<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>