/*
  File autogenerated by gengetopt version 2.17
  generated with the following command:
  gengetopt --conf-parser 

  The developers of gengetopt consider the fixed text that goes in all
  gengetopt output files to be in the public domain:
  we make no copyright claims on it.
*/

/* If we use autoconf.  */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "getopt.h"

#include "cmdline.h"

const char *gengetopt_args_info_purpose = "";

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 {
	char *string_arg;
	struct line_list *next;
};

static struct line_list *cmd_line_list = 0;
static struct line_list *cmd_line_list_tmp = 0;

static void free_cmd_list(void)
{
	/* 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);
		}
	}
}

static char *gengetopt_strdup(const char *s);

static
void clear_given(struct gengetopt_args_info *args_info)
{
	args_info->help_given = 0;
	args_info->version_given = 0;
	args_info->fg_given = 0;
	args_info->debug_given = 0;
	args_info->conf_given = 0;
	args_info->pidfile_given = 0;
	args_info->statedir_given = 0;
	args_info->listen_given = 0;
	args_info->net_given = 0;
	args_info->ipup_given = 0;
	args_info->ipdown_given = 0;
	args_info->dynip_given = 0;
	args_info->statip_given = 0;
	args_info->pcodns1_given = 0;
	args_info->pcodns2_given = 0;
	args_info->timelimit_given = 0;
	args_info->apn_given = 0;
	args_info->qos_given = 0;
}

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 = 0;
	opterr = 1;
	optopt = '?';

	while (1) {
		int option_index = 0;
		char *stop_char;

		static struct option long_options[] = {
			{"help", 0, NULL, 'h'},
			{"version", 0, NULL, 'V'},
			{"fg", 0, NULL, 'f'},
			{"debug", 0, NULL, 'd'},
			{"conf", 1, NULL, 'c'},
			{"pidfile", 1, NULL, 0},
			{"statedir", 1, NULL, 0},
			{"listen", 1, NULL, 'l'},
			{"net", 1, NULL, 'n'},
			{"ipup", 1, NULL, 0},
			{"ipdown", 1, NULL, 0},
			{"dynip", 1, NULL, 0},
			{"statip", 1, NULL, 0},
			{"pcodns1", 1, NULL, 0},
			{"pcodns2", 1, NULL, 0},
			{"timelimit", 1, NULL, 0},
			{"apn", 1, NULL, 'a'},
			{"qos", 1, NULL, 'q'},
			{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.  */

		switch (c) {
		case 'h':	/* Print help and exit.  */
			cmdline_parser_print_help();
			cmdline_parser_free(&local_args_info);
			exit(EXIT_SUCCESS);

		case 'V':	/* Print version and exit.  */
			cmdline_parser_print_version();
			cmdline_parser_free(&local_args_info);
			exit(EXIT_SUCCESS);

		case 'f':	/* Run in foreground.  */
			if (local_args_info.fg_given) {
				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 (local_args_info.debug_given) {
				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 (local_args_info.conf_given) {
				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;
			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 (local_args_info.listen_given) {
				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;
			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 (local_args_info.net_given) {
				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;
			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 (local_args_info.apn_given) {
				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;
			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 (local_args_info.qos_given) {
				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);
			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;

		case 0:	/* Long option with no short option */
			/* Filename of process id file.  */
			if (strcmp(long_options[option_index].name, "pidfile")
			    == 0) {
				if (local_args_info.pidfile_given) {
					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;
				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 (local_args_info.statedir_given) {
					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;
				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 (local_args_info.ipup_given) {
					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;
				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 (local_args_info.ipdown_given) {
					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;
				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 (local_args_info.dynip_given) {
					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;
				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 (local_args_info.statip_given) {
					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;
				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 (local_args_info.pcodns1_given) {
					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;
				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 (local_args_info.pcodns2_given) {
					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;
				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 (local_args_info.timelimit_given) {
					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);
				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.  */
			goto failure;

		default:	/* bug: option not considered.  */
			fprintf(stderr, "%s: option unknown: %c%s\n",
				CMDLINE_PARSER_PACKAGE, c,
				(additional_error ? additional_error : ""));
			abort();
		}		/* switch */
	}			/* while */

	cmdline_parser_release(&local_args_info);

	if (error)
		return (EXIT_FAILURE);

	return 0;

failure:

	cmdline_parser_release(&local_args_info);
	return (EXIT_FAILURE);
}

#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,
			  int initialize, int check_required)
{
	FILE *file;
	char linebuf[CONFIG_FILE_LINE_SIZE];
	int line_num = 0;
	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",
			CMDLINE_PARSER_PACKAGE, filename);
		result = EXIT_FAILURE;
		goto conf_failure;
	}

	while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != NULL) {
		++line_num;
		my_argv[0] = '\0';
		len = strlen(linebuf);
		if (len > (CONFIG_FILE_LINE_BUFFER_SIZE - 1)) {
			fprintf(stderr,
				"%s:%s:%d: Line too long in configuration file\n",
				CMDLINE_PARSER_PACKAGE, filename, line_num);
			result = EXIT_FAILURE;
			goto conf_failure;
		}

		/* 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 */
			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) {
				fprintf
				    (stderr,
				     "%s:%s:%d: unterminated string in configuration file\n",
				     CMDLINE_PARSER_PACKAGE, filename,
				     line_num);
				result = EXIT_FAILURE;
				goto conf_failure;
			}
		} 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 != '#') {
				fprintf
				    (stderr,
				     "%s:%s:%d: malformed string in configuration file\n",
				     CMDLINE_PARSER_PACKAGE, filename,
				     line_num);
				result = EXIT_FAILURE;
				goto conf_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 */

	++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;
}
