]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
socket-util: introduce port argument in sockaddr_port()
authorStefan Hajnoczi <stefanha@redhat.com>
Tue, 20 Dec 2016 14:10:54 +0000 (14:10 +0000)
committerStefan Hajnoczi <stefanha@redhat.com>
Tue, 10 Jan 2017 15:29:04 +0000 (15:29 +0000)
sockaddr_port() either returns a >= 0 port number or a negative errno.
This works for AF_INET and AF_INET6 because port ranges are only 16-bit.

In AF_VSOCK ports are 32-bit so an int cannot represent all port number
and negative errnos.  Separate the port and the return code.

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

index 4ebf10610902aa472e668cd417a2890c2ab5e1f2..16f9bbc9401943180c8c34c5d704a6d2f2a85f13 100644 (file)
@@ -480,7 +480,7 @@ bool socket_address_matches_fd(const SocketAddress *a, int fd) {
         return socket_address_equal(a, &b);
 }
 
-int sockaddr_port(const struct sockaddr *_sa) {
+int sockaddr_port(const struct sockaddr *_sa, unsigned *port) {
         union sockaddr_union *sa = (union sockaddr_union*) _sa;
 
         assert(sa);
@@ -488,7 +488,8 @@ int sockaddr_port(const struct sockaddr *_sa) {
         if (!IN_SET(sa->sa.sa_family, AF_INET, AF_INET6))
                 return -EAFNOSUPPORT;
 
-        return be16toh(sa->sa.sa_family == AF_INET6 ? sa->in6.sin6_port : sa->in.sin_port);
+        *port = be16toh(sa->sa.sa_family == AF_INET6 ? sa->in6.sin6_port : sa->in.sin_port);
+        return 0;
 }
 
 int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret) {
index 2ef572badb51ee644b68082447f4480c3161769b..482055fafa3e5909312e2be417759dcea126d345 100644 (file)
@@ -100,7 +100,7 @@ const char* socket_address_get_path(const SocketAddress *a);
 
 bool socket_ipv6_is_supported(void);
 
-int sockaddr_port(const struct sockaddr *_sa) _pure_;
+int sockaddr_port(const struct sockaddr *_sa, unsigned *port) _pure_;
 
 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);
index 73a8104d170c15d9895fd4476b29106a05b503ca..dc7b685cd3a09418bb9d44bc011f603fbd75c9ce 100644 (file)
@@ -1295,7 +1295,7 @@ static int service_spawn(
                 if (r == 0 && IN_SET(sa.sa.sa_family, AF_INET, AF_INET6)) {
                         _cleanup_free_ char *addr = NULL;
                         char *t;
-                        int port;
+                        unsigned port;
 
                         r = sockaddr_pretty(&sa.sa, salen, true, false, &addr);
                         if (r < 0)
@@ -1306,9 +1306,9 @@ static int service_spawn(
                                 return -ENOMEM;
                         our_env[n_env++] = t;
 
-                        port = sockaddr_port(&sa.sa);
-                        if (port < 0)
-                                return port;
+                        r = sockaddr_port(&sa.sa, &port);
+                        if (r < 0)
+                                return r;
 
                         if (asprintf(&t, "REMOTE_PORT=%u", port) < 0)
                                 return -ENOMEM;