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
diff --git a/src/core/libosmocore.map b/src/core/libosmocore.map
index ae8a068..3d6aa42 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