summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2016-12-20 14:10:54 +0000
committerSven Eden <yamakuzure@gmx.net>2017-07-17 17:58:35 +0200
commit9151b5886c833a533ccad0f05bfe76af33ab67a8 (patch)
tree0a03f68e9c68438a83ddf00dfe7b4d6e37d93b84 /src
parent3fe1519ec24bf096c8389fa66352d97d7d269e12 (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/basic/socket-util.c5
-rw-r--r--src/basic/socket-util.h2
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);