diff --git a/include/osmocom/core/sockaddr_str.h b/include/osmocom/core/sockaddr_str.h index 6373b5ca9..a67c977e4 100644 --- a/include/osmocom/core/sockaddr_str.h +++ b/include/osmocom/core/sockaddr_str.h @@ -86,6 +86,7 @@ int osmo_sockaddr_str_from_32h(struct osmo_sockaddr_str *sockaddr_str, uint32_t int osmo_sockaddr_str_from_sockaddr_in(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr_in *src); int osmo_sockaddr_str_from_sockaddr_in6(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr_in6 *src); int osmo_sockaddr_str_from_sockaddr(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr_storage *src); +int osmo_sockaddr_str_from_sockaddr2(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr *src); int osmo_sockaddr_str_to_in_addr(const struct osmo_sockaddr_str *sockaddr_str, struct in_addr *dst); int osmo_sockaddr_str_to_in6_addr(const struct osmo_sockaddr_str *sockaddr_str, struct in6_addr *dst); diff --git a/src/sockaddr_str.c b/src/sockaddr_str.c index 9dbf07372..7f44ae1f6 100644 --- a/src/sockaddr_str.c +++ b/src/sockaddr_str.c @@ -370,6 +370,31 @@ int osmo_sockaddr_str_from_sockaddr_in6(struct osmo_sockaddr_str *sockaddr_str, return osmo_sockaddr_str_from_in6_addr(sockaddr_str, &src->sin6_addr, osmo_ntohs(src->sin6_port)); } +/*! 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_sockaddr2(struct osmo_sockaddr_str *sockaddr_str, const struct sockaddr *src) +{ + unsigned guess = (src->sa_family == AF_UNSPEC) ? osmo_sockaddr_guess_unspec(src) : src->sa_family; + + if (!sockaddr_str) + return -ENOSPC; + + if (!src) + return -EINVAL; + + if (guess == AF_INET) + return osmo_sockaddr_str_from_sockaddr_in(sockaddr_str, (const struct sockaddr_in *)src); + if (guess == AF_INET6) + return osmo_sockaddr_str_from_sockaddr_in6(sockaddr_str, (const struct sockaddr_in6 *)src); + + return -ENOTSOCK; +} + + /*! 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.