pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/29586 )
Change subject: socket: Introduce API osmo_sockaddr_is_any ......................................................................
socket: Introduce API osmo_sockaddr_is_any
Change-Id: I2810a889fc14052d0e0be6a2b500ad4e5088ffa9 --- M TODO-RELEASE M include/osmocom/core/socket.h M src/socket.c 3 files changed, 22 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/86/29586/1
diff --git a/TODO-RELEASE b/TODO-RELEASE index 8ccfa49..436d417 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -7,3 +7,4 @@ # If any interfaces have been added since the last public release: c:r:a + 1. # If any interfaces have been removed or changed since the last public release: c:r:0. #library what description / commit summary line +libosmocore new API osmo_sockaddr_is_any() \ No newline at end of file diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index 79de6c5..a1c83f3 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -31,6 +31,7 @@ };
int osmo_sockaddr_is_local(struct sockaddr *addr, unsigned int addrlen); +int osmo_sockaddr_is_any(struct osmo_sockaddr *addr);
unsigned int osmo_sockaddr_to_str_and_uint(char *addr, unsigned int addr_len, uint16_t *port, const struct sockaddr *sa); diff --git a/src/socket.c b/src/socket.c index 4605db4..9777d47 100644 --- a/src/socket.c +++ b/src/socket.c @@ -1175,6 +1175,26 @@ return 0; }
+/*! Determine if the given address is an ANY address ("0.0.0.0", "::"). Port is not checked. + * \param[in] addr Socket Address + * \param[in] addrlen Length of socket address in bytes + * \returns 1 if address is local, 0 otherwise. -1 is address family not supported/detected. + */ +int osmo_sockaddr_is_any(struct osmo_sockaddr *addr) +{ + switch (addr->u.sa.sa_family) { + case AF_INET6: { + struct in6_addr ip6_any = IN6ADDR_ANY_INIT; + return memcmp(&addr->u.sin6.sin6_addr, + &ip6_any, sizeof(ip6_any)) == 0; + } + case AF_INET: + return addr->u.sin.sin_addr.s_addr == 0; + default: + return -1; + } +} + /*! Convert sockaddr_in to IP address as char string and port as uint16_t. * \param[out] addr String buffer to write IP address to, or NULL. * \param[out] addr_len Size of \a addr.