From 0ef4f1042fb1868c1b68a439a3ca5f2caa9e0607 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Sun, 14 Feb 2021 07:52:51 +0100 Subject: [PATCH] Add a helper function to retrieve port from addrinfo. --- src/net.c | 15 ++++++++++++--- src/net.h | 4 +++- src/rinetd.c | 12 +++++------- src/types.h | 5 +++-- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/net.c b/src/net.c index 85f7878..6688bed 100644 --- a/src/net.c +++ b/src/net.c @@ -1,6 +1,6 @@ /* Copyright © 1997—1999 Thomas Boutell and Boutell.Com, Inc. - © 2003—2017 Sam Hocevar + © 2003—2021 Sam Hocevar This software is released for free use under the terms of the GNU Public License, version 2 or higher. NO WARRANTY @@ -12,8 +12,7 @@ #include "net.h" -void setSocketDefaults(SOCKET fd) -{ +void setSocketDefaults(SOCKET fd) { /* Make socket non-blocking (FIXME: this uses legacy API) */ FIONBIO_ARG_T ioctltmp = 1; #if _WIN32 @@ -33,3 +32,13 @@ void setSocketDefaults(SOCKET fd) #endif } +uint16_t getPort(struct addrinfo* ai) { + switch (ai->ai_family) { + case AF_INET: + return ntohs(((struct sockaddr_in*)ai->ai_addr)->sin_port); + case AF_INET6: + return ntohs(((struct sockaddr_in6*)ai->ai_addr)->sin6_port); + default: + return 0; + } +} diff --git a/src/net.h b/src/net.h index 8eb23ae..c486959 100644 --- a/src/net.h +++ b/src/net.h @@ -24,6 +24,8 @@ # include #endif +#include + #if defined HAVE_ERRNO_H # include #endif @@ -79,4 +81,4 @@ static inline int GetLastError(void) { #endif /* _WIN32 */ void setSocketDefaults(SOCKET fd); - +uint16_t getPort(struct addrinfo* ai); diff --git a/src/rinetd.c b/src/rinetd.c index 472d7ac..3b0fa38 100644 --- a/src/rinetd.c +++ b/src/rinetd.c @@ -80,7 +80,7 @@ int logFormatCommon = 0; FILE *logFile = NULL; char const *logMessages[] = { - "unknown-error", + "unknown-error", "done-local-closed", "done-remote-closed", "accept-failed -", @@ -211,6 +211,7 @@ static void clearConfiguration(void) { } free(srv->fromHost); free(srv->toHost); + freeaddrinfo(srv->fromAddrInfo); } /* Free memory associated with previous set. */ free(seInfo); @@ -296,7 +297,7 @@ void addServer(char *bindAddress, char *bindPort, protocolType bindProto, } int tmp = 1; - setsockopt(si.fd, SOL_SOCKET, SO_REUSEADDR, (const char *) &tmp, sizeof(tmp)); + setsockopt(si.fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&tmp, sizeof(tmp)); if (bind(si.fd, it->ai_addr, it->ai_addrlen) == SOCKET_ERROR) { syslog(LOG_ERR, "couldn't bind to address %s port %s (%m)\n", @@ -320,12 +321,9 @@ void addServer(char *bindAddress, char *bindPort, protocolType bindProto, setSocketDefaults(si.fd); } - si.fromPort = it->ai_addr->sa_family == AF_INET - ? ntohs(((struct sockaddr_in*)it->ai_addr)->sin_port) - : ntohs(((struct sockaddr_in6*)it->ai_addr)->sin6_port); + si.fromAddrInfo = it; break; } - freeaddrinfo(servinfo); if (getAddress(connectAddress, &si.localAddr) < 0) { /* Warn -- don't exit. */ @@ -1006,7 +1004,7 @@ static void logEvent(ConnectionInfo const *cnx, ServerInfo const *srv, int resul uint16_t fromPort = 0, toPort = 0; if (srv != NULL) { fromHost = srv->fromHost; - fromPort = srv->fromPort; + fromPort = getPort(srv->fromAddrInfo); toHost = srv->toHost; toPort = srv->toPort; } diff --git a/src/types.h b/src/types.h index 6b836c7..4152e0d 100644 --- a/src/types.h +++ b/src/types.h @@ -1,6 +1,6 @@ /* Copyright © 1997—1999 Thomas Boutell and Boutell.Com, Inc. - © 2003—2019 Sam Hocevar + © 2003—2021 Sam Hocevar This software is released for free use under the terms of the GNU Public License, version 2 or higher. NO WARRANTY @@ -41,7 +41,8 @@ struct _server_info { /* In ASCII and local byte order, for logging purposes */ char *fromHost, *toHost; - int16_t fromPort, toPort; + struct addrinfo *fromAddrInfo; + int16_t toPort; protocolType fromProto, toProto; /* Offset and count into list of allow and deny rules. Any rules