Add a helper function to retrieve port from addrinfo.

This commit is contained in:
Sam Hocevar 2021-02-14 07:52:51 +01:00
parent f7cd21f91f
commit 0ef4f1042f
4 changed files with 23 additions and 13 deletions

View File

@ -1,6 +1,6 @@
/* Copyright © 1997—1999 Thomas Boutell <boutell@boutell.com> /* Copyright © 1997—1999 Thomas Boutell <boutell@boutell.com>
and Boutell.Com, Inc. and Boutell.Com, Inc.
© 20032017 Sam Hocevar <sam@hocevar.net> © 20032021 Sam Hocevar <sam@hocevar.net>
This software is released for free use under the terms of This software is released for free use under the terms of
the GNU Public License, version 2 or higher. NO WARRANTY the GNU Public License, version 2 or higher. NO WARRANTY
@ -12,8 +12,7 @@
#include "net.h" #include "net.h"
void setSocketDefaults(SOCKET fd) void setSocketDefaults(SOCKET fd) {
{
/* Make socket non-blocking (FIXME: this uses legacy API) */ /* Make socket non-blocking (FIXME: this uses legacy API) */
FIONBIO_ARG_T ioctltmp = 1; FIONBIO_ARG_T ioctltmp = 1;
#if _WIN32 #if _WIN32
@ -33,3 +32,13 @@ void setSocketDefaults(SOCKET fd)
#endif #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;
}
}

View File

@ -24,6 +24,8 @@
# include <arpa/inet.h> # include <arpa/inet.h>
#endif #endif
#include <stdint.h>
#if defined HAVE_ERRNO_H #if defined HAVE_ERRNO_H
# include <errno.h> # include <errno.h>
#endif #endif
@ -79,4 +81,4 @@ static inline int GetLastError(void) {
#endif /* _WIN32 */ #endif /* _WIN32 */
void setSocketDefaults(SOCKET fd); void setSocketDefaults(SOCKET fd);
uint16_t getPort(struct addrinfo* ai);

View File

@ -80,7 +80,7 @@ int logFormatCommon = 0;
FILE *logFile = NULL; FILE *logFile = NULL;
char const *logMessages[] = { char const *logMessages[] = {
"unknown-error", "unknown-error",
"done-local-closed", "done-local-closed",
"done-remote-closed", "done-remote-closed",
"accept-failed -", "accept-failed -",
@ -211,6 +211,7 @@ static void clearConfiguration(void) {
} }
free(srv->fromHost); free(srv->fromHost);
free(srv->toHost); free(srv->toHost);
freeaddrinfo(srv->fromAddrInfo);
} }
/* Free memory associated with previous set. */ /* Free memory associated with previous set. */
free(seInfo); free(seInfo);
@ -296,7 +297,7 @@ void addServer(char *bindAddress, char *bindPort, protocolType bindProto,
} }
int tmp = 1; 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) { 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", 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); setSocketDefaults(si.fd);
} }
si.fromPort = it->ai_addr->sa_family == AF_INET si.fromAddrInfo = it;
? ntohs(((struct sockaddr_in*)it->ai_addr)->sin_port)
: ntohs(((struct sockaddr_in6*)it->ai_addr)->sin6_port);
break; break;
} }
freeaddrinfo(servinfo);
if (getAddress(connectAddress, &si.localAddr) < 0) { if (getAddress(connectAddress, &si.localAddr) < 0) {
/* Warn -- don't exit. */ /* 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; uint16_t fromPort = 0, toPort = 0;
if (srv != NULL) { if (srv != NULL) {
fromHost = srv->fromHost; fromHost = srv->fromHost;
fromPort = srv->fromPort; fromPort = getPort(srv->fromAddrInfo);
toHost = srv->toHost; toHost = srv->toHost;
toPort = srv->toPort; toPort = srv->toPort;
} }

View File

@ -1,6 +1,6 @@
/* Copyright © 1997—1999 Thomas Boutell <boutell@boutell.com> /* Copyright © 1997—1999 Thomas Boutell <boutell@boutell.com>
and Boutell.Com, Inc. and Boutell.Com, Inc.
© 20032019 Sam Hocevar <sam@hocevar.net> © 20032021 Sam Hocevar <sam@hocevar.net>
This software is released for free use under the terms of This software is released for free use under the terms of
the GNU Public License, version 2 or higher. NO WARRANTY 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 */ /* In ASCII and local byte order, for logging purposes */
char *fromHost, *toHost; char *fromHost, *toHost;
int16_t fromPort, toPort; struct addrinfo *fromAddrInfo;
int16_t toPort;
protocolType fromProto, toProto; protocolType fromProto, toProto;
/* Offset and count into list of allow and deny rules. Any rules /* Offset and count into list of allow and deny rules. Any rules