laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/35085?usp=email )
Change subject: add new osmo_sockaddr_from_str_and_uint() function ...................................................................... add new osmo_sockaddr_from_str_and_uint() function The function is basically a shortcut for getaddrinfo with storing the output data into our 'struct osmo_sockaddr'. Change-Id: I6b5c0bf8ca97e6358d992fb2ff45ffd53ba15197 Related: SYS#6657 --- M include/osmocom/core/socket.h M src/core/libosmocore.map M src/core/socket.c M tests/socket/socket_test.c M tests/socket/socket_test.ok 5 files changed, 52 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/85/35085/1 diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index db55863..03f1d39 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -74,6 +74,7 @@ int osmo_sockaddr_to_octets(uint8_t *dst, size_t dst_maxlen, const struct osmo_sockaddr *os); int osmo_sockaddr_from_octets(struct osmo_sockaddr *os, const void *src, size_t src_len); +int osmo_sockaddr_from_str_and_uint(struct osmo_sockaddr *osa_out, const char *ipstr, uint16_t port); int osmo_sockaddr_netmask_to_prefixlen(const struct osmo_sockaddr *addr); diff --git a/src/core/libosmocore.map b/src/core/libosmocore.map index e5f8bd8..7f8fbfd 100644 --- a/src/core/libosmocore.map +++ b/src/core/libosmocore.map @@ -374,6 +374,7 @@ osmo_signal_unregister_handler; osmo_sockaddr_cmp; osmo_sockaddr_from_octets; +osmo_sockaddr_from_str_and_uint; osmo_sockaddr_in_to_str_and_uint; osmo_sockaddr_is_any; osmo_sockaddr_is_local; diff --git a/src/core/socket.c b/src/core/socket.c index fa5fb88..1dc8e46 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -1662,6 +1662,27 @@ } } +/*! Convert an IP address string (and port number) into a 'struct osmo_sockaddr'. + * \param[out] osa_out caller-allocated osmo_sockaddr storage + * \param[in] ipstr IP[v4,v6] address in string format + * \param[in] port port number (host byte order) + * \returns 0 on success; negative on error. */ +int osmo_sockaddr_from_str_and_uint(struct osmo_sockaddr *osa_out, const char *ipstr, uint16_t port) +{ + struct addrinfo *ai = addrinfo_helper(AF_UNSPEC, 0, 0, ipstr, port, true); + + if (!ai) + return -EIO; + + if (ai->ai_addrlen > sizeof(*osa_out)) + return -ENOSPC; + + memcpy(&osa_out->u.sa, ai->ai_addr, ai->ai_addrlen); + freeaddrinfo(ai); + + return 0; +} + /*! Initialize a unix domain socket (including bind/connect) * \param[in] type Socket type like SOCK_DGRAM, SOCK_STREAM * \param[in] proto Protocol like IPPROTO_TCP, IPPROTO_UDP diff --git a/tests/socket/socket_test.c b/tests/socket/socket_test.c index ddb6926..34130b2 100644 --- a/tests/socket/socket_test.c +++ b/tests/socket/socket_test.c @@ -315,6 +315,7 @@ const char *result; struct osmo_sockaddr localhost4 = {}; struct osmo_sockaddr localhost6 = {}; + struct osmo_sockaddr osa = {}; localhost4.u.sin = (struct sockaddr_in){ .sin_family = AF_INET, @@ -383,6 +384,18 @@ result = osmo_sockaddr_to_str(&localhost6); printf("Checking osmo_sockaddr_to_str_buf long IPv6 port static buffer\n"); OSMO_ASSERT(!strncmp("[2003:1234:5678:90ab:cdef:1234:4321:4321]:23420", result, sizeof(buf))); + + printf("Checking osmo_sockaddr_from_str_and_uint for 0.0.0.0\n"); + OSMO_ASSERT(osmo_sockaddr_from_str_and_uint(&osa, "0.0.0.0", 1234) == 0); + OSMO_ASSERT(osmo_sockaddr_is_any(&osa)); + + printf("Checking osmo_sockaddr_from_str_and_uint for ::\n"); + OSMO_ASSERT(osmo_sockaddr_from_str_and_uint(&osa, "::", 1234) == 0); + OSMO_ASSERT(osmo_sockaddr_is_any(&osa)); + + printf("Checking osmo_sockaddr_from_str_and_uint for 1.2.3.4\n"); + OSMO_ASSERT(osmo_sockaddr_from_str_and_uint(&osa, "1.2.3.4", 1234) == 0); + OSMO_ASSERT(!osmo_sockaddr_is_any(&osa)); } static void test_osa_netmask_prefixlen(void) diff --git a/tests/socket/socket_test.ok b/tests/socket/socket_test.ok index 236c011..2b1c100 100644 --- a/tests/socket/socket_test.ok +++ b/tests/socket/socket_test.ok @@ -31,3 +31,6 @@ Checking osmo_sockaddr_to_str_buf long IPv6 Checking osmo_sockaddr_to_str_buf long IPv6 port Checking osmo_sockaddr_to_str_buf long IPv6 port static buffer +Checking osmo_sockaddr_from_str_and_uint for 0.0.0.0 +Checking osmo_sockaddr_from_str_and_uint for :: +Checking osmo_sockaddr_from_str_and_uint for 1.2.3.4 -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35085?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I6b5c0bf8ca97e6358d992fb2ff45ffd53ba15197 Gerrit-Change-Number: 35085 Gerrit-PatchSet: 1 Gerrit-Owner: laforge <lafo...@osmocom.org> Gerrit-MessageType: newchange