From: Lennart Poettering Date: Wed, 18 Nov 2020 09:25:27 +0000 (+0100) Subject: socket-util: add sockaddr_in_addr() helper X-Git-Tag: v248-rc1~597^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3132597182c806e5193aebb0b67cdc0f73154a51;p=thirdparty%2Fsystemd.git socket-util: add sockaddr_in_addr() helper This extracts the IP address (as union in_addr_union) from a socket address (i.e. a struct sockaddr). --- diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 48d0718d5d3..63ab53b8fc1 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -320,7 +320,7 @@ bool socket_address_matches_fd(const SocketAddress *a, int fd) { } int sockaddr_port(const struct sockaddr *_sa, unsigned *ret_port) { - union sockaddr_union *sa = (union sockaddr_union*) _sa; + const union sockaddr_union *sa = (const union sockaddr_union*) _sa; /* Note, this returns the port as 'unsigned' rather than 'uint16_t', as AF_VSOCK knows larger ports */ @@ -345,6 +345,25 @@ int sockaddr_port(const struct sockaddr *_sa, unsigned *ret_port) { } } +const union in_addr_union *sockaddr_in_addr(const struct sockaddr *_sa) { + const union sockaddr_union *sa = (const union sockaddr_union*) _sa; + + if (!sa) + return NULL; + + switch (sa->sa.sa_family) { + + case AF_INET: + return (const union in_addr_union*) &sa->in.sin_addr; + + case AF_INET6: + return (const union in_addr_union*) &sa->in6.sin6_addr; + + default: + return NULL; + } +} + int sockaddr_pretty( const struct sockaddr *_sa, socklen_t salen, diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index 9f7928040dc..923898a3fc4 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -102,6 +102,7 @@ const char* socket_address_get_path(const SocketAddress *a); bool socket_ipv6_is_supported(void); int sockaddr_port(const struct sockaddr *_sa, unsigned *port); +const union in_addr_union *sockaddr_in_addr(const struct sockaddr *sa); int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret); int getpeername_pretty(int fd, bool include_port, char **ret);