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>