/*
  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",
  "  -d, --debug            Run in debug mode  (default=off)",
  "  -c, --conf=STRING      Read configuration file",
  "      --pidfile=STRING   Filename of process id file  (default=`./sgsnemu.pid')",
  "      --statedir=STRING  Directory of nonvolatile data  (default=`./')",
  "      --dns=STRING       DNS Server to use",
  "  -l, --listen=STRING    Local interface",
  "  -r, --remote=STRING    Remote host",
  "      --contexts=INT     Number of contexts  (default=`1')",
  "      --timelimit=INT    Exit after timelimit seconds  (default=`0')",
  "      --gtpversion=INT   GTP version to use  (default=`1')",
  "  -a, --apn=STRING       Access point name  (default=`internet')",
  "      --selmode=INT      Selection mode  (default=`0x01')",
  "  -i, --imsi=STRING      IMSI  (default=`240010123456789')",
  "      --nsapi=INT        NSAPI  (default=`0')",
  "  -m, --msisdn=STRING    Mobile Station ISDN number  (default=`46702123456')",
  "  -q, --qos=INT          Requested quality of service  (default=`0x0b921f')",
  "      --charging=INT     Charging characteristics  (default=`0x0800')",
  "  -u, --uid=STRING       Login user ID  (default=`mig')",
  "  -p, --pwd=STRING       Login password  (default=`hemmelig')",
  "      --createif         Create local network interface  (default=off)",
  "  -n, --net=STRING       Network address for local interface",
  "      --defaultroute     Create default route  (default=off)",
  "      --ipup=STRING      Script to run after link-up",
  "      --ipdown=STRING    Script to run after link-down",
  "      --pinghost=STRING  Ping remote host",
  "      --pingrate=INT     Number of ping req per second  (default=`1')",
  "      --pingsize=INT     Number of ping data bytes  (default=`56')",
  "      --pingcount=INT    Number of ping req to send  (default=`0')",
  "      --pingquiet        Do not print ping packet info  (default=off)",
    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->debug_given = 0 ;
  args_info->conf_given = 0 ;
  args_info->pidfile_given = 0 ;
  args_info->statedir_given = 0 ;
  args_info->dns_given = 0 ;
  args_info->listen_given = 0 ;
  args_info->remote_given = 0 ;
  args_info->contexts_given = 0 ;
  args_info->timelimit_given = 0 ;
  args_info->gtpversion_given = 0 ;
  args_info->apn_given = 0 ;
  args_info->selmode_given = 0 ;
  args_info->imsi_given = 0 ;
  args_info->nsapi_given = 0 ;
  args_info->msisdn_given = 0 ;
  args_info->qos_given = 0 ;
  args_info->charging_given = 0 ;
  args_info->uid_given = 0 ;
  args_info->pwd_given = 0 ;
  args_info->createif_given = 0 ;
  args_info->net_given = 0 ;
  args_info->defaultroute_given = 0 ;
  args_info->ipup_given = 0 ;
  args_info->ipdown_given = 0 ;
  args_info->pinghost_given = 0 ;
  args_info->pingrate_given = 0 ;
  args_info->pingsize_given = 0 ;
  args_info->pingcount_given = 0 ;
  args_info->pingquiet_given = 0 ;
}

static
void clear_args (struct gengetopt_args_info *args_info)
{
  args_info->debug_flag = 0;
  args_info->conf_arg = NULL;
  args_info->conf_orig = NULL;
  args_info->pidfile_arg = gengetopt_strdup ("./sgsnemu.pid");
  args_info->pidfile_orig = NULL;
  args_info->statedir_arg = gengetopt_strdup ("./");
  args_info->statedir_orig = NULL;
  args_info->dns_arg = NULL;
  args_info->dns_orig = NULL;
  args_info->listen_arg = NULL;
  args_info->listen_orig = NULL;
  args_info->remote_arg = NULL;
  args_info->remote_orig = NULL;
  args_info->contexts_arg = 1;
  args_info->contexts_orig = NULL;
  args_info->timelimit_arg = 0;
  args_info->timelimit_orig = NULL;
  args_info->gtpversion_arg = 1;
  args_info->gtpversion_orig = NULL;
  args_info->apn_arg = gengetopt_strdup ("internet");
  args_info->apn_orig = NULL;
  args_info->selmode_arg = 0x01;
  args_info->selmode_orig = NULL;
  args_info->imsi_arg = gengetopt_strdup ("240010123456789");
  args_info->imsi_orig = NULL;
  args_info->nsapi_arg = 0;
  args_info->nsapi_orig = NULL;
  args_info->msisdn_arg = gengetopt_strdup ("46702123456");
  args_info->msisdn_orig = NULL;
  args_info->qos_arg = 0x0b921f;
  args_info->qos_orig = NULL;
  args_info->charging_arg = 0x0800;
  args_info->charging_orig = NULL;
  args_info->uid_arg = gengetopt_strdup ("mig");
  args_info->uid_orig = NULL;
  args_info->pwd_arg = gengetopt_strdup ("hemmelig");
  args_info->pwd_orig = NULL;
  args_info->createif_flag = 0;
  args_info->net_arg = NULL;
  args_info->net_orig = NULL;
  args_info->defaultroute_flag = 0;
  args_info->ipup_arg = NULL;
  args_info->ipup_orig = NULL;
  args_info->ipdown_arg = NULL;
  args_info->ipdown_orig = NULL;
  args_info->pinghost_arg = NULL;
  args_info->pinghost_orig = NULL;
  args_info->pingrate_arg = 1;
  args_info->pingrate_orig = NULL;
  args_info->pingsize_arg = 56;
  args_info->pingsize_orig = NULL;
  args_info->pingcount_arg = 0;
  args_info->pingcount_orig = NULL;
  args_info->pingquiet_flag = 0;
  
}

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->debug_help = gengetopt_args_info_help[2] ;
  args_info->conf_help = gengetopt_args_info_help[3] ;
  args_info->pidfile_help = gengetopt_args_info_help[4] ;
  args_info->statedir_help = gengetopt_args_info_help[5] ;
  args_info->dns_help = gengetopt_args_info_help[6] ;
  args_info->listen_help = gengetopt_args_info_help[7] ;
  args_info->remote_help = gengetopt_args_info_help[8] ;
  args_info->contexts_help = gengetopt_args_info_help[9] ;
  args_info->timelimit_help = gengetopt_args_info_help[10] ;
  args_info->gtpversion_help = gengetopt_args_info_help[11] ;
  args_info->apn_help = gengetopt_args_info_help[12] ;
  args_info->selmode_help = gengetopt_args_info_help[13] ;
  args_info->imsi_help = gengetopt_args_info_help[14] ;
  args_info->nsapi_help = gengetopt_args_info_help[15] ;
  args_info->msisdn_help = gengetopt_args_info_help[16] ;
  args_info->qos_help = gengetopt_args_info_help[17] ;
  args_info->charging_help = gengetopt_args_info_help[18] ;
  args_info->uid_help = gengetopt_args_info_help[19] ;
  args_info->pwd_help = gengetopt_args_info_help[20] ;
  args_info->createif_help = gengetopt_args_info_help[21] ;
  args_info->net_help = gengetopt_args_info_help[22] ;
  args_info->defaultroute_help = gengetopt_args_info_help[23] ;
  args_info->ipup_help = gengetopt_args_info_help[24] ;
  args_info->ipdown_help = gengetopt_args_info_help[25] ;
  args_info->pinghost_help = gengetopt_args_info_help[26] ;
  args_info->pingrate_help = gengetopt_args_info_help[27] ;
  args_info->pingsize_help = gengetopt_args_info_help[28] ;
  args_info->pingcount_help = gengetopt_args_info_help[29] ;
  args_info->pingquiet_help = gengetopt_args_info_help[30] ;
  
}

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->dns_arg)
    {
      free (args_info->dns_arg); /* free previous argument */
      args_info->dns_arg = 0;
    }
  if (args_info->dns_orig)
    {
      free (args_info->dns_orig); /* free previous argument */
      args_info->dns_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->remote_arg)
    {
      free (args_info->remote_arg); /* free previous argument */
      args_info->remote_arg = 0;
    }
  if (args_info->remote_orig)
    {
      free (args_info->remote_orig); /* free previous argument */
      args_info->remote_orig = 0;
    }
  if (args_info->contexts_orig)
    {
      free (args_info->contexts_orig); /* free previous argument */
      args_info->contexts_orig = 0;
    }
  if (args_info->timelimit_orig)
    {
      free (args_info->timelimit_orig); /* free previous argument */
      args_info->timelimit_orig = 0;
    }
  if (args_info->gtpversion_orig)
    {
      free (args_info->gtpversion_orig); /* free previous argument */
      args_info->gtpversion_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->selmode_orig)
    {
      free (args_info->selmode_orig); /* free previous argument */
      args_info->selmode_orig = 0;
    }
  if (args_info->imsi_arg)
    {
      free (args_info->imsi_arg); /* free previous argument */
      args_info->imsi_arg = 0;
    }
  if (args_info->imsi_orig)
    {
      free (args_info->imsi_orig); /* free previous argument */
      args_info->imsi_orig = 0;
    }
  if (args_info->nsapi_orig)
    {
      free (args_info->nsapi_orig); /* free previous argument */
      args_info->nsapi_orig = 0;
    }
  if (args_info->msisdn_arg)
    {
      free (args_info->msisdn_arg); /* free previous argument */
      args_info->msisdn_arg = 0;
    }
  if (args_info->msisdn_orig)
    {
      free (args_info->msisdn_orig); /* free previous argument */
      args_info->msisdn_orig = 0;
    }
  if (args_info->qos_orig)
    {
      free (args_info->qos_orig); /* free previous argument */
      args_info->qos_orig = 0;
    }
  if (args_info->charging_orig)
    {
      free (args_info->charging_orig); /* free previous argument */
      args_info->charging_orig = 0;
    }
  if (args_info->uid_arg)
    {
      free (args_info->uid_arg); /* free previous argument */
      args_info->uid_arg = 0;
    }
  if (args_info->uid_orig)
    {
      free (args_info->uid_orig); /* free previous argument */
      args_info->uid_orig = 0;
    }
  if (args_info->pwd_arg)
    {
      free (args_info->pwd_arg); /* free previous argument */
      args_info->pwd_arg = 0;
    }
  if (args_info->pwd_orig)
    {
      free (args_info->pwd_orig); /* free previous argument */
      args_info->pwd_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->pinghost_arg)
    {
      free (args_info->pinghost_arg); /* free previous argument */
      args_info->pinghost_arg = 0;
    }
  if (args_info->pinghost_orig)
    {
      free (args_info->pinghost_orig); /* free previous argument */
      args_info->pinghost_orig = 0;
    }
  if (args_info->pingrate_orig)
    {
      free (args_info->pingrate_orig); /* free previous argument */
      args_info->pingrate_orig = 0;
    }
  if (args_info->pingsize_orig)
    {
      free (args_info->pingsize_orig); /* free previous argument */
      args_info->pingsize_orig = 0;
    }
  if (args_info->pingcount_orig)
    {
      free (args_info->pingcount_orig); /* free previous argument */
      args_info->pingcount_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->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->dns_given) {
    if (args_info->dns_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "dns", args_info->dns_orig);
    } else {
      fprintf(outfile, "%s\n", "dns");
    }
  }
  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->remote_given) {
    if (args_info->remote_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "remote", args_info->remote_orig);
    } else {
      fprintf(outfile, "%s\n", "remote");
    }
  }
  if (args_info->contexts_given) {
    if (args_info->contexts_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "contexts", args_info->contexts_orig);
    } else {
      fprintf(outfile, "%s\n", "contexts");
    }
  }
  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->gtpversion_given) {
    if (args_info->gtpversion_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "gtpversion", args_info->gtpversion_orig);
    } else {
      fprintf(outfile, "%s\n", "gtpversion");
    }
  }
  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->selmode_given) {
    if (args_info->selmode_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "selmode", args_info->selmode_orig);
    } else {
      fprintf(outfile, "%s\n", "selmode");
    }
  }
  if (args_info->imsi_given) {
    if (args_info->imsi_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "imsi", args_info->imsi_orig);
    } else {
      fprintf(outfile, "%s\n", "imsi");
    }
  }
  if (args_info->nsapi_given) {
    if (args_info->nsapi_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "nsapi", args_info->nsapi_orig);
    } else {
      fprintf(outfile, "%s\n", "nsapi");
    }
  }
  if (args_info->msisdn_given) {
    if (args_info->msisdn_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "msisdn", args_info->msisdn_orig);
    } else {
      fprintf(outfile, "%s\n", "msisdn");
    }
  }
  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");
    }
  }
  if (args_info->charging_given) {
    if (args_info->charging_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "charging", args_info->charging_orig);
    } else {
      fprintf(outfile, "%s\n", "charging");
    }
  }
  if (args_info->uid_given) {
    if (args_info->uid_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "uid", args_info->uid_orig);
    } else {
      fprintf(outfile, "%s\n", "uid");
    }
  }
  if (args_info->pwd_given) {
    if (args_info->pwd_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "pwd", args_info->pwd_orig);
    } else {
      fprintf(outfile, "%s\n", "pwd");
    }
  }
  if (args_info->createif_given) {
    fprintf(outfile, "%s\n", "createif");
  }
  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->defaultroute_given) {
    fprintf(outfile, "%s\n", "defaultroute");
  }
  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->pinghost_given) {
    if (args_info->pinghost_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "pinghost", args_info->pinghost_orig);
    } else {
      fprintf(outfile, "%s\n", "pinghost");
    }
  }
  if (args_info->pingrate_given) {
    if (args_info->pingrate_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "pingrate", args_info->pingrate_orig);
    } else {
      fprintf(outfile, "%s\n", "pingrate");
    }
  }
  if (args_info->pingsize_given) {
    if (args_info->pingsize_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "pingsize", args_info->pingsize_orig);
    } else {
      fprintf(outfile, "%s\n", "pingsize");
    }
  }
  if (args_info->pingcount_given) {
    if (args_info->pingcount_orig) {
      fprintf(outfile, "%s=\"%s\"\n", "pingcount", args_info->pingcount_orig);
    } else {
      fprintf(outfile, "%s\n", "pingcount");
    }
  }
  if (args_info->pingquiet_given) {
    fprintf(outfile, "%s\n", "pingquiet");
  }
  
  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' },
        { "debug",	0, NULL, 'd' },
        { "conf",	1, NULL, 'c' },
        { "pidfile",	1, NULL, 0 },
        { "statedir",	1, NULL, 0 },
        { "dns",	1, NULL, 0 },
        { "listen",	1, NULL, 'l' },
        { "remote",	1, NULL, 'r' },
        { "contexts",	1, NULL, 0 },
        { "timelimit",	1, NULL, 0 },
        { "gtpversion",	1, NULL, 0 },
        { "apn",	1, NULL, 'a' },
        { "selmode",	1, NULL, 0 },
        { "imsi",	1, NULL, 'i' },
        { "nsapi",	1, NULL, 0 },
        { "msisdn",	1, NULL, 'm' },
        { "qos",	1, NULL, 'q' },
        { "charging",	1, NULL, 0 },
        { "uid",	1, NULL, 'u' },
        { "pwd",	1, NULL, 'p' },
        { "createif",	0, NULL, 0 },
        { "net",	1, NULL, 'n' },
        { "defaultroute",	0, NULL, 0 },
        { "ipup",	1, NULL, 0 },
        { "ipdown",	1, NULL, 0 },
        { "pinghost",	1, NULL, 0 },
        { "pingrate",	1, NULL, 0 },
        { "pingsize",	1, NULL, 0 },
        { "pingcount",	1, NULL, 0 },
        { "pingquiet",	0, NULL, 0 },
        { NULL,	0, NULL, 0 }
      };

      stop_char = 0;
      c = getopt_long (argc, argv, "hVdc:l:r:a:i:m:q:u:p:n:", 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 '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 'r':	/* Remote host.  */
          if (local_args_info.remote_given)
            {
              fprintf (stderr, "%s: `--remote' (`-r') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
              goto failure;
            }
          if (args_info->remote_given && ! override)
            continue;
          local_args_info.remote_given = 1;
          args_info->remote_given = 1;
          if (args_info->remote_arg)
            free (args_info->remote_arg); /* free previous string */
          args_info->remote_arg = gengetopt_strdup (optarg);
          if (args_info->remote_orig)
            free (args_info->remote_orig); /* free previous string */
          args_info->remote_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 'i':	/* IMSI.  */
          if (local_args_info.imsi_given)
            {
              fprintf (stderr, "%s: `--imsi' (`-i') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
              goto failure;
            }
          if (args_info->imsi_given && ! override)
            continue;
          local_args_info.imsi_given = 1;
          args_info->imsi_given = 1;
          if (args_info->imsi_arg)
            free (args_info->imsi_arg); /* free previous string */
          args_info->imsi_arg = gengetopt_strdup (optarg);
          if (args_info->imsi_orig)
            free (args_info->imsi_orig); /* free previous string */
          args_info->imsi_orig = gengetopt_strdup (optarg);
          break;

        case 'm':	/* Mobile Station ISDN number.  */
          if (local_args_info.msisdn_given)
            {
              fprintf (stderr, "%s: `--msisdn' (`-m') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
              goto failure;
            }
          if (args_info->msisdn_given && ! override)
            continue;
          local_args_info.msisdn_given = 1;
          args_info->msisdn_given = 1;
          if (args_info->msisdn_arg)
            free (args_info->msisdn_arg); /* free previous string */
          args_info->msisdn_arg = gengetopt_strdup (optarg);
          if (args_info->msisdn_orig)
            free (args_info->msisdn_orig); /* free previous string */
          args_info->msisdn_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 'u':	/* Login user ID.  */
          if (local_args_info.uid_given)
            {
              fprintf (stderr, "%s: `--uid' (`-u') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
              goto failure;
            }
          if (args_info->uid_given && ! override)
            continue;
          local_args_info.uid_given = 1;
          args_info->uid_given = 1;
          if (args_info->uid_arg)
            free (args_info->uid_arg); /* free previous string */
          args_info->uid_arg = gengetopt_strdup (optarg);
          if (args_info->uid_orig)
            free (args_info->uid_orig); /* free previous string */
          args_info->uid_orig = gengetopt_strdup (optarg);
          break;

        case 'p':	/* Login password.  */
          if (local_args_info.pwd_given)
            {
              fprintf (stderr, "%s: `--pwd' (`-p') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
              goto failure;
            }
          if (args_info->pwd_given && ! override)
            continue;
          local_args_info.pwd_given = 1;
          args_info->pwd_given = 1;
          if (args_info->pwd_arg)
            free (args_info->pwd_arg); /* free previous string */
          args_info->pwd_arg = gengetopt_strdup (optarg);
          if (args_info->pwd_orig)
            free (args_info->pwd_orig); /* free previous string */
          args_info->pwd_orig = gengetopt_strdup (optarg);
          break;

        case 'n':	/* Network address for local interface.  */
          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 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);
          }
          /* DNS Server to use.  */
          else if (strcmp (long_options[option_index].name, "dns") == 0)
          {
            if (local_args_info.dns_given)
              {
                fprintf (stderr, "%s: `--dns' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->dns_given && ! override)
              continue;
            local_args_info.dns_given = 1;
            args_info->dns_given = 1;
            if (args_info->dns_arg)
              free (args_info->dns_arg); /* free previous string */
            args_info->dns_arg = gengetopt_strdup (optarg);
            if (args_info->dns_orig)
              free (args_info->dns_orig); /* free previous string */
            args_info->dns_orig = gengetopt_strdup (optarg);
          }
          /* Number of contexts.  */
          else if (strcmp (long_options[option_index].name, "contexts") == 0)
          {
            if (local_args_info.contexts_given)
              {
                fprintf (stderr, "%s: `--contexts' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->contexts_given && ! override)
              continue;
            local_args_info.contexts_given = 1;
            args_info->contexts_given = 1;
            args_info->contexts_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->contexts_orig)
              free (args_info->contexts_orig); /* free previous string */
            args_info->contexts_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);
          }
          /* GTP version to use.  */
          else if (strcmp (long_options[option_index].name, "gtpversion") == 0)
          {
            if (local_args_info.gtpversion_given)
              {
                fprintf (stderr, "%s: `--gtpversion' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->gtpversion_given && ! override)
              continue;
            local_args_info.gtpversion_given = 1;
            args_info->gtpversion_given = 1;
            args_info->gtpversion_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->gtpversion_orig)
              free (args_info->gtpversion_orig); /* free previous string */
            args_info->gtpversion_orig = gengetopt_strdup (optarg);
          }
          /* Selection mode.  */
          else if (strcmp (long_options[option_index].name, "selmode") == 0)
          {
            if (local_args_info.selmode_given)
              {
                fprintf (stderr, "%s: `--selmode' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->selmode_given && ! override)
              continue;
            local_args_info.selmode_given = 1;
            args_info->selmode_given = 1;
            args_info->selmode_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->selmode_orig)
              free (args_info->selmode_orig); /* free previous string */
            args_info->selmode_orig = gengetopt_strdup (optarg);
          }
          /* NSAPI.  */
          else if (strcmp (long_options[option_index].name, "nsapi") == 0)
          {
            if (local_args_info.nsapi_given)
              {
                fprintf (stderr, "%s: `--nsapi' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->nsapi_given && ! override)
              continue;
            local_args_info.nsapi_given = 1;
            args_info->nsapi_given = 1;
            args_info->nsapi_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->nsapi_orig)
              free (args_info->nsapi_orig); /* free previous string */
            args_info->nsapi_orig = gengetopt_strdup (optarg);
          }
          /* Charging characteristics.  */
          else if (strcmp (long_options[option_index].name, "charging") == 0)
          {
            if (local_args_info.charging_given)
              {
                fprintf (stderr, "%s: `--charging' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->charging_given && ! override)
              continue;
            local_args_info.charging_given = 1;
            args_info->charging_given = 1;
            args_info->charging_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->charging_orig)
              free (args_info->charging_orig); /* free previous string */
            args_info->charging_orig = gengetopt_strdup (optarg);
          }
          /* Create local network interface.  */
          else if (strcmp (long_options[option_index].name, "createif") == 0)
          {
            if (local_args_info.createif_given)
              {
                fprintf (stderr, "%s: `--createif' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->createif_given && ! override)
              continue;
            local_args_info.createif_given = 1;
            args_info->createif_given = 1;
            args_info->createif_flag = !(args_info->createif_flag);
          }
          /* Create default route.  */
          else if (strcmp (long_options[option_index].name, "defaultroute") == 0)
          {
            if (local_args_info.defaultroute_given)
              {
                fprintf (stderr, "%s: `--defaultroute' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->defaultroute_given && ! override)
              continue;
            local_args_info.defaultroute_given = 1;
            args_info->defaultroute_given = 1;
            args_info->defaultroute_flag = !(args_info->defaultroute_flag);
          }
          /* 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);
          }
          /* Ping remote host.  */
          else if (strcmp (long_options[option_index].name, "pinghost") == 0)
          {
            if (local_args_info.pinghost_given)
              {
                fprintf (stderr, "%s: `--pinghost' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->pinghost_given && ! override)
              continue;
            local_args_info.pinghost_given = 1;
            args_info->pinghost_given = 1;
            if (args_info->pinghost_arg)
              free (args_info->pinghost_arg); /* free previous string */
            args_info->pinghost_arg = gengetopt_strdup (optarg);
            if (args_info->pinghost_orig)
              free (args_info->pinghost_orig); /* free previous string */
            args_info->pinghost_orig = gengetopt_strdup (optarg);
          }
          /* Number of ping req per second.  */
          else if (strcmp (long_options[option_index].name, "pingrate") == 0)
          {
            if (local_args_info.pingrate_given)
              {
                fprintf (stderr, "%s: `--pingrate' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->pingrate_given && ! override)
              continue;
            local_args_info.pingrate_given = 1;
            args_info->pingrate_given = 1;
            args_info->pingrate_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->pingrate_orig)
              free (args_info->pingrate_orig); /* free previous string */
            args_info->pingrate_orig = gengetopt_strdup (optarg);
          }
          /* Number of ping data bytes.  */
          else if (strcmp (long_options[option_index].name, "pingsize") == 0)
          {
            if (local_args_info.pingsize_given)
              {
                fprintf (stderr, "%s: `--pingsize' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->pingsize_given && ! override)
              continue;
            local_args_info.pingsize_given = 1;
            args_info->pingsize_given = 1;
            args_info->pingsize_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->pingsize_orig)
              free (args_info->pingsize_orig); /* free previous string */
            args_info->pingsize_orig = gengetopt_strdup (optarg);
          }
          /* Number of ping req to send.  */
          else if (strcmp (long_options[option_index].name, "pingcount") == 0)
          {
            if (local_args_info.pingcount_given)
              {
                fprintf (stderr, "%s: `--pingcount' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->pingcount_given && ! override)
              continue;
            local_args_info.pingcount_given = 1;
            args_info->pingcount_given = 1;
            args_info->pingcount_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->pingcount_orig)
              free (args_info->pingcount_orig); /* free previous string */
            args_info->pingcount_orig = gengetopt_strdup (optarg);
          }
          /* Do not print ping packet info.  */
          else if (strcmp (long_options[option_index].name, "pingquiet") == 0)
          {
            if (local_args_info.pingquiet_given)
              {
                fprintf (stderr, "%s: `--pingquiet' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
                goto failure;
              }
            if (args_info->pingquiet_given && ! override)
              continue;
            local_args_info.pingquiet_given = 1;
            args_info->pingquiet_given = 1;
            args_info->pingquiet_flag = !(args_info->pingquiet_flag);
          }
          
          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;
}
