Change in libosmocore[master]: add osmo_sockaddr_str_is_nonzero()

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

neels gerrit-no-reply at lists.osmocom.org
Wed Oct 23 01:42:08 UTC 2019


neels has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/15835 )


Change subject: add osmo_sockaddr_str_is_nonzero()
......................................................................

add osmo_sockaddr_str_is_nonzero()

Often, an IP address of 0.0.0.0 is considered an unset value (for clients
requiring a server address; not for listening on "any").

osmo_sockaddr_str_is_set() does return false when the port is 0, but there is
no simple way to tell whether the IP address is actually set to a server
address.

Add osmo_sockaddr_str_is_nonzero() to return false if:
- the port is zero, or
- the IP address is zero (0.0.0.0 or ::0), or
- the IP address cannot be parsed.

Change-Id: I73cbcab90cffcdc9a5f8d5281c57c1f87b2c3550
---
M include/osmocom/core/sockaddr_str.h
M src/sockaddr_str.c
M tests/sockaddr_str/sockaddr_str_test.c
M tests/sockaddr_str/sockaddr_str_test.ok
4 files changed, 87 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/35/15835/1

diff --git a/include/osmocom/core/sockaddr_str.h b/include/osmocom/core/sockaddr_str.h
index d16dc86..d47b2a4 100644
--- a/include/osmocom/core/sockaddr_str.h
+++ b/include/osmocom/core/sockaddr_str.h
@@ -65,6 +65,7 @@
 #define OSMO_SOCKADDR_STR_FMT_ARGS(R) ((R)? (R)->ip : "NULL"), ((R)? (R)->port : 0)
 
 bool osmo_sockaddr_str_is_set(const struct osmo_sockaddr_str *sockaddr_str);
+bool osmo_sockaddr_str_is_nonzero(const struct osmo_sockaddr_str *sockaddr_str);
 
 int osmo_sockaddr_str_from_str(struct osmo_sockaddr_str *sockaddr_str, const char *ip, uint16_t port);
 
diff --git a/src/sockaddr_str.c b/src/sockaddr_str.c
index d683c7d..f523050 100644
--- a/src/sockaddr_str.c
+++ b/src/sockaddr_str.c
@@ -66,6 +66,35 @@
 		&& (sockaddr_str->af == AF_INET || sockaddr_str->af == AF_INET6);
 }
 
+/*! Return true if IP and port are valid and nonzero.
+ * \param[in] sockaddr_str  The instance to examine.
+ * \return True iff ip can be converted to a nonzero IP address, and port is not 0.
+ */
+bool osmo_sockaddr_str_is_nonzero(const struct osmo_sockaddr_str *sockaddr_str)
+{
+	uint32_t ipv4;
+	struct in6_addr ipv6_zero = {};
+	struct in6_addr ipv6;
+
+	if (!osmo_sockaddr_str_is_set(sockaddr_str))
+		return false;
+
+	switch (sockaddr_str->af) {
+	case AF_INET:
+		if (osmo_sockaddr_str_to_32(sockaddr_str, &ipv4))
+			return false;
+		return ipv4 != 0;
+
+	case AF_INET6:
+		if (osmo_sockaddr_str_to_in6_addr(sockaddr_str, &ipv6))
+			return false;
+		return memcmp(&ipv6, &ipv6_zero, sizeof(ipv6)) != 0;
+
+	default:
+		return false;
+	}
+}
+
 /*! Distinguish between valid IPv4 and IPv6 strings.
  * This does not verify whether the string is a valid IP address; it assumes that the input is a valid IP address, and
  * on that premise returns whether it is an IPv4 or IPv6 string, by looking for '.' and ':' characters.  It is safe to
diff --git a/tests/sockaddr_str/sockaddr_str_test.c b/tests/sockaddr_str/sockaddr_str_test.c
index d2e7944..4284387 100644
--- a/tests/sockaddr_str/sockaddr_str_test.c
+++ b/tests/sockaddr_str/sockaddr_str_test.c
@@ -53,6 +53,8 @@
 	{ .af = AF_INET, .ip = "1.2.3.4", .port = 0 },
 	{ .af = AF_INET, .ip = "1.2.3:4:5", .port = 0 },
 	{ .af = AF_INET6, .ip = "::1:10.9.8.7", .port = 1 },
+	{ .af = AF_INET, .ip = "0.0.0.0", .port = 5 },
+	{ .af = AF_INET6, .ip = "::", .port = 5 },
 };
 
 const char *af_name(int af)
@@ -106,6 +108,7 @@
 		dump_oip(x);
 
 		printf("  osmo_sockaddr_str_is_set() = %s\n", osmo_sockaddr_str_is_set(x) ? "true" : "false");
+		printf("  osmo_sockaddr_str_is_nonzero() = %s\n", osmo_sockaddr_str_is_nonzero(x) ? "true" : "false");
 
 		{
 			struct in_addr a = {};
diff --git a/tests/sockaddr_str/sockaddr_str_test.ok b/tests/sockaddr_str/sockaddr_str_test.ok
index d69314d..781e9d1 100644
--- a/tests/sockaddr_str/sockaddr_str_test.ok
+++ b/tests/sockaddr_str/sockaddr_str_test.ok
@@ -2,6 +2,7 @@
 
 { .af = AF_INET, .ip = "1.2.3.4", .port = 5 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = true
   osmo_sockaddr_str_to_in_addr() rc == 0 in_addr=01020304
    -> osmo_sockaddr_str_from_in_addr() rc == 0 { .af = AF_INET, .ip = "1.2.3.4", .port = 5 }
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
@@ -19,6 +20,7 @@
 
 { .af = AF_INET, .ip = "0.0.0.0", .port = 0 }
   osmo_sockaddr_str_is_set() = false
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc == 0 in_addr=00000000
    -> osmo_sockaddr_str_from_in_addr() rc == 0 { .af = AF_INET, .ip = "0.0.0.0", .port = 0 }
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
@@ -36,6 +38,7 @@
 
 { .af = AF_INET, .ip = "255.255.255.255", .port = 65535 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = true
   osmo_sockaddr_str_to_in_addr() rc == 0 in_addr=ffffffff
    -> osmo_sockaddr_str_from_in_addr() rc == 0 { .af = AF_INET, .ip = "255.255.255.255", .port = 65535 }
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
@@ -53,6 +56,7 @@
 
 { .af = AF_INET, .ip = "0.0.0.256", .port = 1 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -65,6 +69,7 @@
 
 { .af = AF_INET, .ip = "not an ip address", .port = 1 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -77,6 +82,7 @@
 
 { .af = AF_INET6, .ip = "1:2:3::4", .port = 5 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = true
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc == 0 in6_addr=00010002000300000000000000000004
    -> osmo_sockaddr_str_from_in6_addr() rc == 0 { .af = AF_INET6, .ip = "1:2:3::4", .port = 5 }
@@ -92,6 +98,7 @@
 
 { .af = AF_INET6, .ip = "::", .port = 0 }
   osmo_sockaddr_str_is_set() = false
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc == 0 in6_addr=00000000000000000000000000000000
    -> osmo_sockaddr_str_from_in6_addr() rc == 0 { .af = AF_INET6, .ip = "::", .port = 0 }
@@ -107,6 +114,7 @@
 
 { .af = AF_INET6, .ip = "::1", .port = 0 }
   osmo_sockaddr_str_is_set() = false
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc == 0 in6_addr=00000000000000000000000000000001
    -> osmo_sockaddr_str_from_in6_addr() rc == 0 { .af = AF_INET6, .ip = "::1", .port = 0 }
@@ -122,6 +130,7 @@
 
 { .af = AF_INET6, .ip = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", .port = 65535 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = true
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc == 0 in6_addr=ffffffffffffffffffffffffffffffff
    -> osmo_sockaddr_str_from_in6_addr() rc == 0 { .af = AF_INET6, .ip = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", .port = 65535 }
@@ -137,6 +146,7 @@
 
 { .af = AF_INET6, .ip = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", .port = 65535 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = true
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc == 0 in6_addr=ffffffffffffffffffffffffffffffff
    -> osmo_sockaddr_str_from_in6_addr() rc == 0 { .af = AF_INET6, .ip = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", .port = 65535 }
@@ -155,6 +165,7 @@
 
 { .af = AF_INET6, .ip = "::fffff", .port = 1 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -167,6 +178,7 @@
 
 { .af = AF_INET6, .ip = "not an ip address", .port = 1 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -179,6 +191,7 @@
 
 { .af = AF_INET6, .ip = "1.2.3.4", .port = 5 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -192,6 +205,7 @@
 
 { .af = AF_INET, .ip = "1:2:3::4", .port = 5 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -205,6 +219,7 @@
 
 { .af = AF_UNSPEC, .ip = "1.2.3.4", .port = 5 }
   osmo_sockaddr_str_is_set() = false
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -218,6 +233,7 @@
 
 { .af = AF_INET, .ip = "", .port = 5 }
   osmo_sockaddr_str_is_set() = false
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -230,6 +246,7 @@
 
 { .af = AF_INET6, .ip = "", .port = 5 }
   osmo_sockaddr_str_is_set() = false
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -242,6 +259,7 @@
 
 { .af = AF_INET, .ip = "1.2.3.4", .port = 0 }
   osmo_sockaddr_str_is_set() = false
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc == 0 in_addr=01020304
    -> osmo_sockaddr_str_from_in_addr() rc == 0 { .af = AF_INET, .ip = "1.2.3.4", .port = 0 }
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
@@ -259,6 +277,7 @@
 
 { .af = AF_INET, .ip = "1.2.3:4:5", .port = 0 }
   osmo_sockaddr_str_is_set() = false
+  osmo_sockaddr_str_is_nonzero() = false
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
   osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
@@ -272,6 +291,7 @@
 
 { .af = AF_INET6, .ip = "::1:10.9.8.7", .port = 1 }
   osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = true
   osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
   osmo_sockaddr_str_to_in6_addr() rc == 0 in6_addr=0000000000000000000000010a090807
    -> osmo_sockaddr_str_from_in6_addr() rc == 0 { .af = AF_INET6, .ip = "::1:a09:807", .port = 1 }
@@ -286,3 +306,37 @@
    -> osmo_sockaddr_str_from_sockaddr() rc == 0 { .af = AF_INET6, .ip = "::1:a09:807", .port = 1 }
       DIFFERS!
   osmo_sockaddr_str_from_str() rc == 0 { .af = AF_INET6, .ip = "::1:10.9.8.7", .port = 1 }
+
+
+{ .af = AF_INET, .ip = "0.0.0.0", .port = 5 }
+  osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = false
+  osmo_sockaddr_str_to_in_addr() rc == 0 in_addr=00000000
+   -> osmo_sockaddr_str_from_in_addr() rc == 0 { .af = AF_INET, .ip = "0.0.0.0", .port = 5 }
+  osmo_sockaddr_str_to_in6_addr() rc < 0 in6_addr=00000000000000000000000000000000
+  osmo_sockaddr_str_to_32() rc == 0 uint32_t=0x0
+   -> osmo_sockaddr_str_from_32() rc == 0 { .af = AF_INET, .ip = "0.0.0.0", .port = 5 }
+  osmo_sockaddr_str_to_32n() rc == 0 uint32_t=0x0
+   -> osmo_sockaddr_str_from_32n() rc == 0 { .af = AF_INET, .ip = "0.0.0.0", .port = 5 }
+  osmo_sockaddr_str_to_sockaddr_in() rc == 0 sockaddr_in=02000005000000000000000000000000
+   -> osmo_sockaddr_str_from_sockaddr_in() rc == 0 { .af = AF_INET, .ip = "0.0.0.0", .port = 5 }
+  osmo_sockaddr_str_to_sockaddr_in6() rc < 0 sockaddr_in6=00000000000000000000000000000000000000000000000000000000
+  osmo_sockaddr_str_to_sockaddr() rc == 0 sockaddr_storage=0200000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+   -> osmo_sockaddr_str_from_sockaddr() rc == 0 { .af = AF_INET, .ip = "0.0.0.0", .port = 5 }
+  osmo_sockaddr_str_from_str() rc == 0 { .af = AF_INET, .ip = "0.0.0.0", .port = 5 }
+
+
+{ .af = AF_INET6, .ip = "::", .port = 5 }
+  osmo_sockaddr_str_is_set() = true
+  osmo_sockaddr_str_is_nonzero() = false
+  osmo_sockaddr_str_to_in_addr() rc < 0 in_addr=00000000
+  osmo_sockaddr_str_to_in6_addr() rc == 0 in6_addr=00000000000000000000000000000000
+   -> osmo_sockaddr_str_from_in6_addr() rc == 0 { .af = AF_INET6, .ip = "::", .port = 5 }
+  osmo_sockaddr_str_to_32() rc < 0 uint32_t=0x0
+  osmo_sockaddr_str_to_32n() rc < 0 uint32_t=0x0
+  osmo_sockaddr_str_to_sockaddr_in() rc < 0 sockaddr_in=00000000000000000000000000000000
+  osmo_sockaddr_str_to_sockaddr_in6() rc == 0 sockaddr_in6=0a000005000000000000000000000000000000000000000000000000
+   -> osmo_sockaddr_str_from_sockaddr_in6() rc == 0 { .af = AF_INET6, .ip = "::", .port = 5 }
+  osmo_sockaddr_str_to_sockaddr() rc == 0 sockaddr_storage=0a00000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+   -> osmo_sockaddr_str_from_sockaddr() rc == 0 { .af = AF_INET6, .ip = "::", .port = 5 }
+  osmo_sockaddr_str_from_str() rc == 0 { .af = AF_INET6, .ip = "::", .port = 5 }

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/15835
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I73cbcab90cffcdc9a5f8d5281c57c1f87b2c3550
Gerrit-Change-Number: 15835
Gerrit-PatchSet: 1
Gerrit-Owner: neels <nhofmeyr at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20191023/12c7909d/attachment.htm>


More information about the gerrit-log mailing list