]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
socket-util: add sockaddr_in_addr() helper
authorLennart Poettering <lennart@poettering.net>
Wed, 18 Nov 2020 09:25:27 +0000 (10:25 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 2 Dec 2020 14:14:21 +0000 (15:14 +0100)
This extracts the IP address (as union in_addr_union) from a socket
address (i.e. a struct sockaddr).

src/basic/socket-util.c
src/basic/socket-util.h

index 48d0718d5d39199bbd45a5cb39a5834c9773dfae..63ab53b8fc1b87da8966743a0f182c8dd43ed77f 100644 (file)
@@ -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,
index 9f7928040dc13577b71c1129bf82a33ea7be5db5..923898a3fc4ab74d6f36d64a40e0727cd9883f90 100644 (file)
@@ -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);