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

<div style="display:none"> Gerrit-Project: osmo-ggsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie0d48a12a8349be5a859a03191421cbd9cc324cc </div>
<div style="display:none"> Gerrit-Change-Number: 17758 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>