Change in osmo-ggsn[master]: Refactor arg/cfg parser to use talloc

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Wed Apr 8 17:51:20 UTC 2020


pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/17758 )


Change subject: Refactor arg/cfg parser to use talloc
......................................................................

Refactor arg/cfg parser to use talloc

Used to get rid of some annoying memory leaks presented by ASan after
each run. both ASan and talloc_report_full are fine after these changes,
and sgsnemu continues to work as expected.

Change-Id: Ie0d48a12a8349be5a859a03191421cbd9cc324cc
---
M sgsnemu/cmdline.c
M sgsnemu/cmdline.h
M sgsnemu/sgsnemu.c
3 files changed, 367 insertions(+), 377 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/58/17758/1

diff --git a/sgsnemu/cmdline.c b/sgsnemu/cmdline.c
index 604e76b..1789c63 100644
--- a/sgsnemu/cmdline.c
+++ b/sgsnemu/cmdline.c
@@ -1,7 +1,7 @@
 /*
   File autogenerated by gengetopt version 2.22.6
   generated with the following command:
-  gengetopt --conf-parser 
+  gengetopt --conf-parser
 
   The developers of gengetopt consider the fixed text that goes in all
   gengetopt output files to be in the public domain:
@@ -21,6 +21,8 @@
 #define FIX_UNUSED(X) (void) (X)	/* avoid warnings for unused params */
 #endif
 
+#include <osmocom/core/talloc.h>
+
 #include <getopt.h>
 
 #include "cmdline.h"
@@ -116,14 +118,12 @@
 		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);
+			talloc_free(cmd_line_list_tmp->string_arg);
+			talloc_free(cmd_line_list_tmp);
 		}
 	}
 }
 
-static char *gengetopt_strdup(const char *s);
-
 static
 void clear_given(struct gengetopt_args_info *args_info)
 {
@@ -183,9 +183,9 @@
 	args_info->debug_flag = 0;
 	args_info->conf_arg = NULL;
 	args_info->conf_orig = NULL;
-	args_info->pidfile_arg = gengetopt_strdup("./sgsnemu.pid");
+	args_info->pidfile_arg = talloc_strdup(args_info, "./sgsnemu.pid");
 	args_info->pidfile_orig = NULL;
-	args_info->statedir_arg = gengetopt_strdup("./");
+	args_info->statedir_arg = talloc_strdup(args_info, "./");
 	args_info->statedir_orig = NULL;
 	args_info->dns_arg = NULL;
 	args_info->dns_orig = NULL;
@@ -199,26 +199,26 @@
 	args_info->timelimit_orig = NULL;
 	args_info->gtpversion_arg = 1;
 	args_info->gtpversion_orig = NULL;
-	args_info->apn_arg = gengetopt_strdup("internet");
+	args_info->apn_arg = talloc_strdup(args_info, "internet");
 	args_info->apn_orig = NULL;
 	args_info->selmode_arg = 0x01;
 	args_info->selmode_orig = NULL;
 	args_info->rattype_arg = 1;
 	args_info->rattype_orig = NULL;
-	args_info->userloc_arg = gengetopt_strdup("02509946241207");
+	args_info->userloc_arg = talloc_strdup(args_info, "02509946241207");
 	args_info->userloc_orig = NULL;
-	args_info->rai_arg = gengetopt_strdup("02509946241207");
+	args_info->rai_arg = talloc_strdup(args_info, "02509946241207");
 	args_info->rai_orig = NULL;
-	args_info->mstz_arg = gengetopt_strdup("0");
+	args_info->mstz_arg = talloc_strdup(args_info, "0");
 	args_info->mstz_orig = NULL;
-	args_info->imeisv_arg = gengetopt_strdup("2143658709214365");
+	args_info->imeisv_arg = talloc_strdup(args_info, "2143658709214365");
 	args_info->imeisv_orig = NULL;
 	args_info->norecovery_flag = 0;
-	args_info->imsi_arg = gengetopt_strdup("240010123456789");
+	args_info->imsi_arg = talloc_strdup(args_info, "240010123456789");
 	args_info->imsi_orig = NULL;
 	args_info->nsapi_arg = 0;
 	args_info->nsapi_orig = NULL;
-	args_info->msisdn_arg = gengetopt_strdup("46702123456");
+	args_info->msisdn_arg = talloc_strdup(args_info, "46702123456");
 	args_info->msisdn_orig = NULL;
 	args_info->qos_arg = 0x000b921f;
 	args_info->qos_orig = NULL;
@@ -232,9 +232,9 @@
 	args_info->qose4_orig = NULL;
 	args_info->charging_arg = 0x0800;
 	args_info->charging_orig = NULL;
-	args_info->uid_arg = gengetopt_strdup("mig");
+	args_info->uid_arg = talloc_strdup(args_info, "mig");
 	args_info->uid_orig = NULL;
-	args_info->pwd_arg = gengetopt_strdup("hemmelig");
+	args_info->pwd_arg = talloc_strdup(args_info, "hemmelig");
 	args_info->pwd_orig = NULL;
 	args_info->createif_flag = 0;
 	args_info->net_arg = NULL;
@@ -258,7 +258,7 @@
 	args_info->pingcount_orig = NULL;
 	args_info->pingquiet_flag = 0;
 	args_info->no_tx_gpdu_seq_flag = 0;
-	args_info->pdp_type_arg = gengetopt_strdup("v4");
+	args_info->pdp_type_arg = talloc_strdup(args_info, "v4");
 	args_info->pdp_type_orig = NULL;
 
 }
@@ -371,7 +371,7 @@
 static void free_string_field(char **s)
 {
 	if (*s) {
-		free(*s);
+		talloc_free(*s);
 		*s = 0;
 	}
 }
@@ -439,7 +439,7 @@
 	free_string_field(&(args_info->pdp_type_arg));
 	free_string_field(&(args_info->pdp_type_orig));
 
-	clear_given(args_info);
+	talloc_free(args_info);
 }
 
 static void
@@ -591,25 +591,6 @@
 	return i;
 }
 
-void cmdline_parser_free(struct gengetopt_args_info *args_info)
-{
-	cmdline_parser_release(args_info);
-}
-
-/** @brief replacement of strdup, which is not standard */
-char *gengetopt_strdup(const char *s)
-{
-	char *result = 0;
-	if (!s)
-		return result;
-
-	result = (char *)malloc(strlen(s) + 1);
-	if (result == (char *)0)
-		return (char *)0;
-	strcpy(result, s);
-	return result;
-}
-
 int cmdline_parser(int argc, char **argv, struct gengetopt_args_info *args_info)
 {
 	return cmdline_parser2(argc, argv, args_info, 0, 1, 1);
@@ -623,7 +604,7 @@
 	result = cmdline_parser_internal(argc, argv, args_info, params, 0);
 
 	if (result == EXIT_FAILURE) {
-		cmdline_parser_free(args_info);
+		talloc_free(args_info);
 		exit(EXIT_FAILURE);
 	}
 
@@ -646,7 +627,7 @@
 	result = cmdline_parser_internal(argc, argv, args_info, &params, 0);
 
 	if (result == EXIT_FAILURE) {
-		cmdline_parser_free(args_info);
+		talloc_free(args_info);
 		exit(EXIT_FAILURE);
 	}
 
@@ -663,7 +644,7 @@
 		result = EXIT_FAILURE;
 
 	if (result == EXIT_FAILURE) {
-		cmdline_parser_free(args_info);
+		talloc_free(args_info);
 		exit(EXIT_FAILURE);
 	}
 
@@ -748,6 +729,7 @@
 
 /**
  * @brief updates an option
+ * @param tall_ctx talloc ctx
  * @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
@@ -765,7 +747,7 @@
  * @param additional_error possible further error specification
  */
 static
-int update_arg(void *field, char **orig_field,
+int update_arg(void *tall_ctx, void *field, char **orig_field,
 	       unsigned int *field_given, unsigned int *prev_given,
 	       char *value, const char *possible_values[],
 	       const char *default_value,
@@ -822,8 +804,8 @@
 		if (val) {
 			string_field = (char **)field;
 			if (!no_free && *string_field)
-				free(*string_field);	/* free previous string */
-			*string_field = gengetopt_strdup(val);
+				talloc_free(*string_field);	/* free previous string */
+			*string_field = talloc_strdup(tall_ctx, val);
 		}
 		break;
 	default:
@@ -854,8 +836,8 @@
 				*orig_field = value;
 			} else {
 				if (*orig_field)
-					free(*orig_field);	/* free previous string */
-				*orig_field = gengetopt_strdup(value);
+					talloc_free(*orig_field);	/* free previous string */
+				*orig_field = talloc_strdup(tall_ctx, value);
 			}
 		}
 	};
@@ -896,7 +878,7 @@
 	int c;			/* Character of the parsed option.  */
 
 	int error_occurred = 0;
-	struct gengetopt_args_info local_args_info;
+	struct gengetopt_args_info *local_args_info = talloc(NULL, struct gengetopt_args_info);
 
 	int override;
 	int initialize;
@@ -913,7 +895,7 @@
 	if (initialize)
 		cmdline_parser_init(args_info);
 
-	cmdline_parser_init(&local_args_info);
+	cmdline_parser_init(local_args_info);
 
 	optarg = 0;
 	optind = 0;
@@ -981,20 +963,20 @@
 		switch (c) {
 		case 'h':	/* Print help and exit.  */
 			cmdline_parser_print_help();
-			cmdline_parser_free(&local_args_info);
+			talloc_free(local_args_info);
 			exit(EXIT_SUCCESS);
 
 		case 'V':	/* Print version and exit.  */
 			cmdline_parser_print_version();
-			cmdline_parser_free(&local_args_info);
+			talloc_free(local_args_info);
 			exit(EXIT_SUCCESS);
 
 		case 'd':	/* Run in debug mode.  */
 
 			if (update_arg
-			    ((void *)&(args_info->debug_flag), 0,
+			    (args_info, (void *)&(args_info->debug_flag), 0,
 			     &(args_info->debug_given),
-			     &(local_args_info.debug_given), optarg, 0, 0,
+			     &(local_args_info->debug_given), optarg, 0, 0,
 			     ARG_FLAG, check_ambiguity, override, 1, 0, "debug",
 			     'd', additional_error))
 				goto failure;
@@ -1002,10 +984,10 @@
 			break;
 		case 'c':	/* Read configuration file.  */
 
-			if (update_arg((void *)&(args_info->conf_arg),
+			if (update_arg(args_info, (void *)&(args_info->conf_arg),
 				       &(args_info->conf_orig),
 				       &(args_info->conf_given),
-				       &(local_args_info.conf_given), optarg, 0,
+				       &(local_args_info->conf_given), optarg, 0,
 				       0, ARG_STRING, check_ambiguity, override,
 				       0, 0, "conf", 'c', additional_error))
 				goto failure;
@@ -1013,10 +995,10 @@
 			break;
 		case 'l':	/* Local host.  */
 
-			if (update_arg((void *)&(args_info->listen_arg),
+			if (update_arg(args_info, (void *)&(args_info->listen_arg),
 				       &(args_info->listen_orig),
 				       &(args_info->listen_given),
-				       &(local_args_info.listen_given), optarg,
+				       &(local_args_info->listen_given), optarg,
 				       0, 0, ARG_STRING, check_ambiguity,
 				       override, 0, 0, "listen", 'l',
 				       additional_error))
@@ -1025,10 +1007,10 @@
 			break;
 		case 'r':	/* Remote host.  */
 
-			if (update_arg((void *)&(args_info->remote_arg),
+			if (update_arg(args_info, (void *)&(args_info->remote_arg),
 				       &(args_info->remote_orig),
 				       &(args_info->remote_given),
-				       &(local_args_info.remote_given), optarg,
+				       &(local_args_info->remote_given), optarg,
 				       0, 0, ARG_STRING, check_ambiguity,
 				       override, 0, 0, "remote", 'r',
 				       additional_error))
@@ -1037,10 +1019,10 @@
 			break;
 		case 'a':	/* Access point name.  */
 
-			if (update_arg((void *)&(args_info->apn_arg),
+			if (update_arg(args_info, (void *)&(args_info->apn_arg),
 				       &(args_info->apn_orig),
 				       &(args_info->apn_given),
-				       &(local_args_info.apn_given), optarg, 0,
+				       &(local_args_info->apn_given), optarg, 0,
 				       "internet", ARG_STRING, check_ambiguity,
 				       override, 0, 0, "apn", 'a',
 				       additional_error))
@@ -1049,10 +1031,10 @@
 			break;
 		case 'i':	/* IMSI.  */
 
-			if (update_arg((void *)&(args_info->imsi_arg),
+			if (update_arg(args_info, (void *)&(args_info->imsi_arg),
 				       &(args_info->imsi_orig),
 				       &(args_info->imsi_given),
-				       &(local_args_info.imsi_given), optarg, 0,
+				       &(local_args_info->imsi_given), optarg, 0,
 				       "240010123456789", ARG_STRING,
 				       check_ambiguity, override, 0, 0, "imsi",
 				       'i', additional_error))
@@ -1061,10 +1043,10 @@
 			break;
 		case 'm':	/* Mobile Station ISDN number.  */
 
-			if (update_arg((void *)&(args_info->msisdn_arg),
+			if (update_arg(args_info, (void *)&(args_info->msisdn_arg),
 				       &(args_info->msisdn_orig),
 				       &(args_info->msisdn_given),
-				       &(local_args_info.msisdn_given), optarg,
+				       &(local_args_info->msisdn_given), optarg,
 				       0, "46702123456", ARG_STRING,
 				       check_ambiguity, override, 0, 0,
 				       "msisdn", 'm', additional_error))
@@ -1073,10 +1055,10 @@
 			break;
 		case 'q':	/* Requested quality of service.  */
 
-			if (update_arg((void *)&(args_info->qos_arg),
+			if (update_arg(args_info, (void *)&(args_info->qos_arg),
 				       &(args_info->qos_orig),
 				       &(args_info->qos_given),
-				       &(local_args_info.qos_given), optarg, 0,
+				       &(local_args_info->qos_given), optarg, 0,
 				       "0x000b921f", ARG_INT, check_ambiguity,
 				       override, 0, 0, "qos", 'q',
 				       additional_error))
@@ -1085,10 +1067,10 @@
 			break;
 		case 'u':	/* Login user ID.  */
 
-			if (update_arg((void *)&(args_info->uid_arg),
+			if (update_arg(args_info, (void *)&(args_info->uid_arg),
 				       &(args_info->uid_orig),
 				       &(args_info->uid_given),
-				       &(local_args_info.uid_given), optarg, 0,
+				       &(local_args_info->uid_given), optarg, 0,
 				       "mig", ARG_STRING, check_ambiguity,
 				       override, 0, 0, "uid", 'u',
 				       additional_error))
@@ -1097,10 +1079,10 @@
 			break;
 		case 'p':	/* Login password.  */
 
-			if (update_arg((void *)&(args_info->pwd_arg),
+			if (update_arg(args_info, (void *)&(args_info->pwd_arg),
 				       &(args_info->pwd_orig),
 				       &(args_info->pwd_given),
-				       &(local_args_info.pwd_given), optarg, 0,
+				       &(local_args_info->pwd_given), optarg, 0,
 				       "hemmelig", ARG_STRING, check_ambiguity,
 				       override, 0, 0, "pwd", 'p',
 				       additional_error))
@@ -1110,10 +1092,10 @@
 		case 'n':	/* Network address for local interface.  */
 			args_info->createif_mode_counter += 1;
 
-			if (update_arg((void *)&(args_info->net_arg),
+			if (update_arg(args_info, (void *)&(args_info->net_arg),
 				       &(args_info->net_orig),
 				       &(args_info->net_given),
-				       &(local_args_info.net_given), optarg, 0,
+				       &(local_args_info->net_given), optarg, 0,
 				       0, ARG_STRING, check_ambiguity, override,
 				       0, 0, "net", 'n', additional_error))
 				goto failure;
@@ -1121,10 +1103,10 @@
 			break;
 		case 't':	/* PDP Type.  */
 
-			if (update_arg((void *)&(args_info->pdp_type_arg),
+			if (update_arg(args_info, (void *)&(args_info->pdp_type_arg),
 				       &(args_info->pdp_type_orig),
 				       &(args_info->pdp_type_given),
-				       &(local_args_info.pdp_type_given),
+				       &(local_args_info->pdp_type_given),
 				       optarg, 0, "v4", ARG_STRING,
 				       check_ambiguity, override, 0, 0,
 				       "pdp-type", 't', additional_error))
@@ -1138,10 +1120,10 @@
 			    == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->pidfile_arg),
+				    (args_info, (void *)&(args_info->pidfile_arg),
 				     &(args_info->pidfile_orig),
 				     &(args_info->pidfile_given),
-				     &(local_args_info.pidfile_given), optarg,
+				     &(local_args_info->pidfile_given), optarg,
 				     0, "./sgsnemu.pid", ARG_STRING,
 				     check_ambiguity, override, 0, 0, "pidfile",
 				     '-', additional_error))
@@ -1154,10 +1136,10 @@
 				  "statedir") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->statedir_arg),
+				    (args_info, (void *)&(args_info->statedir_arg),
 				     &(args_info->statedir_orig),
 				     &(args_info->statedir_given),
-				     &(local_args_info.statedir_given), optarg,
+				     &(local_args_info->statedir_given), optarg,
 				     0, "./", ARG_STRING, check_ambiguity,
 				     override, 0, 0, "statedir", '-',
 				     additional_error))
@@ -1168,10 +1150,10 @@
 			else if (strcmp(long_options[option_index].name, "dns")
 				 == 0) {
 
-				if (update_arg((void *)&(args_info->dns_arg),
+				if (update_arg(args_info, (void *)&(args_info->dns_arg),
 					       &(args_info->dns_orig),
 					       &(args_info->dns_given),
-					       &(local_args_info.dns_given),
+					       &(local_args_info->dns_given),
 					       optarg, 0, 0, ARG_STRING,
 					       check_ambiguity, override, 0, 0,
 					       "dns", '-', additional_error))
@@ -1184,10 +1166,10 @@
 				  "contexts") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->contexts_arg),
+				    (args_info, (void *)&(args_info->contexts_arg),
 				     &(args_info->contexts_orig),
 				     &(args_info->contexts_given),
-				     &(local_args_info.contexts_given), optarg,
+				     &(local_args_info->contexts_given), optarg,
 				     0, "1", ARG_INT, check_ambiguity, override,
 				     0, 0, "contexts", '-', additional_error))
 					goto failure;
@@ -1199,10 +1181,10 @@
 				  "timelimit") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->timelimit_arg),
+				    (args_info, (void *)&(args_info->timelimit_arg),
 				     &(args_info->timelimit_orig),
 				     &(args_info->timelimit_given),
-				     &(local_args_info.timelimit_given), optarg,
+				     &(local_args_info->timelimit_given), optarg,
 				     0, "0", ARG_INT, check_ambiguity, override,
 				     0, 0, "timelimit", '-', additional_error))
 					goto failure;
@@ -1214,10 +1196,10 @@
 				  "gtpversion") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->gtpversion_arg),
+				    (args_info, (void *)&(args_info->gtpversion_arg),
 				     &(args_info->gtpversion_orig),
 				     &(args_info->gtpversion_given),
-				     &(local_args_info.gtpversion_given),
+				     &(local_args_info->gtpversion_given),
 				     optarg, 0, "1", ARG_INT, check_ambiguity,
 				     override, 0, 0, "gtpversion", '-',
 				     additional_error))
@@ -1230,10 +1212,10 @@
 				  "selmode") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->selmode_arg),
+				    (args_info, (void *)&(args_info->selmode_arg),
 				     &(args_info->selmode_orig),
 				     &(args_info->selmode_given),
-				     &(local_args_info.selmode_given), optarg,
+				     &(local_args_info->selmode_given), optarg,
 				     0, "0x01", ARG_INT, check_ambiguity,
 				     override, 0, 0, "selmode", '-',
 				     additional_error))
@@ -1246,10 +1228,10 @@
 				  "rattype") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->rattype_arg),
+				    (args_info, (void *)&(args_info->rattype_arg),
 				     &(args_info->rattype_orig),
 				     &(args_info->rattype_given),
-				     &(local_args_info.rattype_given), optarg,
+				     &(local_args_info->rattype_given), optarg,
 				     0, "1", ARG_INT, check_ambiguity, override,
 				     0, 0, "rattype", '-', additional_error))
 					goto failure;
@@ -1261,10 +1243,10 @@
 				  "userloc") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->userloc_arg),
+				    (args_info, (void *)&(args_info->userloc_arg),
 				     &(args_info->userloc_orig),
 				     &(args_info->userloc_given),
-				     &(local_args_info.userloc_given), optarg,
+				     &(local_args_info->userloc_given), optarg,
 				     0, "02509946241207", ARG_STRING,
 				     check_ambiguity, override, 0, 0, "userloc",
 				     '-', additional_error))
@@ -1275,10 +1257,10 @@
 			else if (strcmp(long_options[option_index].name, "rai")
 				 == 0) {
 
-				if (update_arg((void *)&(args_info->rai_arg),
+				if (update_arg(args_info, (void *)&(args_info->rai_arg),
 					       &(args_info->rai_orig),
 					       &(args_info->rai_given),
-					       &(local_args_info.rai_given),
+					       &(local_args_info->rai_given),
 					       optarg, 0, "02509946241207",
 					       ARG_STRING, check_ambiguity,
 					       override, 0, 0, "rai", '-',
@@ -1290,10 +1272,10 @@
 			else if (strcmp(long_options[option_index].name, "mstz")
 				 == 0) {
 
-				if (update_arg((void *)&(args_info->mstz_arg),
+				if (update_arg(args_info, (void *)&(args_info->mstz_arg),
 					       &(args_info->mstz_orig),
 					       &(args_info->mstz_given),
-					       &(local_args_info.mstz_given),
+					       &(local_args_info->mstz_given),
 					       optarg, 0, "0", ARG_STRING,
 					       check_ambiguity, override, 0, 0,
 					       "mstz", '-', additional_error))
@@ -1305,10 +1287,10 @@
 				 (long_options[option_index].name,
 				  "imeisv") == 0) {
 
-				if (update_arg((void *)&(args_info->imeisv_arg),
+				if (update_arg(args_info, (void *)&(args_info->imeisv_arg),
 					       &(args_info->imeisv_orig),
 					       &(args_info->imeisv_given),
-					       &(local_args_info.imeisv_given),
+					       &(local_args_info->imeisv_given),
 					       optarg, 0, "2143658709214365",
 					       ARG_STRING, check_ambiguity,
 					       override, 0, 0, "imeisv", '-',
@@ -1322,9 +1304,9 @@
 				  "norecovery") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->norecovery_flag), 0,
+				    (args_info, (void *)&(args_info->norecovery_flag), 0,
 				     &(args_info->norecovery_given),
-				     &(local_args_info.norecovery_given),
+				     &(local_args_info->norecovery_given),
 				     optarg, 0, 0, ARG_FLAG, check_ambiguity,
 				     override, 1, 0, "norecovery", '-',
 				     additional_error))
@@ -1336,10 +1318,10 @@
 				 (long_options[option_index].name,
 				  "nsapi") == 0) {
 
-				if (update_arg((void *)&(args_info->nsapi_arg),
+				if (update_arg(args_info, (void *)&(args_info->nsapi_arg),
 					       &(args_info->nsapi_orig),
 					       &(args_info->nsapi_given),
-					       &(local_args_info.nsapi_given),
+					       &(local_args_info->nsapi_given),
 					       optarg, 0, "0", ARG_INT,
 					       check_ambiguity, override, 0, 0,
 					       "nsapi", '-', additional_error))
@@ -1351,10 +1333,10 @@
 				 (long_options[option_index].name,
 				  "qose1") == 0) {
 
-				if (update_arg((void *)&(args_info->qose1_arg),
+				if (update_arg(args_info, (void *)&(args_info->qose1_arg),
 					       &(args_info->qose1_orig),
 					       &(args_info->qose1_given),
-					       &(local_args_info.qose1_given),
+					       &(local_args_info->qose1_given),
 					       optarg, 0, "0x9396404074f9ffff",
 					       ARG_INT, check_ambiguity,
 					       override, 0, 0, "qose1", '-',
@@ -1367,10 +1349,10 @@
 				 (long_options[option_index].name,
 				  "qose2") == 0) {
 
-				if (update_arg((void *)&(args_info->qose2_arg),
+				if (update_arg(args_info, (void *)&(args_info->qose2_arg),
 					       &(args_info->qose2_orig),
 					       &(args_info->qose2_given),
-					       &(local_args_info.qose2_given),
+					       &(local_args_info->qose2_given),
 					       optarg, 0, "0x11", ARG_INT,
 					       check_ambiguity, override, 0, 0,
 					       "qose2", '-', additional_error))
@@ -1382,10 +1364,10 @@
 				 (long_options[option_index].name,
 				  "qose3") == 0) {
 
-				if (update_arg((void *)&(args_info->qose3_arg),
+				if (update_arg(args_info, (void *)&(args_info->qose3_arg),
 					       &(args_info->qose3_orig),
 					       &(args_info->qose3_given),
-					       &(local_args_info.qose3_given),
+					       &(local_args_info->qose3_given),
 					       optarg, 0, "0x0101", ARG_INT,
 					       check_ambiguity, override, 0, 0,
 					       "qose3", '-', additional_error))
@@ -1397,10 +1379,10 @@
 				 (long_options[option_index].name,
 				  "qose4") == 0) {
 
-				if (update_arg((void *)&(args_info->qose4_arg),
+				if (update_arg(args_info, (void *)&(args_info->qose4_arg),
 					       &(args_info->qose4_orig),
 					       &(args_info->qose4_given),
-					       &(local_args_info.qose4_given),
+					       &(local_args_info->qose4_given),
 					       optarg, 0, "0x4040", ARG_INT,
 					       check_ambiguity, override, 0, 0,
 					       "qose4", '-', additional_error))
@@ -1413,10 +1395,10 @@
 				  "charging") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->charging_arg),
+				    (args_info, (void *)&(args_info->charging_arg),
 				     &(args_info->charging_orig),
 				     &(args_info->charging_given),
-				     &(local_args_info.charging_given), optarg,
+				     &(local_args_info->charging_given), optarg,
 				     0, "0x0800", ARG_INT, check_ambiguity,
 				     override, 0, 0, "charging", '-',
 				     additional_error))
@@ -1430,9 +1412,9 @@
 				args_info->createif_mode_counter += 1;
 
 				if (update_arg
-				    ((void *)&(args_info->createif_flag), 0,
+				    (args_info, (void *)&(args_info->createif_flag), 0,
 				     &(args_info->createif_given),
-				     &(local_args_info.createif_given), optarg,
+				     &(local_args_info->createif_given), optarg,
 				     0, 0, ARG_FLAG, check_ambiguity, override,
 				     1, 0, "createif", '-', additional_error))
 					goto failure;
@@ -1445,9 +1427,9 @@
 				args_info->createif_mode_counter += 1;
 
 				if (update_arg
-				    ((void *)&(args_info->defaultroute_flag), 0,
+				    (args_info, (void *)&(args_info->defaultroute_flag), 0,
 				     &(args_info->defaultroute_given),
-				     &(local_args_info.defaultroute_given),
+				     &(local_args_info->defaultroute_given),
 				     optarg, 0, 0, ARG_FLAG, check_ambiguity,
 				     override, 1, 0, "defaultroute", '-',
 				     additional_error))
@@ -1459,10 +1441,10 @@
 				 == 0) {
 				args_info->createif_mode_counter += 1;
 
-				if (update_arg((void *)&(args_info->ipup_arg),
+				if (update_arg(args_info, (void *)&(args_info->ipup_arg),
 					       &(args_info->ipup_orig),
 					       &(args_info->ipup_given),
-					       &(local_args_info.ipup_given),
+					       &(local_args_info->ipup_given),
 					       optarg, 0, 0, ARG_STRING,
 					       check_ambiguity, override, 0, 0,
 					       "ipup", '-', additional_error))
@@ -1475,10 +1457,10 @@
 				  "ipdown") == 0) {
 				args_info->createif_mode_counter += 1;
 
-				if (update_arg((void *)&(args_info->ipdown_arg),
+				if (update_arg(args_info, (void *)&(args_info->ipdown_arg),
 					       &(args_info->ipdown_orig),
 					       &(args_info->ipdown_given),
-					       &(local_args_info.ipdown_given),
+					       &(local_args_info->ipdown_given),
 					       optarg, 0, 0, ARG_STRING,
 					       check_ambiguity, override, 0, 0,
 					       "ipdown", '-', additional_error))
@@ -1492,10 +1474,10 @@
 				args_info->createif_mode_counter += 1;
 
 				if (update_arg
-				    ((void *)&(args_info->tun_device_arg),
+				    (args_info, (void *)&(args_info->tun_device_arg),
 				     &(args_info->tun_device_orig),
 				     &(args_info->tun_device_given),
-				     &(local_args_info.tun_device_given),
+				     &(local_args_info->tun_device_given),
 				     optarg, 0, 0, ARG_STRING, check_ambiguity,
 				     override, 0, 0, "tun-device", '-',
 				     additional_error))
@@ -1508,10 +1490,10 @@
 				  "netns") == 0) {
 				args_info->createif_mode_counter += 1;
 
-				if (update_arg((void *)&(args_info->netns_arg),
+				if (update_arg(args_info, (void *)&(args_info->netns_arg),
 					       &(args_info->netns_orig),
 					       &(args_info->netns_given),
-					       &(local_args_info.netns_given),
+					       &(local_args_info->netns_given),
 					       optarg, 0, 0, ARG_STRING,
 					       check_ambiguity, override, 0, 0,
 					       "netns", '-', additional_error))
@@ -1525,10 +1507,10 @@
 				args_info->pinghost_mode_counter += 1;
 
 				if (update_arg
-				    ((void *)&(args_info->pinghost_arg),
+				    (args_info, (void *)&(args_info->pinghost_arg),
 				     &(args_info->pinghost_orig),
 				     &(args_info->pinghost_given),
-				     &(local_args_info.pinghost_given), optarg,
+				     &(local_args_info->pinghost_given), optarg,
 				     0, 0, ARG_STRING, check_ambiguity,
 				     override, 0, 0, "pinghost", '-',
 				     additional_error))
@@ -1542,10 +1524,10 @@
 				args_info->pinghost_mode_counter += 1;
 
 				if (update_arg
-				    ((void *)&(args_info->pingrate_arg),
+				    (args_info, (void *)&(args_info->pingrate_arg),
 				     &(args_info->pingrate_orig),
 				     &(args_info->pingrate_given),
-				     &(local_args_info.pingrate_given), optarg,
+				     &(local_args_info->pingrate_given), optarg,
 				     0, "1", ARG_INT, check_ambiguity, override,
 				     0, 0, "pingrate", '-', additional_error))
 					goto failure;
@@ -1558,10 +1540,10 @@
 				args_info->pinghost_mode_counter += 1;
 
 				if (update_arg
-				    ((void *)&(args_info->pingsize_arg),
+				    (args_info, (void *)&(args_info->pingsize_arg),
 				     &(args_info->pingsize_orig),
 				     &(args_info->pingsize_given),
-				     &(local_args_info.pingsize_given), optarg,
+				     &(local_args_info->pingsize_given), optarg,
 				     0, "56", ARG_INT, check_ambiguity,
 				     override, 0, 0, "pingsize", '-',
 				     additional_error))
@@ -1575,10 +1557,10 @@
 				args_info->pinghost_mode_counter += 1;
 
 				if (update_arg
-				    ((void *)&(args_info->pingcount_arg),
+				    (args_info, (void *)&(args_info->pingcount_arg),
 				     &(args_info->pingcount_orig),
 				     &(args_info->pingcount_given),
-				     &(local_args_info.pingcount_given), optarg,
+				     &(local_args_info->pingcount_given), optarg,
 				     0, "0", ARG_INT, check_ambiguity, override,
 				     0, 0, "pingcount", '-', additional_error))
 					goto failure;
@@ -1591,9 +1573,9 @@
 				args_info->pinghost_mode_counter += 1;
 
 				if (update_arg
-				    ((void *)&(args_info->pingquiet_flag), 0,
+				    (args_info, (void *)&(args_info->pingquiet_flag), 0,
 				     &(args_info->pingquiet_given),
-				     &(local_args_info.pingquiet_given), optarg,
+				     &(local_args_info->pingquiet_given), optarg,
 				     0, 0, ARG_FLAG, check_ambiguity, override,
 				     1, 0, "pingquiet", '-', additional_error))
 					goto failure;
@@ -1605,9 +1587,9 @@
 				  "no-tx-gpdu-seq") == 0) {
 
 				if (update_arg
-				    ((void *)&(args_info->no_tx_gpdu_seq_flag),
+				    (args_info, (void *)&(args_info->no_tx_gpdu_seq_flag),
 				     0, &(args_info->no_tx_gpdu_seq_given),
-				     &(local_args_info.no_tx_gpdu_seq_given),
+				     &(local_args_info->no_tx_gpdu_seq_given),
 				     optarg, 0, 0, ARG_FLAG, check_ambiguity,
 				     override, 1, 0, "no-tx-gpdu-seq", '-',
 				     additional_error))
@@ -1660,7 +1642,7 @@
 					     additional_error);
 	}
 
-	cmdline_parser_release(&local_args_info);
+	cmdline_parser_release(local_args_info);
 
 	if (error_occurred)
 		return (EXIT_FAILURE);
@@ -1669,7 +1651,7 @@
 
 failure:
 
-	cmdline_parser_release(&local_args_info);
+	cmdline_parser_release(local_args_info);
 	return (EXIT_FAILURE);
 }
 
@@ -1803,10 +1785,10 @@
 		++(*my_argc);
 
 		cmd_line_list_tmp =
-		    (struct line_list *)malloc(sizeof(struct line_list));
+		    (struct line_list *)talloc(NULL, 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);
+		cmd_line_list->string_arg = talloc_strdup(cmd_line_list_tmp, my_argv);
 	}			/* while */
 
 	if (file)
@@ -1842,16 +1824,16 @@
 
 	/* store the program name */
 	cmd_line_list_tmp =
-	    (struct line_list *)malloc(sizeof(struct line_list));
+	    (struct line_list *)talloc(NULL, 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);
+	cmd_line_list->string_arg = talloc_strdup(cmd_line_list, 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;
+		my_argv_arg = (char **)talloc_size(cmd_line_list_tmp, (my_argc + 1) * sizeof(char *));
 
 		for (i = my_argc - 1; i >= 0; --i) {
 			my_argv_arg[i] = cmd_line_list_tmp->string_arg;
@@ -1861,7 +1843,7 @@
 		my_argv_arg[my_argc] = 0;
 
 		additional_error =
-		    (char *)malloc(strlen(filename) + strlen(ADDITIONAL_ERROR) +
+		    (char *)talloc_size(cmd_line_list_tmp, strlen(filename) + strlen(ADDITIONAL_ERROR) +
 				   1);
 		strcpy(additional_error, ADDITIONAL_ERROR);
 		strcat(additional_error, filename);
@@ -1869,13 +1851,13 @@
 		    cmdline_parser_internal(my_argc, my_argv_arg, args_info,
 					    params, additional_error);
 
-		free(additional_error);
-		free(my_argv_arg);
+		talloc_free(additional_error);
+		talloc_free(my_argv_arg);
 	}
 
 	free_cmd_list();
 	if (result == EXIT_FAILURE) {
-		cmdline_parser_free(args_info);
+		talloc_free(args_info);
 		exit(EXIT_FAILURE);
 	}
 
diff --git a/sgsnemu/cmdline.h b/sgsnemu/cmdline.h
index 4dd4989..ad203fb 100644
--- a/sgsnemu/cmdline.h
+++ b/sgsnemu/cmdline.h
@@ -473,7 +473,7 @@
 	void cmdline_parser_print_version(void);
 
 /**
- * Initializes all the fields a cmdline_parser_params structure 
+ * Initializes all the fields a cmdline_parser_params structure
  * to their default values
  * @param params the structure to initialize
  */
diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c
index fce5059..01bdf9b 100644
--- a/sgsnemu/sgsnemu.c
+++ b/sgsnemu/sgsnemu.c
@@ -239,7 +239,7 @@
 static int process_options(int argc, char **argv)
 {
 	/* gengeopt declarations */
-	struct gengetopt_args_info args_info;
+	struct gengetopt_args_info *args_info = talloc(tall_sgsnemu_ctx, struct gengetopt_args_info);
 
 	struct hostent *host;
 	unsigned int n;
@@ -262,120 +262,120 @@
 	int nbquarters;
 	int DST;
 
-	if (cmdline_parser(argc, argv, &args_info) != 0)
+	if (cmdline_parser(argc, argv, args_info) != 0)
 		return -1;
-	if (args_info.debug_flag) {
-		if (args_info.remote_arg)
-			printf("remote: %s\n", args_info.remote_arg);
-		if (args_info.listen_arg)
-			printf("listen: %s\n", args_info.listen_arg);
-		if (args_info.conf_arg)
-			printf("conf: %s\n", args_info.conf_arg);
-		printf("debug: %d\n", args_info.debug_flag);
-		if (args_info.imsi_arg)
-			printf("imsi: %s\n", args_info.imsi_arg);
-		printf("qos: %#08x\n", args_info.qos_arg);
-		printf("qose1: %#0.16llx\n", args_info.qose1_arg);
-		printf("qose2: %#04x\n", args_info.qose2_arg);
-		printf("qose3: %#06x\n", args_info.qose3_arg);
-		printf("qose4: %#06x\n", args_info.qose4_arg);
-		printf("charging: %#04x\n", args_info.charging_arg);
-		if (args_info.apn_arg)
-			printf("apn: %s\n", args_info.apn_arg);
-		if (args_info.msisdn_arg)
-			printf("msisdn: %s\n", args_info.msisdn_arg);
-		if (args_info.uid_arg)
-			printf("uid: %s\n", args_info.uid_arg);
-		if (args_info.pwd_arg)
-			printf("pwd: %s\n", args_info.pwd_arg);
-		if (args_info.pidfile_arg)
-			printf("pidfile: %s\n", args_info.pidfile_arg);
-		if (args_info.statedir_arg)
-			printf("statedir: %s\n", args_info.statedir_arg);
-		if (args_info.dns_arg)
-			printf("dns: %s\n", args_info.dns_arg);
-		printf("contexts: %d\n", args_info.contexts_arg);
-		printf("timelimit: %d\n", args_info.timelimit_arg);
-		printf("createif: %d\n", args_info.createif_flag);
-		if (args_info.tun_device_arg)
-			printf("tun-device: %s\n", args_info.tun_device_arg);
-		if (args_info.netns_arg)
-			printf("netns: %s\n", args_info.netns_arg);
-		if (args_info.ipup_arg)
-			printf("ipup: %s\n", args_info.ipup_arg);
-		if (args_info.ipdown_arg)
-			printf("ipdown: %s\n", args_info.ipdown_arg);
-		printf("defaultroute: %d\n", args_info.defaultroute_flag);
-		if (args_info.pinghost_arg)
-			printf("pinghost: %s\n", args_info.pinghost_arg);
-		printf("pingrate: %d\n", args_info.pingrate_arg);
-		printf("pingsize: %d\n", args_info.pingsize_arg);
-		printf("pingcount: %d\n", args_info.pingcount_arg);
-		printf("pingquiet: %d\n", args_info.pingquiet_flag);
-		printf("norecovery: %d\n", args_info.norecovery_flag);
-		printf("no-tx-gpdu-seq: %d\n", args_info.no_tx_gpdu_seq_flag);
+	if (args_info->debug_flag) {
+		if (args_info->remote_arg)
+			printf("remote: %s\n", args_info->remote_arg);
+		if (args_info->listen_arg)
+			printf("listen: %s\n", args_info->listen_arg);
+		if (args_info->conf_arg)
+			printf("conf: %s\n", args_info->conf_arg);
+		printf("debug: %d\n", args_info->debug_flag);
+		if (args_info->imsi_arg)
+			printf("imsi: %s\n", args_info->imsi_arg);
+		printf("qos: %#08x\n", args_info->qos_arg);
+		printf("qose1: %#0.16llx\n", args_info->qose1_arg);
+		printf("qose2: %#04x\n", args_info->qose2_arg);
+		printf("qose3: %#06x\n", args_info->qose3_arg);
+		printf("qose4: %#06x\n", args_info->qose4_arg);
+		printf("charging: %#04x\n", args_info->charging_arg);
+		if (args_info->apn_arg)
+			printf("apn: %s\n", args_info->apn_arg);
+		if (args_info->msisdn_arg)
+			printf("msisdn: %s\n", args_info->msisdn_arg);
+		if (args_info->uid_arg)
+			printf("uid: %s\n", args_info->uid_arg);
+		if (args_info->pwd_arg)
+			printf("pwd: %s\n", args_info->pwd_arg);
+		if (args_info->pidfile_arg)
+			printf("pidfile: %s\n", args_info->pidfile_arg);
+		if (args_info->statedir_arg)
+			printf("statedir: %s\n", args_info->statedir_arg);
+		if (args_info->dns_arg)
+			printf("dns: %s\n", args_info->dns_arg);
+		printf("contexts: %d\n", args_info->contexts_arg);
+		printf("timelimit: %d\n", args_info->timelimit_arg);
+		printf("createif: %d\n", args_info->createif_flag);
+		if (args_info->tun_device_arg)
+			printf("tun-device: %s\n", args_info->tun_device_arg);
+		if (args_info->netns_arg)
+			printf("netns: %s\n", args_info->netns_arg);
+		if (args_info->ipup_arg)
+			printf("ipup: %s\n", args_info->ipup_arg);
+		if (args_info->ipdown_arg)
+			printf("ipdown: %s\n", args_info->ipdown_arg);
+		printf("defaultroute: %d\n", args_info->defaultroute_flag);
+		if (args_info->pinghost_arg)
+			printf("pinghost: %s\n", args_info->pinghost_arg);
+		printf("pingrate: %d\n", args_info->pingrate_arg);
+		printf("pingsize: %d\n", args_info->pingsize_arg);
+		printf("pingcount: %d\n", args_info->pingcount_arg);
+		printf("pingquiet: %d\n", args_info->pingquiet_flag);
+		printf("norecovery: %d\n", args_info->norecovery_flag);
+		printf("no-tx-gpdu-seq: %d\n", args_info->no_tx_gpdu_seq_flag);
 	}
 
 	/* Try out our new parser */
 
-	if (args_info.conf_arg) {
+	if (args_info->conf_arg) {
 		if (cmdline_parser_configfile
-		    (args_info.conf_arg, &args_info, 0, 0, 0) != 0)
+		    (args_info->conf_arg, args_info, 0, 0, 0) != 0)
 			return -1;
-		if (args_info.debug_flag) {
+		if (args_info->debug_flag) {
 			printf("cmdline_parser_configfile\n");
-			if (args_info.remote_arg)
-				printf("remote: %s\n", args_info.remote_arg);
-			if (args_info.listen_arg)
-				printf("listen: %s\n", args_info.listen_arg);
-			if (args_info.conf_arg)
-				printf("conf: %s\n", args_info.conf_arg);
-			printf("debug: %d\n", args_info.debug_flag);
-			if (args_info.imsi_arg)
-				printf("imsi: %s\n", args_info.imsi_arg);
-			printf("qos: %#08x\n", args_info.qos_arg);
-			printf("qose1: %#0.16llx\n", args_info.qose1_arg);
-			printf("qose2: %#04x\n", args_info.qose2_arg);
-			printf("qose3: %#06x\n", args_info.qose3_arg);
-			printf("qose4: %#06x\n", args_info.qose4_arg);
-			printf("charging: %#04x\n", args_info.charging_arg);
-			if (args_info.apn_arg)
-				printf("apn: %s\n", args_info.apn_arg);
-			if (args_info.msisdn_arg)
-				printf("msisdn: %s\n", args_info.msisdn_arg);
-			if (args_info.uid_arg)
-				printf("uid: %s\n", args_info.uid_arg);
-			if (args_info.pwd_arg)
-				printf("pwd: %s\n", args_info.pwd_arg);
-			if (args_info.pidfile_arg)
-				printf("pidfile: %s\n", args_info.pidfile_arg);
-			if (args_info.statedir_arg)
+			if (args_info->remote_arg)
+				printf("remote: %s\n", args_info->remote_arg);
+			if (args_info->listen_arg)
+				printf("listen: %s\n", args_info->listen_arg);
+			if (args_info->conf_arg)
+				printf("conf: %s\n", args_info->conf_arg);
+			printf("debug: %d\n", args_info->debug_flag);
+			if (args_info->imsi_arg)
+				printf("imsi: %s\n", args_info->imsi_arg);
+			printf("qos: %#08x\n", args_info->qos_arg);
+			printf("qose1: %#0.16llx\n", args_info->qose1_arg);
+			printf("qose2: %#04x\n", args_info->qose2_arg);
+			printf("qose3: %#06x\n", args_info->qose3_arg);
+			printf("qose4: %#06x\n", args_info->qose4_arg);
+			printf("charging: %#04x\n", args_info->charging_arg);
+			if (args_info->apn_arg)
+				printf("apn: %s\n", args_info->apn_arg);
+			if (args_info->msisdn_arg)
+				printf("msisdn: %s\n", args_info->msisdn_arg);
+			if (args_info->uid_arg)
+				printf("uid: %s\n", args_info->uid_arg);
+			if (args_info->pwd_arg)
+				printf("pwd: %s\n", args_info->pwd_arg);
+			if (args_info->pidfile_arg)
+				printf("pidfile: %s\n", args_info->pidfile_arg);
+			if (args_info->statedir_arg)
 				printf("statedir: %s\n",
-				       args_info.statedir_arg);
-			if (args_info.dns_arg)
-				printf("dns: %s\n", args_info.dns_arg);
-			printf("contexts: %d\n", args_info.contexts_arg);
-			printf("timelimit: %d\n", args_info.timelimit_arg);
-			printf("createif: %d\n", args_info.createif_flag);
-			if (args_info.tun_device_arg)
-				printf("tun-device: %s\n", args_info.tun_device_arg);
-			if (args_info.netns_arg)
-				printf("netns: %s\n", args_info.netns_arg);
-			if (args_info.ipup_arg)
-				printf("ipup: %s\n", args_info.ipup_arg);
-			if (args_info.ipdown_arg)
-				printf("ipdown: %s\n", args_info.ipdown_arg);
+				       args_info->statedir_arg);
+			if (args_info->dns_arg)
+				printf("dns: %s\n", args_info->dns_arg);
+			printf("contexts: %d\n", args_info->contexts_arg);
+			printf("timelimit: %d\n", args_info->timelimit_arg);
+			printf("createif: %d\n", args_info->createif_flag);
+			if (args_info->tun_device_arg)
+				printf("tun-device: %s\n", args_info->tun_device_arg);
+			if (args_info->netns_arg)
+				printf("netns: %s\n", args_info->netns_arg);
+			if (args_info->ipup_arg)
+				printf("ipup: %s\n", args_info->ipup_arg);
+			if (args_info->ipdown_arg)
+				printf("ipdown: %s\n", args_info->ipdown_arg);
 			printf("defaultroute: %d\n",
-			       args_info.defaultroute_flag);
-			if (args_info.pinghost_arg)
+			       args_info->defaultroute_flag);
+			if (args_info->pinghost_arg)
 				printf("pinghost: %s\n",
-				       args_info.pinghost_arg);
-			printf("pingrate: %d\n", args_info.pingrate_arg);
-			printf("pingsize: %d\n", args_info.pingsize_arg);
-			printf("pingcount: %d\n", args_info.pingcount_arg);
-			printf("pingquiet: %d\n", args_info.pingquiet_flag);
-			printf("norecovery: %d\n", args_info.norecovery_flag);
-			printf("no-tx-gpdu-seq: %d\n", args_info.no_tx_gpdu_seq_flag);
+				       args_info->pinghost_arg);
+			printf("pingrate: %d\n", args_info->pingrate_arg);
+			printf("pingsize: %d\n", args_info->pingsize_arg);
+			printf("pingcount: %d\n", args_info->pingcount_arg);
+			printf("pingquiet: %d\n", args_info->pingquiet_flag);
+			printf("norecovery: %d\n", args_info->norecovery_flag);
+			printf("no-tx-gpdu-seq: %d\n", args_info->no_tx_gpdu_seq_flag);
 		}
 	}
 
@@ -384,7 +384,7 @@
 	/* foreground                                                   */
 	/* If fg flag not given run as a daemon                         */
 	/* Do not allow sgsnemu to run as deamon
-	   if (!args_info.fg_flag)
+	   if (!args_info->fg_flag)
 	   {
 	   closelog();
 	   freopen("/dev/null", "w", stdout);
@@ -395,22 +395,22 @@
 	   }                                                             */
 
 	/* debug                                                        */
-	options.debug = args_info.debug_flag;
+	options.debug = args_info->debug_flag;
 
 	/* pidfile */
 	/* This has to be done after we have our final pid */
-	if (args_info.pidfile_arg) {
-		log_pid(args_info.pidfile_arg);
+	if (args_info->pidfile_arg) {
+		log_pid(args_info->pidfile_arg);
 	}
 
 	/* dns                                                          */
 	/* If no dns option is given use system default                 */
 	/* Do hostname lookup to translate hostname to IP address       */
 	printf("\n");
-	if (args_info.dns_arg) {
-		if (!(host = gethostbyname(args_info.dns_arg))) {
+	if (args_info->dns_arg) {
+		if (!(host = gethostbyname(args_info->dns_arg))) {
 			SYS_ERR(DSGSN, LOGL_ERROR, 0,
-				"Invalid DNS address: %s!", args_info.dns_arg);
+				"Invalid DNS address: %s!", args_info->dns_arg);
 			return -1;
 		} else {
 			memcpy(&options.dns.s_addr, host->h_addr,
@@ -418,7 +418,7 @@
 			_res.nscount = 1;
 			_res.nsaddr_list[0].sin_addr = options.dns;
 			printf("Using DNS server:      %s (%s)\n",
-			       args_info.dns_arg, inet_ntoa(options.dns));
+			       args_info->dns_arg, inet_ntoa(options.dns));
 		}
 	} else {
 		options.dns.s_addr = 0;
@@ -428,17 +428,17 @@
 	/* listen                                                       */
 	/* If no listen option is specified listen to any local port    */
 	/* Do hostname lookup to translate hostname to IP address       */
-	if (args_info.listen_arg) {
-		if (!(host = gethostbyname(args_info.listen_arg))) {
+	if (args_info->listen_arg) {
+		if (!(host = gethostbyname(args_info->listen_arg))) {
 			SYS_ERR(DSGSN, LOGL_ERROR, 0,
 				"Invalid listening address: %s!",
-				args_info.listen_arg);
+				args_info->listen_arg);
 			return -1;
 		} else {
 			memcpy(&options.listen.s_addr, host->h_addr,
 			       host->h_length);
 			printf("Local IP address is:   %s (%s)\n",
-			       args_info.listen_arg, inet_ntoa(options.listen));
+			       args_info->listen_arg, inet_ntoa(options.listen));
 		}
 	} else {
 		SYS_ERR(DSGSN, LOGL_ERROR, 0,
@@ -449,17 +449,17 @@
 	/* remote                                                       */
 	/* If no remote option is specified terminate                   */
 	/* Do hostname lookup to translate hostname to IP address       */
-	if (args_info.remote_arg) {
-		if (!(host = gethostbyname(args_info.remote_arg))) {
+	if (args_info->remote_arg) {
+		if (!(host = gethostbyname(args_info->remote_arg))) {
 			SYS_ERR(DSGSN, LOGL_ERROR, 0,
 				"Invalid remote address: %s!",
-				args_info.remote_arg);
+				args_info->remote_arg);
 			return -1;
 		} else {
 			memcpy(&options.remote.s_addr, host->h_addr,
 			       host->h_length);
 			printf("Remote IP address is:  %s (%s)\n",
-			       args_info.remote_arg, inet_ntoa(options.remote));
+			       args_info->remote_arg, inet_ntoa(options.remote));
 		}
 	} else {
 		SYS_ERR(DSGSN, LOGL_ERROR, 0,
@@ -468,106 +468,106 @@
 	}
 
 	/* imsi                                                            */
-	if (strlen(args_info.imsi_arg) != 15) {
+	if (strlen(args_info->imsi_arg) != 15) {
 		printf("Invalid IMSI\n");
 		return -1;
 	}
 
 	options.imsi = 0xf000000000000000ull;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[0] - 48));
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[1] - 48)) << 4;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[2] - 48)) << 8;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[3] - 48)) << 12;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[4] - 48)) << 16;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[5] - 48)) << 20;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[6] - 48)) << 24;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[7] - 48)) << 28;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[8] - 48)) << 32;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[9] - 48)) << 36;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[10] - 48)) << 40;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[11] - 48)) << 44;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[12] - 48)) << 48;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[13] - 48)) << 52;
-	options.imsi |= ((uint64_t) (args_info.imsi_arg[14] - 48)) << 56;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[0] - 48));
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[1] - 48)) << 4;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[2] - 48)) << 8;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[3] - 48)) << 12;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[4] - 48)) << 16;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[5] - 48)) << 20;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[6] - 48)) << 24;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[7] - 48)) << 28;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[8] - 48)) << 32;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[9] - 48)) << 36;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[10] - 48)) << 40;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[11] - 48)) << 44;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[12] - 48)) << 48;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[13] - 48)) << 52;
+	options.imsi |= ((uint64_t) (args_info->imsi_arg[14] - 48)) << 56;
 
 	printf("IMSI is:               %s (%#08llx)\n",
-	       args_info.imsi_arg, options.imsi);
+	       args_info->imsi_arg, options.imsi);
 
 	/* nsapi                                                           */
-	if ((args_info.nsapi_arg > 15) || (args_info.nsapi_arg < 0)) {
+	if ((args_info->nsapi_arg > 15) || (args_info->nsapi_arg < 0)) {
 		printf("Invalid NSAPI\n");
 		return -1;
 	}
-	options.nsapi = args_info.nsapi_arg;
-	printf("Using NSAPI:           %d\n", args_info.nsapi_arg);
+	options.nsapi = args_info->nsapi_arg;
+	printf("Using NSAPI:           %d\n", args_info->nsapi_arg);
 
 	/* qos                                                             */
 	options.qos.l = 4;
-	options.qos.v[3] = (args_info.qos_arg) & 0xff;
-	options.qos.v[2] = ((args_info.qos_arg) >> 8) & 0xff;
-	options.qos.v[1] = ((args_info.qos_arg) >> 16) & 0xff;
-	options.qos.v[0] = ((args_info.qos_arg) >> 24) & 0xff;
+	options.qos.v[3] = (args_info->qos_arg) & 0xff;
+	options.qos.v[2] = ((args_info->qos_arg) >> 8) & 0xff;
+	options.qos.v[1] = ((args_info->qos_arg) >> 16) & 0xff;
+	options.qos.v[0] = ((args_info->qos_arg) >> 24) & 0xff;
 	/* Extensions according to 3GPP TS 24.008                          */
-	if (args_info.qose1_given == 1) {
+	if (args_info->qose1_given == 1) {
 		options.qos.l = 12;
-		options.qos.v[11] = (args_info.qose1_arg) & 0xff;
-		options.qos.v[10] = ((args_info.qose1_arg) >> 8) & 0xff;
-		options.qos.v[9] = ((args_info.qose1_arg) >> 16) & 0xff;
-		options.qos.v[8] = ((args_info.qose1_arg) >> 24) & 0xff;
-		options.qos.v[7] = ((args_info.qose1_arg) >> 32) & 0xff;
-		options.qos.v[6] = ((args_info.qose1_arg) >> 40) & 0xff;
-		options.qos.v[5] = ((args_info.qose1_arg) >> 48) & 0xff;
-		options.qos.v[4] = ((args_info.qose1_arg) >> 56) & 0xff;
-		if (args_info.qose2_given == 1) {
+		options.qos.v[11] = (args_info->qose1_arg) & 0xff;
+		options.qos.v[10] = ((args_info->qose1_arg) >> 8) & 0xff;
+		options.qos.v[9] = ((args_info->qose1_arg) >> 16) & 0xff;
+		options.qos.v[8] = ((args_info->qose1_arg) >> 24) & 0xff;
+		options.qos.v[7] = ((args_info->qose1_arg) >> 32) & 0xff;
+		options.qos.v[6] = ((args_info->qose1_arg) >> 40) & 0xff;
+		options.qos.v[5] = ((args_info->qose1_arg) >> 48) & 0xff;
+		options.qos.v[4] = ((args_info->qose1_arg) >> 56) & 0xff;
+		if (args_info->qose2_given == 1) {
 			options.qos.l = 13;
-			options.qos.v[12] = (args_info.qose2_arg) & 0xff;
-			if (args_info.qose3_given == 1) {
+			options.qos.v[12] = (args_info->qose2_arg) & 0xff;
+			if (args_info->qose3_given == 1) {
 				options.qos.l = 15;
 				options.qos.v[14] =
-				    (args_info.qose3_arg) & 0xff;
+				    (args_info->qose3_arg) & 0xff;
 				options.qos.v[13] =
-				    ((args_info.qose3_arg) >> 8) & 0xff;
-				if (args_info.qose4_given == 1) {
+				    ((args_info->qose3_arg) >> 8) & 0xff;
+				if (args_info->qose4_given == 1) {
 					options.qos.l = 17;
 					options.qos.v[16] =
-					    (args_info.qose4_arg) & 0xff;
+					    (args_info->qose4_arg) & 0xff;
 					options.qos.v[15] =
-					    ((args_info.qose4_arg) >> 8) & 0xff;
+					    ((args_info->qose4_arg) >> 8) & 0xff;
 				}
 			}
 		}
 	}
 
 	/* charging                                                        */
-	options.cch = args_info.charging_arg;
+	options.cch = args_info->charging_arg;
 
 	/* contexts                                                        */
-	if (args_info.contexts_arg > MAXCONTEXTS) {
+	if (args_info->contexts_arg > MAXCONTEXTS) {
 		printf("Contexts has to be less than %d\n", MAXCONTEXTS);
 		return -1;
 	}
-	options.contexts = args_info.contexts_arg;
+	options.contexts = args_info->contexts_arg;
 
 	/* Timelimit                                                       */
-	options.timelimit = args_info.timelimit_arg;
+	options.timelimit = args_info->timelimit_arg;
 
 	/* gtpversion                                                      */
-	if ((args_info.gtpversion_arg > 1) || (args_info.gtpversion_arg < 0)) {
+	if ((args_info->gtpversion_arg > 1) || (args_info->gtpversion_arg < 0)) {
 		printf("Invalid GTP version\n");
 		return -1;
 	}
-	options.gtpversion = args_info.gtpversion_arg;
-	printf("Using GTP version:     %d\n", args_info.gtpversion_arg);
+	options.gtpversion = args_info->gtpversion_arg;
+	printf("Using GTP version:     %d\n", args_info->gtpversion_arg);
 
 	/* apn                                                             */
-	if (strlen(args_info.apn_arg) > (sizeof(options.apn.v) - 1)) {
+	if (strlen(args_info->apn_arg) > (sizeof(options.apn.v) - 1)) {
 		printf("Invalid APN\n");
 		return -1;
 	}
-	options.apn.l = strlen(args_info.apn_arg) + 1;
+	options.apn.l = strlen(args_info->apn_arg) + 1;
 
 	apn = (char *)options.apn.v;
-	for (tok = strtok(args_info.apn_arg, ".");
+	for (tok = strtok(args_info->apn_arg, ".");
 	     tok != NULL;
 	     tok = strtok(NULL, ".")) {
 		     size_t len = strlen(tok);
@@ -577,25 +577,25 @@
 		     apn += len;
 	     }
 
-	printf("Using APN:             %s\n", args_info.apn_arg);
+	printf("Using APN:             %s\n", args_info->apn_arg);
 
 	/* selmode */
-	options.selmode = args_info.selmode_arg;
-	printf("Using selection mode:  %d\n", args_info.selmode_arg);
+	options.selmode = args_info->selmode_arg;
+	printf("Using selection mode:  %d\n", args_info->selmode_arg);
 
 	/* rattype */
-	if (args_info.rattype_given == 1) {
+	if (args_info->rattype_given == 1) {
 		options.rattype_given = 1;
 		options.rattype.l = 1;
-		options.rattype.v[0] = args_info.rattype_arg;
-		printf("Using RAT Type:  %d\n", args_info.rattype_arg);
+		options.rattype.v[0] = args_info->rattype_arg;
+		printf("Using RAT Type:  %d\n", args_info->rattype_arg);
 	}
 
 	/* userloc */
-	if (args_info.userloc_given == 1) {
+	if (args_info->userloc_given == 1) {
 		printf("Using User Location Information:  %s\n",
-		       args_info.userloc_arg);
-		tmp = args_info.userloc_arg;
+		       args_info->userloc_arg);
+		tmp = args_info->userloc_arg;
 		n = 0;
 		pch = strtok(tmp, ".");
 		while (pch != NULL) {
@@ -687,9 +687,9 @@
 	}
 
 	/* RAI */
-	if (args_info.rai_given == 1) {
-		printf("Using RAI:  %s\n", args_info.rai_arg);
-		tmp = args_info.rai_arg;
+	if (args_info->rai_given == 1) {
+		printf("Using RAI:  %s\n", args_info->rai_arg);
+		tmp = args_info->rai_arg;
 		n = 0;
 		pch = strtok(tmp, ".");
 		while (pch != NULL) {
@@ -761,12 +761,12 @@
 	}
 
 	/* mstz */
-	if (args_info.mstz_given == 1) {
+	if (args_info->mstz_given == 1) {
 		options.mstz_given = 1;
 		options.mstz.l = 2;
 
-		printf("Using MS Time Zone:  %s\n", args_info.mstz_arg);
-		tmp = args_info.mstz_arg;
+		printf("Using MS Time Zone:  %s\n", args_info->mstz_arg);
+		tmp = args_info->mstz_arg;
 		n = 0;
 		pch = strtok(tmp, ".");
 		while (pch != NULL) {
@@ -815,80 +815,80 @@
 	}
 
 	/* imeisv */
-	if (args_info.imeisv_given == 1) {
+	if (args_info->imeisv_given == 1) {
 		options.imeisv_given = 1;
-		if (strlen(args_info.imeisv_arg) != 16) {
+		if (strlen(args_info->imeisv_arg) != 16) {
 			printf("Invalid IMEI(SV)\n");
 			return -1;
 		}
 		options.imeisv.l = 8;
 		for (n = 0; n < 8; n++) {
-			a = (uint8_t) (args_info.imeisv_arg[2 * n] - 48);
-			b = (uint8_t) (args_info.imeisv_arg[2 * n + 1] - 48);
+			a = (uint8_t) (args_info->imeisv_arg[2 * n] - 48);
+			b = (uint8_t) (args_info->imeisv_arg[2 * n + 1] - 48);
 			options.imeisv.v[n] = 16 * b + a;
 		}
-		printf("Using IMEI(SV):  %s\n", args_info.imeisv_arg);
+		printf("Using IMEI(SV):  %s\n", args_info->imeisv_arg);
 	}
 
 	/* msisdn                                                          */
-	if (strlen(args_info.msisdn_arg) > (sizeof(options.msisdn.v) - 1)) {
+	if (strlen(args_info->msisdn_arg) > (sizeof(options.msisdn.v) - 1)) {
 		printf("Invalid MSISDN\n");
 		return -1;
 	}
 	options.msisdn.l = 1;
 	options.msisdn.v[0] = 0x91;	/* International format */
-	for (n = 0; n < strlen(args_info.msisdn_arg); n++) {
+	for (n = 0; n < strlen(args_info->msisdn_arg); n++) {
 		if ((n % 2) == 0) {
 			options.msisdn.v[((int)n / 2) + 1] =
-			    args_info.msisdn_arg[n] - 48 + 0xf0;
+			    args_info->msisdn_arg[n] - 48 + 0xf0;
 			options.msisdn.l += 1;
 		} else {
 			options.msisdn.v[((int)n / 2) + 1] =
 			    (options.msisdn.v[((int)n / 2) + 1] & 0x0f) +
-			    (args_info.msisdn_arg[n] - 48) * 16;
+			    (args_info->msisdn_arg[n] - 48) * 16;
 		}
 	}
-	printf("Using MSISDN:          %s\n", args_info.msisdn_arg);
+	printf("Using MSISDN:          %s\n", args_info->msisdn_arg);
 
 	/* UID and PWD */
 	/* Might need to also insert stuff like DNS etc. */
-	if ((strlen(args_info.uid_arg) + strlen(args_info.pwd_arg) + 10) >
+	if ((strlen(args_info->uid_arg) + strlen(args_info->pwd_arg) + 10) >
 	    (sizeof(options.pco.v) - 1)) {
 		printf("invalid UID and PWD\n");
 		return -1;
 	}
 	options.pco.l =
-	    strlen(args_info.uid_arg) + strlen(args_info.pwd_arg) + 10;
+	    strlen(args_info->uid_arg) + strlen(args_info->pwd_arg) + 10;
 	options.pco.v[0] = 0x80;	/* PPP */
 	options.pco.v[1] = 0xc0;	/* PAP */
 	options.pco.v[2] = 0x23;
 	options.pco.v[3] =
-	    strlen(args_info.uid_arg) + strlen(args_info.pwd_arg) + 6;
+	    strlen(args_info->uid_arg) + strlen(args_info->pwd_arg) + 6;
 	options.pco.v[4] = 0x01;	/* Authenticate request */
 	options.pco.v[5] = 0x01;
 	options.pco.v[6] = 0x00;	/* MSB of length */
 	options.pco.v[7] =
-	    strlen(args_info.uid_arg) + strlen(args_info.pwd_arg) + 6;
-	options.pco.v[8] = strlen(args_info.uid_arg);
-	memcpy(&options.pco.v[9], args_info.uid_arg, strlen(args_info.uid_arg));
-	options.pco.v[9 + strlen(args_info.uid_arg)] =
-	    strlen(args_info.pwd_arg);
-	memcpy(&options.pco.v[10 + strlen(args_info.uid_arg)],
-	       args_info.pwd_arg, strlen(args_info.pwd_arg));
+	    strlen(args_info->uid_arg) + strlen(args_info->pwd_arg) + 6;
+	options.pco.v[8] = strlen(args_info->uid_arg);
+	memcpy(&options.pco.v[9], args_info->uid_arg, strlen(args_info->uid_arg));
+	options.pco.v[9 + strlen(args_info->uid_arg)] =
+	    strlen(args_info->pwd_arg);
+	memcpy(&options.pco.v[10 + strlen(args_info->uid_arg)],
+	       args_info->pwd_arg, strlen(args_info->pwd_arg));
 
 	/* createif */
-	options.createif = args_info.createif_flag;
-	options.tun_dev_name = args_info.tun_device_arg;
-	options.netns = args_info.netns_arg;
+	options.createif = args_info->createif_flag;
+	options.tun_dev_name = args_info->tun_device_arg;
+	options.netns = args_info->netns_arg;
 
 	/* net                                                          */
 	/* Store net as in_addr net and mask                            */
-	if (args_info.net_arg) {
+	if (args_info->net_arg) {
 		if (ippool_aton
-		    (&options.net, &options.prefixlen, args_info.net_arg, 0)) {
+		    (&options.net, &options.prefixlen, args_info->net_arg, 0)) {
 			SYS_ERR(DSGSN, LOGL_ERROR, 0,
 				"Invalid network address: %s!",
-				args_info.net_arg);
+				args_info->net_arg);
 			exit(1);
 		}
 		options.netaddr = options.net;
@@ -902,56 +902,56 @@
 	}
 
 	/* ipup */
-	options.ipup = args_info.ipup_arg;
+	options.ipup = args_info->ipup_arg;
 
 	/* ipdown */
-	options.ipdown = args_info.ipdown_arg;
+	options.ipdown = args_info->ipdown_arg;
 
 	/* statedir */
-	options.statedir = args_info.statedir_arg;
+	options.statedir = args_info->statedir_arg;
 
 	/* defaultroute */
-	options.defaultroute = args_info.defaultroute_flag;
+	options.defaultroute = args_info->defaultroute_flag;
 
 	/* pinghost                                                     */
 	/* Store ping host as in_addr                                   */
-	if (args_info.pinghost_arg) {
-		if (!(host = gethostbyname(args_info.pinghost_arg))) {
+	if (args_info->pinghost_arg) {
+		if (!(host = gethostbyname(args_info->pinghost_arg))) {
 			SYS_ERR(DSGSN, LOGL_ERROR, 0,
 				"Invalid ping host: %s!",
-				args_info.pinghost_arg);
+				args_info->pinghost_arg);
 			return -1;
 		} else {
 			memcpy(&options.pinghost.s_addr, host->h_addr,
 			       host->h_length);
 			printf("Using ping host:       %s (%s)\n",
-			       args_info.pinghost_arg,
+			       args_info->pinghost_arg,
 			       inet_ntoa(options.pinghost));
 		}
 	}
 
 	/* Other ping parameters                                        */
-	options.pingrate = args_info.pingrate_arg;
-	options.pingsize = args_info.pingsize_arg;
-	options.pingcount = args_info.pingcount_arg;
-	options.pingquiet = args_info.pingquiet_flag;
+	options.pingrate = args_info->pingrate_arg;
+	options.pingsize = args_info->pingsize_arg;
+	options.pingcount = args_info->pingcount_arg;
+	options.pingquiet = args_info->pingquiet_flag;
 
 	/* norecovery */
-	options.norecovery_given = args_info.norecovery_flag;
+	options.norecovery_given = args_info->norecovery_flag;
 
-	if (args_info.no_tx_gpdu_seq_flag)
+	if (args_info->no_tx_gpdu_seq_flag)
 		options.tx_gpdu_seq = 0;
 	else
 		options.tx_gpdu_seq = 1;
 
 	/* PDP Type */
-	if (!strcmp(args_info.pdp_type_arg, "v6"))
+	if (!strcmp(args_info->pdp_type_arg, "v6"))
 		options.pdp_type = PDP_EUA_TYPE_v6;
-	else if (!strcmp(args_info.pdp_type_arg, "v4"))
+	else if (!strcmp(args_info->pdp_type_arg, "v4"))
 		options.pdp_type = PDP_EUA_TYPE_v4;
 	else {
 		SYS_ERR(DSGSN, LOGL_ERROR, 0, "Unsupported/unknown PDP Type '%s'\n",
-			args_info.pdp_type_arg);
+			args_info->pdp_type_arg);
 		return -1;
 	}
 
@@ -1607,6 +1607,9 @@
 	signal(SIGHUP,  signal_handler);
 	signal(SIGINT,  signal_handler);
 
+	/* Track the use of talloc NULL memory contexts */
+	talloc_enable_null_tracking();
+
 	tall_sgsnemu_ctx = talloc_named_const(NULL, 0, "sgsnemu");
 	msgb_talloc_ctx_init(tall_sgsnemu_ctx, 0);
 	osmo_init_logging2(tall_sgsnemu_ctx, &log_info);
@@ -1936,6 +1939,11 @@
 	if (options.createif)
 		tun_free(tun);
 
+	talloc_free(tall_sgsnemu_ctx);
+	fprintf(stderr, "=== talloc report (NULL):\n");
+	talloc_report_full(NULL, stderr);
+	talloc_disable_null_tracking();
+
 	if (0 == state)
 		exit(1);	/* Indicate error */
 

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/17758
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: Ie0d48a12a8349be5a859a03191421cbd9cc324cc
Gerrit-Change-Number: 17758
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200408/70d119d9/attachment.htm>


More information about the gerrit-log mailing list