sgsnemu: Re-generate cmdline.[ch] using gengetopt

This will replace the manual additions to cmdline.[ch] with
auto-generated code from gengetopt.  We need to fix-up the RAT Type in
sgsnemu.c as the manually-added code diverged from what gengetopt
generates.

Change-Id: Ia687e13d5cec1655a57078a767d2123aa022842c
diff --git a/sgsnemu/cmdline.c b/sgsnemu/cmdline.c
index 1ff1a59..88210d7 100644
--- a/sgsnemu/cmdline.c
+++ b/sgsnemu/cmdline.c
@@ -1,5 +1,5 @@
 /*
-  File autogenerated by gengetopt version 2.17
+  File autogenerated by gengetopt version 2.22.6
   generated with the following command:
   gengetopt --conf-parser 
 
@@ -17,7 +17,11 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "getopt.h"
+#ifndef FIX_UNUSED
+#define FIX_UNUSED(X) (void) (X)	/* avoid warnings for unused params */
+#endif
+
+#include <getopt.h>
 
 #include "cmdline.h"
 
@@ -26,60 +30,67 @@
 const char *gengetopt_args_info_usage =
     "Usage: " CMDLINE_PARSER_PACKAGE " [OPTIONS]...";
 
+const char *gengetopt_args_info_versiontext = "";
+
+const char *gengetopt_args_info_description = "";
+
 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')",
-	"      --rattype=INT      Radio Access Technology Type (optional-1to5)",
-	"      --userloc=STRING   User Location Information (optional-type.MCC.MNC.LAC.CIorSACorRAC)",
-	"      --rai=STRING       Routing Area Information (optional-MCC.MNC.LAC.RAC)",
-	"      --mstz=STRING      MS Time Zone (optional- sign.NbQuartersOfAnHour.DSTAdjustment)",
-	"      --imeisv=STRING    IMEI(SV) International Mobile Equipment Identity (and Software Version) (optional,16 digits)",
-	"  -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=`0x000b921f')",
-	"      --qose1=INT        Requested quality of service Extension 1 (example=`0x9396404074f9ffff')",
-	"      --qose2=INT        Requested quality of service Extension 2 (example=`0x11')",
-	"      --qose3=INT        Requested quality of service Extension 3 (example=`0x0101')",
-	"      --qose4=INT        Requested quality of service Extension 4 (example=`0x4040')",
-	"      --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)",
-	"      --norecovery       Do not send recovery (default=off)",
+	"  -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\n                                  (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')",
+	"      --rattype=1..5            Radio Access Technology Type  (default=`1')",
+	"      --userloc=type.MCC.MNC.LAC.CIorSACorRAC\n                                User Location Information\n                                  (default=`02509946241207')",
+	"      --rai=MCC.MNC.LAC.RAC     Routing Area Information\n                                  (default=`02509946241207')",
+	"      --mstz=sign.NbQuartersOfAnHour.DSTAdjustment\n                                MS Time Zone  (default=`0')",
+	"      --imeisv=STRING           IMEI(SV) International Mobile Equipment\n                                  Identity (and Software Version)\n                                  (default=`2143658709214365')",
+	"      --norecovery              Do not send recovery  (default=off)",
+	"  -i, --imsi=STRING             IMSI  (default=`240010123456789')",
+	"      --nsapi=INT               NSAPI  (default=`0')",
+	"  -m, --msisdn=STRING           Mobile Station ISDN number\n                                  (default=`46702123456')",
+	"  -q, --qos=INT                 Requested quality of service\n                                  (default=`0x000b921f')",
+	"      --qose1=INT               Requested quality of service Extension 1\n                                  (default=`0x9396404074f9ffff')",
+	"      --qose2=INT               Requested quality of service Extension 2\n                                  (default=`0x11')",
+	"      --qose3=INT               Requested quality of service Extension 3\n                                  (default=`0x0101')",
+	"      --qose4=INT               Requested quality of service Extension 4\n                                  (default=`0x4040')",
+	"      --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
 };
 
+typedef enum { ARG_NO, ARG_FLAG, ARG_STRING, ARG_INT
+} cmdline_parser_arg_type;
+
 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,
+cmdline_parser_internal(int argc, char **argv,
+			struct gengetopt_args_info *args_info,
+			struct cmdline_parser_params *params,
 			const char *additional_error);
 
 struct line_list {
@@ -127,6 +138,7 @@
 	args_info->rai_given = 0;
 	args_info->mstz_given = 0;
 	args_info->imeisv_given = 0;
+	args_info->norecovery_given = 0;
 	args_info->imsi_given = 0;
 	args_info->nsapi_given = 0;
 	args_info->msisdn_given = 0;
@@ -148,12 +160,12 @@
 	args_info->pingsize_given = 0;
 	args_info->pingcount_given = 0;
 	args_info->pingquiet_given = 0;
-	args_info->norecovery_given = 0;
 }
 
 static
 void clear_args(struct gengetopt_args_info *args_info)
 {
+	FIX_UNUSED(args_info);
 	args_info->debug_flag = 0;
 	args_info->conf_arg = NULL;
 	args_info->conf_orig = NULL;
@@ -177,16 +189,17 @@
 	args_info->apn_orig = NULL;
 	args_info->selmode_arg = 0x01;
 	args_info->selmode_orig = NULL;
-	args_info->rattype_arg = "1";
+	args_info->rattype_arg = 1;
 	args_info->rattype_orig = NULL;
-	args_info->userloc_arg = strdup("02509946241207");
+	args_info->userloc_arg = gengetopt_strdup("02509946241207");
 	args_info->userloc_orig = NULL;
-	args_info->rai_arg = strdup("02509946241207");
+	args_info->rai_arg = gengetopt_strdup("02509946241207");
 	args_info->rai_orig = NULL;
-	args_info->mstz_arg = strdup("0");
+	args_info->mstz_arg = gengetopt_strdup("0");
 	args_info->mstz_orig = NULL;
-	args_info->imeisv_arg = strdup("2143658709214365");
+	args_info->imeisv_arg = gengetopt_strdup("2143658709214365");
 	args_info->imeisv_orig = NULL;
+	args_info->norecovery_flag = 0;
 	args_info->imsi_arg = gengetopt_strdup("240010123456789");
 	args_info->imsi_orig = NULL;
 	args_info->nsapi_arg = 0;
@@ -226,13 +239,13 @@
 	args_info->pingcount_arg = 0;
 	args_info->pingcount_orig = NULL;
 	args_info->pingquiet_flag = 0;
-	args_info->norecovery_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];
@@ -247,41 +260,67 @@
 	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];
-	args_info->norecovery_help = gengetopt_args_info_help[31];
+	args_info->rattype_help = gengetopt_args_info_help[14];
+	args_info->userloc_help = gengetopt_args_info_help[15];
+	args_info->rai_help = gengetopt_args_info_help[16];
+	args_info->mstz_help = gengetopt_args_info_help[17];
+	args_info->imeisv_help = gengetopt_args_info_help[18];
+	args_info->norecovery_help = gengetopt_args_info_help[19];
+	args_info->imsi_help = gengetopt_args_info_help[20];
+	args_info->nsapi_help = gengetopt_args_info_help[21];
+	args_info->msisdn_help = gengetopt_args_info_help[22];
+	args_info->qos_help = gengetopt_args_info_help[23];
+	args_info->qose1_help = gengetopt_args_info_help[24];
+	args_info->qose2_help = gengetopt_args_info_help[25];
+	args_info->qose3_help = gengetopt_args_info_help[26];
+	args_info->qose4_help = gengetopt_args_info_help[27];
+	args_info->charging_help = gengetopt_args_info_help[28];
+	args_info->uid_help = gengetopt_args_info_help[29];
+	args_info->pwd_help = gengetopt_args_info_help[30];
+	args_info->createif_help = gengetopt_args_info_help[31];
+	args_info->net_help = gengetopt_args_info_help[32];
+	args_info->defaultroute_help = gengetopt_args_info_help[33];
+	args_info->ipup_help = gengetopt_args_info_help[34];
+	args_info->ipdown_help = gengetopt_args_info_help[35];
+	args_info->pinghost_help = gengetopt_args_info_help[36];
+	args_info->pingrate_help = gengetopt_args_info_help[37];
+	args_info->pingsize_help = gengetopt_args_info_help[38];
+	args_info->pingcount_help = gengetopt_args_info_help[39];
+	args_info->pingquiet_help = gengetopt_args_info_help[40];
 
 }
 
 void cmdline_parser_print_version(void)
 {
-	printf("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
+	printf("%s %s\n",
+	       (strlen(CMDLINE_PARSER_PACKAGE_NAME) ?
+		CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE),
+	       CMDLINE_PARSER_VERSION);
+
+	if (strlen(gengetopt_args_info_versiontext) > 0)
+		printf("\n%s\n", gengetopt_args_info_versiontext);
 }
 
-void cmdline_parser_print_help(void)
+static void print_help_common(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);
+	if (strlen(gengetopt_args_info_usage) > 0)
+		printf("\n%s\n", gengetopt_args_info_usage);
+
+	printf("\n");
+
+	if (strlen(gengetopt_args_info_description) > 0)
+		printf("%s\n\n", gengetopt_args_info_description);
+}
+
+void cmdline_parser_print_help(void)
+{
+	int i = 0;
+	print_help_common();
 	while (gengetopt_args_info_help[i])
 		printf("%s\n", gengetopt_args_info_help[i++]);
 }
@@ -293,173 +332,212 @@
 	init_args_info(args_info);
 }
 
+void cmdline_parser_params_init(struct cmdline_parser_params *params)
+{
+	if (params) {
+		params->override = 0;
+		params->initialize = 1;
+		params->check_required = 1;
+		params->check_ambiguity = 0;
+		params->print_errors = 1;
+	}
+}
+
+struct cmdline_parser_params *cmdline_parser_params_create(void)
+{
+	struct cmdline_parser_params *params =
+	    (struct cmdline_parser_params *)
+	    malloc(sizeof(struct cmdline_parser_params));
+	cmdline_parser_params_init(params);
+	return params;
+}
+
+static void free_string_field(char **s)
+{
+	if (*s) {
+		free(*s);
+		*s = 0;
+	}
+}
+
 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;
-	}
+	free_string_field(&(args_info->conf_arg));
+	free_string_field(&(args_info->conf_orig));
+	free_string_field(&(args_info->pidfile_arg));
+	free_string_field(&(args_info->pidfile_orig));
+	free_string_field(&(args_info->statedir_arg));
+	free_string_field(&(args_info->statedir_orig));
+	free_string_field(&(args_info->dns_arg));
+	free_string_field(&(args_info->dns_orig));
+	free_string_field(&(args_info->listen_arg));
+	free_string_field(&(args_info->listen_orig));
+	free_string_field(&(args_info->remote_arg));
+	free_string_field(&(args_info->remote_orig));
+	free_string_field(&(args_info->contexts_orig));
+	free_string_field(&(args_info->timelimit_orig));
+	free_string_field(&(args_info->gtpversion_orig));
+	free_string_field(&(args_info->apn_arg));
+	free_string_field(&(args_info->apn_orig));
+	free_string_field(&(args_info->selmode_orig));
+	free_string_field(&(args_info->rattype_orig));
+	free_string_field(&(args_info->userloc_arg));
+	free_string_field(&(args_info->userloc_orig));
+	free_string_field(&(args_info->rai_arg));
+	free_string_field(&(args_info->rai_orig));
+	free_string_field(&(args_info->mstz_arg));
+	free_string_field(&(args_info->mstz_orig));
+	free_string_field(&(args_info->imeisv_arg));
+	free_string_field(&(args_info->imeisv_orig));
+	free_string_field(&(args_info->imsi_arg));
+	free_string_field(&(args_info->imsi_orig));
+	free_string_field(&(args_info->nsapi_orig));
+	free_string_field(&(args_info->msisdn_arg));
+	free_string_field(&(args_info->msisdn_orig));
+	free_string_field(&(args_info->qos_orig));
+	free_string_field(&(args_info->qose1_orig));
+	free_string_field(&(args_info->qose2_orig));
+	free_string_field(&(args_info->qose3_orig));
+	free_string_field(&(args_info->qose4_orig));
+	free_string_field(&(args_info->charging_orig));
+	free_string_field(&(args_info->uid_arg));
+	free_string_field(&(args_info->uid_orig));
+	free_string_field(&(args_info->pwd_arg));
+	free_string_field(&(args_info->pwd_orig));
+	free_string_field(&(args_info->net_arg));
+	free_string_field(&(args_info->net_orig));
+	free_string_field(&(args_info->ipup_arg));
+	free_string_field(&(args_info->ipup_orig));
+	free_string_field(&(args_info->ipdown_arg));
+	free_string_field(&(args_info->ipdown_orig));
+	free_string_field(&(args_info->pinghost_arg));
+	free_string_field(&(args_info->pinghost_orig));
+	free_string_field(&(args_info->pingrate_orig));
+	free_string_field(&(args_info->pingsize_orig));
+	free_string_field(&(args_info->pingcount_orig));
 
 	clear_given(args_info);
 }
 
+static void
+write_into_file(FILE * outfile, const char *opt, const char *arg,
+		const char *values[])
+{
+	FIX_UNUSED(values);
+	if (arg) {
+		fprintf(outfile, "%s=\"%s\"\n", opt, arg);
+	} else {
+		fprintf(outfile, "%s\n", opt);
+	}
+}
+
+int cmdline_parser_dump(FILE * outfile, struct gengetopt_args_info *args_info)
+{
+	int i = 0;
+
+	if (!outfile) {
+		fprintf(stderr, "%s: cannot dump options to stream\n",
+			CMDLINE_PARSER_PACKAGE);
+		return EXIT_FAILURE;
+	}
+
+	if (args_info->help_given)
+		write_into_file(outfile, "help", 0, 0);
+	if (args_info->version_given)
+		write_into_file(outfile, "version", 0, 0);
+	if (args_info->debug_given)
+		write_into_file(outfile, "debug", 0, 0);
+	if (args_info->conf_given)
+		write_into_file(outfile, "conf", args_info->conf_orig, 0);
+	if (args_info->pidfile_given)
+		write_into_file(outfile, "pidfile", args_info->pidfile_orig, 0);
+	if (args_info->statedir_given)
+		write_into_file(outfile, "statedir", args_info->statedir_orig,
+				0);
+	if (args_info->dns_given)
+		write_into_file(outfile, "dns", args_info->dns_orig, 0);
+	if (args_info->listen_given)
+		write_into_file(outfile, "listen", args_info->listen_orig, 0);
+	if (args_info->remote_given)
+		write_into_file(outfile, "remote", args_info->remote_orig, 0);
+	if (args_info->contexts_given)
+		write_into_file(outfile, "contexts", args_info->contexts_orig,
+				0);
+	if (args_info->timelimit_given)
+		write_into_file(outfile, "timelimit", args_info->timelimit_orig,
+				0);
+	if (args_info->gtpversion_given)
+		write_into_file(outfile, "gtpversion",
+				args_info->gtpversion_orig, 0);
+	if (args_info->apn_given)
+		write_into_file(outfile, "apn", args_info->apn_orig, 0);
+	if (args_info->selmode_given)
+		write_into_file(outfile, "selmode", args_info->selmode_orig, 0);
+	if (args_info->rattype_given)
+		write_into_file(outfile, "rattype", args_info->rattype_orig, 0);
+	if (args_info->userloc_given)
+		write_into_file(outfile, "userloc", args_info->userloc_orig, 0);
+	if (args_info->rai_given)
+		write_into_file(outfile, "rai", args_info->rai_orig, 0);
+	if (args_info->mstz_given)
+		write_into_file(outfile, "mstz", args_info->mstz_orig, 0);
+	if (args_info->imeisv_given)
+		write_into_file(outfile, "imeisv", args_info->imeisv_orig, 0);
+	if (args_info->norecovery_given)
+		write_into_file(outfile, "norecovery", 0, 0);
+	if (args_info->imsi_given)
+		write_into_file(outfile, "imsi", args_info->imsi_orig, 0);
+	if (args_info->nsapi_given)
+		write_into_file(outfile, "nsapi", args_info->nsapi_orig, 0);
+	if (args_info->msisdn_given)
+		write_into_file(outfile, "msisdn", args_info->msisdn_orig, 0);
+	if (args_info->qos_given)
+		write_into_file(outfile, "qos", args_info->qos_orig, 0);
+	if (args_info->qose1_given)
+		write_into_file(outfile, "qose1", args_info->qose1_orig, 0);
+	if (args_info->qose2_given)
+		write_into_file(outfile, "qose2", args_info->qose2_orig, 0);
+	if (args_info->qose3_given)
+		write_into_file(outfile, "qose3", args_info->qose3_orig, 0);
+	if (args_info->qose4_given)
+		write_into_file(outfile, "qose4", args_info->qose4_orig, 0);
+	if (args_info->charging_given)
+		write_into_file(outfile, "charging", args_info->charging_orig,
+				0);
+	if (args_info->uid_given)
+		write_into_file(outfile, "uid", args_info->uid_orig, 0);
+	if (args_info->pwd_given)
+		write_into_file(outfile, "pwd", args_info->pwd_orig, 0);
+	if (args_info->createif_given)
+		write_into_file(outfile, "createif", 0, 0);
+	if (args_info->net_given)
+		write_into_file(outfile, "net", args_info->net_orig, 0);
+	if (args_info->defaultroute_given)
+		write_into_file(outfile, "defaultroute", 0, 0);
+	if (args_info->ipup_given)
+		write_into_file(outfile, "ipup", args_info->ipup_orig, 0);
+	if (args_info->ipdown_given)
+		write_into_file(outfile, "ipdown", args_info->ipdown_orig, 0);
+	if (args_info->pinghost_given)
+		write_into_file(outfile, "pinghost", args_info->pinghost_orig,
+				0);
+	if (args_info->pingrate_given)
+		write_into_file(outfile, "pingrate", args_info->pingrate_orig,
+				0);
+	if (args_info->pingsize_given)
+		write_into_file(outfile, "pingsize", args_info->pingsize_orig,
+				0);
+	if (args_info->pingcount_given)
+		write_into_file(outfile, "pingcount", args_info->pingcount_orig,
+				0);
+	if (args_info->pingquiet_given)
+		write_into_file(outfile, "pingquiet", 0, 0);
+
+	i = EXIT_SUCCESS;
+	return i;
+}
+
 int
 cmdline_parser_file_save(const char *filename,
 			 struct gengetopt_args_info *args_info)
@@ -475,231 +553,9 @@
 		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");
-	}
-	if (args_info->norecovery_given) {
-		fprintf(outfile, "%s\n", "norecovery");
-	}
-
+	i = cmdline_parser_dump(outfile, args_info);
 	fclose(outfile);
 
-	i = EXIT_SUCCESS;
 	return i;
 }
 
@@ -708,11 +564,10 @@
 	cmdline_parser_release(args_info);
 }
 
-/* gengetopt_strdup() */
-/* strdup.c replacement of strdup, which is not standard */
+/** @brief replacement of strdup, which is not standard */
 char *gengetopt_strdup(const char *s)
 {
-	char *result = NULL;
+	char *result = 0;
 	if (!s)
 		return result;
 
@@ -723,23 +578,40 @@
 	return result;
 }
 
-int
-cmdline_parser(int argc, char *const *argv,
-	       struct gengetopt_args_info *args_info)
+int cmdline_parser(int argc, char **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)
+cmdline_parser_ext(int argc, char **argv, struct gengetopt_args_info *args_info,
+		   struct cmdline_parser_params *params)
 {
 	int result;
+	result = cmdline_parser_internal(argc, argv, args_info, params, 0);
 
-	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_parser2(int argc, char **argv, struct gengetopt_args_info *args_info,
+		int override, int initialize, int check_required)
+{
+	int result;
+	struct cmdline_parser_params params;
+
+	params.override = override;
+	params.initialize = initialize;
+	params.check_required = check_required;
+	params.check_ambiguity = 0;
+	params.print_errors = 1;
+
+	result = cmdline_parser_internal(argc, argv, args_info, &params, 0);
 
 	if (result == EXIT_FAILURE) {
 		cmdline_parser_free(args_info);
@@ -753,20 +625,153 @@
 cmdline_parser_required(struct gengetopt_args_info *args_info,
 			const char *prog_name)
 {
+	FIX_UNUSED(args_info);
+	FIX_UNUSED(prog_name);
 	return EXIT_SUCCESS;
 }
 
+static char *package_name = 0;
+
+/**
+ * @brief updates an option
+ * @param field the generic pointer to the field to update
+ * @param orig_field the pointer to the orig field
+ * @param field_given the pointer to the number of occurrence of this option
+ * @param prev_given the pointer to the number of occurrence already seen
+ * @param value the argument for this option (if null no arg was specified)
+ * @param possible_values the possible values for this option (if specified)
+ * @param default_value the default value (in case the option only accepts fixed values)
+ * @param arg_type the type of this option
+ * @param check_ambiguity @see cmdline_parser_params.check_ambiguity
+ * @param override @see cmdline_parser_params.override
+ * @param no_free whether to free a possible previous value
+ * @param multiple_option whether this is a multiple option
+ * @param long_opt the corresponding long option
+ * @param short_opt the corresponding short option (or '-' if none)
+ * @param additional_error possible further error specification
+ */
+static
+int update_arg(void *field, char **orig_field,
+	       unsigned int *field_given, unsigned int *prev_given,
+	       char *value, const char *possible_values[],
+	       const char *default_value,
+	       cmdline_parser_arg_type arg_type,
+	       int check_ambiguity, int override,
+	       int no_free, int multiple_option,
+	       const char *long_opt, char short_opt,
+	       const char *additional_error)
+{
+	char *stop_char = 0;
+	const char *val = value;
+	int found;
+	char **string_field;
+	FIX_UNUSED(field);
+
+	stop_char = 0;
+	found = 0;
+
+	if (!multiple_option && prev_given
+	    && (*prev_given || (check_ambiguity && *field_given))) {
+		if (short_opt != '-')
+			fprintf(stderr,
+				"%s: `--%s' (`-%c') option given more than once%s\n",
+				package_name, long_opt, short_opt,
+				(additional_error ? additional_error : ""));
+		else
+			fprintf(stderr,
+				"%s: `--%s' option given more than once%s\n",
+				package_name, long_opt,
+				(additional_error ? additional_error : ""));
+		return 1;	/* failure */
+	}
+
+	FIX_UNUSED(default_value);
+
+	if (field_given && *field_given && !override)
+		return 0;
+	if (prev_given)
+		(*prev_given)++;
+	if (field_given)
+		(*field_given)++;
+	if (possible_values)
+		val = possible_values[found];
+
+	switch (arg_type) {
+	case ARG_FLAG:
+		*((int *)field) = !*((int *)field);
+		break;
+	case ARG_INT:
+		if (val)
+			*((int *)field) = strtol(val, &stop_char, 0);
+		break;
+	case ARG_STRING:
+		if (val) {
+			string_field = (char **)field;
+			if (!no_free && *string_field)
+				free(*string_field);	/* free previous string */
+			*string_field = gengetopt_strdup(val);
+		}
+		break;
+	default:
+		break;
+	};
+
+	/* check numeric conversion */
+	switch (arg_type) {
+	case ARG_INT:
+		if (val && !(stop_char && *stop_char == '\0')) {
+			fprintf(stderr, "%s: invalid numeric value: %s\n",
+				package_name, val);
+			return 1;	/* failure */
+		}
+		break;
+	default:
+		;
+	};
+
+	/* store the original value */
+	switch (arg_type) {
+	case ARG_NO:
+	case ARG_FLAG:
+		break;
+	default:
+		if (value && orig_field) {
+			if (no_free) {
+				*orig_field = value;
+			} else {
+				if (*orig_field)
+					free(*orig_field);	/* free previous string */
+				*orig_field = gengetopt_strdup(value);
+			}
+		}
+	};
+
+	return 0;		/* OK */
+}
+
 int
-cmdline_parser_internal(int argc, char *const *argv,
-			struct gengetopt_args_info *args_info, int override,
-			int initialize, int check_required,
+cmdline_parser_internal(int argc, char **argv,
+			struct gengetopt_args_info *args_info,
+			struct cmdline_parser_params *params,
 			const char *additional_error)
 {
 	int c;			/* Character of the parsed option.  */
 
-	int error = 0;
+	int error_occurred = 0;
 	struct gengetopt_args_info local_args_info;
 
+	int override;
+	int initialize;
+	int check_required;
+	int check_ambiguity;
+
+	package_name = argv[0];
+
+	override = params->override;
+	initialize = params->initialize;
+	check_required = params->check_required;
+	check_ambiguity = params->check_ambiguity;
+
 	if (initialize)
 		cmdline_parser_init(args_info);
 
@@ -774,12 +779,11 @@
 
 	optarg = 0;
 	optind = 0;
-	opterr = 1;
+	opterr = params->print_errors;
 	optopt = '?';
 
 	while (1) {
 		int option_index = 0;
-		char *stop_char;
 
 		static struct option long_options[] = {
 			{"help", 0, NULL, 'h'},
@@ -801,6 +805,7 @@
 			{"rai", 1, NULL, 0},
 			{"mstz", 1, NULL, 0},
 			{"imeisv", 1, NULL, 0},
+			{"norecovery", 0, NULL, 0},
 			{"imsi", 1, NULL, 'i'},
 			{"nsapi", 1, NULL, 0},
 			{"msisdn", 1, NULL, 'm'},
@@ -822,11 +827,9 @@
 			{"pingsize", 1, NULL, 0},
 			{"pingcount", 1, NULL, 0},
 			{"pingquiet", 0, NULL, 0},
-			{"norecovery", 0, NULL, 0},
-			{NULL, 0, NULL, 0}
+			{0, 0, 0, 0}
 		};
 
-		stop_char = 0;
 		c = getopt_long(argc, argv, "hVdc:l:r:a:i:m:q:u:p:n:",
 				long_options, &option_index);
 
@@ -845,884 +848,559 @@
 			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;
 
+			if (update_arg
+			    ((void *)&(args_info->debug_flag), 0,
+			     &(args_info->debug_given),
+			     &(local_args_info.debug_given), optarg, 0, 0,
+			     ARG_FLAG, check_ambiguity, override, 1, 0, "debug",
+			     'd', additional_error))
+				goto failure;
+
+			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;
 
+			if (update_arg((void *)&(args_info->conf_arg),
+				       &(args_info->conf_orig),
+				       &(args_info->conf_given),
+				       &(local_args_info.conf_given), optarg, 0,
+				       0, ARG_STRING, check_ambiguity, override,
+				       0, 0, "conf", 'c', additional_error))
+				goto failure;
+
+			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;
 
+			if (update_arg((void *)&(args_info->listen_arg),
+				       &(args_info->listen_orig),
+				       &(args_info->listen_given),
+				       &(local_args_info.listen_given), optarg,
+				       0, 0, ARG_STRING, check_ambiguity,
+				       override, 0, 0, "listen", 'l',
+				       additional_error))
+				goto failure;
+
+			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;
 
+			if (update_arg((void *)&(args_info->remote_arg),
+				       &(args_info->remote_orig),
+				       &(args_info->remote_given),
+				       &(local_args_info.remote_given), optarg,
+				       0, 0, ARG_STRING, check_ambiguity,
+				       override, 0, 0, "remote", 'r',
+				       additional_error))
+				goto failure;
+
+			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;
 
+			if (update_arg((void *)&(args_info->apn_arg),
+				       &(args_info->apn_orig),
+				       &(args_info->apn_given),
+				       &(local_args_info.apn_given), optarg, 0,
+				       "internet", ARG_STRING, check_ambiguity,
+				       override, 0, 0, "apn", 'a',
+				       additional_error))
+				goto failure;
+
+			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;
 
+			if (update_arg((void *)&(args_info->imsi_arg),
+				       &(args_info->imsi_orig),
+				       &(args_info->imsi_given),
+				       &(local_args_info.imsi_given), optarg, 0,
+				       "240010123456789", ARG_STRING,
+				       check_ambiguity, override, 0, 0, "imsi",
+				       'i', additional_error))
+				goto failure;
+
+			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;
 
+			if (update_arg((void *)&(args_info->msisdn_arg),
+				       &(args_info->msisdn_orig),
+				       &(args_info->msisdn_given),
+				       &(local_args_info.msisdn_given), optarg,
+				       0, "46702123456", ARG_STRING,
+				       check_ambiguity, override, 0, 0,
+				       "msisdn", 'm', additional_error))
+				goto failure;
+
+			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;
 
+			if (update_arg((void *)&(args_info->qos_arg),
+				       &(args_info->qos_orig),
+				       &(args_info->qos_given),
+				       &(local_args_info.qos_given), optarg, 0,
+				       "0x000b921f", ARG_INT, check_ambiguity,
+				       override, 0, 0, "qos", 'q',
+				       additional_error))
+				goto failure;
+
+			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;
 
+			if (update_arg((void *)&(args_info->uid_arg),
+				       &(args_info->uid_orig),
+				       &(args_info->uid_given),
+				       &(local_args_info.uid_given), optarg, 0,
+				       "mig", ARG_STRING, check_ambiguity,
+				       override, 0, 0, "uid", 'u',
+				       additional_error))
+				goto failure;
+
+			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 :
-					 ""));
+			if (update_arg((void *)&(args_info->pwd_arg),
+				       &(args_info->pwd_orig),
+				       &(args_info->pwd_given),
+				       &(local_args_info.pwd_given), optarg, 0,
+				       "hemmelig", ARG_STRING, check_ambiguity,
+				       override, 0, 0, "pwd", 'p',
+				       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 'n':	/* Network address for local interface.  */
+
+			if (update_arg((void *)&(args_info->net_arg),
+				       &(args_info->net_orig),
+				       &(args_info->net_given),
+				       &(local_args_info.net_given), optarg, 0,
+				       0, ARG_STRING, check_ambiguity, override,
+				       0, 0, "net", 'n', additional_error))
+				goto failure;
+
 			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 : ""));
+
+				if (update_arg
+				    ((void *)&(args_info->pidfile_arg),
+				     &(args_info->pidfile_orig),
+				     &(args_info->pidfile_given),
+				     &(local_args_info.pidfile_given), optarg,
+				     0, "./sgsnemu.pid", ARG_STRING,
+				     check_ambiguity, override, 0, 0, "pidfile",
+				     '-', 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 : ""));
+
+				if (update_arg
+				    ((void *)&(args_info->statedir_arg),
+				     &(args_info->statedir_orig),
+				     &(args_info->statedir_given),
+				     &(local_args_info.statedir_given), optarg,
+				     0, "./", ARG_STRING, check_ambiguity,
+				     override, 0, 0, "statedir", '-',
+				     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 : ""));
+
+				if (update_arg((void *)&(args_info->dns_arg),
+					       &(args_info->dns_orig),
+					       &(args_info->dns_given),
+					       &(local_args_info.dns_given),
+					       optarg, 0, 0, ARG_STRING,
+					       check_ambiguity, override, 0, 0,
+					       "dns", '-', 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 : ""));
+
+				if (update_arg
+				    ((void *)&(args_info->contexts_arg),
+				     &(args_info->contexts_orig),
+				     &(args_info->contexts_given),
+				     &(local_args_info.contexts_given), optarg,
+				     0, "1", ARG_INT, check_ambiguity, override,
+				     0, 0, "contexts", '-', 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 : ""));
+
+				if (update_arg
+				    ((void *)&(args_info->timelimit_arg),
+				     &(args_info->timelimit_orig),
+				     &(args_info->timelimit_given),
+				     &(local_args_info.timelimit_given), optarg,
+				     0, "0", ARG_INT, check_ambiguity, override,
+				     0, 0, "timelimit", '-', 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 : ""));
+
+				if (update_arg
+				    ((void *)&(args_info->gtpversion_arg),
+				     &(args_info->gtpversion_orig),
+				     &(args_info->gtpversion_given),
+				     &(local_args_info.gtpversion_given),
+				     optarg, 0, "1", ARG_INT, check_ambiguity,
+				     override, 0, 0, "gtpversion", '-',
+				     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 : ""));
+
+				if (update_arg
+				    ((void *)&(args_info->selmode_arg),
+				     &(args_info->selmode_orig),
+				     &(args_info->selmode_given),
+				     &(local_args_info.selmode_given), optarg,
+				     0, "0x01", ARG_INT, check_ambiguity,
+				     override, 0, 0, "selmode", '-',
+				     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);
-			}
-			/* QoS Extension 1.  */
-			else if (strcmp
-				 (long_options[option_index].name,
-				  "qose1") == 0) {
-				if (args_info->qose1_given) {
-					fprintf(stderr,
-						"%s: `--qose1' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->qose1_given = 1;
-				args_info->qose1_arg =
-				    strtoull(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->qose1_orig)
-					free(args_info->qose1_orig);	/* free previous string */
-				args_info->qose1_orig =
-				    gengetopt_strdup(optarg);
-				break;
-			}
-			/* QoS Extension 2.  */
-			else if (strcmp
-				 (long_options[option_index].name,
-				  "qose2") == 0) {
-				if (args_info->qose2_given) {
-					fprintf(stderr,
-						"%s: `--qose2' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->qose2_given = 1;
-				args_info->qose2_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->qose2_orig)
-					free(args_info->qose2_orig);	/* free previous string */
-				args_info->qose2_orig =
-				    gengetopt_strdup(optarg);
-				break;
-			}
-			/* QoS Extension 3.  */
-			else if (strcmp
-				 (long_options[option_index].name,
-				  "qose3") == 0) {
-				if (args_info->qose3_given) {
-					fprintf(stderr,
-						"%s: `--qose3' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->qose3_given = 1;
-				args_info->qose3_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->qose3_orig)
-					free(args_info->qose3_orig);	/* free previous string */
-				args_info->qose3_orig =
-				    gengetopt_strdup(optarg);
-				break;
-			}
-			/* QoS Extension 4.  */
-			else if (strcmp
-				 (long_options[option_index].name,
-				  "qose4") == 0) {
-				if (args_info->qose4_given) {
-					fprintf(stderr,
-						"%s: `--qose4' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->qose4_given = 1;
-				args_info->qose4_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->qose4_orig)
-					free(args_info->qose4_orig);	/* free previous string */
-				args_info->qose4_orig =
-				    gengetopt_strdup(optarg);
-				break;
+
 			}
 			/* Radio Access Technology Type.  */
 			else if (strcmp
 				 (long_options[option_index].name,
 				  "rattype") == 0) {
-				if (args_info->rattype_given) {
-					fprintf(stderr,
-						"%s: `--rattype' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->rattype_given = 1;
-				/* args_info->rattype_arg = strtol (optarg,&stop_char,0); */
-				args_info->rattype_arg = strdup(optarg);
-				break;
+
+				if (update_arg
+				    ((void *)&(args_info->rattype_arg),
+				     &(args_info->rattype_orig),
+				     &(args_info->rattype_given),
+				     &(local_args_info.rattype_given), optarg,
+				     0, "1", ARG_INT, check_ambiguity, override,
+				     0, 0, "rattype", '-', additional_error))
+					goto failure;
+
 			}
 			/* User Location Information.  */
 			else if (strcmp
 				 (long_options[option_index].name,
 				  "userloc") == 0) {
-				if (args_info->userloc_given) {
-					fprintf(stderr,
-						"%s: `--userloc' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->userloc_given = 1;
-				args_info->userloc_arg = strdup(optarg);
-				break;
+
+				if (update_arg
+				    ((void *)&(args_info->userloc_arg),
+				     &(args_info->userloc_orig),
+				     &(args_info->userloc_given),
+				     &(local_args_info.userloc_given), optarg,
+				     0, "02509946241207", ARG_STRING,
+				     check_ambiguity, override, 0, 0, "userloc",
+				     '-', additional_error))
+					goto failure;
+
 			}
 			/* Routing Area Information.  */
 			else if (strcmp(long_options[option_index].name, "rai")
 				 == 0) {
-				if (args_info->rai_given) {
-					fprintf(stderr,
-						"%s: `--rai' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->rai_given = 1;
-				args_info->rai_arg = strdup(optarg);
-				break;
+
+				if (update_arg((void *)&(args_info->rai_arg),
+					       &(args_info->rai_orig),
+					       &(args_info->rai_given),
+					       &(local_args_info.rai_given),
+					       optarg, 0, "02509946241207",
+					       ARG_STRING, check_ambiguity,
+					       override, 0, 0, "rai", '-',
+					       additional_error))
+					goto failure;
+
 			}
-			/* MS Time Zone  */
+			/* MS Time Zone.  */
 			else if (strcmp(long_options[option_index].name, "mstz")
 				 == 0) {
-				if (args_info->mstz_given) {
-					fprintf(stderr,
-						"%s: `--mstz' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->mstz_given = 1;
-				args_info->mstz_arg = strdup(optarg);
-				break;
+
+				if (update_arg((void *)&(args_info->mstz_arg),
+					       &(args_info->mstz_orig),
+					       &(args_info->mstz_given),
+					       &(local_args_info.mstz_given),
+					       optarg, 0, "0", ARG_STRING,
+					       check_ambiguity, override, 0, 0,
+					       "mstz", '-', additional_error))
+					goto failure;
+
 			}
-			/* IMEI(SV)  */
+			/* IMEI(SV) International Mobile Equipment Identity (and Software Version).  */
 			else if (strcmp
 				 (long_options[option_index].name,
 				  "imeisv") == 0) {
-				if (args_info->imeisv_given) {
-					fprintf(stderr,
-						"%s: `--imeisv' option given more than once\n",
-						PACKAGE);
-					exit(EXIT_FAILURE);
-				}
-				args_info->imeisv_given = 1;
-				args_info->imeisv_arg = strdup(optarg);
-				break;
-			}
-			/* 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 : ""));
+
+				if (update_arg((void *)&(args_info->imeisv_arg),
+					       &(args_info->imeisv_orig),
+					       &(args_info->imeisv_given),
+					       &(local_args_info.imeisv_given),
+					       optarg, 0, "2143658709214365",
+					       ARG_STRING, check_ambiguity,
+					       override, 0, 0, "imeisv", '-',
+					       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);
+
 			}
 			/* Do not send recovery.  */
 			else if (strcmp
 				 (long_options[option_index].name,
 				  "norecovery") == 0) {
-				if (local_args_info.norecovery_given) {
-					fprintf(stderr,
-						"%s: `--norecovery' option given more than once%s\n",
-						argv[0],
-						(additional_error ?
-						 additional_error : ""));
+
+				if (update_arg
+				    ((void *)&(args_info->norecovery_flag), 0,
+				     &(args_info->norecovery_given),
+				     &(local_args_info.norecovery_given),
+				     optarg, 0, 0, ARG_FLAG, check_ambiguity,
+				     override, 1, 0, "norecovery", '-',
+				     additional_error))
 					goto failure;
-				}
-				if (args_info->norecovery_given && !override)
-					continue;
-				local_args_info.norecovery_given = 1;
-				args_info->norecovery_given = 1;
-				args_info->norecovery_flag =
-				    !(args_info->norecovery_flag);
+
+			}
+			/* NSAPI.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "nsapi") == 0) {
+
+				if (update_arg((void *)&(args_info->nsapi_arg),
+					       &(args_info->nsapi_orig),
+					       &(args_info->nsapi_given),
+					       &(local_args_info.nsapi_given),
+					       optarg, 0, "0", ARG_INT,
+					       check_ambiguity, override, 0, 0,
+					       "nsapi", '-', additional_error))
+					goto failure;
+
+			}
+			/* Requested quality of service Extension 1.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "qose1") == 0) {
+
+				if (update_arg((void *)&(args_info->qose1_arg),
+					       &(args_info->qose1_orig),
+					       &(args_info->qose1_given),
+					       &(local_args_info.qose1_given),
+					       optarg, 0, "0x9396404074f9ffff",
+					       ARG_INT, check_ambiguity,
+					       override, 0, 0, "qose1", '-',
+					       additional_error))
+					goto failure;
+
+			}
+			/* Requested quality of service Extension 2.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "qose2") == 0) {
+
+				if (update_arg((void *)&(args_info->qose2_arg),
+					       &(args_info->qose2_orig),
+					       &(args_info->qose2_given),
+					       &(local_args_info.qose2_given),
+					       optarg, 0, "0x11", ARG_INT,
+					       check_ambiguity, override, 0, 0,
+					       "qose2", '-', additional_error))
+					goto failure;
+
+			}
+			/* Requested quality of service Extension 3.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "qose3") == 0) {
+
+				if (update_arg((void *)&(args_info->qose3_arg),
+					       &(args_info->qose3_orig),
+					       &(args_info->qose3_given),
+					       &(local_args_info.qose3_given),
+					       optarg, 0, "0x0101", ARG_INT,
+					       check_ambiguity, override, 0, 0,
+					       "qose3", '-', additional_error))
+					goto failure;
+
+			}
+			/* Requested quality of service Extension 4.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "qose4") == 0) {
+
+				if (update_arg((void *)&(args_info->qose4_arg),
+					       &(args_info->qose4_orig),
+					       &(args_info->qose4_given),
+					       &(local_args_info.qose4_given),
+					       optarg, 0, "0x4040", ARG_INT,
+					       check_ambiguity, override, 0, 0,
+					       "qose4", '-', additional_error))
+					goto failure;
+
+			}
+			/* Charging characteristics.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "charging") == 0) {
+
+				if (update_arg
+				    ((void *)&(args_info->charging_arg),
+				     &(args_info->charging_orig),
+				     &(args_info->charging_given),
+				     &(local_args_info.charging_given), optarg,
+				     0, "0x0800", ARG_INT, check_ambiguity,
+				     override, 0, 0, "charging", '-',
+				     additional_error))
+					goto failure;
+
+			}
+			/* Create local network interface.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "createif") == 0) {
+
+				if (update_arg
+				    ((void *)&(args_info->createif_flag), 0,
+				     &(args_info->createif_given),
+				     &(local_args_info.createif_given), optarg,
+				     0, 0, ARG_FLAG, check_ambiguity, override,
+				     1, 0, "createif", '-', additional_error))
+					goto failure;
+
+			}
+			/* Create default route.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "defaultroute") == 0) {
+
+				if (update_arg
+				    ((void *)&(args_info->defaultroute_flag), 0,
+				     &(args_info->defaultroute_given),
+				     &(local_args_info.defaultroute_given),
+				     optarg, 0, 0, ARG_FLAG, check_ambiguity,
+				     override, 1, 0, "defaultroute", '-',
+				     additional_error))
+					goto failure;
+
+			}
+			/* Script to run after link-up.  */
+			else if (strcmp(long_options[option_index].name, "ipup")
+				 == 0) {
+
+				if (update_arg((void *)&(args_info->ipup_arg),
+					       &(args_info->ipup_orig),
+					       &(args_info->ipup_given),
+					       &(local_args_info.ipup_given),
+					       optarg, 0, 0, ARG_STRING,
+					       check_ambiguity, override, 0, 0,
+					       "ipup", '-', additional_error))
+					goto failure;
+
+			}
+			/* Script to run after link-down.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "ipdown") == 0) {
+
+				if (update_arg((void *)&(args_info->ipdown_arg),
+					       &(args_info->ipdown_orig),
+					       &(args_info->ipdown_given),
+					       &(local_args_info.ipdown_given),
+					       optarg, 0, 0, ARG_STRING,
+					       check_ambiguity, override, 0, 0,
+					       "ipdown", '-', additional_error))
+					goto failure;
+
+			}
+			/* Ping remote host.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "pinghost") == 0) {
+
+				if (update_arg
+				    ((void *)&(args_info->pinghost_arg),
+				     &(args_info->pinghost_orig),
+				     &(args_info->pinghost_given),
+				     &(local_args_info.pinghost_given), optarg,
+				     0, 0, ARG_STRING, check_ambiguity,
+				     override, 0, 0, "pinghost", '-',
+				     additional_error))
+					goto failure;
+
+			}
+			/* Number of ping req per second.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "pingrate") == 0) {
+
+				if (update_arg
+				    ((void *)&(args_info->pingrate_arg),
+				     &(args_info->pingrate_orig),
+				     &(args_info->pingrate_given),
+				     &(local_args_info.pingrate_given), optarg,
+				     0, "1", ARG_INT, check_ambiguity, override,
+				     0, 0, "pingrate", '-', additional_error))
+					goto failure;
+
+			}
+			/* Number of ping data bytes.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "pingsize") == 0) {
+
+				if (update_arg
+				    ((void *)&(args_info->pingsize_arg),
+				     &(args_info->pingsize_orig),
+				     &(args_info->pingsize_given),
+				     &(local_args_info.pingsize_given), optarg,
+				     0, "56", ARG_INT, check_ambiguity,
+				     override, 0, 0, "pingsize", '-',
+				     additional_error))
+					goto failure;
+
+			}
+			/* Number of ping req to send.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "pingcount") == 0) {
+
+				if (update_arg
+				    ((void *)&(args_info->pingcount_arg),
+				     &(args_info->pingcount_orig),
+				     &(args_info->pingcount_given),
+				     &(local_args_info.pingcount_given), optarg,
+				     0, "0", ARG_INT, check_ambiguity, override,
+				     0, 0, "pingcount", '-', additional_error))
+					goto failure;
+
+			}
+			/* Do not print ping packet info.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "pingquiet") == 0) {
+
+				if (update_arg
+				    ((void *)&(args_info->pingquiet_flag), 0,
+				     &(args_info->pingquiet_given),
+				     &(local_args_info.pingquiet_given), optarg,
+				     0, 0, ARG_FLAG, check_ambiguity, override,
+				     1, 0, "pingquiet", '-', additional_error))
+					goto failure;
+
 			}
 
 			break;
@@ -1740,7 +1418,7 @@
 
 	cmdline_parser_release(&local_args_info);
 
-	if (error)
+	if (error_occurred)
 		return (EXIT_FAILURE);
 
 	return 0;
@@ -1759,40 +1437,25 @@
 #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)
+static int _cmdline_parser_configfile(const char *filename, int *my_argc)
 {
 	FILE *file;
+	char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE + 1];
 	char linebuf[CONFIG_FILE_LINE_SIZE];
 	int line_num = 0;
-	int i, result, equal;
+	int result = 0, 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) {
+	if ((file = fopen(filename, "r")) == 0) {
 		fprintf(stderr, "%s: Error opening configuration file '%s'\n",
 			CMDLINE_PARSER_PACKAGE, filename);
-		result = EXIT_FAILURE;
-		goto conf_failure;
+		return EXIT_FAILURE;
 	}
 
-	while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != NULL) {
+	while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != 0) {
 		++line_num;
 		my_argv[0] = '\0';
 		len = strlen(linebuf);
@@ -1801,7 +1464,7 @@
 				"%s:%s:%d: Line too long in configuration file\n",
 				CMDLINE_PARSER_PACKAGE, filename, line_num);
 			result = EXIT_FAILURE;
-			goto conf_failure;
+			break;
 		}
 
 		/* find first non-whitespace character in the line */
@@ -1817,7 +1480,7 @@
 		next_token = strcspn(fopt, " \t\r\n=");
 
 		if (fopt[next_token] == '\0') {	/* the line is over */
-			farg = NULL;
+			farg = 0;
 			equal = 0;
 			goto noarg;
 		}
@@ -1828,6 +1491,7 @@
 
 		/* 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] == '='))) {
@@ -1848,7 +1512,7 @@
 				     CMDLINE_PARSER_PACKAGE, filename,
 				     line_num);
 				result = EXIT_FAILURE;
-				goto conf_failure;
+				break;
 			}
 		} else {	/* read up the remaining part up to a delimiter */
 			next_token = strcspn(farg, " \t\r\n#\'\"");
@@ -1868,20 +1532,31 @@
 				     CMDLINE_PARSER_PACKAGE, filename,
 				     line_num);
 				result = EXIT_FAILURE;
-				goto conf_failure;
+				break;
 			}
 		}
 
 noarg:
-		++my_argc;
+		if (!strcmp(fopt, "include")) {
+			if (farg && *farg) {
+				result =
+				    _cmdline_parser_configfile(farg, my_argc);
+			} else {
+				fprintf(stderr,
+					"%s:%s:%d: include requires a filename argument.\n",
+					CMDLINE_PARSER_PACKAGE, filename,
+					line_num);
+			}
+			continue;
+		}
 		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);
+		++(*my_argc);
 
 		cmd_line_list_tmp =
 		    (struct line_list *)malloc(sizeof(struct line_list));
@@ -1890,30 +1565,69 @@
 		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);
+	return result;
+}
+
+int
+cmdline_parser_configfile(const char *filename,
+			  struct gengetopt_args_info *args_info,
+			  int override, int initialize, int check_required)
+{
+	struct cmdline_parser_params params;
+
+	params.override = override;
+	params.initialize = initialize;
+	params.check_required = check_required;
+	params.check_ambiguity = 0;
+	params.print_errors = 1;
+
+	return cmdline_parser_config_file(filename, args_info, &params);
+}
+
+int
+cmdline_parser_config_file(const char *filename,
+			   struct gengetopt_args_info *args_info,
+			   struct cmdline_parser_params *params)
+{
+	int i, result;
+	int my_argc = 1;
+	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);
+
+	result = _cmdline_parser_configfile(filename, &my_argc);
+
+	if (result != EXIT_FAILURE) {
+		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,
+					    params, additional_error);
+
+		free(additional_error);
+		free(my_argv_arg);
+	}
 
 	free_cmd_list();
 	if (result == EXIT_FAILURE) {