diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-05-04 11:13:56 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-05-04 11:13:56 +0200 |
commit | 1b3e57701744ac33878fa129c087c1798fee4936 (patch) | |
tree | 625302939c9c508d3e16f60237a0879b81cfc12e /ggsn | |
parent | 5701b0f6479603284f80d0277ae31d1099dce7ed (diff) |
Use newer gengetopt which also frees memory
Taken from http://sourceforge.net/tracker/index.php?func=detail&aid=1811521&group_id=68956&atid=522957
Diffstat (limited to 'ggsn')
-rw-r--r-- | ggsn/cmdline.c | 1286 | ||||
-rw-r--r-- | ggsn/cmdline.h | 79 | ||||
-rw-r--r-- | ggsn/ggsn.c | 3 |
3 files changed, 901 insertions, 467 deletions
diff --git a/ggsn/cmdline.c b/ggsn/cmdline.c index d8eafe5..d83376f 100644 --- a/ggsn/cmdline.c +++ b/ggsn/cmdline.c @@ -1,5 +1,5 @@ /* - File autogenerated by gengetopt version 2.8 + File autogenerated by gengetopt version 2.17 generated with the following command: gengetopt --conf-parser @@ -8,81 +8,84 @@ we make no copyright claims on it. */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> /* If we use autoconf. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif -/* Check for configure's getopt check result. */ -#ifndef HAVE_GETOPT_LONG -#include "getopt.h" -#else -#include <getopt.h> -#endif -#ifndef HAVE_STRDUP -#define strdup gengetopt_strdup -#endif /* HAVE_STRDUP */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "getopt.h" #include "cmdline.h" +const char *gengetopt_args_info_purpose = ""; -void -cmdline_parser_print_version (void) +const char *gengetopt_args_info_usage = "Usage: " CMDLINE_PARSER_PACKAGE " [OPTIONS]..."; + +const char *gengetopt_args_info_help[] = { + " -h, --help Print help and exit", + " -V, --version Print version and exit", + " -f, --fg Run in foreground (default=off)", + " -d, --debug Run in debug mode (default=off)", + " -c, --conf=STRING Read configuration file (default=`/etc/ggsn.conf')", + " --pidfile=STRING Filename of process id file \n (default=`/var/run/ggsn.pid')", + " --statedir=STRING Directory of nonvolatile data \n (default=`/var/lib/ggsn/')", + " -l, --listen=STRING Local interface", + " -n, --net=STRING Network (default=`192.168.0.0/24')", + " --ipup=STRING Script to run after link-up", + " --ipdown=STRING Script to run after link-down", + " --dynip=STRING Dynamic IP address pool", + " --statip=STRING Static IP address pool", + " --pcodns1=STRING PCO DNS Server 1 (default=`0.0.0.0')", + " --pcodns2=STRING PCO DNS Server 2 (default=`0.0.0.0')", + " --timelimit=INT Exit after timelimit seconds (default=`0')", + " -a, --apn=STRING Access point name (default=`internet')", + " -q, --qos=INT Requested quality of service (default=`0x0b921f')", + 0 +}; + +static +void clear_given (struct gengetopt_args_info *args_info); +static +void clear_args (struct gengetopt_args_info *args_info); + +static int +cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required, const char *additional_error); + +struct line_list { - printf ("%s %s\n", PACKAGE, VERSION); -} + char * string_arg; + struct line_list * next; +}; -void -cmdline_parser_print_help (void) +static struct line_list *cmd_line_list = 0; +static struct line_list *cmd_line_list_tmp = 0; + +static void +free_cmd_list(void) { - cmdline_parser_print_version (); - printf("\n" - "Usage: %s [OPTIONS]...\n", PACKAGE); - printf(" -h --help Print help and exit\n"); - printf(" -V --version Print version and exit\n"); - printf(" -f --fg Run in foreground (default=off)\n"); - printf(" -d --debug Run in debug mode (default=off)\n"); - printf(" -cSTRING --conf=STRING Read configuration file (default='/etc/ggsn.conf')\n"); - printf(" --pidfile=STRING Filename of process id file (default='/var/run/ggsn.pid')\n"); - printf(" --statedir=STRING Directory of nonvolatile data (default='/var/lib/ggsn/')\n"); - printf(" -lSTRING --listen=STRING Local interface\n"); - printf(" -nSTRING --net=STRING Network (default='192.168.0.0/24')\n"); - printf(" --ipup=STRING Script to run after link-up\n"); - printf(" --ipdown=STRING Script to run after link-down\n"); - printf(" --dynip=STRING Dynamic IP address pool\n"); - printf(" --statip=STRING Static IP address pool\n"); - printf(" --pcodns1=STRING PCO DNS Server 1 (default='0.0.0.0')\n"); - printf(" --pcodns2=STRING PCO DNS Server 2 (default='0.0.0.0')\n"); - printf(" --timelimit=INT Exit after timelimit seconds (default='0')\n"); - printf(" -aSTRING --apn=STRING Access point name (default='internet')\n"); - printf(" -qINT --qos=INT Requested quality of service (default='0x0b921f')\n"); + /* free the list of a previous call */ + if (cmd_line_list) + { + while (cmd_line_list) { + cmd_line_list_tmp = cmd_line_list; + cmd_line_list = cmd_line_list->next; + free (cmd_line_list_tmp->string_arg); + free (cmd_line_list_tmp); + } + } } -#ifndef HAVE_STRDUP -/* gengetopt_strdup(): automatically generated from strdup.c. */ -/* strdup.c replacement of strdup, which is not standard */ static char * -gengetopt_strdup (const char *s) -{ - char *result = (char*)malloc(strlen(s) + 1); - if (result == (char*)0) - return (char*)0; - strcpy(result, s); - return result; -} -#endif /* HAVE_STRDUP */ +gengetopt_strdup (const char *s); -int -cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info) +static +void clear_given (struct gengetopt_args_info *args_info) { - int c; /* Character of the parsed option. */ - int missing_required_options = 0; - args_info->help_given = 0 ; args_info->version_given = 0 ; args_info->fg_given = 0 ; @@ -101,29 +104,431 @@ cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_i args_info->timelimit_given = 0 ; args_info->apn_given = 0 ; args_info->qos_given = 0 ; -#define clear_args() { \ - args_info->fg_flag = 0;\ - args_info->debug_flag = 0;\ - args_info->conf_arg = strdup("/etc/ggsn.conf") ;\ - args_info->pidfile_arg = strdup("/var/run/ggsn.pid") ;\ - args_info->statedir_arg = strdup("/var/lib/ggsn/") ;\ - args_info->listen_arg = NULL; \ - args_info->net_arg = strdup("192.168.0.0/24") ;\ - args_info->ipup_arg = NULL; \ - args_info->ipdown_arg = NULL; \ - args_info->dynip_arg = NULL; \ - args_info->statip_arg = NULL; \ - args_info->pcodns1_arg = strdup("0.0.0.0") ;\ - args_info->pcodns2_arg = strdup("0.0.0.0") ;\ - args_info->timelimit_arg = 0 ;\ - args_info->apn_arg = strdup("internet") ;\ - args_info->qos_arg = 0x0b921f ;\ } - clear_args(); +static +void clear_args (struct gengetopt_args_info *args_info) +{ + args_info->fg_flag = 0; + args_info->debug_flag = 0; + args_info->conf_arg = gengetopt_strdup ("/etc/ggsn.conf"); + args_info->conf_orig = NULL; + args_info->pidfile_arg = gengetopt_strdup ("/var/run/ggsn.pid"); + args_info->pidfile_orig = NULL; + args_info->statedir_arg = gengetopt_strdup ("/var/lib/ggsn/"); + args_info->statedir_orig = NULL; + args_info->listen_arg = NULL; + args_info->listen_orig = NULL; + args_info->net_arg = gengetopt_strdup ("192.168.0.0/24"); + args_info->net_orig = NULL; + args_info->ipup_arg = NULL; + args_info->ipup_orig = NULL; + args_info->ipdown_arg = NULL; + args_info->ipdown_orig = NULL; + args_info->dynip_arg = NULL; + args_info->dynip_orig = NULL; + args_info->statip_arg = NULL; + args_info->statip_orig = NULL; + args_info->pcodns1_arg = gengetopt_strdup ("0.0.0.0"); + args_info->pcodns1_orig = NULL; + args_info->pcodns2_arg = gengetopt_strdup ("0.0.0.0"); + args_info->pcodns2_orig = NULL; + args_info->timelimit_arg = 0; + args_info->timelimit_orig = NULL; + args_info->apn_arg = gengetopt_strdup ("internet"); + args_info->apn_orig = NULL; + args_info->qos_arg = 0x0b921f; + args_info->qos_orig = NULL; + +} + +static +void init_args_info(struct gengetopt_args_info *args_info) +{ + args_info->help_help = gengetopt_args_info_help[0] ; + args_info->version_help = gengetopt_args_info_help[1] ; + args_info->fg_help = gengetopt_args_info_help[2] ; + args_info->debug_help = gengetopt_args_info_help[3] ; + args_info->conf_help = gengetopt_args_info_help[4] ; + args_info->pidfile_help = gengetopt_args_info_help[5] ; + args_info->statedir_help = gengetopt_args_info_help[6] ; + args_info->listen_help = gengetopt_args_info_help[7] ; + args_info->net_help = gengetopt_args_info_help[8] ; + args_info->ipup_help = gengetopt_args_info_help[9] ; + args_info->ipdown_help = gengetopt_args_info_help[10] ; + args_info->dynip_help = gengetopt_args_info_help[11] ; + args_info->statip_help = gengetopt_args_info_help[12] ; + args_info->pcodns1_help = gengetopt_args_info_help[13] ; + args_info->pcodns2_help = gengetopt_args_info_help[14] ; + args_info->timelimit_help = gengetopt_args_info_help[15] ; + args_info->apn_help = gengetopt_args_info_help[16] ; + args_info->qos_help = gengetopt_args_info_help[17] ; + +} + +void +cmdline_parser_print_version (void) +{ + printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION); +} + +void +cmdline_parser_print_help (void) +{ + int i = 0; + cmdline_parser_print_version (); + + if (strlen(gengetopt_args_info_purpose) > 0) + printf("\n%s\n", gengetopt_args_info_purpose); + + printf("\n%s\n\n", gengetopt_args_info_usage); + while (gengetopt_args_info_help[i]) + printf("%s\n", gengetopt_args_info_help[i++]); +} + +void +cmdline_parser_init (struct gengetopt_args_info *args_info) +{ + clear_given (args_info); + clear_args (args_info); + init_args_info (args_info); +} + +static void +cmdline_parser_release (struct gengetopt_args_info *args_info) +{ + + if (args_info->conf_arg) + { + free (args_info->conf_arg); /* free previous argument */ + args_info->conf_arg = 0; + } + if (args_info->conf_orig) + { + free (args_info->conf_orig); /* free previous argument */ + args_info->conf_orig = 0; + } + if (args_info->pidfile_arg) + { + free (args_info->pidfile_arg); /* free previous argument */ + args_info->pidfile_arg = 0; + } + if (args_info->pidfile_orig) + { + free (args_info->pidfile_orig); /* free previous argument */ + args_info->pidfile_orig = 0; + } + if (args_info->statedir_arg) + { + free (args_info->statedir_arg); /* free previous argument */ + args_info->statedir_arg = 0; + } + if (args_info->statedir_orig) + { + free (args_info->statedir_orig); /* free previous argument */ + args_info->statedir_orig = 0; + } + if (args_info->listen_arg) + { + free (args_info->listen_arg); /* free previous argument */ + args_info->listen_arg = 0; + } + if (args_info->listen_orig) + { + free (args_info->listen_orig); /* free previous argument */ + args_info->listen_orig = 0; + } + if (args_info->net_arg) + { + free (args_info->net_arg); /* free previous argument */ + args_info->net_arg = 0; + } + if (args_info->net_orig) + { + free (args_info->net_orig); /* free previous argument */ + args_info->net_orig = 0; + } + if (args_info->ipup_arg) + { + free (args_info->ipup_arg); /* free previous argument */ + args_info->ipup_arg = 0; + } + if (args_info->ipup_orig) + { + free (args_info->ipup_orig); /* free previous argument */ + args_info->ipup_orig = 0; + } + if (args_info->ipdown_arg) + { + free (args_info->ipdown_arg); /* free previous argument */ + args_info->ipdown_arg = 0; + } + if (args_info->ipdown_orig) + { + free (args_info->ipdown_orig); /* free previous argument */ + args_info->ipdown_orig = 0; + } + if (args_info->dynip_arg) + { + free (args_info->dynip_arg); /* free previous argument */ + args_info->dynip_arg = 0; + } + if (args_info->dynip_orig) + { + free (args_info->dynip_orig); /* free previous argument */ + args_info->dynip_orig = 0; + } + if (args_info->statip_arg) + { + free (args_info->statip_arg); /* free previous argument */ + args_info->statip_arg = 0; + } + if (args_info->statip_orig) + { + free (args_info->statip_orig); /* free previous argument */ + args_info->statip_orig = 0; + } + if (args_info->pcodns1_arg) + { + free (args_info->pcodns1_arg); /* free previous argument */ + args_info->pcodns1_arg = 0; + } + if (args_info->pcodns1_orig) + { + free (args_info->pcodns1_orig); /* free previous argument */ + args_info->pcodns1_orig = 0; + } + if (args_info->pcodns2_arg) + { + free (args_info->pcodns2_arg); /* free previous argument */ + args_info->pcodns2_arg = 0; + } + if (args_info->pcodns2_orig) + { + free (args_info->pcodns2_orig); /* free previous argument */ + args_info->pcodns2_orig = 0; + } + if (args_info->timelimit_orig) + { + free (args_info->timelimit_orig); /* free previous argument */ + args_info->timelimit_orig = 0; + } + if (args_info->apn_arg) + { + free (args_info->apn_arg); /* free previous argument */ + args_info->apn_arg = 0; + } + if (args_info->apn_orig) + { + free (args_info->apn_orig); /* free previous argument */ + args_info->apn_orig = 0; + } + if (args_info->qos_orig) + { + free (args_info->qos_orig); /* free previous argument */ + args_info->qos_orig = 0; + } + + clear_given (args_info); +} + +int +cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) +{ + FILE *outfile; + int i = 0; + + outfile = fopen(filename, "w"); + + if (!outfile) + { + fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); + return EXIT_FAILURE; + } + + if (args_info->help_given) { + fprintf(outfile, "%s\n", "help"); + } + if (args_info->version_given) { + fprintf(outfile, "%s\n", "version"); + } + if (args_info->fg_given) { + fprintf(outfile, "%s\n", "fg"); + } + if (args_info->debug_given) { + fprintf(outfile, "%s\n", "debug"); + } + if (args_info->conf_given) { + if (args_info->conf_orig) { + fprintf(outfile, "%s=\"%s\"\n", "conf", args_info->conf_orig); + } else { + fprintf(outfile, "%s\n", "conf"); + } + } + if (args_info->pidfile_given) { + if (args_info->pidfile_orig) { + fprintf(outfile, "%s=\"%s\"\n", "pidfile", args_info->pidfile_orig); + } else { + fprintf(outfile, "%s\n", "pidfile"); + } + } + if (args_info->statedir_given) { + if (args_info->statedir_orig) { + fprintf(outfile, "%s=\"%s\"\n", "statedir", args_info->statedir_orig); + } else { + fprintf(outfile, "%s\n", "statedir"); + } + } + if (args_info->listen_given) { + if (args_info->listen_orig) { + fprintf(outfile, "%s=\"%s\"\n", "listen", args_info->listen_orig); + } else { + fprintf(outfile, "%s\n", "listen"); + } + } + if (args_info->net_given) { + if (args_info->net_orig) { + fprintf(outfile, "%s=\"%s\"\n", "net", args_info->net_orig); + } else { + fprintf(outfile, "%s\n", "net"); + } + } + if (args_info->ipup_given) { + if (args_info->ipup_orig) { + fprintf(outfile, "%s=\"%s\"\n", "ipup", args_info->ipup_orig); + } else { + fprintf(outfile, "%s\n", "ipup"); + } + } + if (args_info->ipdown_given) { + if (args_info->ipdown_orig) { + fprintf(outfile, "%s=\"%s\"\n", "ipdown", args_info->ipdown_orig); + } else { + fprintf(outfile, "%s\n", "ipdown"); + } + } + if (args_info->dynip_given) { + if (args_info->dynip_orig) { + fprintf(outfile, "%s=\"%s\"\n", "dynip", args_info->dynip_orig); + } else { + fprintf(outfile, "%s\n", "dynip"); + } + } + if (args_info->statip_given) { + if (args_info->statip_orig) { + fprintf(outfile, "%s=\"%s\"\n", "statip", args_info->statip_orig); + } else { + fprintf(outfile, "%s\n", "statip"); + } + } + if (args_info->pcodns1_given) { + if (args_info->pcodns1_orig) { + fprintf(outfile, "%s=\"%s\"\n", "pcodns1", args_info->pcodns1_orig); + } else { + fprintf(outfile, "%s\n", "pcodns1"); + } + } + if (args_info->pcodns2_given) { + if (args_info->pcodns2_orig) { + fprintf(outfile, "%s=\"%s\"\n", "pcodns2", args_info->pcodns2_orig); + } else { + fprintf(outfile, "%s\n", "pcodns2"); + } + } + if (args_info->timelimit_given) { + if (args_info->timelimit_orig) { + fprintf(outfile, "%s=\"%s\"\n", "timelimit", args_info->timelimit_orig); + } else { + fprintf(outfile, "%s\n", "timelimit"); + } + } + if (args_info->apn_given) { + if (args_info->apn_orig) { + fprintf(outfile, "%s=\"%s\"\n", "apn", args_info->apn_orig); + } else { + fprintf(outfile, "%s\n", "apn"); + } + } + if (args_info->qos_given) { + if (args_info->qos_orig) { + fprintf(outfile, "%s=\"%s\"\n", "qos", args_info->qos_orig); + } else { + fprintf(outfile, "%s\n", "qos"); + } + } + + fclose (outfile); + + i = EXIT_SUCCESS; + return i; +} + +void +cmdline_parser_free (struct gengetopt_args_info *args_info) +{ + cmdline_parser_release (args_info); +} + + +/* gengetopt_strdup() */ +/* strdup.c replacement of strdup, which is not standard */ +char * +gengetopt_strdup (const char *s) +{ + char *result = NULL; + if (!s) + return result; + + result = (char*)malloc(strlen(s) + 1); + if (result == (char*)0) + return (char*)0; + strcpy(result, s); + return result; +} + +int +cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info) +{ + return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); +} + +int +cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) +{ + int result; + + result = cmdline_parser_internal (argc, argv, args_info, override, initialize, check_required, NULL); + + if (result == EXIT_FAILURE) + { + cmdline_parser_free (args_info); + exit (EXIT_FAILURE); + } + + return result; +} + +int +cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) +{ + return EXIT_SUCCESS; +} + +int +cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required, const char *additional_error) +{ + int c; /* Character of the parsed option. */ + + int error = 0; + struct gengetopt_args_info local_args_info; + + if (initialize) + cmdline_parser_init (args_info); + + cmdline_parser_init (&local_args_info); optarg = 0; - optind = 1; + optind = 0; opterr = 1; optopt = '?'; @@ -131,6 +536,7 @@ cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_i { int option_index = 0; char *stop_char; + static struct option long_options[] = { { "help", 0, NULL, 'h' }, { "version", 0, NULL, 'V' }, @@ -153,6 +559,7 @@ cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_i { NULL, 0, NULL, 0 } }; + stop_char = 0; c = getopt_long (argc, argv, "hVfdc:l:n:a:q:", long_options, &option_index); if (c == -1) break; /* Exit from `while (1)' loop. */ @@ -160,90 +567,131 @@ cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_i switch (c) { case 'h': /* Print help and exit. */ - clear_args (); cmdline_parser_print_help (); + cmdline_parser_free (&local_args_info); exit (EXIT_SUCCESS); case 'V': /* Print version and exit. */ - clear_args (); cmdline_parser_print_version (); + cmdline_parser_free (&local_args_info); exit (EXIT_SUCCESS); case 'f': /* Run in foreground. */ - if (args_info->fg_given) + if (local_args_info.fg_given) { - fprintf (stderr, "%s: `--fg' (`-f') option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--fg' (`-f') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->fg_given && ! override) + continue; + local_args_info.fg_given = 1; args_info->fg_given = 1; args_info->fg_flag = !(args_info->fg_flag); break; case 'd': /* Run in debug mode. */ - if (args_info->debug_given) + if (local_args_info.debug_given) { - fprintf (stderr, "%s: `--debug' (`-d') option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--debug' (`-d') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->debug_given && ! override) + continue; + local_args_info.debug_given = 1; args_info->debug_given = 1; args_info->debug_flag = !(args_info->debug_flag); break; case 'c': /* Read configuration file. */ - if (args_info->conf_given) + if (local_args_info.conf_given) { - fprintf (stderr, "%s: `--conf' (`-c') option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--conf' (`-c') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->conf_given && ! override) + continue; + local_args_info.conf_given = 1; args_info->conf_given = 1; - args_info->conf_arg = strdup (optarg); + if (args_info->conf_arg) + free (args_info->conf_arg); /* free previous string */ + args_info->conf_arg = gengetopt_strdup (optarg); + if (args_info->conf_orig) + free (args_info->conf_orig); /* free previous string */ + args_info->conf_orig = gengetopt_strdup (optarg); break; case 'l': /* Local interface. */ - if (args_info->listen_given) + if (local_args_info.listen_given) { - fprintf (stderr, "%s: `--listen' (`-l') option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--listen' (`-l') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->listen_given && ! override) + continue; + local_args_info.listen_given = 1; args_info->listen_given = 1; - args_info->listen_arg = strdup (optarg); + if (args_info->listen_arg) + free (args_info->listen_arg); /* free previous string */ + args_info->listen_arg = gengetopt_strdup (optarg); + if (args_info->listen_orig) + free (args_info->listen_orig); /* free previous string */ + args_info->listen_orig = gengetopt_strdup (optarg); break; case 'n': /* Network. */ - if (args_info->net_given) + if (local_args_info.net_given) { - fprintf (stderr, "%s: `--net' (`-n') option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--net' (`-n') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->net_given && ! override) + continue; + local_args_info.net_given = 1; args_info->net_given = 1; - args_info->net_arg = strdup (optarg); + if (args_info->net_arg) + free (args_info->net_arg); /* free previous string */ + args_info->net_arg = gengetopt_strdup (optarg); + if (args_info->net_orig) + free (args_info->net_orig); /* free previous string */ + args_info->net_orig = gengetopt_strdup (optarg); break; case 'a': /* Access point name. */ - if (args_info->apn_given) + if (local_args_info.apn_given) { - fprintf (stderr, "%s: `--apn' (`-a') option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--apn' (`-a') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->apn_given && ! override) + continue; + local_args_info.apn_given = 1; args_info->apn_given = 1; - args_info->apn_arg = strdup (optarg); + if (args_info->apn_arg) + free (args_info->apn_arg); /* free previous string */ + args_info->apn_arg = gengetopt_strdup (optarg); + if (args_info->apn_orig) + free (args_info->apn_orig); /* free previous string */ + args_info->apn_orig = gengetopt_strdup (optarg); break; case 'q': /* Requested quality of service. */ - if (args_info->qos_given) + if (local_args_info.qos_given) { - fprintf (stderr, "%s: `--qos' (`-q') option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--qos' (`-q') option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->qos_given && ! override) + continue; + local_args_info.qos_given = 1; args_info->qos_given = 1; - args_info->qos_arg = strtol (optarg,&stop_char,0); + args_info->qos_arg = strtol (optarg, &stop_char, 0); + if (!(stop_char && *stop_char == '\0')) { + fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], optarg); + goto failure; + } + if (args_info->qos_orig) + free (args_info->qos_orig); /* free previous string */ + args_info->qos_orig = gengetopt_strdup (optarg); break; @@ -251,444 +699,374 @@ cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_i /* Filename of process id file. */ if (strcmp (long_options[option_index].name, "pidfile") == 0) { - if (args_info->pidfile_given) + if (local_args_info.pidfile_given) { - fprintf (stderr, "%s: `--pidfile' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--pidfile' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->pidfile_given && ! override) + continue; + local_args_info.pidfile_given = 1; args_info->pidfile_given = 1; - args_info->pidfile_arg = strdup (optarg); - break; + if (args_info->pidfile_arg) + free (args_info->pidfile_arg); /* free previous string */ + args_info->pidfile_arg = gengetopt_strdup (optarg); + if (args_info->pidfile_orig) + free (args_info->pidfile_orig); /* free previous string */ + args_info->pidfile_orig = gengetopt_strdup (optarg); } /* Directory of nonvolatile data. */ else if (strcmp (long_options[option_index].name, "statedir") == 0) { - if (args_info->statedir_given) + if (local_args_info.statedir_given) { - fprintf (stderr, "%s: `--statedir' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--statedir' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->statedir_given && ! override) + continue; + local_args_info.statedir_given = 1; args_info->statedir_given = 1; - args_info->statedir_arg = strdup (optarg); - break; + if (args_info->statedir_arg) + free (args_info->statedir_arg); /* free previous string */ + args_info->statedir_arg = gengetopt_strdup (optarg); + if (args_info->statedir_orig) + free (args_info->statedir_orig); /* free previous string */ + args_info->statedir_orig = gengetopt_strdup (optarg); } /* Script to run after link-up. */ else if (strcmp (long_options[option_index].name, "ipup") == 0) { - if (args_info->ipup_given) + if (local_args_info.ipup_given) { - fprintf (stderr, "%s: `--ipup' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--ipup' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->ipup_given && ! override) + continue; + local_args_info.ipup_given = 1; args_info->ipup_given = 1; - args_info->ipup_arg = strdup (optarg); - break; + if (args_info->ipup_arg) + free (args_info->ipup_arg); /* free previous string */ + args_info->ipup_arg = gengetopt_strdup (optarg); + if (args_info->ipup_orig) + free (args_info->ipup_orig); /* free previous string */ + args_info->ipup_orig = gengetopt_strdup (optarg); } /* Script to run after link-down. */ else if (strcmp (long_options[option_index].name, "ipdown") == 0) { - if (args_info->ipdown_given) + if (local_args_info.ipdown_given) { - fprintf (stderr, "%s: `--ipdown' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--ipdown' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->ipdown_given && ! override) + continue; + local_args_info.ipdown_given = 1; args_info->ipdown_given = 1; - args_info->ipdown_arg = strdup (optarg); - break; + if (args_info->ipdown_arg) + free (args_info->ipdown_arg); /* free previous string */ + args_info->ipdown_arg = gengetopt_strdup (optarg); + if (args_info->ipdown_orig) + free (args_info->ipdown_orig); /* free previous string */ + args_info->ipdown_orig = gengetopt_strdup (optarg); } /* Dynamic IP address pool. */ else if (strcmp (long_options[option_index].name, "dynip") == 0) { - if (args_info->dynip_given) + if (local_args_info.dynip_given) { - fprintf (stderr, "%s: `--dynip' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--dynip' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->dynip_given && ! override) + continue; + local_args_info.dynip_given = 1; args_info->dynip_given = 1; - args_info->dynip_arg = strdup (optarg); - break; + if (args_info->dynip_arg) + free (args_info->dynip_arg); /* free previous string */ + args_info->dynip_arg = gengetopt_strdup (optarg); + if (args_info->dynip_orig) + free (args_info->dynip_orig); /* free previous string */ + args_info->dynip_orig = gengetopt_strdup (optarg); } /* Static IP address pool. */ else if (strcmp (long_options[option_index].name, "statip") == 0) { - if (args_info->statip_given) + if (local_args_info.statip_given) { - fprintf (stderr, "%s: `--statip' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--statip' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->statip_given && ! override) + continue; + local_args_info.statip_given = 1; args_info->statip_given = 1; - args_info->statip_arg = strdup (optarg); - break; + if (args_info->statip_arg) + free (args_info->statip_arg); /* free previous string */ + args_info->statip_arg = gengetopt_strdup (optarg); + if (args_info->statip_orig) + free (args_info->statip_orig); /* free previous string */ + args_info->statip_orig = gengetopt_strdup (optarg); } /* PCO DNS Server 1. */ else if (strcmp (long_options[option_index].name, "pcodns1") == 0) { - if (args_info->pcodns1_given) + if (local_args_info.pcodns1_given) { - fprintf (stderr, "%s: `--pcodns1' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--pcodns1' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->pcodns1_given && ! override) + continue; + local_args_info.pcodns1_given = 1; args_info->pcodns1_given = 1; - args_info->pcodns1_arg = strdup (optarg); - break; + if (args_info->pcodns1_arg) + free (args_info->pcodns1_arg); /* free previous string */ + args_info->pcodns1_arg = gengetopt_strdup (optarg); + if (args_info->pcodns1_orig) + free (args_info->pcodns1_orig); /* free previous string */ + args_info->pcodns1_orig = gengetopt_strdup (optarg); } /* PCO DNS Server 2. */ else if (strcmp (long_options[option_index].name, "pcodns2") == 0) { - if (args_info->pcodns2_given) + if (local_args_info.pcodns2_given) { - fprintf (stderr, "%s: `--pcodns2' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--pcodns2' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->pcodns2_given && ! override) + continue; + local_args_info.pcodns2_given = 1; args_info->pcodns2_given = 1; - args_info->pcodns2_arg = strdup (optarg); - break; + if (args_info->pcodns2_arg) + free (args_info->pcodns2_arg); /* free previous string */ + args_info->pcodns2_arg = gengetopt_strdup (optarg); + if (args_info->pcodns2_orig) + free (args_info->pcodns2_orig); /* free previous string */ + args_info->pcodns2_orig = gengetopt_strdup (optarg); } /* Exit after timelimit seconds. */ else if (strcmp (long_options[option_index].name, "timelimit") == 0) { - if (args_info->timelimit_given) + if (local_args_info.timelimit_given) { - fprintf (stderr, "%s: `--timelimit' option given more than once\n", PACKAGE); - clear_args (); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: `--timelimit' option given more than once%s\n", argv[0], (additional_error ? additional_error : "")); + goto failure; } + if (args_info->timelimit_given && ! override) + continue; + local_args_info.timelimit_given = 1; args_info->timelimit_given = 1; - args_info->timelimit_arg = strtol (optarg,&stop_char,0); - break; + args_info->timelimit_arg = strtol (optarg, &stop_char, 0); + if (!(stop_char && *stop_char == '\0')) { + fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], optarg); + goto failure; + } + if (args_info->timelimit_orig) + free (args_info->timelimit_orig); /* free previous string */ + args_info->timelimit_orig = gengetopt_strdup (optarg); } - + + break; case '?': /* Invalid option. */ /* `getopt_long' already printed an error message. */ - exit (EXIT_FAILURE); + goto failure; default: /* bug: option not considered. */ - fprintf (stderr, "%s: option unknown: %c\n", PACKAGE, c); + fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); abort (); } /* switch */ } /* while */ - if ( missing_required_options ) - exit (EXIT_FAILURE); + + + cmdline_parser_release (&local_args_info); + + if ( error ) + return (EXIT_FAILURE); return 0; + +failure: + + cmdline_parser_release (&local_args_info); + return (EXIT_FAILURE); } -#define CONFIGPARSERBUFSIZE 1024 +#ifndef CONFIG_FILE_LINE_SIZE +#define CONFIG_FILE_LINE_SIZE 2048 +#endif +#define ADDITIONAL_ERROR " in configuration file " + +#define CONFIG_FILE_LINE_BUFFER_SIZE (CONFIG_FILE_LINE_SIZE+3) +/* 3 is for "--" and "=" */ + +char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE+1]; int -cmdline_parser_configfile (char * const filename, struct gengetopt_args_info *args_info, int override) +cmdline_parser_configfile (char * const filename, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) { FILE* file; - char linebuf[CONFIGPARSERBUFSIZE]; + char linebuf[CONFIG_FILE_LINE_SIZE]; int line_num = 0; - int len; - int fnum; - char fopt[CONFIGPARSERBUFSIZE], farg[CONFIGPARSERBUFSIZE]; - char *stop_char; + int i, result, equal; + char *fopt, *farg; + char *str_index; + size_t len, next_token; + char delimiter; + int my_argc = 0; + char **my_argv_arg; + char *additional_error; + + /* store the program name */ + cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list)); + cmd_line_list_tmp->next = cmd_line_list; + cmd_line_list = cmd_line_list_tmp; + cmd_line_list->string_arg = gengetopt_strdup (CMDLINE_PARSER_PACKAGE); if ((file = fopen(filename, "r")) == NULL) { fprintf (stderr, "%s: Error opening configuration file '%s'\n", - PACKAGE, filename); - exit (EXIT_FAILURE); + CMDLINE_PARSER_PACKAGE, filename); + result = EXIT_FAILURE; + goto conf_failure; } - while ((fgets(linebuf, CONFIGPARSERBUFSIZE, file)) != NULL) + while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != NULL) { ++line_num; + my_argv[0] = '\0'; len = strlen(linebuf); - if (len == CONFIGPARSERBUFSIZE-1) + if (len > (CONFIG_FILE_LINE_BUFFER_SIZE-1)) { - fprintf (stderr, "%s: Line longer than %d characters found in configuration file '%s'\n", - PACKAGE, CONFIGPARSERBUFSIZE, filename); - exit (EXIT_FAILURE); + fprintf (stderr, "%s:%s:%d: Line too long in configuration file\n", + CMDLINE_PARSER_PACKAGE, filename, line_num); + result = EXIT_FAILURE; + goto conf_failure; } - if (linebuf[0] == '#') - continue; /* Line was a comment */ - - /* Get the option */ - if ((fnum = sscanf(linebuf, "%s %s", fopt, farg)) > 0) + /* find first non-whitespace character in the line */ + next_token = strspn ( linebuf, " \t\r\n"); + str_index = linebuf + next_token; + + if ( str_index[0] == '\0' || str_index[0] == '#') + continue; /* empty line or comment line is skipped */ + + fopt = str_index; + + /* truncate fopt at the end of the first non-valid character */ + next_token = strcspn (fopt, " \t\r\n="); + + if (fopt[next_token] == '\0') /* the line is over */ { - if (!strcmp(fopt, "help")) - { - if (override || !args_info->help_given) - { - args_info->help_given = 1; - - } - continue; - } - if (!strcmp(fopt, "version")) - { - if (override || !args_info->version_given) - { - args_info->version_given = 1; - - } - continue; - } - if (!strcmp(fopt, "fg")) - { - if (override || !args_info->fg_given) - { - args_info->fg_given = 1; - args_info->fg_flag = !(args_info->fg_flag); - } - continue; - } - if (!strcmp(fopt, "debug")) - { - if (override || !args_info->debug_given) - { - args_info->debug_given = 1; - args_info->debug_flag = !(args_info->debug_flag); - } - continue; - } - if (!strcmp(fopt, "conf")) - { - if (override || !args_info->conf_given) - { - args_info->conf_given = 1; - if (fnum == 2) - args_info->conf_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "pidfile")) - { - if (override || !args_info->pidfile_given) - { - args_info->pidfile_given = 1; - if (fnum == 2) - args_info->pidfile_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "statedir")) - { - if (override || !args_info->statedir_given) - { - args_info->statedir_given = 1; - if (fnum == 2) - args_info->statedir_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "listen")) - { - if (override || !args_info->listen_given) - { - args_info->listen_given = 1; - if (fnum == 2) - args_info->listen_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "net")) - { - if (override || !args_info->net_given) - { - args_info->net_given = 1; - if (fnum == 2) - args_info->net_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "ipup")) - { - if (override || !args_info->ipup_given) - { - args_info->ipup_given = 1; - if (fnum == 2) - args_info->ipup_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "ipdown")) - { - if (override || !args_info->ipdown_given) - { - args_info->ipdown_given = 1; - if (fnum == 2) - args_info->ipdown_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "dynip")) - { - if (override || !args_info->dynip_given) - { - args_info->dynip_given = 1; - if (fnum == 2) - args_info->dynip_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "statip")) - { - if (override || !args_info->statip_given) - { - args_info->statip_given = 1; - if (fnum == 2) - args_info->statip_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "pcodns1")) - { - if (override || !args_info->pcodns1_given) - { - args_info->pcodns1_given = 1; - if (fnum == 2) - args_info->pcodns1_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "pcodns2")) - { - if (override || !args_info->pcodns2_given) - { - args_info->pcodns2_given = 1; - if (fnum == 2) - args_info->pcodns2_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "timelimit")) - { - if (override || !args_info->timelimit_given) - { - args_info->timelimit_given = 1; - if (fnum == 2) - args_info->timelimit_arg = strtol (farg,&stop_char,0); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; - } - if (!strcmp(fopt, "apn")) + farg = NULL; + equal = 0; + goto noarg; + } + + /* remember if equal sign is present */ + equal = (fopt[next_token] == '='); + fopt[next_token++] = '\0'; + + /* advance pointers to the next token after the end of fopt */ + next_token += strspn (fopt + next_token, " \t\r\n"); + /* check for the presence of equal sign, and if so, skip it */ + if ( !equal ) + if ((equal = (fopt[next_token] == '='))) + { + next_token++; + next_token += strspn (fopt + next_token, " \t\r\n"); + } + str_index += next_token; + + /* find argument */ + farg = str_index; + if ( farg[0] == '\"' || farg[0] == '\'' ) + { /* quoted argument */ + str_index = strchr (++farg, str_index[0] ); /* skip opening quote */ + if (! str_index) { - if (override || !args_info->apn_given) - { - args_info->apn_given = 1; - if (fnum == 2) - args_info->apn_arg = strdup (farg); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; + fprintf + (stderr, + "%s:%s:%d: unterminated string in configuration file\n", + CMDLINE_PARSER_PACKAGE, filename, line_num); + result = EXIT_FAILURE; + goto conf_failure; } - if (!strcmp(fopt, "qos")) + } + else + { /* read up the remaining part up to a delimiter */ + next_token = strcspn (farg, " \t\r\n#\'\""); + str_index += next_token; + } + + /* truncate farg at the delimiter and store it for further check */ + delimiter = *str_index, *str_index++ = '\0'; + + /* everything but comment is illegal at the end of line */ + if (delimiter != '\0' && delimiter != '#') + { + str_index += strspn(str_index, " \t\r\n"); + if (*str_index != '\0' && *str_index != '#') { - if (override || !args_info->qos_given) - { - args_info->qos_given = 1; - if (fnum == 2) - args_info->qos_arg = strtol (farg,&stop_char,0); - else - { - fprintf (stderr, "%s:%d: required <option_name> <option_val>\n", - filename, line_num); - exit (EXIT_FAILURE); - } - } - continue; + fprintf + (stderr, + "%s:%s:%d: malformed string in configuration file\n", + CMDLINE_PARSER_PACKAGE, filename, line_num); + result = EXIT_FAILURE; + goto conf_failure; } - - - /* Tried all known options. This one is unknown! */ - fprintf (stderr, "%s: Unknown option '%s' found in %s\n", - PACKAGE, fopt, filename); - exit (EXIT_FAILURE); } + + noarg: + ++my_argc; + len = strlen(fopt); + + strcat (my_argv, len > 1 ? "--" : "-"); + strcat (my_argv, fopt); + if (len > 1 && ((farg &&*farg) || equal)) + strcat (my_argv, "="); + if (farg && *farg) + strcat (my_argv, farg); + + cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list)); + cmd_line_list_tmp->next = cmd_line_list; + cmd_line_list = cmd_line_list_tmp; + cmd_line_list->string_arg = gengetopt_strdup(my_argv); } /* while */ - fclose(file); /* No error checking on close */ - return 0; + ++my_argc; /* for program name */ + my_argv_arg = (char **) malloc((my_argc+1) * sizeof(char *)); + cmd_line_list_tmp = cmd_line_list; + for (i = my_argc - 1; i >= 0; --i) { + my_argv_arg[i] = cmd_line_list_tmp->string_arg; + cmd_line_list_tmp = cmd_line_list_tmp->next; + } + my_argv_arg[my_argc] = 0; + + additional_error = (char *)malloc(strlen(filename) + strlen(ADDITIONAL_ERROR) + 1); + strcpy (additional_error, ADDITIONAL_ERROR); + strcat (additional_error, filename); + result = + cmdline_parser_internal (my_argc, my_argv_arg, args_info, override, initialize, check_required, additional_error); + + free (additional_error); + free (my_argv_arg); + +conf_failure: + if (file) + fclose(file); + + free_cmd_list(); + if (result == EXIT_FAILURE) + { + cmdline_parser_free (args_info); + exit (EXIT_FAILURE); + } + + return result; } diff --git a/ggsn/cmdline.h b/ggsn/cmdline.h index f083dbe..d9e3086 100644 --- a/ggsn/cmdline.h +++ b/ggsn/cmdline.h @@ -1,42 +1,78 @@ /* cmdline.h */ -/* File autogenerated by gengetopt version 2.8 */ +/* File autogenerated by gengetopt version 2.17 */ -#ifndef _cmdline_h -#define _cmdline_h +#ifndef CMDLINE_H +#define CMDLINE_H + +/* If we use autoconf. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ -/* Don't define PACKAGE and VERSION if we use automake. */ -#ifndef PACKAGE -#define PACKAGE "" +#ifndef CMDLINE_PARSER_PACKAGE +#define CMDLINE_PARSER_PACKAGE PACKAGE #endif -#ifndef VERSION -#define VERSION "" +#ifndef CMDLINE_PARSER_VERSION +#define CMDLINE_PARSER_VERSION VERSION #endif struct gengetopt_args_info { + const char *help_help; /* Print help and exit help description. */ + const char *version_help; /* Print version and exit help description. */ int fg_flag; /* Run in foreground (default=off). */ + const char *fg_help; /* Run in foreground help description. */ int debug_flag; /* Run in debug mode (default=off). */ + const char *debug_help; /* Run in debug mode help description. */ char * conf_arg; /* Read configuration file (default='/etc/ggsn.conf'). */ + char * conf_orig; /* Read configuration file original value given at command line. */ + const char *conf_help; /* Read configuration file help description. */ char * pidfile_arg; /* Filename of process id file (default='/var/run/ggsn.pid'). */ + char * pidfile_orig; /* Filename of process id file original value given at command line. */ + const char *pidfile_help; /* Filename of process id file help description. */ char * statedir_arg; /* Directory of nonvolatile data (default='/var/lib/ggsn/'). */ + char * statedir_orig; /* Directory of nonvolatile data original value given at command line. */ + const char *statedir_help; /* Directory of nonvolatile data help description. */ char * listen_arg; /* Local interface. */ + char * listen_orig; /* Local interface original value given at command line. */ + const char *listen_help; /* Local interface help description. */ char * net_arg; /* Network (default='192.168.0.0/24'). */ + char * net_orig; /* Network original value given at command line. */ + const char *net_help; /* Network help description. */ char * ipup_arg; /* Script to run after link-up. */ + char * ipup_orig; /* Script to run after link-up original value given at command line. */ + const char *ipup_help; /* Script to run after link-up help description. */ char * ipdown_arg; /* Script to run after link-down. */ + char * ipdown_orig; /* Script to run after link-down original value given at command line. */ + const char *ipdown_help; /* Script to run after link-down help description. */ char * dynip_arg; /* Dynamic IP address pool. */ + char * dynip_orig; /* Dynamic IP address pool original value given at command line. */ + const char *dynip_help; /* Dynamic IP address pool help description. */ char * statip_arg; /* Static IP address pool. */ + char * statip_orig; /* Static IP address pool original value given at command line. */ + const char *statip_help; /* Static IP address pool help description. */ char * pcodns1_arg; /* PCO DNS Server 1 (default='0.0.0.0'). */ + char * pcodns1_orig; /* PCO DNS Server 1 original value given at command line. */ + const char *pcodns1_help; /* PCO DNS Server 1 help description. */ char * pcodns2_arg; /* PCO DNS Server 2 (default='0.0.0.0'). */ + char * pcodns2_orig; /* PCO DNS Server 2 original value given at command line. */ + const char *pcodns2_help; /* PCO DNS Server 2 help description. */ int timelimit_arg; /* Exit after timelimit seconds (default='0'). */ + char * timelimit_orig; /* Exit after timelimit seconds original value given at command line. */ + const char *timelimit_help; /* Exit after timelimit seconds help description. */ char * apn_arg; /* Access point name (default='internet'). */ + char * apn_orig; /* Access point name original value given at command line. */ + const char *apn_help; /* Access point name help description. */ int qos_arg; /* Requested quality of service (default='0x0b921f'). */ - + char * qos_orig; /* Requested quality of service original value given at command line. */ + const char *qos_help; /* Requested quality of service help description. */ + int help_given ; /* Whether help was given. */ int version_given ; /* Whether version was given. */ int fg_given ; /* Whether fg was given. */ @@ -58,14 +94,33 @@ struct gengetopt_args_info } ; -int cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info); +extern const char *gengetopt_args_info_purpose; +extern const char *gengetopt_args_info_usage; +extern const char *gengetopt_args_info_help[]; + +int cmdline_parser (int argc, char * const *argv, + struct gengetopt_args_info *args_info); +int cmdline_parser2 (int argc, char * const *argv, + struct gengetopt_args_info *args_info, + int override, int initialize, int check_required); +int cmdline_parser_file_save(const char *filename, + struct gengetopt_args_info *args_info); void cmdline_parser_print_help(void); void cmdline_parser_print_version(void); -int cmdline_parser_configfile (char * const filename, struct gengetopt_args_info *args_info, int override); +void cmdline_parser_init (struct gengetopt_args_info *args_info); +void cmdline_parser_free (struct gengetopt_args_info *args_info); + +int cmdline_parser_configfile (char * const filename, + struct gengetopt_args_info *args_info, + int override, int initialize, int check_required); + +int cmdline_parser_required (struct gengetopt_args_info *args_info, + const char *prog_name); + #ifdef __cplusplus } #endif /* __cplusplus */ -#endif /* _cmdline_h */ +#endif /* CMDLINE_H */ diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index 5f120f3..52a2022 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -261,7 +261,7 @@ int main(int argc, char **argv) /* Try out our new parser */ - if (cmdline_parser_configfile (args_info.conf_arg, &args_info, 0) != 0) + if (cmdline_parser_configfile (args_info.conf_arg, &args_info, 0, 0, 0) != 0) exit(1); if (args_info.debug_flag) { printf("cmdline_parser_configfile\n"); @@ -532,6 +532,7 @@ int main(int argc, char **argv) } + cmdline_parser_free(&args_info); ippool_free(ippool); gtp_free(gsn); tun_free(tun); |