diff --git a/ggsn/cmdline.c b/ggsn/cmdline.c
index d83376f..c5da6b4 100644
--- a/ggsn/cmdline.c
+++ b/ggsn/cmdline.c
@@ -23,878 +23,939 @@
 
 const char *gengetopt_args_info_purpose = "";
 
-const char *gengetopt_args_info_usage = "Usage: " CMDLINE_PARSER_PACKAGE " [OPTIONS]...";
+const char *gengetopt_args_info_usage =
+    "Usage: " CMDLINE_PARSER_PACKAGE " [OPTIONS]...";
 
 const char *gengetopt_args_info_help[] = {
-  "  -h, --help             Print help and exit",
-  "  -V, --version          Print version and exit",
-  "  -f, --fg               Run in foreground  (default=off)",
-  "  -d, --debug            Run in debug mode  (default=off)",
-  "  -c, --conf=STRING      Read configuration file  (default=`/etc/ggsn.conf')",
-  "      --pidfile=STRING   Filename of process id file  \n                           (default=`/var/run/ggsn.pid')",
-  "      --statedir=STRING  Directory of nonvolatile data  \n                           (default=`/var/lib/ggsn/')",
-  "  -l, --listen=STRING    Local interface",
-  "  -n, --net=STRING       Network  (default=`192.168.0.0/24')",
-  "      --ipup=STRING      Script to run after link-up",
-  "      --ipdown=STRING    Script to run after link-down",
-  "      --dynip=STRING     Dynamic IP address pool",
-  "      --statip=STRING    Static IP address pool",
-  "      --pcodns1=STRING   PCO DNS Server 1  (default=`0.0.0.0')",
-  "      --pcodns2=STRING   PCO DNS Server 2  (default=`0.0.0.0')",
-  "      --timelimit=INT    Exit after timelimit seconds  (default=`0')",
-  "  -a, --apn=STRING       Access point name  (default=`internet')",
-  "  -q, --qos=INT          Requested quality of service  (default=`0x0b921f')",
-    0
+	"  -h, --help             Print help and exit",
+	"  -V, --version          Print version and exit",
+	"  -f, --fg               Run in foreground  (default=off)",
+	"  -d, --debug            Run in debug mode  (default=off)",
+	"  -c, --conf=STRING      Read configuration file  (default=`/etc/ggsn.conf')",
+	"      --pidfile=STRING   Filename of process id file  \n                           (default=`/var/run/ggsn.pid')",
+	"      --statedir=STRING  Directory of nonvolatile data  \n                           (default=`/var/lib/ggsn/')",
+	"  -l, --listen=STRING    Local interface",
+	"  -n, --net=STRING       Network  (default=`192.168.0.0/24')",
+	"      --ipup=STRING      Script to run after link-up",
+	"      --ipdown=STRING    Script to run after link-down",
+	"      --dynip=STRING     Dynamic IP address pool",
+	"      --statip=STRING    Static IP address pool",
+	"      --pcodns1=STRING   PCO DNS Server 1  (default=`0.0.0.0')",
+	"      --pcodns2=STRING   PCO DNS Server 2  (default=`0.0.0.0')",
+	"      --timelimit=INT    Exit after timelimit seconds  (default=`0')",
+	"  -a, --apn=STRING       Access point name  (default=`internet')",
+	"  -q, --qos=INT          Requested quality of service  (default=`0x0b921f')",
+	0
 };
 
 static
-void clear_given (struct gengetopt_args_info *args_info);
+void clear_given(struct gengetopt_args_info *args_info);
 static
-void clear_args (struct gengetopt_args_info *args_info);
+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);
+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;
+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)
+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);
-      }
-    }
+	/* 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 char *gengetopt_strdup(const char *s);
 
 static
-void clear_given (struct gengetopt_args_info *args_info)
+void clear_given(struct gengetopt_args_info *args_info)
 {
-  args_info->help_given = 0 ;
-  args_info->version_given = 0 ;
-  args_info->fg_given = 0 ;
-  args_info->debug_given = 0 ;
-  args_info->conf_given = 0 ;
-  args_info->pidfile_given = 0 ;
-  args_info->statedir_given = 0 ;
-  args_info->listen_given = 0 ;
-  args_info->net_given = 0 ;
-  args_info->ipup_given = 0 ;
-  args_info->ipdown_given = 0 ;
-  args_info->dynip_given = 0 ;
-  args_info->statip_given = 0 ;
-  args_info->pcodns1_given = 0 ;
-  args_info->pcodns2_given = 0 ;
-  args_info->timelimit_given = 0 ;
-  args_info->apn_given = 0 ;
-  args_info->qos_given = 0 ;
+	args_info->help_given = 0;
+	args_info->version_given = 0;
+	args_info->fg_given = 0;
+	args_info->debug_given = 0;
+	args_info->conf_given = 0;
+	args_info->pidfile_given = 0;
+	args_info->statedir_given = 0;
+	args_info->listen_given = 0;
+	args_info->net_given = 0;
+	args_info->ipup_given = 0;
+	args_info->ipdown_given = 0;
+	args_info->dynip_given = 0;
+	args_info->statip_given = 0;
+	args_info->pcodns1_given = 0;
+	args_info->pcodns2_given = 0;
+	args_info->timelimit_given = 0;
+	args_info->apn_given = 0;
+	args_info->qos_given = 0;
 }
 
 static
-void clear_args (struct gengetopt_args_info *args_info)
+void clear_args(struct gengetopt_args_info *args_info)
 {
-  args_info->fg_flag = 0;
-  args_info->debug_flag = 0;
-  args_info->conf_arg = gengetopt_strdup ("/etc/ggsn.conf");
-  args_info->conf_orig = NULL;
-  args_info->pidfile_arg = gengetopt_strdup ("/var/run/ggsn.pid");
-  args_info->pidfile_orig = NULL;
-  args_info->statedir_arg = gengetopt_strdup ("/var/lib/ggsn/");
-  args_info->statedir_orig = NULL;
-  args_info->listen_arg = NULL;
-  args_info->listen_orig = NULL;
-  args_info->net_arg = gengetopt_strdup ("192.168.0.0/24");
-  args_info->net_orig = NULL;
-  args_info->ipup_arg = NULL;
-  args_info->ipup_orig = NULL;
-  args_info->ipdown_arg = NULL;
-  args_info->ipdown_orig = NULL;
-  args_info->dynip_arg = NULL;
-  args_info->dynip_orig = NULL;
-  args_info->statip_arg = NULL;
-  args_info->statip_orig = NULL;
-  args_info->pcodns1_arg = gengetopt_strdup ("0.0.0.0");
-  args_info->pcodns1_orig = NULL;
-  args_info->pcodns2_arg = gengetopt_strdup ("0.0.0.0");
-  args_info->pcodns2_orig = NULL;
-  args_info->timelimit_arg = 0;
-  args_info->timelimit_orig = NULL;
-  args_info->apn_arg = gengetopt_strdup ("internet");
-  args_info->apn_orig = NULL;
-  args_info->qos_arg = 0x0b921f;
-  args_info->qos_orig = NULL;
-  
+	args_info->fg_flag = 0;
+	args_info->debug_flag = 0;
+	args_info->conf_arg = gengetopt_strdup("/etc/ggsn.conf");
+	args_info->conf_orig = NULL;
+	args_info->pidfile_arg = gengetopt_strdup("/var/run/ggsn.pid");
+	args_info->pidfile_orig = NULL;
+	args_info->statedir_arg = gengetopt_strdup("/var/lib/ggsn/");
+	args_info->statedir_orig = NULL;
+	args_info->listen_arg = NULL;
+	args_info->listen_orig = NULL;
+	args_info->net_arg = gengetopt_strdup("192.168.0.0/24");
+	args_info->net_orig = NULL;
+	args_info->ipup_arg = NULL;
+	args_info->ipup_orig = NULL;
+	args_info->ipdown_arg = NULL;
+	args_info->ipdown_orig = NULL;
+	args_info->dynip_arg = NULL;
+	args_info->dynip_orig = NULL;
+	args_info->statip_arg = NULL;
+	args_info->statip_orig = NULL;
+	args_info->pcodns1_arg = gengetopt_strdup("0.0.0.0");
+	args_info->pcodns1_orig = NULL;
+	args_info->pcodns2_arg = gengetopt_strdup("0.0.0.0");
+	args_info->pcodns2_orig = NULL;
+	args_info->timelimit_arg = 0;
+	args_info->timelimit_orig = NULL;
+	args_info->apn_arg = gengetopt_strdup("internet");
+	args_info->apn_orig = NULL;
+	args_info->qos_arg = 0x0b921f;
+	args_info->qos_orig = NULL;
+
 }
 
 static
 void init_args_info(struct gengetopt_args_info *args_info)
 {
-  args_info->help_help = gengetopt_args_info_help[0] ;
-  args_info->version_help = gengetopt_args_info_help[1] ;
-  args_info->fg_help = gengetopt_args_info_help[2] ;
-  args_info->debug_help = gengetopt_args_info_help[3] ;
-  args_info->conf_help = gengetopt_args_info_help[4] ;
-  args_info->pidfile_help = gengetopt_args_info_help[5] ;
-  args_info->statedir_help = gengetopt_args_info_help[6] ;
-  args_info->listen_help = gengetopt_args_info_help[7] ;
-  args_info->net_help = gengetopt_args_info_help[8] ;
-  args_info->ipup_help = gengetopt_args_info_help[9] ;
-  args_info->ipdown_help = gengetopt_args_info_help[10] ;
-  args_info->dynip_help = gengetopt_args_info_help[11] ;
-  args_info->statip_help = gengetopt_args_info_help[12] ;
-  args_info->pcodns1_help = gengetopt_args_info_help[13] ;
-  args_info->pcodns2_help = gengetopt_args_info_help[14] ;
-  args_info->timelimit_help = gengetopt_args_info_help[15] ;
-  args_info->apn_help = gengetopt_args_info_help[16] ;
-  args_info->qos_help = gengetopt_args_info_help[17] ;
-  
+	args_info->help_help = gengetopt_args_info_help[0];
+	args_info->version_help = gengetopt_args_info_help[1];
+	args_info->fg_help = gengetopt_args_info_help[2];
+	args_info->debug_help = gengetopt_args_info_help[3];
+	args_info->conf_help = gengetopt_args_info_help[4];
+	args_info->pidfile_help = gengetopt_args_info_help[5];
+	args_info->statedir_help = gengetopt_args_info_help[6];
+	args_info->listen_help = gengetopt_args_info_help[7];
+	args_info->net_help = gengetopt_args_info_help[8];
+	args_info->ipup_help = gengetopt_args_info_help[9];
+	args_info->ipdown_help = gengetopt_args_info_help[10];
+	args_info->dynip_help = gengetopt_args_info_help[11];
+	args_info->statip_help = gengetopt_args_info_help[12];
+	args_info->pcodns1_help = gengetopt_args_info_help[13];
+	args_info->pcodns2_help = gengetopt_args_info_help[14];
+	args_info->timelimit_help = gengetopt_args_info_help[15];
+	args_info->apn_help = gengetopt_args_info_help[16];
+	args_info->qos_help = gengetopt_args_info_help[17];
+
 }
 
-void
-cmdline_parser_print_version (void)
+void cmdline_parser_print_version(void)
 {
-  printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
+	printf("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION);
 }
 
-void
-cmdline_parser_print_help (void)
+void cmdline_parser_print_help(void)
 {
-  int i = 0;
-  cmdline_parser_print_version ();
+	int i = 0;
+	cmdline_parser_print_version();
 
-  if (strlen(gengetopt_args_info_purpose) > 0)
-    printf("\n%s\n", gengetopt_args_info_purpose);
+	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++]);
+	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)
+void cmdline_parser_init(struct gengetopt_args_info *args_info)
 {
-  clear_given (args_info);
-  clear_args (args_info);
-  init_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)
+static void cmdline_parser_release(struct gengetopt_args_info *args_info)
 {
-  
-  if (args_info->conf_arg)
-    {
-      free (args_info->conf_arg); /* free previous argument */
-      args_info->conf_arg = 0;
-    }
-  if (args_info->conf_orig)
-    {
-      free (args_info->conf_orig); /* free previous argument */
-      args_info->conf_orig = 0;
-    }
-  if (args_info->pidfile_arg)
-    {
-      free (args_info->pidfile_arg); /* free previous argument */
-      args_info->pidfile_arg = 0;
-    }
-  if (args_info->pidfile_orig)
-    {
-      free (args_info->pidfile_orig); /* free previous argument */
-      args_info->pidfile_orig = 0;
-    }
-  if (args_info->statedir_arg)
-    {
-      free (args_info->statedir_arg); /* free previous argument */
-      args_info->statedir_arg = 0;
-    }
-  if (args_info->statedir_orig)
-    {
-      free (args_info->statedir_orig); /* free previous argument */
-      args_info->statedir_orig = 0;
-    }
-  if (args_info->listen_arg)
-    {
-      free (args_info->listen_arg); /* free previous argument */
-      args_info->listen_arg = 0;
-    }
-  if (args_info->listen_orig)
-    {
-      free (args_info->listen_orig); /* free previous argument */
-      args_info->listen_orig = 0;
-    }
-  if (args_info->net_arg)
-    {
-      free (args_info->net_arg); /* free previous argument */
-      args_info->net_arg = 0;
-    }
-  if (args_info->net_orig)
-    {
-      free (args_info->net_orig); /* free previous argument */
-      args_info->net_orig = 0;
-    }
-  if (args_info->ipup_arg)
-    {
-      free (args_info->ipup_arg); /* free previous argument */
-      args_info->ipup_arg = 0;
-    }
-  if (args_info->ipup_orig)
-    {
-      free (args_info->ipup_orig); /* free previous argument */
-      args_info->ipup_orig = 0;
-    }
-  if (args_info->ipdown_arg)
-    {
-      free (args_info->ipdown_arg); /* free previous argument */
-      args_info->ipdown_arg = 0;
-    }
-  if (args_info->ipdown_orig)
-    {
-      free (args_info->ipdown_orig); /* free previous argument */
-      args_info->ipdown_orig = 0;
-    }
-  if (args_info->dynip_arg)
-    {
-      free (args_info->dynip_arg); /* free previous argument */
-      args_info->dynip_arg = 0;
-    }
-  if (args_info->dynip_orig)
-    {
-      free (args_info->dynip_orig); /* free previous argument */
-      args_info->dynip_orig = 0;
-    }
-  if (args_info->statip_arg)
-    {
-      free (args_info->statip_arg); /* free previous argument */
-      args_info->statip_arg = 0;
-    }
-  if (args_info->statip_orig)
-    {
-      free (args_info->statip_orig); /* free previous argument */
-      args_info->statip_orig = 0;
-    }
-  if (args_info->pcodns1_arg)
-    {
-      free (args_info->pcodns1_arg); /* free previous argument */
-      args_info->pcodns1_arg = 0;
-    }
-  if (args_info->pcodns1_orig)
-    {
-      free (args_info->pcodns1_orig); /* free previous argument */
-      args_info->pcodns1_orig = 0;
-    }
-  if (args_info->pcodns2_arg)
-    {
-      free (args_info->pcodns2_arg); /* free previous argument */
-      args_info->pcodns2_arg = 0;
-    }
-  if (args_info->pcodns2_orig)
-    {
-      free (args_info->pcodns2_orig); /* free previous argument */
-      args_info->pcodns2_orig = 0;
-    }
-  if (args_info->timelimit_orig)
-    {
-      free (args_info->timelimit_orig); /* free previous argument */
-      args_info->timelimit_orig = 0;
-    }
-  if (args_info->apn_arg)
-    {
-      free (args_info->apn_arg); /* free previous argument */
-      args_info->apn_arg = 0;
-    }
-  if (args_info->apn_orig)
-    {
-      free (args_info->apn_orig); /* free previous argument */
-      args_info->apn_orig = 0;
-    }
-  if (args_info->qos_orig)
-    {
-      free (args_info->qos_orig); /* free previous argument */
-      args_info->qos_orig = 0;
-    }
-  
-  clear_given (args_info);
+
+	if (args_info->conf_arg) {
+		free(args_info->conf_arg);	/* free previous argument */
+		args_info->conf_arg = 0;
+	}
+	if (args_info->conf_orig) {
+		free(args_info->conf_orig);	/* free previous argument */
+		args_info->conf_orig = 0;
+	}
+	if (args_info->pidfile_arg) {
+		free(args_info->pidfile_arg);	/* free previous argument */
+		args_info->pidfile_arg = 0;
+	}
+	if (args_info->pidfile_orig) {
+		free(args_info->pidfile_orig);	/* free previous argument */
+		args_info->pidfile_orig = 0;
+	}
+	if (args_info->statedir_arg) {
+		free(args_info->statedir_arg);	/* free previous argument */
+		args_info->statedir_arg = 0;
+	}
+	if (args_info->statedir_orig) {
+		free(args_info->statedir_orig);	/* free previous argument */
+		args_info->statedir_orig = 0;
+	}
+	if (args_info->listen_arg) {
+		free(args_info->listen_arg);	/* free previous argument */
+		args_info->listen_arg = 0;
+	}
+	if (args_info->listen_orig) {
+		free(args_info->listen_orig);	/* free previous argument */
+		args_info->listen_orig = 0;
+	}
+	if (args_info->net_arg) {
+		free(args_info->net_arg);	/* free previous argument */
+		args_info->net_arg = 0;
+	}
+	if (args_info->net_orig) {
+		free(args_info->net_orig);	/* free previous argument */
+		args_info->net_orig = 0;
+	}
+	if (args_info->ipup_arg) {
+		free(args_info->ipup_arg);	/* free previous argument */
+		args_info->ipup_arg = 0;
+	}
+	if (args_info->ipup_orig) {
+		free(args_info->ipup_orig);	/* free previous argument */
+		args_info->ipup_orig = 0;
+	}
+	if (args_info->ipdown_arg) {
+		free(args_info->ipdown_arg);	/* free previous argument */
+		args_info->ipdown_arg = 0;
+	}
+	if (args_info->ipdown_orig) {
+		free(args_info->ipdown_orig);	/* free previous argument */
+		args_info->ipdown_orig = 0;
+	}
+	if (args_info->dynip_arg) {
+		free(args_info->dynip_arg);	/* free previous argument */
+		args_info->dynip_arg = 0;
+	}
+	if (args_info->dynip_orig) {
+		free(args_info->dynip_orig);	/* free previous argument */
+		args_info->dynip_orig = 0;
+	}
+	if (args_info->statip_arg) {
+		free(args_info->statip_arg);	/* free previous argument */
+		args_info->statip_arg = 0;
+	}
+	if (args_info->statip_orig) {
+		free(args_info->statip_orig);	/* free previous argument */
+		args_info->statip_orig = 0;
+	}
+	if (args_info->pcodns1_arg) {
+		free(args_info->pcodns1_arg);	/* free previous argument */
+		args_info->pcodns1_arg = 0;
+	}
+	if (args_info->pcodns1_orig) {
+		free(args_info->pcodns1_orig);	/* free previous argument */
+		args_info->pcodns1_orig = 0;
+	}
+	if (args_info->pcodns2_arg) {
+		free(args_info->pcodns2_arg);	/* free previous argument */
+		args_info->pcodns2_arg = 0;
+	}
+	if (args_info->pcodns2_orig) {
+		free(args_info->pcodns2_orig);	/* free previous argument */
+		args_info->pcodns2_orig = 0;
+	}
+	if (args_info->timelimit_orig) {
+		free(args_info->timelimit_orig);	/* free previous argument */
+		args_info->timelimit_orig = 0;
+	}
+	if (args_info->apn_arg) {
+		free(args_info->apn_arg);	/* free previous argument */
+		args_info->apn_arg = 0;
+	}
+	if (args_info->apn_orig) {
+		free(args_info->apn_orig);	/* free previous argument */
+		args_info->apn_orig = 0;
+	}
+	if (args_info->qos_orig) {
+		free(args_info->qos_orig);	/* free previous argument */
+		args_info->qos_orig = 0;
+	}
+
+	clear_given(args_info);
 }
 
 int
-cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info)
+cmdline_parser_file_save(const char *filename,
+			 struct gengetopt_args_info *args_info)
 {
-  FILE *outfile;
-  int i = 0;
+	FILE *outfile;
+	int i = 0;
 
-  outfile = fopen(filename, "w");
+	outfile = fopen(filename, "w");
 
-  if (!outfile)
-    {
-      fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename);
-      return EXIT_FAILURE;
-    }
+	if (!outfile) {
+		fprintf(stderr, "%s: cannot open file for writing: %s\n",
+			CMDLINE_PARSER_PACKAGE, filename);
+		return EXIT_FAILURE;
+	}
 
-  if (args_info->help_given) {
-    fprintf(outfile, "%s\n", "help");
-  }
-  if (args_info->version_given) {
-    fprintf(outfile, "%s\n", "version");
-  }
-  if (args_info->fg_given) {
-    fprintf(outfile, "%s\n", "fg");
-  }
-  if (args_info->debug_given) {
-    fprintf(outfile, "%s\n", "debug");
-  }
-  if (args_info->conf_given) {
-    if (args_info->conf_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "conf", args_info->conf_orig);
-    } else {
-      fprintf(outfile, "%s\n", "conf");
-    }
-  }
-  if (args_info->pidfile_given) {
-    if (args_info->pidfile_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "pidfile", args_info->pidfile_orig);
-    } else {
-      fprintf(outfile, "%s\n", "pidfile");
-    }
-  }
-  if (args_info->statedir_given) {
-    if (args_info->statedir_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "statedir", args_info->statedir_orig);
-    } else {
-      fprintf(outfile, "%s\n", "statedir");
-    }
-  }
-  if (args_info->listen_given) {
-    if (args_info->listen_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "listen", args_info->listen_orig);
-    } else {
-      fprintf(outfile, "%s\n", "listen");
-    }
-  }
-  if (args_info->net_given) {
-    if (args_info->net_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "net", args_info->net_orig);
-    } else {
-      fprintf(outfile, "%s\n", "net");
-    }
-  }
-  if (args_info->ipup_given) {
-    if (args_info->ipup_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "ipup", args_info->ipup_orig);
-    } else {
-      fprintf(outfile, "%s\n", "ipup");
-    }
-  }
-  if (args_info->ipdown_given) {
-    if (args_info->ipdown_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "ipdown", args_info->ipdown_orig);
-    } else {
-      fprintf(outfile, "%s\n", "ipdown");
-    }
-  }
-  if (args_info->dynip_given) {
-    if (args_info->dynip_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "dynip", args_info->dynip_orig);
-    } else {
-      fprintf(outfile, "%s\n", "dynip");
-    }
-  }
-  if (args_info->statip_given) {
-    if (args_info->statip_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "statip", args_info->statip_orig);
-    } else {
-      fprintf(outfile, "%s\n", "statip");
-    }
-  }
-  if (args_info->pcodns1_given) {
-    if (args_info->pcodns1_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "pcodns1", args_info->pcodns1_orig);
-    } else {
-      fprintf(outfile, "%s\n", "pcodns1");
-    }
-  }
-  if (args_info->pcodns2_given) {
-    if (args_info->pcodns2_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "pcodns2", args_info->pcodns2_orig);
-    } else {
-      fprintf(outfile, "%s\n", "pcodns2");
-    }
-  }
-  if (args_info->timelimit_given) {
-    if (args_info->timelimit_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "timelimit", args_info->timelimit_orig);
-    } else {
-      fprintf(outfile, "%s\n", "timelimit");
-    }
-  }
-  if (args_info->apn_given) {
-    if (args_info->apn_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "apn", args_info->apn_orig);
-    } else {
-      fprintf(outfile, "%s\n", "apn");
-    }
-  }
-  if (args_info->qos_given) {
-    if (args_info->qos_orig) {
-      fprintf(outfile, "%s=\"%s\"\n", "qos", args_info->qos_orig);
-    } else {
-      fprintf(outfile, "%s\n", "qos");
-    }
-  }
-  
-  fclose (outfile);
+	if (args_info->help_given) {
+		fprintf(outfile, "%s\n", "help");
+	}
+	if (args_info->version_given) {
+		fprintf(outfile, "%s\n", "version");
+	}
+	if (args_info->fg_given) {
+		fprintf(outfile, "%s\n", "fg");
+	}
+	if (args_info->debug_given) {
+		fprintf(outfile, "%s\n", "debug");
+	}
+	if (args_info->conf_given) {
+		if (args_info->conf_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "conf",
+				args_info->conf_orig);
+		} else {
+			fprintf(outfile, "%s\n", "conf");
+		}
+	}
+	if (args_info->pidfile_given) {
+		if (args_info->pidfile_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "pidfile",
+				args_info->pidfile_orig);
+		} else {
+			fprintf(outfile, "%s\n", "pidfile");
+		}
+	}
+	if (args_info->statedir_given) {
+		if (args_info->statedir_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "statedir",
+				args_info->statedir_orig);
+		} else {
+			fprintf(outfile, "%s\n", "statedir");
+		}
+	}
+	if (args_info->listen_given) {
+		if (args_info->listen_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "listen",
+				args_info->listen_orig);
+		} else {
+			fprintf(outfile, "%s\n", "listen");
+		}
+	}
+	if (args_info->net_given) {
+		if (args_info->net_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "net",
+				args_info->net_orig);
+		} else {
+			fprintf(outfile, "%s\n", "net");
+		}
+	}
+	if (args_info->ipup_given) {
+		if (args_info->ipup_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "ipup",
+				args_info->ipup_orig);
+		} else {
+			fprintf(outfile, "%s\n", "ipup");
+		}
+	}
+	if (args_info->ipdown_given) {
+		if (args_info->ipdown_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "ipdown",
+				args_info->ipdown_orig);
+		} else {
+			fprintf(outfile, "%s\n", "ipdown");
+		}
+	}
+	if (args_info->dynip_given) {
+		if (args_info->dynip_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "dynip",
+				args_info->dynip_orig);
+		} else {
+			fprintf(outfile, "%s\n", "dynip");
+		}
+	}
+	if (args_info->statip_given) {
+		if (args_info->statip_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "statip",
+				args_info->statip_orig);
+		} else {
+			fprintf(outfile, "%s\n", "statip");
+		}
+	}
+	if (args_info->pcodns1_given) {
+		if (args_info->pcodns1_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "pcodns1",
+				args_info->pcodns1_orig);
+		} else {
+			fprintf(outfile, "%s\n", "pcodns1");
+		}
+	}
+	if (args_info->pcodns2_given) {
+		if (args_info->pcodns2_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "pcodns2",
+				args_info->pcodns2_orig);
+		} else {
+			fprintf(outfile, "%s\n", "pcodns2");
+		}
+	}
+	if (args_info->timelimit_given) {
+		if (args_info->timelimit_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "timelimit",
+				args_info->timelimit_orig);
+		} else {
+			fprintf(outfile, "%s\n", "timelimit");
+		}
+	}
+	if (args_info->apn_given) {
+		if (args_info->apn_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "apn",
+				args_info->apn_orig);
+		} else {
+			fprintf(outfile, "%s\n", "apn");
+		}
+	}
+	if (args_info->qos_given) {
+		if (args_info->qos_orig) {
+			fprintf(outfile, "%s=\"%s\"\n", "qos",
+				args_info->qos_orig);
+		} else {
+			fprintf(outfile, "%s\n", "qos");
+		}
+	}
 
-  i = EXIT_SUCCESS;
-  return i;
+	fclose(outfile);
+
+	i = EXIT_SUCCESS;
+	return i;
 }
 
-void
-cmdline_parser_free (struct gengetopt_args_info *args_info)
+void cmdline_parser_free(struct gengetopt_args_info *args_info)
 {
-  cmdline_parser_release (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 *gengetopt_strdup(const char *s)
 {
-  char *result = NULL;
-  if (!s)
-    return result;
+	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;
+	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)
+cmdline_parser(int argc, char *const *argv,
+	       struct gengetopt_args_info *args_info)
 {
-  return cmdline_parser2 (argc, argv, args_info, 0, 1, 1);
+	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_parser2(int argc, char *const *argv,
+		struct gengetopt_args_info *args_info, int override,
+		int initialize, int check_required)
 {
-  int result;
+	int result;
 
-  result = cmdline_parser_internal (argc, argv, args_info, override, initialize, check_required, NULL);
+	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;
+	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)
+cmdline_parser_required(struct gengetopt_args_info *args_info,
+			const char *prog_name)
 {
-  return EXIT_SUCCESS;
+	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)
+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 c;			/* Character of the parsed option.  */
 
-  int error = 0;
-  struct gengetopt_args_info local_args_info;
+	int error = 0;
+	struct gengetopt_args_info local_args_info;
 
-  if (initialize)
-    cmdline_parser_init (args_info);
+	if (initialize)
+		cmdline_parser_init(args_info);
 
-  cmdline_parser_init (&local_args_info);
+	cmdline_parser_init(&local_args_info);
 
-  optarg = 0;
-  optind = 0;
-  opterr = 1;
-  optopt = '?';
+	optarg = 0;
+	optind = 0;
+	opterr = 1;
+	optopt = '?';
 
-  while (1)
-    {
-      int option_index = 0;
-      char *stop_char;
+	while (1) {
+		int option_index = 0;
+		char *stop_char;
 
-      static struct option long_options[] = {
-        { "help",	0, NULL, 'h' },
-        { "version",	0, NULL, 'V' },
-        { "fg",	0, NULL, 'f' },
-        { "debug",	0, NULL, 'd' },
-        { "conf",	1, NULL, 'c' },
-        { "pidfile",	1, NULL, 0 },
-        { "statedir",	1, NULL, 0 },
-        { "listen",	1, NULL, 'l' },
-        { "net",	1, NULL, 'n' },
-        { "ipup",	1, NULL, 0 },
-        { "ipdown",	1, NULL, 0 },
-        { "dynip",	1, NULL, 0 },
-        { "statip",	1, NULL, 0 },
-        { "pcodns1",	1, NULL, 0 },
-        { "pcodns2",	1, NULL, 0 },
-        { "timelimit",	1, NULL, 0 },
-        { "apn",	1, NULL, 'a' },
-        { "qos",	1, NULL, 'q' },
-        { NULL,	0, NULL, 0 }
-      };
+		static struct option long_options[] = {
+			{"help", 0, NULL, 'h'},
+			{"version", 0, NULL, 'V'},
+			{"fg", 0, NULL, 'f'},
+			{"debug", 0, NULL, 'd'},
+			{"conf", 1, NULL, 'c'},
+			{"pidfile", 1, NULL, 0},
+			{"statedir", 1, NULL, 0},
+			{"listen", 1, NULL, 'l'},
+			{"net", 1, NULL, 'n'},
+			{"ipup", 1, NULL, 0},
+			{"ipdown", 1, NULL, 0},
+			{"dynip", 1, NULL, 0},
+			{"statip", 1, NULL, 0},
+			{"pcodns1", 1, NULL, 0},
+			{"pcodns2", 1, NULL, 0},
+			{"timelimit", 1, NULL, 0},
+			{"apn", 1, NULL, 'a'},
+			{"qos", 1, NULL, 'q'},
+			{NULL, 0, NULL, 0}
+		};
 
-      stop_char = 0;
-      c = getopt_long (argc, argv, "hVfdc:l:n:a:q:", long_options, &option_index);
+		stop_char = 0;
+		c = getopt_long(argc, argv, "hVfdc:l:n:a:q:", long_options,
+				&option_index);
 
-      if (c == -1) break;	/* Exit from `while (1)' loop.  */
+		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);
+		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 'V':	/* Print version and exit.  */
+			cmdline_parser_print_version();
+			cmdline_parser_free(&local_args_info);
+			exit(EXIT_SUCCESS);
 
-        case 'f':	/* Run in foreground.  */
-          if (local_args_info.fg_given)
-            {
-              fprintf (stderr, "%s: `--fg' (`-f') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-              goto failure;
-            }
-          if (args_info->fg_given && ! override)
-            continue;
-          local_args_info.fg_given = 1;
-          args_info->fg_given = 1;
-          args_info->fg_flag = !(args_info->fg_flag);
-          break;
+		case 'f':	/* Run in foreground.  */
+			if (local_args_info.fg_given) {
+				fprintf(stderr,
+					"%s: `--fg' (`-f') option given more than once%s\n",
+					argv[0],
+					(additional_error ? additional_error :
+					 ""));
+				goto failure;
+			}
+			if (args_info->fg_given && !override)
+				continue;
+			local_args_info.fg_given = 1;
+			args_info->fg_given = 1;
+			args_info->fg_flag = !(args_info->fg_flag);
+			break;
 
-        case 'd':	/* Run in debug mode.  */
-          if (local_args_info.debug_given)
-            {
-              fprintf (stderr, "%s: `--debug' (`-d') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-              goto failure;
-            }
-          if (args_info->debug_given && ! override)
-            continue;
-          local_args_info.debug_given = 1;
-          args_info->debug_given = 1;
-          args_info->debug_flag = !(args_info->debug_flag);
-          break;
+		case '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 '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 'l':	/* Local interface.  */
+			if (local_args_info.listen_given) {
+				fprintf(stderr,
+					"%s: `--listen' (`-l') option given more than once%s\n",
+					argv[0],
+					(additional_error ? additional_error :
+					 ""));
+				goto failure;
+			}
+			if (args_info->listen_given && !override)
+				continue;
+			local_args_info.listen_given = 1;
+			args_info->listen_given = 1;
+			if (args_info->listen_arg)
+				free(args_info->listen_arg);	/* free previous string */
+			args_info->listen_arg = gengetopt_strdup(optarg);
+			if (args_info->listen_orig)
+				free(args_info->listen_orig);	/* free previous string */
+			args_info->listen_orig = gengetopt_strdup(optarg);
+			break;
 
-        case 'n':	/* Network.  */
-          if (local_args_info.net_given)
-            {
-              fprintf (stderr, "%s: `--net' (`-n') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-              goto failure;
-            }
-          if (args_info->net_given && ! override)
-            continue;
-          local_args_info.net_given = 1;
-          args_info->net_given = 1;
-          if (args_info->net_arg)
-            free (args_info->net_arg); /* free previous string */
-          args_info->net_arg = gengetopt_strdup (optarg);
-          if (args_info->net_orig)
-            free (args_info->net_orig); /* free previous string */
-          args_info->net_orig = gengetopt_strdup (optarg);
-          break;
+		case 'n':	/* Network.  */
+			if (local_args_info.net_given) {
+				fprintf(stderr,
+					"%s: `--net' (`-n') option given more than once%s\n",
+					argv[0],
+					(additional_error ? additional_error :
+					 ""));
+				goto failure;
+			}
+			if (args_info->net_given && !override)
+				continue;
+			local_args_info.net_given = 1;
+			args_info->net_given = 1;
+			if (args_info->net_arg)
+				free(args_info->net_arg);	/* free previous string */
+			args_info->net_arg = gengetopt_strdup(optarg);
+			if (args_info->net_orig)
+				free(args_info->net_orig);	/* free previous string */
+			args_info->net_orig = gengetopt_strdup(optarg);
+			break;
 
-        case 'a':	/* Access point name.  */
-          if (local_args_info.apn_given)
-            {
-              fprintf (stderr, "%s: `--apn' (`-a') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-              goto failure;
-            }
-          if (args_info->apn_given && ! override)
-            continue;
-          local_args_info.apn_given = 1;
-          args_info->apn_given = 1;
-          if (args_info->apn_arg)
-            free (args_info->apn_arg); /* free previous string */
-          args_info->apn_arg = gengetopt_strdup (optarg);
-          if (args_info->apn_orig)
-            free (args_info->apn_orig); /* free previous string */
-          args_info->apn_orig = gengetopt_strdup (optarg);
-          break;
+		case 'a':	/* Access point name.  */
+			if (local_args_info.apn_given) {
+				fprintf(stderr,
+					"%s: `--apn' (`-a') option given more than once%s\n",
+					argv[0],
+					(additional_error ? additional_error :
+					 ""));
+				goto failure;
+			}
+			if (args_info->apn_given && !override)
+				continue;
+			local_args_info.apn_given = 1;
+			args_info->apn_given = 1;
+			if (args_info->apn_arg)
+				free(args_info->apn_arg);	/* free previous string */
+			args_info->apn_arg = gengetopt_strdup(optarg);
+			if (args_info->apn_orig)
+				free(args_info->apn_orig);	/* free previous string */
+			args_info->apn_orig = gengetopt_strdup(optarg);
+			break;
 
-        case 'q':	/* Requested quality of service.  */
-          if (local_args_info.qos_given)
-            {
-              fprintf (stderr, "%s: `--qos' (`-q') option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-              goto failure;
-            }
-          if (args_info->qos_given && ! override)
-            continue;
-          local_args_info.qos_given = 1;
-          args_info->qos_given = 1;
-          args_info->qos_arg = strtol (optarg, &stop_char, 0);
-          if (!(stop_char && *stop_char == '\0')) {
-            fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], optarg);
-            goto failure;
-          }
-          if (args_info->qos_orig)
-            free (args_info->qos_orig); /* free previous string */
-          args_info->qos_orig = gengetopt_strdup (optarg);
-          break;
+		case 'q':	/* Requested quality of service.  */
+			if (local_args_info.qos_given) {
+				fprintf(stderr,
+					"%s: `--qos' (`-q') option given more than once%s\n",
+					argv[0],
+					(additional_error ? additional_error :
+					 ""));
+				goto failure;
+			}
+			if (args_info->qos_given && !override)
+				continue;
+			local_args_info.qos_given = 1;
+			args_info->qos_given = 1;
+			args_info->qos_arg = strtol(optarg, &stop_char, 0);
+			if (!(stop_char && *stop_char == '\0')) {
+				fprintf(stderr,
+					"%s: invalid numeric value: %s\n",
+					argv[0], optarg);
+				goto failure;
+			}
+			if (args_info->qos_orig)
+				free(args_info->qos_orig);	/* free previous string */
+			args_info->qos_orig = gengetopt_strdup(optarg);
+			break;
 
+		case 0:	/* Long option with no short option */
+			/* Filename of process id file.  */
+			if (strcmp(long_options[option_index].name, "pidfile")
+			    == 0) {
+				if (local_args_info.pidfile_given) {
+					fprintf(stderr,
+						"%s: `--pidfile' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->pidfile_given && !override)
+					continue;
+				local_args_info.pidfile_given = 1;
+				args_info->pidfile_given = 1;
+				if (args_info->pidfile_arg)
+					free(args_info->pidfile_arg);	/* free previous string */
+				args_info->pidfile_arg =
+				    gengetopt_strdup(optarg);
+				if (args_info->pidfile_orig)
+					free(args_info->pidfile_orig);	/* free previous string */
+				args_info->pidfile_orig =
+				    gengetopt_strdup(optarg);
+			}
+			/* Directory of nonvolatile data.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "statedir") == 0) {
+				if (local_args_info.statedir_given) {
+					fprintf(stderr,
+						"%s: `--statedir' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->statedir_given && !override)
+					continue;
+				local_args_info.statedir_given = 1;
+				args_info->statedir_given = 1;
+				if (args_info->statedir_arg)
+					free(args_info->statedir_arg);	/* free previous string */
+				args_info->statedir_arg =
+				    gengetopt_strdup(optarg);
+				if (args_info->statedir_orig)
+					free(args_info->statedir_orig);	/* free previous string */
+				args_info->statedir_orig =
+				    gengetopt_strdup(optarg);
+			}
+			/* Script to run after link-up.  */
+			else if (strcmp(long_options[option_index].name, "ipup")
+				 == 0) {
+				if (local_args_info.ipup_given) {
+					fprintf(stderr,
+						"%s: `--ipup' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->ipup_given && !override)
+					continue;
+				local_args_info.ipup_given = 1;
+				args_info->ipup_given = 1;
+				if (args_info->ipup_arg)
+					free(args_info->ipup_arg);	/* free previous string */
+				args_info->ipup_arg = gengetopt_strdup(optarg);
+				if (args_info->ipup_orig)
+					free(args_info->ipup_orig);	/* free previous string */
+				args_info->ipup_orig = gengetopt_strdup(optarg);
+			}
+			/* Script to run after link-down.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "ipdown") == 0) {
+				if (local_args_info.ipdown_given) {
+					fprintf(stderr,
+						"%s: `--ipdown' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->ipdown_given && !override)
+					continue;
+				local_args_info.ipdown_given = 1;
+				args_info->ipdown_given = 1;
+				if (args_info->ipdown_arg)
+					free(args_info->ipdown_arg);	/* free previous string */
+				args_info->ipdown_arg =
+				    gengetopt_strdup(optarg);
+				if (args_info->ipdown_orig)
+					free(args_info->ipdown_orig);	/* free previous string */
+				args_info->ipdown_orig =
+				    gengetopt_strdup(optarg);
+			}
+			/* Dynamic IP address pool.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "dynip") == 0) {
+				if (local_args_info.dynip_given) {
+					fprintf(stderr,
+						"%s: `--dynip' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->dynip_given && !override)
+					continue;
+				local_args_info.dynip_given = 1;
+				args_info->dynip_given = 1;
+				if (args_info->dynip_arg)
+					free(args_info->dynip_arg);	/* free previous string */
+				args_info->dynip_arg = gengetopt_strdup(optarg);
+				if (args_info->dynip_orig)
+					free(args_info->dynip_orig);	/* free previous string */
+				args_info->dynip_orig =
+				    gengetopt_strdup(optarg);
+			}
+			/* Static IP address pool.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "statip") == 0) {
+				if (local_args_info.statip_given) {
+					fprintf(stderr,
+						"%s: `--statip' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->statip_given && !override)
+					continue;
+				local_args_info.statip_given = 1;
+				args_info->statip_given = 1;
+				if (args_info->statip_arg)
+					free(args_info->statip_arg);	/* free previous string */
+				args_info->statip_arg =
+				    gengetopt_strdup(optarg);
+				if (args_info->statip_orig)
+					free(args_info->statip_orig);	/* free previous string */
+				args_info->statip_orig =
+				    gengetopt_strdup(optarg);
+			}
+			/* PCO DNS Server 1.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "pcodns1") == 0) {
+				if (local_args_info.pcodns1_given) {
+					fprintf(stderr,
+						"%s: `--pcodns1' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->pcodns1_given && !override)
+					continue;
+				local_args_info.pcodns1_given = 1;
+				args_info->pcodns1_given = 1;
+				if (args_info->pcodns1_arg)
+					free(args_info->pcodns1_arg);	/* free previous string */
+				args_info->pcodns1_arg =
+				    gengetopt_strdup(optarg);
+				if (args_info->pcodns1_orig)
+					free(args_info->pcodns1_orig);	/* free previous string */
+				args_info->pcodns1_orig =
+				    gengetopt_strdup(optarg);
+			}
+			/* PCO DNS Server 2.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "pcodns2") == 0) {
+				if (local_args_info.pcodns2_given) {
+					fprintf(stderr,
+						"%s: `--pcodns2' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->pcodns2_given && !override)
+					continue;
+				local_args_info.pcodns2_given = 1;
+				args_info->pcodns2_given = 1;
+				if (args_info->pcodns2_arg)
+					free(args_info->pcodns2_arg);	/* free previous string */
+				args_info->pcodns2_arg =
+				    gengetopt_strdup(optarg);
+				if (args_info->pcodns2_orig)
+					free(args_info->pcodns2_orig);	/* free previous string */
+				args_info->pcodns2_orig =
+				    gengetopt_strdup(optarg);
+			}
+			/* Exit after timelimit seconds.  */
+			else if (strcmp
+				 (long_options[option_index].name,
+				  "timelimit") == 0) {
+				if (local_args_info.timelimit_given) {
+					fprintf(stderr,
+						"%s: `--timelimit' option given more than once%s\n",
+						argv[0],
+						(additional_error ?
+						 additional_error : ""));
+					goto failure;
+				}
+				if (args_info->timelimit_given && !override)
+					continue;
+				local_args_info.timelimit_given = 1;
+				args_info->timelimit_given = 1;
+				args_info->timelimit_arg =
+				    strtol(optarg, &stop_char, 0);
+				if (!(stop_char && *stop_char == '\0')) {
+					fprintf(stderr,
+						"%s: invalid numeric value: %s\n",
+						argv[0], optarg);
+					goto failure;
+				}
+				if (args_info->timelimit_orig)
+					free(args_info->timelimit_orig);	/* free previous string */
+				args_info->timelimit_orig =
+				    gengetopt_strdup(optarg);
+			}
 
-        case 0:	/* Long option with no short option */
-          /* Filename of process id file.  */
-          if (strcmp (long_options[option_index].name, "pidfile") == 0)
-          {
-            if (local_args_info.pidfile_given)
-              {
-                fprintf (stderr, "%s: `--pidfile' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->pidfile_given && ! override)
-              continue;
-            local_args_info.pidfile_given = 1;
-            args_info->pidfile_given = 1;
-            if (args_info->pidfile_arg)
-              free (args_info->pidfile_arg); /* free previous string */
-            args_info->pidfile_arg = gengetopt_strdup (optarg);
-            if (args_info->pidfile_orig)
-              free (args_info->pidfile_orig); /* free previous string */
-            args_info->pidfile_orig = gengetopt_strdup (optarg);
-          }
-          /* Directory of nonvolatile data.  */
-          else if (strcmp (long_options[option_index].name, "statedir") == 0)
-          {
-            if (local_args_info.statedir_given)
-              {
-                fprintf (stderr, "%s: `--statedir' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->statedir_given && ! override)
-              continue;
-            local_args_info.statedir_given = 1;
-            args_info->statedir_given = 1;
-            if (args_info->statedir_arg)
-              free (args_info->statedir_arg); /* free previous string */
-            args_info->statedir_arg = gengetopt_strdup (optarg);
-            if (args_info->statedir_orig)
-              free (args_info->statedir_orig); /* free previous string */
-            args_info->statedir_orig = gengetopt_strdup (optarg);
-          }
-          /* Script to run after link-up.  */
-          else if (strcmp (long_options[option_index].name, "ipup") == 0)
-          {
-            if (local_args_info.ipup_given)
-              {
-                fprintf (stderr, "%s: `--ipup' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->ipup_given && ! override)
-              continue;
-            local_args_info.ipup_given = 1;
-            args_info->ipup_given = 1;
-            if (args_info->ipup_arg)
-              free (args_info->ipup_arg); /* free previous string */
-            args_info->ipup_arg = gengetopt_strdup (optarg);
-            if (args_info->ipup_orig)
-              free (args_info->ipup_orig); /* free previous string */
-            args_info->ipup_orig = gengetopt_strdup (optarg);
-          }
-          /* Script to run after link-down.  */
-          else if (strcmp (long_options[option_index].name, "ipdown") == 0)
-          {
-            if (local_args_info.ipdown_given)
-              {
-                fprintf (stderr, "%s: `--ipdown' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->ipdown_given && ! override)
-              continue;
-            local_args_info.ipdown_given = 1;
-            args_info->ipdown_given = 1;
-            if (args_info->ipdown_arg)
-              free (args_info->ipdown_arg); /* free previous string */
-            args_info->ipdown_arg = gengetopt_strdup (optarg);
-            if (args_info->ipdown_orig)
-              free (args_info->ipdown_orig); /* free previous string */
-            args_info->ipdown_orig = gengetopt_strdup (optarg);
-          }
-          /* Dynamic IP address pool.  */
-          else if (strcmp (long_options[option_index].name, "dynip") == 0)
-          {
-            if (local_args_info.dynip_given)
-              {
-                fprintf (stderr, "%s: `--dynip' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->dynip_given && ! override)
-              continue;
-            local_args_info.dynip_given = 1;
-            args_info->dynip_given = 1;
-            if (args_info->dynip_arg)
-              free (args_info->dynip_arg); /* free previous string */
-            args_info->dynip_arg = gengetopt_strdup (optarg);
-            if (args_info->dynip_orig)
-              free (args_info->dynip_orig); /* free previous string */
-            args_info->dynip_orig = gengetopt_strdup (optarg);
-          }
-          /* Static IP address pool.  */
-          else if (strcmp (long_options[option_index].name, "statip") == 0)
-          {
-            if (local_args_info.statip_given)
-              {
-                fprintf (stderr, "%s: `--statip' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->statip_given && ! override)
-              continue;
-            local_args_info.statip_given = 1;
-            args_info->statip_given = 1;
-            if (args_info->statip_arg)
-              free (args_info->statip_arg); /* free previous string */
-            args_info->statip_arg = gengetopt_strdup (optarg);
-            if (args_info->statip_orig)
-              free (args_info->statip_orig); /* free previous string */
-            args_info->statip_orig = gengetopt_strdup (optarg);
-          }
-          /* PCO DNS Server 1.  */
-          else if (strcmp (long_options[option_index].name, "pcodns1") == 0)
-          {
-            if (local_args_info.pcodns1_given)
-              {
-                fprintf (stderr, "%s: `--pcodns1' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->pcodns1_given && ! override)
-              continue;
-            local_args_info.pcodns1_given = 1;
-            args_info->pcodns1_given = 1;
-            if (args_info->pcodns1_arg)
-              free (args_info->pcodns1_arg); /* free previous string */
-            args_info->pcodns1_arg = gengetopt_strdup (optarg);
-            if (args_info->pcodns1_orig)
-              free (args_info->pcodns1_orig); /* free previous string */
-            args_info->pcodns1_orig = gengetopt_strdup (optarg);
-          }
-          /* PCO DNS Server 2.  */
-          else if (strcmp (long_options[option_index].name, "pcodns2") == 0)
-          {
-            if (local_args_info.pcodns2_given)
-              {
-                fprintf (stderr, "%s: `--pcodns2' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->pcodns2_given && ! override)
-              continue;
-            local_args_info.pcodns2_given = 1;
-            args_info->pcodns2_given = 1;
-            if (args_info->pcodns2_arg)
-              free (args_info->pcodns2_arg); /* free previous string */
-            args_info->pcodns2_arg = gengetopt_strdup (optarg);
-            if (args_info->pcodns2_orig)
-              free (args_info->pcodns2_orig); /* free previous string */
-            args_info->pcodns2_orig = gengetopt_strdup (optarg);
-          }
-          /* Exit after timelimit seconds.  */
-          else if (strcmp (long_options[option_index].name, "timelimit") == 0)
-          {
-            if (local_args_info.timelimit_given)
-              {
-                fprintf (stderr, "%s: `--timelimit' option given more than once%s\n", argv[0], (additional_error ? additional_error : ""));
-                goto failure;
-              }
-            if (args_info->timelimit_given && ! override)
-              continue;
-            local_args_info.timelimit_given = 1;
-            args_info->timelimit_given = 1;
-            args_info->timelimit_arg = strtol (optarg, &stop_char, 0);
-            if (!(stop_char && *stop_char == '\0')) {
-              fprintf(stderr, "%s: invalid numeric value: %s\n", argv[0], optarg);
-              goto failure;
-            }
-            if (args_info->timelimit_orig)
-              free (args_info->timelimit_orig); /* free previous string */
-            args_info->timelimit_orig = gengetopt_strdup (optarg);
-          }
-          
-          break;
-        case '?':	/* Invalid option.  */
-          /* `getopt_long' already printed an error message.  */
-          goto failure;
+			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 */
+		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);
 
-
-  cmdline_parser_release (&local_args_info);
-
-  if ( error )
-    return (EXIT_FAILURE);
-
-  return 0;
+	return 0;
 
 failure:
-  
-  cmdline_parser_release (&local_args_info);
-  return (EXIT_FAILURE);
+
+	cmdline_parser_release(&local_args_info);
+	return (EXIT_FAILURE);
 }
 
 #ifndef CONFIG_FILE_LINE_SIZE
@@ -905,168 +966,167 @@
 #define CONFIG_FILE_LINE_BUFFER_SIZE (CONFIG_FILE_LINE_SIZE+3)
 /* 3 is for "--" and "=" */
 
-char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE+1];
+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)
+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;
+	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);
+	/* 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;
-    }
+	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;
-        }
+	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;
+		/* 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 */
+		if (str_index[0] == '\0' || str_index[0] == '#')
+			continue;	/* empty line or comment line is skipped */
 
-      fopt = str_index;
+		fopt = str_index;
 
-      /* truncate fopt at the end of the first non-valid character */
-      next_token = strcspn (fopt, " \t\r\n=");
+		/* 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;
-        }
+		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';
+		/* 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;
+		/* 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;
-        }
+		/* 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';
+		/* 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;
-            }
-        }
+		/* 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);
+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);
+		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 */
+		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;
+	++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);
+	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);
+	free(additional_error);
+	free(my_argv_arg);
 
 conf_failure:
-  if (file)
-    fclose(file);
+	if (file)
+		fclose(file);
 
-  free_cmd_list();
-  if (result == EXIT_FAILURE)
-    {
-      cmdline_parser_free (args_info);
-      exit (EXIT_FAILURE);
-    }
-  
-  return result;
+	free_cmd_list();
+	if (result == EXIT_FAILURE) {
+		cmdline_parser_free(args_info);
+		exit(EXIT_FAILURE);
+	}
+
+	return result;
 }
