<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16621">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">remsim-client: Introduce 'struct client_config'<br><br>Introduce a dedicated structure for the parsed command line options<br>converted into the configuration for the client.  This reduces the<br>amount of spaghetti code and paves the way for a later VTY / config<br>file.<br><br>Change-Id: I59980a78f0344602f9fa5b2277c99dfbf0b7815c<br>---<br>M src/simtrace2-remsim_client.c<br>1 file changed, 142 insertions(+), 79 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-remsim refs/changes/21/16621/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/simtrace2-remsim_client.c b/src/simtrace2-remsim_client.c</span><br><span>index 1798df9..79eb32b 100644</span><br><span>--- a/src/simtrace2-remsim_client.c</span><br><span>+++ b/src/simtrace2-remsim_client.c</span><br><span>@@ -840,44 +840,83 @@</span><br><span>           );</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const struct option opts[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        { "server-host", 1, 0, 's' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "server-port", 1, 0, 'p' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "client-id", 1, 0, 'c' },</span><br><span style="color: hsl(0, 100%, 40%);">-   { "client-slot", 1, 0, 'n' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "help", 0, 0, 'h' },</span><br><span style="color: hsl(0, 100%, 40%);">-        { "version", 0, 0, 'v' },</span><br><span style="color: hsl(0, 100%, 40%);">-     { "gsmtap-ip", 1, 0, 'i' },</span><br><span style="color: hsl(0, 100%, 40%);">-   { "keep-running", 0, 0, 'k' },</span><br><span style="color: hsl(0, 100%, 40%);">-        { "usb-vendor", 1, 0, 'V' },</span><br><span style="color: hsl(0, 100%, 40%);">-  { "usb-product", 1, 0, 'P' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "usb-config", 1, 0, 'C' },</span><br><span style="color: hsl(0, 100%, 40%);">-  { "usb-interface", 1, 0, 'I' },</span><br><span style="color: hsl(0, 100%, 40%);">-       { "usb-altsetting", 1, 0, 'S' },</span><br><span style="color: hsl(0, 100%, 40%);">-      { "usb-address", 1, 0, 'A' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "usb-path", 1, 0, 'H' },</span><br><span style="color: hsl(0, 100%, 40%);">-    { "atr", 1, 0, 'a' },</span><br><span style="color: hsl(0, 100%, 40%);">- { NULL, 0, 0, 0 }</span><br><span style="color: hsl(120, 100%, 40%);">+#define ATR_SIZE_MAX            55</span><br><span style="color: hsl(120, 100%, 40%);">+struct client_config {</span><br><span style="color: hsl(120, 100%, 40%);">+ char *server_host;</span><br><span style="color: hsl(120, 100%, 40%);">+    int server_port;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    int client_id;</span><br><span style="color: hsl(120, 100%, 40%);">+        int client_slot;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    char *gsmtap_host;</span><br><span style="color: hsl(120, 100%, 40%);">+    bool keep_running;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t data[ATR_SIZE_MAX];</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t len;</span><br><span style="color: hsl(120, 100%, 40%);">+  } atr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              int vendor_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                int product_id;</span><br><span style="color: hsl(120, 100%, 40%);">+               int config_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                int if_num;</span><br><span style="color: hsl(120, 100%, 40%);">+           int altsetting;</span><br><span style="color: hsl(120, 100%, 40%);">+               int addr;</span><br><span style="color: hsl(120, 100%, 40%);">+             char *path;</span><br><span style="color: hsl(120, 100%, 40%);">+   } usb;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct client_config *client_config_init(void *ctx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct rspro_server_conn *srvc, *bankdc;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct st_transport *transp = ci->slot->transp;</span><br><span style="color: hsl(0, 100%, 40%);">-   char *gsmtap_host = "127.0.0.1";</span><br><span style="color: hsl(0, 100%, 40%);">-      int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- int c, ret = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- int keep_running = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   int server_port = 9998;</span><br><span style="color: hsl(0, 100%, 40%);">- int if_num = 0, vendor_id = -1, product_id = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        int config_id = -1, altsetting = 0, addr = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-  int client_id = -1, client_slot = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-   char *server_host = "127.0.0.1";</span><br><span style="color: hsl(0, 100%, 40%);">-      char *path = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t atr_data[33] = { 0x3B, 0x00 }; // the shortest simplest ATR possible</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t atr_len = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct client_config *cfg = talloc_zero(ctx, struct client_config);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!cfg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        print_welcome();</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg->server_host = talloc_strdup(cfg, "127.0.0.1");</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg->server_port = 9998;</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg->client_id = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg->client_slot = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+     cfg->gsmtap_host = talloc_strdup(cfg, "127.0.0.1");</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg->keep_running = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg->usb.vendor_id = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg->usb.product_id = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+  cfg->usb.config_id = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg->usb.if_num = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg->usb.altsetting = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg->usb.addr = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg->usb.path = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    cfg->atr.data[0] = 0x3B;</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg->atr.data[1] = 0x00; // the shortest simplest ATR possible</span><br><span style="color: hsl(120, 100%, 40%);">+     cfg->atr.len = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return cfg;</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(struct client_config *cfg, int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    const struct option opts[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                { "server-host", 1, 0, 's' },</span><br><span style="color: hsl(120, 100%, 40%);">+               { "server-port", 1, 0, 'p' },</span><br><span style="color: hsl(120, 100%, 40%);">+               { "client-id", 1, 0, 'c' },</span><br><span style="color: hsl(120, 100%, 40%);">+         { "client-slot", 1, 0, 'n' },</span><br><span style="color: hsl(120, 100%, 40%);">+               { "help", 0, 0, 'h' },</span><br><span style="color: hsl(120, 100%, 40%);">+              { "version", 0, 0, 'v' },</span><br><span style="color: hsl(120, 100%, 40%);">+           { "gsmtap-ip", 1, 0, 'i' },</span><br><span style="color: hsl(120, 100%, 40%);">+         { "keep-running", 0, 0, 'k' },</span><br><span style="color: hsl(120, 100%, 40%);">+              { "usb-vendor", 1, 0, 'V' },</span><br><span style="color: hsl(120, 100%, 40%);">+                { "usb-product", 1, 0, 'P' },</span><br><span style="color: hsl(120, 100%, 40%);">+               { "usb-config", 1, 0, 'C' },</span><br><span style="color: hsl(120, 100%, 40%);">+                { "usb-interface", 1, 0, 'I' },</span><br><span style="color: hsl(120, 100%, 40%);">+             { "usb-altsetting", 1, 0, 'S' },</span><br><span style="color: hsl(120, 100%, 40%);">+            { "usb-address", 1, 0, 'A' },</span><br><span style="color: hsl(120, 100%, 40%);">+               { "usb-path", 1, 0, 'H' },</span><br><span style="color: hsl(120, 100%, 40%);">+          { "atr", 1, 0, 'a' },</span><br><span style="color: hsl(120, 100%, 40%);">+               { NULL, 0, 0, 0 }</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+    int c, rc;</span><br><span> </span><br><span>       while (1) {</span><br><span>          int option_index = 0;</span><br><span>@@ -887,16 +926,16 @@</span><br><span>                        break;</span><br><span>               switch (c) {</span><br><span>                 case 's':</span><br><span style="color: hsl(0, 100%, 40%);">-                       server_host = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_talloc_replace_string(cfg, &cfg->server_host, optarg);</span><br><span>                   break;</span><br><span>               case 'p':</span><br><span style="color: hsl(0, 100%, 40%);">-                       server_port = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                   cfg->server_port = atoi(optarg);</span><br><span>                  break;</span><br><span>               case 'c':</span><br><span style="color: hsl(0, 100%, 40%);">-                       client_id = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                     cfg->client_id = atoi(optarg);</span><br><span>                    break;</span><br><span>               case 'n':</span><br><span style="color: hsl(0, 100%, 40%);">-                       client_slot = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                   cfg->client_slot = atoi(optarg);</span><br><span>                  break;</span><br><span>               case 'h':</span><br><span>                    print_help();</span><br><span>@@ -907,62 +946,82 @@</span><br><span>                        exit(0);</span><br><span>                     break;</span><br><span>               case 'i':</span><br><span style="color: hsl(0, 100%, 40%);">-                       gsmtap_host = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_talloc_replace_string(cfg, &cfg->gsmtap_host, optarg);</span><br><span>                   break;</span><br><span>               case 'k':</span><br><span style="color: hsl(0, 100%, 40%);">-                       keep_running = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                     cfg->keep_running = 1;</span><br><span>                    break;</span><br><span>               case 'V':</span><br><span style="color: hsl(0, 100%, 40%);">-                       vendor_id = strtol(optarg, NULL, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+                 cfg->usb.vendor_id = strtol(optarg, NULL, 16);</span><br><span>                    break;</span><br><span>               case 'P':</span><br><span style="color: hsl(0, 100%, 40%);">-                       product_id = strtol(optarg, NULL, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+                        cfg->usb.product_id = strtol(optarg, NULL, 16);</span><br><span>                   break;</span><br><span>               case 'C':</span><br><span style="color: hsl(0, 100%, 40%);">-                       config_id = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                     cfg->usb.config_id = atoi(optarg);</span><br><span>                        break;</span><br><span>               case 'I':</span><br><span style="color: hsl(0, 100%, 40%);">-                       if_num = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                        cfg->usb.if_num = atoi(optarg);</span><br><span>                   break;</span><br><span>               case 'S':</span><br><span style="color: hsl(0, 100%, 40%);">-                       altsetting = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                    cfg->usb.altsetting = atoi(optarg);</span><br><span>                       break;</span><br><span>               case 'A':</span><br><span style="color: hsl(0, 100%, 40%);">-                       addr = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                  cfg->usb.addr = atoi(optarg);</span><br><span>                     break;</span><br><span>               case 'H':</span><br><span style="color: hsl(0, 100%, 40%);">-                       path = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                        cfg->usb.path = optarg;</span><br><span>                   break;</span><br><span>               case 'a':</span><br><span style="color: hsl(0, 100%, 40%);">-                       rc = osmo_hexparse(optarg, atr_data, ARRAY_SIZE(atr_data));</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (rc < 2 || rc > ARRAY_SIZE(atr_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                fprintf(stderr, "ATR matlformed\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                          goto do_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+                 rc = osmo_hexparse(optarg, cfg->atr.data, ARRAY_SIZE(cfg->atr.data));</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (rc < 2 || rc > ARRAY_SIZE(cfg->atr.data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              fprintf(stderr, "ATR malformed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         exit(2);</span><br><span>                     }</span><br><span style="color: hsl(0, 100%, 40%);">-                       atr_len = rc;</span><br><span style="color: hsl(120, 100%, 40%);">+                 cfg->atr.len = rc;</span><br><span>                        break;</span><br><span>               }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (vendor_id < 0 || product_id < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            fprintf(stderr, "You have to specify the vendor and product ID\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           goto do_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (argc > optind) {</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "Unsupported positional arguments on command line\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(2);</span><br><span>     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        signal(SIGUSR1, handle_sig_usr1);</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%);">+       struct rspro_server_conn *srvc, *bankdc;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct st_transport *transp = ci->slot->transp;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct client_config *cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       int ret = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        print_welcome();</span><br><span> </span><br><span>         g_tall_ctx = talloc_named_const(NULL, 0, "global");</span><br><span>        talloc_asn1_ctx = talloc_named_const(g_tall_ctx, 0, "asn1");</span><br><span>       msgb_talloc_ctx_init(g_tall_ctx, 0);</span><br><span>         osmo_init_logging2(g_tall_ctx, &log_info);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    cfg = client_config_init(g_tall_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ handle_options(cfg, argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (cfg->usb.vendor_id < 0 || cfg->usb.product_id < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(stderr, "You have to specify the vendor and product ID\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         goto do_exit;</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(SIGUSR1, handle_sig_usr1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  rc = osmo_libusb_init(NULL);</span><br><span>         if (rc < 0) {</span><br><span>             fprintf(stderr, "libusb initialization failed\n");</span><br><span>                 goto do_exit;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   g_gti = gsmtap_source_init(gsmtap_host, GSMTAP_UDP_PORT, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  g_gti = gsmtap_source_init(cfg->gsmtap_host, GSMTAP_UDP_PORT, 0);</span><br><span>         if (!g_gti) {</span><br><span>                perror("unable to open GSMTAP");</span><br><span>           goto close_exit;</span><br><span>@@ -975,20 +1034,22 @@</span><br><span> </span><br><span>        g_client = talloc_zero(g_tall_ctx, struct bankd_client);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (client_id != -1) {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* default to client slot 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (client_slot == -1)</span><br><span style="color: hsl(0, 100%, 40%);">-                  client_slot = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (cfg->client_id != -1) {</span><br><span>               g_client->srv_conn.clslot = talloc_zero(g_client, ClientSlot_t);</span><br><span style="color: hsl(0, 100%, 40%);">-             g_client->srv_conn.clslot->clientId = client_id;</span><br><span style="color: hsl(0, 100%, 40%);">-          g_client->srv_conn.clslot->slotNr = client_slot;</span><br><span style="color: hsl(120, 100%, 40%);">+                g_client->srv_conn.clslot->clientId = cfg->client_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* default to client slot 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (cfg->client_slot == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                        g_client->srv_conn.clslot->slotNr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+                  g_client->srv_conn.clslot->slotNr = cfg->client_slot;</span><br><span>               g_client->bankd_conn.clslot = talloc_zero(g_client, ClientSlot_t);</span><br><span>                *g_client->bankd_conn.clslot = *g_client->srv_conn.clslot;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* create and [attempt to] establish connection to remsim-server */</span><br><span>  srvc = &g_client->srv_conn;</span><br><span style="color: hsl(0, 100%, 40%);">-      srvc->server_host = server_host;</span><br><span style="color: hsl(0, 100%, 40%);">-     srvc->server_port = server_port;</span><br><span style="color: hsl(120, 100%, 40%);">+   srvc->server_host = cfg->server_host;</span><br><span style="color: hsl(120, 100%, 40%);">+   srvc->server_port = cfg->server_port;</span><br><span>  srvc->handle_rx = srvc_handle_rx;</span><br><span>         srvc->own_comp_id.type = ComponentType_remsimClient;</span><br><span>      OSMO_STRLCPY_ARRAY(srvc->own_comp_id.name, "simtrace2-remsim-client");</span><br><span>@@ -1001,6 +1062,8 @@</span><br><span>  }</span><br><span>    osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_ESTABLISH, NULL);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /* create and not yet establish connection to remsim-bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+ srvc = &g_client->srv_conn;</span><br><span>   bankdc = &g_client->bankd_conn;</span><br><span>       /* server_host / server_port are configured from remsim-server */</span><br><span>    bankdc->handle_rx = bankd_handle_rx;</span><br><span>@@ -1017,27 +1080,27 @@</span><br><span>    // connect to SIMtrace2 cardem</span><br><span>       do {</span><br><span>                 struct usb_interface_match _ifm, *ifm = &_ifm;</span><br><span style="color: hsl(0, 100%, 40%);">-              ifm->vendor = vendor_id;</span><br><span style="color: hsl(0, 100%, 40%);">-             ifm->product = product_id;</span><br><span style="color: hsl(0, 100%, 40%);">-           ifm->configuration = config_id;</span><br><span style="color: hsl(0, 100%, 40%);">-              ifm->interface = if_num;</span><br><span style="color: hsl(0, 100%, 40%);">-             ifm->altsetting = altsetting;</span><br><span style="color: hsl(0, 100%, 40%);">-                ifm->addr = addr;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (path)</span><br><span style="color: hsl(0, 100%, 40%);">-                       osmo_strlcpy(ifm->path, path, sizeof(ifm->path));</span><br><span style="color: hsl(120, 100%, 40%);">+               ifm->vendor = cfg->usb.vendor_id;</span><br><span style="color: hsl(120, 100%, 40%);">+               ifm->product = cfg->usb.product_id;</span><br><span style="color: hsl(120, 100%, 40%);">+             ifm->configuration = cfg->usb.config_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                ifm->interface = cfg->usb.if_num;</span><br><span style="color: hsl(120, 100%, 40%);">+               ifm->altsetting = cfg->usb.altsetting;</span><br><span style="color: hsl(120, 100%, 40%);">+          ifm->addr = cfg->usb.addr;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (cfg->usb.path)</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_strlcpy(ifm->path, cfg->usb.path, sizeof(ifm->path));</span><br><span>          transp->usb_devh = osmo_libusb_open_claim_interface(NULL, NULL, ifm);</span><br><span>             if (!transp->usb_devh) {</span><br><span>                  fprintf(stderr, "can't open USB device\n");</span><br><span>                    goto close_exit;</span><br><span>             }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           rc = libusb_claim_interface(transp->usb_devh, if_num);</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = libusb_claim_interface(transp->usb_devh, cfg->usb.if_num);</span><br><span>                if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        fprintf(stderr, "can't claim interface %d; rc=%d\n", if_num, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                       fprintf(stderr, "can't claim interface %d; rc=%d\n", cfg->usb.if_num, rc);</span><br><span>                  goto close_exit;</span><br><span>             }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           rc = osmo_libusb_get_ep_addrs(transp->usb_devh, if_num, &transp->usb_ep.out,</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = osmo_libusb_get_ep_addrs(transp->usb_devh, cfg->usb.if_num, &transp->usb_ep.out,</span><br><span>                                           &transp->usb_ep.in, &transp->usb_ep.irq_in);</span><br><span>           if (rc < 0) {</span><br><span>                     fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc);</span><br><span>@@ -1101,7 +1164,7 @@</span><br><span> </span><br><span>             /* set the ATR */</span><br><span>            //atr_update_csum(real_atr, sizeof(real_atr));</span><br><span style="color: hsl(0, 100%, 40%);">-          cardem_request_set_atr(ci, atr_data, atr_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                cardem_request_set_atr(ci, cfg->atr.data, cfg->atr.len);</span><br><span> </span><br><span>           /* select remote (forwarded) SIM */</span><br><span>          st_modem_reset_pulse(ci->slot, 300);</span><br><span>@@ -1121,9 +1184,9 @@</span><br><span> close_exit:</span><br><span>               if (transp->usb_devh)</span><br><span>                     libusb_close(transp->usb_devh);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (keep_running)</span><br><span style="color: hsl(120, 100%, 40%);">+             if (cfg->keep_running)</span><br><span>                    sleep(1);</span><br><span style="color: hsl(0, 100%, 40%);">-       } while (keep_running);</span><br><span style="color: hsl(120, 100%, 40%);">+       } while (cfg->keep_running);</span><br><span> </span><br><span>  libusb_exit(NULL);</span><br><span> do_exit:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16621">change 16621</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-remsim/+/16621"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-remsim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I59980a78f0344602f9fa5b2277c99dfbf0b7815c </div>
<div style="display:none"> Gerrit-Change-Number: 16621 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>