<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10068">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add osmo_sockaddr_to_str_and_uint()<br><br>This came from osmo-bsc refactoring patch I82e3f918295daa83274a4cf803f046979f284366<br>https://gerrit.osmocom.org/#/c/osmo-bsc/+/9671/6/src/osmo-bsc/gsm_data.c@1708<br><br>Add regression test in utils_test.c.<br><br>Change-Id: I1f2918418c38918c5ac70acaa51a47adfca12b5e<br>---<br>M include/osmocom/core/socket.h<br>M src/socket.c<br>M tests/utils/utils_test.c<br>M tests/utils/utils_test.ok<br>4 files changed, 148 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/68/10068/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h</span><br><span>index 47d9f30..3e95953 100644</span><br><span>--- a/include/osmocom/core/socket.h</span><br><span>+++ b/include/osmocom/core/socket.h</span><br><span>@@ -44,6 +44,9 @@</span><br><span> </span><br><span> int osmo_sockaddr_is_local(struct sockaddr *addr, unsigned int addrlen);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+size_t osmo_sockaddr_to_str_and_uint(char *addr, size_t addr_len, uint16_t *port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    const struct sockaddr *sa);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int osmo_sock_unix_init(uint16_t type, uint8_t proto,</span><br><span>                  const char *socket_path, unsigned int flags);</span><br><span> </span><br><span>diff --git a/src/socket.c b/src/socket.c</span><br><span>index cd73f17..168db35 100644</span><br><span>--- a/src/socket.c</span><br><span>+++ b/src/socket.c</span><br><span>@@ -35,6 +35,7 @@</span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/socket.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span> </span><br><span> #include <sys/ioctl.h></span><br><span> #include <sys/socket.h></span><br><span>@@ -553,6 +554,25 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Convert sockaddr to IP address as char string and port as uint16_t.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] addr  String buffer to write IP address to, or NULL.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] addr_len  Size of \a addr.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] port  Pointer to uint16_t to write the port number to, or NULL.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] sa  Sockaddr to convert.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns the required string buffer size, like osmo_strlcpy(), or 0 if \a addr is NULL.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+size_t osmo_sockaddr_to_str_and_uint(char *addr, size_t addr_len, uint16_t *port,</span><br><span style="color: hsl(120, 100%, 40%);">+                               const struct sockaddr *sa)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    const struct sockaddr_in *sin = (const struct sockaddr_in *)sa;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (port)</span><br><span style="color: hsl(120, 100%, 40%);">+             *port = ntohs(sin->sin_port);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (addr)</span><br><span style="color: hsl(120, 100%, 40%);">+             return osmo_strlcpy(addr, inet_ntoa(sin->sin_addr), addr_len);</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> /*! Initialize a unix domain socket (including bind/connect)</span><br><span>  *  \param[in] type Socket type like SOCK_DGRAM, SOCK_STREAM</span><br><span>  *  \param[in] proto Protocol like IPPROTO_TCP, IPPROTO_UDP</span><br><span>diff --git a/tests/utils/utils_test.c b/tests/utils/utils_test.c</span><br><span>index 84964f5..1b49ca7 100644</span><br><span>--- a/tests/utils/utils_test.c</span><br><span>+++ b/tests/utils/utils_test.c</span><br><span>@@ -24,10 +24,13 @@</span><br><span> </span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/socket.h></span><br><span> </span><br><span> #include <stdio.h></span><br><span> #include <ctype.h></span><br><span> #include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arpa/inet.h></span><br><span> </span><br><span> static void hexdump_test(void)</span><br><span> {</span><br><span>@@ -446,6 +449,117 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_sockaddr_to_str_and_uint_test_case {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t port;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool omit_port;</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *addr;</span><br><span style="color: hsl(120, 100%, 40%);">+     size_t addr_len;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool omit_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+       size_t expect_rc;</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *expect_returned_addr;</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%);">+struct osmo_sockaddr_to_str_and_uint_test_case osmo_sockaddr_to_str_and_uint_test_data[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+             .port = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .addr = "0.0.0.0",</span><br><span style="color: hsl(120, 100%, 40%);">+          .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_rc = 7,</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%);">+             .port = 65535,</span><br><span style="color: hsl(120, 100%, 40%);">+                .addr = "255.255.255.255",</span><br><span style="color: hsl(120, 100%, 40%);">+          .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_rc = 15,</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%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "234.23.42.123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_rc = 13,</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%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "234.23.42.123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .addr_len = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_rc = 13,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_returned_addr = "234.23.42",</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%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .omit_port = true,</span><br><span style="color: hsl(120, 100%, 40%);">+            .addr = "234.23.42.123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .addr_len = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_rc = 13,</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%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "234.23.42.123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .omit_addr = true,</span><br><span style="color: hsl(120, 100%, 40%);">+            .expect_rc = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_returned_addr = "",</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%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "234.23.42.123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .addr_len = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_rc = 13,</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_returned_addr = "",</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%);">+             .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .addr = "234.23.42.123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .omit_port = true,</span><br><span style="color: hsl(120, 100%, 40%);">+            .omit_addr = true,</span><br><span style="color: hsl(120, 100%, 40%);">+            .expect_rc = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_returned_addr = "",</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 osmo_sockaddr_to_str_and_uint_test(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        printf("\n%s\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < ARRAY_SIZE(osmo_sockaddr_to_str_and_uint_test_data); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                struct osmo_sockaddr_to_str_and_uint_test_case *t =</span><br><span style="color: hsl(120, 100%, 40%);">+                   &osmo_sockaddr_to_str_and_uint_test_data[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            struct sockaddr_in sin = {</span><br><span style="color: hsl(120, 100%, 40%);">+                    .sin_family = AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                        .sin_port = htons(t->port),</span><br><span style="color: hsl(120, 100%, 40%);">+                };</span><br><span style="color: hsl(120, 100%, 40%);">+            inet_aton(t->addr, &sin.sin_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           char addr[20] = {};</span><br><span style="color: hsl(120, 100%, 40%);">+           uint16_t port = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            size_t rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = osmo_sockaddr_to_str_and_uint(</span><br><span style="color: hsl(120, 100%, 40%);">+                   t->omit_addr? NULL : addr, t->addr_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                 t->omit_port? NULL : &port,</span><br><span style="color: hsl(120, 100%, 40%);">+                    (const struct sockaddr*)&sin);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("[%d] %s:%u%s%s addr_len=%zu --> %s:%u rc=%zu\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                i,</span><br><span style="color: hsl(120, 100%, 40%);">+                    t->addr ? : "-",</span><br><span style="color: hsl(120, 100%, 40%);">+                 t->port,</span><br><span style="color: hsl(120, 100%, 40%);">+                   t->omit_addr ? " (omit addr)" : "",</span><br><span style="color: hsl(120, 100%, 40%);">+                    t->omit_port ? " (omit port)" : "",</span><br><span style="color: hsl(120, 100%, 40%);">+                    t->addr_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                       addr, port, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (rc != t->expect_rc)</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("ERROR: Expected rc = %zu\n", t->expect_rc);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!t->expect_returned_addr)</span><br><span style="color: hsl(120, 100%, 40%);">+                      t->expect_returned_addr = t->addr;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (strcmp(t->expect_returned_addr, addr))</span><br><span style="color: hsl(120, 100%, 40%);">+                 printf("ERROR: Expected addr = '%s'\n", t->expect_returned_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!t->omit_port && port != t->port)</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("ERROR: Expected port = %u\n", t->port);</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> int main(int argc, char **argv)</span><br><span> {</span><br><span>       static const struct log_info log_info = {};</span><br><span>@@ -459,5 +573,6 @@</span><br><span>    str_escape_test();</span><br><span>   str_quote_test();</span><br><span>    isqrt_test();</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_sockaddr_to_str_and_uint_test();</span><br><span>        return 0;</span><br><span> }</span><br><span>diff --git a/tests/utils/utils_test.ok b/tests/utils/utils_test.ok</span><br><span>index ea9216f..b158bf7 100644</span><br><span>--- a/tests/utils/utils_test.ok</span><br><span>+++ b/tests/utils/utils_test.ok</span><br><span>@@ -139,3 +139,13 @@</span><br><span> 'NULL'</span><br><span> </span><br><span> Testing integer square-root</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_sockaddr_to_str_and_uint_test</span><br><span style="color: hsl(120, 100%, 40%);">+[0] 0.0.0.0:0 addr_len=20 --> 0.0.0.0:0 rc=7</span><br><span style="color: hsl(120, 100%, 40%);">+[1] 255.255.255.255:65535 addr_len=20 --> 255.255.255.255:65535 rc=15</span><br><span style="color: hsl(120, 100%, 40%);">+[2] 234.23.42.123:1234 addr_len=20 --> 234.23.42.123:1234 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[3] 234.23.42.123:1234 addr_len=10 --> 234.23.42:1234 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[4] 234.23.42.123:1234 (omit port) addr_len=20 --> 234.23.42.123:0 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[5] 234.23.42.123:1234 (omit addr) addr_len=0 --> :1234 rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+[6] 234.23.42.123:1234 addr_len=0 --> :1234 rc=13</span><br><span style="color: hsl(120, 100%, 40%);">+[7] 234.23.42.123:1234 (omit addr) (omit port) addr_len=0 --> :0 rc=0</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10068">change 10068</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/10068"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I1f2918418c38918c5ac70acaa51a47adfca12b5e </div>
<div style="display:none"> Gerrit-Change-Number: 10068 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>