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>
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
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;
}
}

View File

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

View File

@ -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;
}

View File

@ -1,6 +1,6 @@
/* Copyright © 1997—1999 Thomas Boutell <boutell@boutell.com>
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
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