<p>lynxis lazus has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/21701">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">utils: add osmo-ns-dummy<br><br>A dummy client to do integration tests of the ns2 layer.<br>It drop all unit data. But allows vty tests.<br><br>Change-Id: I127c178426bc1a3da8de251740eda93853030d6d<br>---<br>M configure.ac<br>M utils/Makefile.am<br>A utils/osmo-ns-dummy.c<br>3 files changed, 276 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/01/21701/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index 10fb496..0d710f3 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -243,6 +243,14 @@</span><br><span>  [enable_vty=$enableval], [enable_vty="yes"])</span><br><span> AM_CONDITIONAL(ENABLE_VTY, test x"$enable_vty" = x"yes")</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(nsdummy,</span><br><span style="color: hsl(120, 100%, 40%);">+    [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-nsdummy],</span><br><span style="color: hsl(120, 100%, 40%);">+           [Enable building ns dummy for testing network service]</span><br><span style="color: hsl(120, 100%, 40%);">+        )],</span><br><span style="color: hsl(120, 100%, 40%);">+   [enable_nsdummy=$enableval], [enable_nsdummy="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL(ENABLE_NSDUMMY, test x"$enable_nsdummy" = x"yes")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AC_ARG_ENABLE(panic_infloop,</span><br><span>        [AS_HELP_STRING(</span><br><span>             [--enable-panic-infloop],</span><br><span>diff --git a/utils/Makefile.am b/utils/Makefile.am</span><br><span>index 653b719..6b2a23b 100644</span><br><span>--- a/utils/Makefile.am</span><br><span>+++ b/utils/Makefile.am</span><br><span>@@ -1,11 +1,13 @@</span><br><span style="color: hsl(0, 100%, 40%);">-if ENABLE_UTILITIES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS =</span><br><span> AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(TALLOC_CFLAGS)</span><br><span> AM_CFLAGS = -Wall $(PTHREAD_CFLAGS)</span><br><span> LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libosmogsm.la $(PTHREAD_LIBS)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_UTILITIES</span><br><span> EXTRA_DIST = conv_gen.py conv_codes_gsm.py</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bin_PROGRAMS = osmo-arfcn osmo-auc-gen osmo-config-merge</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS += osmo-arfcn osmo-auc-gen osmo-config-merge</span><br><span> </span><br><span> osmo_arfcn_SOURCES = osmo-arfcn.c</span><br><span> </span><br><span>@@ -22,3 +24,13 @@</span><br><span> osmo_sim_test_CFLAGS = $(PCSC_CFLAGS)</span><br><span> endif</span><br><span> endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_NSDUMMY</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS += osmo-ns-dummy</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_ns_dummy_SOURCES = osmo-ns-dummy.c</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_ns_dummy_LDADD = $(LDADD) $(TALLOC_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+                   $(top_builddir)/src/gb/libosmogb.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                 $(top_builddir)/src/vty/libosmovty.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                       $(top_builddir)/src/gsm/libosmogsm.la</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_ns_dummy_CFLAGS = $(TALLOC_CFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span>diff --git a/utils/osmo-ns-dummy.c b/utils/osmo-ns-dummy.c</span><br><span>new file mode 100644</span><br><span>index 0000000..f1434c2</span><br><span>--- /dev/null</span><br><span>+++ b/utils/osmo-ns-dummy.c</span><br><span>@@ -0,0 +1,254 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <getopt.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/select.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/gprs_ns2.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/telnet_interface.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/command.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/ports.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/tdef_vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/misc.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void *tall_nsdummy_ctx  = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct log_info log_info = {};</span><br><span style="color: hsl(120, 100%, 40%);">+static bool quit = false;</span><br><span style="color: hsl(120, 100%, 40%);">+static bool config_given = false;</span><br><span style="color: hsl(120, 100%, 40%);">+static bool daemonize = false;</span><br><span style="color: hsl(120, 100%, 40%);">+static char *config_file = "osmo-pcu.cfg";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const char vty_copyright[] =</span><br><span style="color: hsl(120, 100%, 40%);">+    "Copyright (C) 2020 by by sysmocom - s.f.m.c. GmbH, Author: Alexander Couzens <lynxis@fe80.eu>\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+   "License GNU GPL version 2 or later\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "This is free software: you are free to change and redistribute it.\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "There is NO WARRANTY, to the extent permitted by law.\r\n";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct vty_app_info vty_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+     .name           = "OsmoNSdummy",</span><br><span style="color: hsl(120, 100%, 40%);">+    .version        = PACKAGE_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+    .copyright      = vty_copyright,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void print_help()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   printf( "Some useful options:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "  -h      --help                  This text\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "  -c      --config-file           Specify the filename of the config file\n"</span><br><span style="color: hsl(120, 100%, 40%);">+               "  -V      --version               Print version\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "  -D      --daemonize             Fork the process into a background daemon\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "\nVTY reference generation:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "          --vty-ref-mode MODE     VTY reference generation mode (e.g. 'expert').\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                "          --vty-ref-xml           Generate the VTY reference XML output and exit.\n"</span><br><span style="color: hsl(120, 100%, 40%);">+               );</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_long_options(const char *prog_name, const int long_option)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     static int vty_ref_mode = VTY_REF_GEN_MODE_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (long_option) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_ref_mode = get_string_value(vty_ref_gen_mode_names, optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (vty_ref_mode < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    fprintf(stderr, "%s: Unknown VTY reference generation "</span><br><span style="color: hsl(120, 100%, 40%);">+                             "mode '%s'\n", prog_name, optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                  exit(2);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "Generating the VTY reference in mode '%s' (%s)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 get_value_string(vty_ref_gen_mode_names, vty_ref_mode),</span><br><span style="color: hsl(120, 100%, 40%);">+                       get_value_string(vty_ref_gen_mode_desc, vty_ref_mode));</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_dump_xml_ref_mode(stdout, (enum vty_ref_gen_mode) vty_ref_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      default:</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "%s: error parsing cmdline options\n", prog_name);</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(2);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_options(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int option_idx = 0, c;</span><br><span style="color: hsl(120, 100%, 40%);">+                static int long_option = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+           static const struct option long_options[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                 { "help", 0, 0, 'h' },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { "config-file", 1, 0, 'c' },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { "version", 0, 0, 'V' },</span><br><span style="color: hsl(120, 100%, 40%);">+                   { "daemonize", 0, 0, 'D' },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { "vty-ref-mode", 1, &long_option, 1 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { "vty-ref-xml", 0, &long_option, 2 },</span><br><span style="color: hsl(120, 100%, 40%);">+                  { 0, 0, 0, 0 }</span><br><span style="color: hsl(120, 100%, 40%);">+                };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          c = getopt_long(argc, argv, "hc:VD",</span><br><span style="color: hsl(120, 100%, 40%);">+                                long_options, &option_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (c == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case 'h':</span><br><span style="color: hsl(120, 100%, 40%);">+                     print_help();</span><br><span style="color: hsl(120, 100%, 40%);">+                 exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       handle_long_options(argv[0], long_option);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'c':</span><br><span style="color: hsl(120, 100%, 40%);">+                     free(config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+                    config_file = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                 config_given = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'V':</span><br><span style="color: hsl(120, 100%, 40%);">+                     print_version(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                     exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'D':</span><br><span style="color: hsl(120, 100%, 40%);">+                     daemonize = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, "Unknown option '%c'\n", c);</span><br><span style="color: hsl(120, 100%, 40%);">+                        exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void sighandler(int sigset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        if (sigset == SIGPIPE)</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(stderr, "Signal %d received.\n", sigset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (sigset) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case SIGINT:</span><br><span style="color: hsl(120, 100%, 40%);">+  case SIGTERM:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* If another signal is received afterwards, the program</span><br><span style="color: hsl(120, 100%, 40%);">+               * is terminated without finishing shutdown process.</span><br><span style="color: hsl(120, 100%, 40%);">+           */</span><br><span style="color: hsl(120, 100%, 40%);">+           signal(SIGINT, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+              signal(SIGTERM, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             signal(SIGPIPE, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             signal(SIGABRT, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             signal(SIGUSR1, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             signal(SIGUSR2, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           quit = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIGABRT:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* in case of abort, we want to obtain a talloc report and</span><br><span style="color: hsl(120, 100%, 40%);">+             * then run default SIGABRT handler, who will generate coredump</span><br><span style="color: hsl(120, 100%, 40%);">+                * and abort the process. abort() should do this for us after we</span><br><span style="color: hsl(120, 100%, 40%);">+               * return, but program wouldn't exit if an external SIGABRT is</span><br><span style="color: hsl(120, 100%, 40%);">+             * received.</span><br><span style="color: hsl(120, 100%, 40%);">+           */</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_report_full(tall_nsdummy_ctx, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+         signal(SIGABRT, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             raise(SIGABRT);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIGUSR1:</span><br><span style="color: hsl(120, 100%, 40%);">+ case SIGUSR2:</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_report_full(tall_nsdummy_ctx, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* called by the ns layer */</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_ns_prim_cb(struct osmo_prim_hdr *oph, void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main (int argc, char *argv[])</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        void *ctx = tall_nsdummy_ctx = talloc_named_const(NULL, 0, "osmo-ns-dummy");</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_ns2_inst *nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_logging2(ctx, &log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+       log_set_use_color(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     log_set_print_filename(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_print_filename(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_log_level(osmo_stderr_target, LOGL_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_talloc_ctx_init(ctx, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stats_init(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_init(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_info.tall_ctx = ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+      vty_init(&vty_info);</span><br><span style="color: hsl(120, 100%, 40%);">+      logging_vty_add_cmds();</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_stats_vty_add_cmds();</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_talloc_vty_add_cmds();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ handle_options(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+   nsi = gprs_ns2_instantiate(ctx, gprs_ns_prim_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!nsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DLNS, LOGL_ERROR, "Failed to create NS instance\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   gprs_ns2_vty2_init(nsi);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = vty_read_config_file(config_file, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0 && config_given) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Failed to parse the config file: '%s'\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+         exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                fprintf(stderr, "No config file: '%s' Using default config.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = telnet_init_dynif(ctx, NULL, vty_get_bind_addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                               OSMO_VTY_PORT_PCU);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Error initializing telnet\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   signal(SIGINT, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+   signal(SIGTERM, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGPIPE, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGABRT, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGUSR1, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGUSR2, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_init_ignore_signals();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (daemonize) {</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_daemonize();</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      perror("Error during daemonize");</span><br><span style="color: hsl(120, 100%, 40%);">+                   exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   while (!quit) {</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_select_main(0);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   telnet_exit();</span><br><span style="color: hsl(120, 100%, 40%);">+        gprs_ns2_free(nsi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_report_full(tall_nsdummy_ctx, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(tall_nsdummy_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/21701">change 21701</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/libosmocore/+/21701"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I127c178426bc1a3da8de251740eda93853030d6d </div>
<div style="display:none"> Gerrit-Change-Number: 21701 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>