/* --------------------------------------------------------------------------- $Id: cli.c,v 1.25 2007/05/07 18:55:25 cnepveu Exp $ --------------------------------------------------------------------------- Copyright (c) 2001-2006 Hexago Inc. All rights reserved. LICENSE NOTICE: You may use and modify this source code only if you have executed a valid license agreement with Hexago Inc. granting you the right to do so, the said license agreement governing such use and modifications. Copyright or other intellectual property notices are not to be removed from the source code. --------------------------------------------------------------------------- */ #include #include #include #include #include #include "platform.h" #include "cli.h" #include "log.h" // Verbose #include "hex_strings.h" #include "lib.h" #include "config.h" #include "cnfchk.h" // tspFixConfig #ifdef WIN32 #include "console.h" #include "service.h" #endif static void flush_stdin(void) { char x; while ( (x=fgetc(stdin)) ) if (x == '\n') break; } /* Ask the question, return 0 if answer is N or n, 1 if answer is Y or y */ int ask(char *question, ...) { va_list ap; char *buf; char c; int ret; #ifdef WIN32 enable_console_input(); #endif if ( (buf = malloc(sizeof(char) * 1024)) == NULL ) { Display(LOG_LEVEL_3, ELError, "ask", HEX_STR_MALLOC_ERR_IN_ASK); return 0; } va_start(ap, question); vsnprintf(buf, 1024, question, ap); va_end(ap); ask_again: printf("%s? (Y/N) ", buf); c = fgetc(stdin); /* empty stdin */ flush_stdin(); c = tolower(c); if (c == 'y') ret = 1; else if (c == 'n') ret = 0; else goto ask_again; free(buf); #ifdef WIN32 disable_console_input(); #endif return ret; } void PrintUsage(char *Message, ...) { if(Message) { va_list argp; va_start(argp, Message); vprintf(Message, argp); va_end(argp); } printf("usage: gw6c [options] [-f config_file] [-r seconds]\n"); printf(" where options are :\n"); printf(" -i gif interface to use for tunnel_v6v4\n"); printf(" -u interface to use for tunnel_v6udpv4\n"); printf(" -s interface to query to get IPv4 source address\n"); printf(" -f Read this config file instead of %s \n", FileName); printf(" -r Retry after n seconds until success\n"); printf(" -c Verify and fix the config file (to migrate template names)\n"); #ifdef WIN32 /* Not clean. Should be a hook to print platform specific options */ printf(" --register install to run as service\n"); printf(" --unregister uninstall the service\n"); #endif printf(" -h help\n"); printf(" -? help\n"); printf("\n"); return; } int ParseArguments(int argc, char *argv[], tConf *Conf) { int ch; #ifdef WIN32 /* Not clean. Should be a hook to platform specific options parser */ service_parse_cli(argc, argv); #endif while ((ch = getopt(argc, argv, "h?cf:r:i:u:s:")) != -1) { switch (ch) { case 's': Conf->client_v4 = optarg; break; case 'i': Conf->if_tunnel_v6v4 = optarg; break; case 'u': Conf->if_tunnel_v6udpv4 = optarg; break; case 'f': FileName = optarg; break; case 'r': Conf->retry = atoi(optarg); break; case 'c': tspFixConfig(); // The name of the error code below is confusing in this // case since we're not showing help. The desired behaviour // is the same, however: no error, but quit the application // without continuing. return NO_ERROR_SHOW_HELP; case '?': case 'h': PrintUsage(NULL); if ((optopt != '?') && (optopt != 'h') && (optopt != 0)) { return INVALID_ARGUMENTS; } else { return NO_ERROR_SHOW_HELP; } default: PrintUsage("Error while parsing command line arguments"); return INVALID_ARGUMENTS; } } return NO_ERROR; }