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.orgpespin 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, ¶ms, 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>