/*
  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;
}
