From 9151b5886c833a533ccad0f05bfe76af33ab67a8 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Tue, 20 Dec 2016 14:10:54 +0000 Subject: [PATCH] socket-util: introduce port argument in sockaddr_port() 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 | 5 +++-- src/basic/socket-util.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 1d43a48ae..151586479 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -481,7 +481,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); @@ -489,7 +489,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) { diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index 718de9ba3..b17c14189 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -103,7 +103,7 @@ const char* socket_address_get_path(const SocketAddress *a); bool socket_ipv6_is_supported(void); #if 0 /// UNNEEDED by elogind -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); -- 2.30.2