/*
 *------------------------------------------------------------------
 *
 * $Source: $
 * $Revision: 1.1 $
 * $Date: 87/06/24 14:09:52 $
 * $State: Exp $
 * $Author: jon $
 * $Locker: jon $
 *
 * $Log:	rvd.c,v $
 * 
 *------------------------------------------------------------------
 */

#ifndef lint
static char *rcsid_gadmin_c = "$Header: infwd.c,v 1.3 87/06/24 14:11:49 jon Exp $";
#endif	lint

#include <stdio.h>
#include "ss.h"

#include "gadmin.h"

extern ss_request_table gadmin_cmds;

gadmin_invocation_info *gii;

main(argc, argv)
	int argc;
	char **argv;
{
	int code;
	char *argv0 = argv[0];
	char *initial_request = (char *)NULL;
	char *default_gateway = (char *)NULL;
	u_long default_gateway_addr, get_host_addr();
	int quit = FALSE;	/* quit after processing request */
	int flame = FALSE;	/* Have we flamed them for multiple  */
	int sci_idx;

	gii = (gadmin_invocation_info *) malloc (sizeof (gadmin_invocation_info));
	if (gii == NULL) {
	  perror ("Couldn't allocatin invocation info.");
	  exit (99);
	}
	bzero (gii, sizeof (gadmin_invocation_info));

	gii->subsystem_name = GADMIN_SUBSYSTEM_NAME;
	gii->version = GADMIN_VERSION;

	while (++argv, --argc) {
		if (!strcmp(*argv, "-prompt")) {
			if (argc == 1) {
				fprintf(stderr,
					"No argument supplied with -prompt\n");
				exit(1);
			}
			argc--; argv++;
			gii->subsystem_name = *argv;
		}
		else if (!strcmp(*argv, "-request") || !strcmp(*argv, "-rq")) {
			if (argc == 1) {
				fprintf(stderr,
					"No string supplied with -request.\n");
				exit(1);
			}
			argc--; argv++;
			initial_request = *argv;
		}
		else if (!strcmp(*argv, "-quit"))
			quit = TRUE;
		else if (!strcmp(*argv, "-no_quit"))
			quit = FALSE;
		else if (**argv == '-') {
			fprintf(stderr, "Unknown control argument %s\n",
				*argv);
			fprintf(stderr, "Usage: %s [gateway] [ -prompt name ] [ -request name ] [ -quit ]\n",
				argv0);
			exit(1);
		}
		else default_gateway = *argv;
	      }

	sci_idx = ss_create_invocation(gii->subsystem_name, gii->version,
				       (char *)NULL, &gadmin_cmds, &code);
	if (code) {
		ss_perror(sci_idx, code, "creating invocation");
		exit(1);
	}

	gii->sci_idx = sci_idx;

	(void) ss_add_info_dir(sci_idx, INFO_DIR, &code);
	if (code) {
		ss_perror(sci_idx, code, INFO_DIR);
	}

#ifdef ndef
	init_disc_err_tbl();
	init_dsc_err_tbl();
#endif

	if (default_gateway) {
	  if (default_gateway_addr = 
	      get_host_addr (default_gateway, &default_gateway, sci_idx)) {
	    gii->default_gateway = default_gateway;
	    gii->default_gateway_addr = default_gateway_addr;
	  }
	}

	if (init_gw_socket (&(gii->gw_send_socket), sci_idx))
	  exit (1);

	if (!quit) 
	  printf("gadmin version %s.  Type '?' for a list of commands.\n\n",
		 gii->version);

	if (initial_request != (char *)NULL) {
		(void) ss_execute_line(sci_idx, initial_request, &code);
		if (code != 0)
			ss_perror(sci_idx, code, initial_request);
	      }
	if (!quit || code)
	  (void) ss_listen (sci_idx, &code);
      }

