diff options
author | AdrianStoenescu <51166009+AdrianStoenescu@users.noreply.github.com> | 2019-07-25 13:36:49 +0300 |
---|---|---|
committer | Saya Sugiura <39760799+ssugiura@users.noreply.github.com> | 2019-07-25 19:36:49 +0900 |
commit | e8716cc5c950e50411b23a7a6cafa3c063c59e90 (patch) | |
tree | 98bffcc8f95e8cee9e77e80625e4b0e94c7525cd /src/daemon/dlt_daemon_socket.c | |
parent | 923ba7d4ab9c73300a9ef54e0ac4d1d7c02e2ba7 (diff) | |
download | DLT-daemon-e8716cc5c950e50411b23a7a6cafa3c063c59e90.tar.gz |
Add option in dlt.conf for bindAddress to specific IPs (#130)
Add the possibility to have in dlt.conf an option that specifies a set
of IP addresses. The daemon will do a socket bind only for this list,
therefore external connections will be limited to this set of IP
addresses. If this option is not given, the default INADDR_ANY is used
("0.0.0.0") as before.
The option in dlt.conf can look like this:
BindAddress = 160.48.199.98;160.48.199.97;160.48.199.226,160.48.199.186;160.48.199.139;172.16.222.99
There can be as many addresses but only specified on one single line.
They have to be delimited by ',' or ';'. ' ' (space) delimiter does
not work. IPv6 addresses are supported as well. For instance:
BindAddress = fe80::255:7bff:feb5:7df7
IPv6 addresses are acceptable only if DLT_USE_IPv6 flag is ON at
compile time. IPv4 addresses are acceptable only if DLT_USE_IPv6 flag is
OFF at compile time. One cannot have both IPv4 and IPv6 format in the
same time.
Signed-off-by: Adrian Stoenescu Adrian.Stoenescu@harman.com
Diffstat (limited to 'src/daemon/dlt_daemon_socket.c')
-rw-r--r-- | src/daemon/dlt_daemon_socket.c | 92 |
1 files changed, 49 insertions, 43 deletions
diff --git a/src/daemon/dlt_daemon_socket.c b/src/daemon/dlt_daemon_socket.c index 6dfc264..2e4f9ea 100644 --- a/src/daemon/dlt_daemon_socket.c +++ b/src/daemon/dlt_daemon_socket.c @@ -57,66 +57,72 @@ #include "dlt_daemon_socket.h" -int dlt_daemon_socket_open(int *sock, unsigned int servPort) +int dlt_daemon_socket_open(int *sock, unsigned int servPort, char *ip) { int yes = 1; - char portnumbuffer[33]; - struct addrinfo hints, *servinfo, *p; - int rv; + int ret_inet_pton = 0; - memset(&hints, 0, sizeof hints); #ifdef DLT_USE_IPv6 - hints.ai_family = AF_INET6; /* force IPv6 - will still work with IPv4 */ -#else - hints.ai_family = AF_INET; -#endif - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_PASSIVE; /* use my IP address */ - - snprintf(portnumbuffer, 32, "%d", servPort); - if ((rv = getaddrinfo(NULL, portnumbuffer, &hints, &servinfo)) != 0) { - dlt_vlog(LOG_WARNING, "getaddrinfo error %d: %s\n", rv, gai_strerror(rv)); - return -1; + /* create socket */ + if ((*sock = socket(AF_INET6, SOCK_STREAM, 0)) == -1) { + const int lastErrno = errno; + dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: socket() error %d: %s\n", lastErrno, strerror(lastErrno)); } - for (p = servinfo; p != NULL; p = p->ai_next) { - if ((*sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { - const int lastErrno = errno; - dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: socket() error %d: %s\n", lastErrno, strerror(lastErrno)); - continue; - } +#else - dlt_vlog(LOG_INFO, "%s: Socket created - socket_family:%i, socket_type:%i, protocol:%i\n", - __FUNCTION__, p->ai_family, p->ai_socktype, p->ai_protocol); + if ((*sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + const int lastErrno = errno; + dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: socket() error %d: %s\n", lastErrno, strerror(lastErrno)); + } - if (setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { - const int lastErrno = errno; - dlt_vlog(LOG_WARNING, - "dlt_daemon_socket_open: Setsockopt error %d in dlt_daemon_local_connection_init: %s\n", - lastErrno, - strerror(lastErrno)); - continue; - } +#endif - if (bind(*sock, p->ai_addr, p->ai_addrlen) == -1) { - const int lastErrno = errno; /*close() may set errno too */ - close(*sock); - dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: bind() error %d: %s\n", lastErrno, strerror(lastErrno)); - continue; - } + dlt_vlog(LOG_INFO, "%s: Socket created\n", __FUNCTION__); - break; + /* setsockpt SO_REUSEADDR */ + if (setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { + const int lastErrno = errno; + dlt_vlog(LOG_WARNING, + "dlt_daemon_socket_open: Setsockopt error %d in dlt_daemon_local_connection_init: %s\n", + lastErrno, + strerror(lastErrno)); } - if (p == NULL) { - dlt_log(LOG_WARNING, "failed to bind socket\n"); + /* bind */ +#ifdef DLT_USE_IPv6 + struct sockaddr_in6 forced_addr; + memset(&forced_addr, 0, sizeof(forced_addr)); + forced_addr.sin6_family = AF_INET6; + forced_addr.sin6_port = htons(servPort); + ret_inet_pton = inet_pton(AF_INET6, ip, &forced_addr.sin6_addr); +#else + struct sockaddr_in forced_addr; + memset(&forced_addr, 0, sizeof(forced_addr)); + forced_addr.sin_family = AF_INET; + forced_addr.sin_port = htons(servPort); + ret_inet_pton = inet_pton(AF_INET, ip, &forced_addr.sin_addr); +#endif + + /* inet_pton returns 1 on success */ + if (ret_inet_pton != 1) { + dlt_vlog(LOG_WARNING, + "dlt_daemon_socket_open: inet_pton() error %d: %s. Cannot convert IP address: %s\n", + errno, + strerror(errno), + ip); return -1; } - freeaddrinfo(servinfo); + if (bind(*sock, (struct sockaddr *)&forced_addr, sizeof(forced_addr)) == -1) { + const int lastErrno = errno; /*close() may set errno too */ + close(*sock); + dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: bind() error %d: %s\n", lastErrno, strerror(lastErrno)); + } - dlt_vlog(LOG_INFO, "%s: Listening on port: %u\n", __func__, servPort); + /*listen */ + dlt_vlog(LOG_INFO, "%s: Listening on ip %s and port: %u\n", __FUNCTION__, ip, servPort); /* get socket buffer size */ dlt_vlog(LOG_INFO, "dlt_daemon_socket_open: Socket send queue size: %d\n", |