sockaddr_str: add conversion to,from osmo_sockaddr

Add functions to pass struct osmo_sockaddr to the
osmo_sockaddr_str_{to,from}* API directly.

So far the interface to osmo_sockaddr_str_ is:

  osmo_sockaddr_str_from_sockaddr(&my_sa_str, &my_osa->u.sas);

I'm working a lot with osmo_sockaddr at the moment, and the cumulated
time of forgetting to add 'u.sas' and having another compilation cycle
because of those is justifying this additional API.

Change-Id: I0df84b4bb8cb5d8434b735fa3a38e7f95be43e91
diff --git a/src/core/libosmocore.map b/src/core/libosmocore.map
index fb294ba..c5ab6e3 100644
--- a/src/core/libosmocore.map
+++ b/src/core/libosmocore.map
@@ -400,6 +400,7 @@
 osmo_sockaddr_str_from_sockaddr;
 osmo_sockaddr_str_from_sockaddr_in;
 osmo_sockaddr_str_from_sockaddr_in6;
+osmo_sockaddr_str_from_osa;
 osmo_sockaddr_str_from_str;
 osmo_sockaddr_str_from_str2;
 osmo_sockaddr_str_is_nonzero;
@@ -412,6 +413,7 @@
 osmo_sockaddr_str_to_sockaddr;
 osmo_sockaddr_str_to_sockaddr_in;
 osmo_sockaddr_str_to_sockaddr_in6;
+osmo_sockaddr_str_to_osa;
 osmo_sockaddr_to_octets;
 osmo_sockaddr_to_str;
 osmo_sockaddr_to_str_and_uint;
diff --git a/src/core/sockaddr_str.c b/src/core/sockaddr_str.c
index 9f1e897..bea6184 100644
--- a/src/core/sockaddr_str.c
+++ b/src/core/sockaddr_str.c
@@ -33,6 +33,7 @@
 #include <osmocom/core/sockaddr_str.h>
 #include <osmocom/core/utils.h>
 #include <osmocom/core/byteswap.h>
+#include <osmocom/core/socket.h>
 
 /*! \addtogroup sockaddr_str
  *
@@ -359,6 +360,17 @@
 	return -EINVAL;
 }
 
+/*! Convert IPv4 or IPv6 address and port to osmo_sockaddr_str.
+ * \param[out] sockaddr_str  The instance to copy to.
+ * \param[in] src  IPv4 or IPv6 address and port data.
+ * \return 0 on success, negative if src does not indicate AF_INET nor AF_INET6 (or if the conversion fails, which
+ *         should not be possible in practice).
+ */
+int osmo_sockaddr_str_from_osa(struct osmo_sockaddr_str *sockaddr_str, const struct osmo_sockaddr *src)
+{
+	return osmo_sockaddr_str_from_sockaddr(sockaddr_str, &src->u.sas);
+}
+
 /*! Convert osmo_sockaddr_str address string to IPv4 address data.
  * \param[in] sockaddr_str  The instance to convert the IP of.
  * \param[out] dst  IPv4 address data to write to.
@@ -509,5 +521,15 @@
 	}
 }
 
+/*! Convert osmo_sockaddr_str address string and port to IPv4 or IPv6 address and port data.
+ * \param[in] sockaddr_str  The instance to convert the IP and port of.
+ * \param[out] dst  IPv4/IPv6 address and port data to write to.
+ * \return 0 on success, negative on error (e.g. invalid IP address string for the family indicated by sockaddr_str->af).
+ */
+int osmo_sockaddr_str_to_osa(const struct osmo_sockaddr_str *sockaddr_str, struct osmo_sockaddr *dst)
+{
+	return osmo_sockaddr_str_to_sockaddr(sockaddr_str, &dst->u.sas);
+}
+
 /*! @} */
 #endif // HAVE_NETINET_IN_H