mirror of
https://github.com/morgan9e/systemd
synced 2026-04-16 01:16:10 +09:00
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.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user