<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13488">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libmsc/db.c: introduce and use parse_sm_ud_from_result()<br><br>The following functions:<br><br>  - sms_from_result(),<br>  - sms_from_result_v3(),<br>  - sms_from_result_v4(),<br><br>do retrieve the TP-UD, TP-UDL and text in the same way,<br>so let's avoid code duplication.<br><br>Change-Id: If67dfb9f7d2a55fa3d45dc4689a2acff9909faf6<br>---<br>M src/libmsc/db.c<br>1 file changed, 35 insertions(+), 48 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/88/13488/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libmsc/db.c b/src/libmsc/db.c</span><br><span>index ae9b114..bf57ec8 100644</span><br><span>--- a/src/libmsc/db.c</span><br><span>+++ b/src/libmsc/db.c</span><br><span>@@ -225,6 +225,32 @@</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void parse_tp_ud_from_result(struct gsm_sms *sms, dbi_result result)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    const unsigned char *user_data;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int user_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *text;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Retrieve TP-UDL (User-Data-Length) in octets (regardless of DCS) */</span><br><span style="color: hsl(120, 100%, 40%);">+        user_data_len = dbi_result_get_field_length(result, "user_data");</span><br><span style="color: hsl(120, 100%, 40%);">+   if (user_data_len > sizeof(sms->user_data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DDB, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+              "SMS TP-UD length %u is too big, truncating to %zu\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              user_data_len, sizeof(sms->user_data));</span><br><span style="color: hsl(120, 100%, 40%);">+               user_data_len = (uint8_t) sizeof(sms->user_data);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     sms->user_data_len = user_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Retrieve the TP-UD (User-Data) itself */</span><br><span style="color: hsl(120, 100%, 40%);">+   user_data = dbi_result_get_binary(result, "user_data");</span><br><span style="color: hsl(120, 100%, 40%);">+     memcpy(sms->user_data, user_data, user_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Retrieve the text parsed from TP-UD (User-Data) */</span><br><span style="color: hsl(120, 100%, 40%);">+ text = dbi_result_get_string(result, "text");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (text)</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_STRLCPY_ARRAY(sms->text, text);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /**</span><br><span>  * Copied from the normal sms_from_result_v3 to avoid having</span><br><span>  * to make sure that the real routine will remain backward</span><br><span>@@ -234,9 +260,7 @@</span><br><span> {</span><br><span>         struct gsm_sms *sms = sms_alloc();</span><br><span>   long long unsigned int sender_id;</span><br><span style="color: hsl(0, 100%, 40%);">-       const char *text, *daddr;</span><br><span style="color: hsl(0, 100%, 40%);">-       const unsigned char *user_data;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int user_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *daddr;</span><br><span>   char buf[32];</span><br><span>        char *quoted;</span><br><span>        dbi_result result2;</span><br><span>@@ -274,20 +298,9 @@</span><br><span>   if (daddr)</span><br><span>           OSMO_STRLCPY_ARRAY(sms->dst.addr, daddr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        user_data_len = dbi_result_get_field_length(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-     user_data = dbi_result_get_binary(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-       if (user_data_len > sizeof(sms->user_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DDB, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                "SMS TP-UD length %u is too big, truncating to %zu\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                user_data_len, sizeof(sms->user_data));</span><br><span style="color: hsl(0, 100%, 40%);">-         user_data_len = (uint8_t) sizeof(sms->user_data);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       sms->user_data_len = user_data_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(sms->user_data, user_data, sms->user_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Parse TP-UD, TP-UDL and decoded text */</span><br><span style="color: hsl(120, 100%, 40%);">+    parse_tp_ud_from_result(sms, result);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       text = dbi_result_get_string(result, "text");</span><br><span style="color: hsl(0, 100%, 40%);">- if (text)</span><br><span style="color: hsl(0, 100%, 40%);">-               OSMO_STRLCPY_ARRAY(sms->text, text);</span><br><span>      return sms;</span><br><span> }</span><br><span> </span><br><span>@@ -400,9 +413,7 @@</span><br><span> static struct gsm_sms *sms_from_result_v4(dbi_result result)</span><br><span> {</span><br><span>      struct gsm_sms *sms = sms_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-      const unsigned char *user_data;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int user_data_len;</span><br><span style="color: hsl(0, 100%, 40%);">-     const char *text, *addr;</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *addr;</span><br><span> </span><br><span>        if (!sms)</span><br><span>            return NULL;</span><br><span>@@ -426,20 +437,9 @@</span><br><span>  sms->dst.ton = dbi_result_get_ulonglong(result, "dest_ton");</span><br><span>    sms->dst.npi = dbi_result_get_ulonglong(result, "dest_npi");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   user_data_len = dbi_result_get_field_length(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-     user_data = dbi_result_get_binary(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-       if (user_data_len > sizeof(sms->user_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DDB, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                "SMS TP-UD length %u is too big, truncating to %zu\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                user_data_len, sizeof(sms->user_data));</span><br><span style="color: hsl(0, 100%, 40%);">-         user_data_len = (uint8_t) sizeof(sms->user_data);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       sms->user_data_len = user_data_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(sms->user_data, user_data, sms->user_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Parse TP-UD, TP-UDL and decoded text */</span><br><span style="color: hsl(120, 100%, 40%);">+    parse_tp_ud_from_result(sms, result);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       text = dbi_result_get_string(result, "text");</span><br><span style="color: hsl(0, 100%, 40%);">- if (text)</span><br><span style="color: hsl(0, 100%, 40%);">-               OSMO_STRLCPY_ARRAY(sms->text, text);</span><br><span>      return sms;</span><br><span> }</span><br><span> </span><br><span>@@ -754,9 +754,7 @@</span><br><span> static struct gsm_sms *sms_from_result(struct gsm_network *net, dbi_result result)</span><br><span> {</span><br><span>        struct gsm_sms *sms = sms_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-      const char *text, *daddr, *saddr;</span><br><span style="color: hsl(0, 100%, 40%);">-       const unsigned char *user_data;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int user_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *daddr, *saddr;</span><br><span>   time_t validity_timestamp;</span><br><span> </span><br><span>       if (!sms)</span><br><span>@@ -790,20 +788,9 @@</span><br><span>     if (saddr)</span><br><span>           OSMO_STRLCPY_ARRAY(sms->src.addr, saddr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        user_data_len = dbi_result_get_field_length(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-     user_data = dbi_result_get_binary(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-       if (user_data_len > sizeof(sms->user_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DDB, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                "SMS TP-UD length %u is too big, truncating to %zu\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                user_data_len, sizeof(sms->user_data));</span><br><span style="color: hsl(0, 100%, 40%);">-         user_data_len = (uint8_t) sizeof(sms->user_data);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       sms->user_data_len = user_data_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(sms->user_data, user_data, sms->user_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Parse TP-UD, TP-UDL and decoded text */</span><br><span style="color: hsl(120, 100%, 40%);">+    parse_tp_ud_from_result(sms, result);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       text = dbi_result_get_string(result, "text");</span><br><span style="color: hsl(0, 100%, 40%);">- if (text)</span><br><span style="color: hsl(0, 100%, 40%);">-               OSMO_STRLCPY_ARRAY(sms->text, text);</span><br><span>      return sms;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13488">change 13488</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/13488"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: If67dfb9f7d2a55fa3d45dc4689a2acff9909faf6 </div>
<div style="display:none"> Gerrit-Change-Number: 13488 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>