aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/core/sockaddr_str.h1
-rw-r--r--src/sockaddr_str.c33
2 files changed, 27 insertions, 7 deletions
diff --git a/include/osmocom/core/sockaddr_str.h b/include/osmocom/core/sockaddr_str.h
index e42216a4..d96b7434 100644
--- a/include/osmocom/core/sockaddr_str.h
+++ b/include/osmocom/core/sockaddr_str.h
@@ -74,6 +74,7 @@ bool osmo_sockaddr_str_is_nonzero(const struct osmo_sockaddr_str *sockaddr_str);
int osmo_sockaddr_str_cmp(const struct osmo_sockaddr_str *a, const struct osmo_sockaddr_str *b);
int osmo_sockaddr_str_from_str(struct osmo_sockaddr_str *sockaddr_str, const char *ip, uint16_t port);
+int osmo_sockaddr_str_from_str2(struct osmo_sockaddr_str *sockaddr_str, const char *ip);
int osmo_sockaddr_str_from_in_addr(struct osmo_sockaddr_str *sockaddr_str, const struct in_addr *addr, uint16_t port);
int osmo_sockaddr_str_from_in6_addr(struct osmo_sockaddr_str *sockaddr_str, const struct in6_addr *addr, uint16_t port);
diff --git a/src/sockaddr_str.c b/src/sockaddr_str.c
index c38a05cb..f5508a03 100644
--- a/src/sockaddr_str.c
+++ b/src/sockaddr_str.c
@@ -188,25 +188,24 @@ int osmo_ip_str_type(const char *ip)
return AF_UNSPEC;
}
-/*! Safely copy the given ip string to sockaddr_str, classify to AF_INET or AF_INET6, and set the port.
+/*! Safely copy the given ip string to sockaddr_str, classify to AF_INET or AF_INET6.
* Data will be written to sockaddr_str even if an error is returned.
* \param[out] sockaddr_str The instance to copy to.
* \param[in] ip Valid IP address string.
- * \param[in] port Port number.
* \return 0 on success, negative if copying the address string failed (e.g. too long), if the address family could
* not be detected (i.e. if osmo_ip_str_type() returned AF_UNSPEC), or if sockaddr_str is NULL.
*/
-int osmo_sockaddr_str_from_str(struct osmo_sockaddr_str *sockaddr_str, const char *ip, uint16_t port)
+int osmo_sockaddr_str_from_str2(struct osmo_sockaddr_str *sockaddr_str, const char *ip)
{
int rc;
if (!sockaddr_str)
return -ENOSPC;
if (!ip)
ip = "";
- *sockaddr_str = (struct osmo_sockaddr_str){
- .af = osmo_ip_str_type(ip),
- .port = port,
- };
+ sockaddr_str->af = osmo_ip_str_type(ip);
+ /* to be compatible with previous behaviour, zero the full IP field.
+ * Allow the usage of memcmp(&sockaddr_str, ...) */
+ memset(sockaddr_str->ip, 0x0, sizeof(sockaddr_str->ip));
rc = osmo_strlcpy(sockaddr_str->ip, ip, sizeof(sockaddr_str->ip));
if (rc <= 0)
return -EIO;
@@ -217,6 +216,26 @@ int osmo_sockaddr_str_from_str(struct osmo_sockaddr_str *sockaddr_str, const cha
return 0;
}
+/*! Safely copy the given ip string to sockaddr_str, classify to AF_INET or AF_INET6, and set the port.
+ * Data will be written to sockaddr_str even if an error is returned.
+ * \param[out] sockaddr_str The instance to copy to.
+ * \param[in] ip Valid IP address string.
+ * \param[in] port Port number.
+ * \return 0 on success, negative if copying the address string failed (e.g. too long), if the address family could
+ * not be detected (i.e. if osmo_ip_str_type() returned AF_UNSPEC), or if sockaddr_str is NULL.
+ */
+int osmo_sockaddr_str_from_str(struct osmo_sockaddr_str *sockaddr_str, const char *ip, uint16_t port)
+{
+ int rc;
+ if (!sockaddr_str)
+ return -ENOSPC;
+
+ rc = osmo_sockaddr_str_from_str2(sockaddr_str, ip);
+ sockaddr_str->port = port;
+
+ return rc;
+}
+
/*! Convert IPv4 address to osmo_sockaddr_str, and set port.
* \param[out] sockaddr_str The instance to copy to.
* \param[in] addr IPv4 address data.