summaryrefslogtreecommitdiffstats
path: root/libnetdata/socket/socket.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2018-11-07 12:19:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2018-11-07 12:20:17 +0000
commita64a253794ac64cb40befee54db53bde17dd0d49 (patch)
treec1024acc5f6e508814b944d99f112259bb28b1be /libnetdata/socket/socket.c
parentNew upstream version 1.10.0+dfsg (diff)
downloadnetdata-a64a253794ac64cb40befee54db53bde17dd0d49.tar.xz
netdata-a64a253794ac64cb40befee54db53bde17dd0d49.zip
New upstream version 1.11.0+dfsgupstream/1.11.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--libnetdata/socket/socket.c (renamed from src/socket.c)64
1 files changed, 39 insertions, 25 deletions
diff --git a/src/socket.c b/libnetdata/socket/socket.c
index 8bede73fd..c266efeb4 100644
--- a/src/socket.c
+++ b/libnetdata/socket/socket.c
@@ -1,4 +1,6 @@
-#include "common.h"
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "../libnetdata.h"
// --------------------------------------------------------------------------------------------------------------------
// various library calls
@@ -45,12 +47,14 @@ int sock_setreuse(int fd, int reuse) {
}
int sock_setreuse_port(int fd, int reuse) {
- int ret = -1;
+ int ret;
#ifdef SO_REUSEPORT
ret = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse));
if(ret == -1 && errno != ENOPROTOOPT)
error("failed to set SO_REUSEPORT on socket %d", fd);
+#else
+ ret = -1;
#endif
return ret;
@@ -80,7 +84,7 @@ int sock_enlarge_out(int fd) {
// --------------------------------------------------------------------------------------------------------------------
-char *strdup_client_description(int family, const char *protocol, const char *ip, int port) {
+char *strdup_client_description(int family, const char *protocol, const char *ip, uint16_t port) {
char buffer[100 + 1];
switch(family) {
@@ -148,7 +152,7 @@ int create_listen_socket_unix(const char *path, int listen_backlog) {
return sock;
}
-int create_listen_socket4(int socktype, const char *ip, int port, int listen_backlog) {
+int create_listen_socket4(int socktype, const char *ip, uint16_t port, int listen_backlog) {
int sock;
debug(D_LISTENER, "LISTENER: IPv4 creating new listening socket on ip '%s' port %d, socktype %d", ip, port, socktype);
@@ -244,7 +248,7 @@ int create_listen_socket6(int socktype, uint32_t scope_id, const char *ip, int p
return sock;
}
-static inline int listen_sockets_add(LISTEN_SOCKETS *sockets, int fd, int family, int socktype, const char *protocol, const char *ip, int port) {
+static inline int listen_sockets_add(LISTEN_SOCKETS *sockets, int fd, int family, int socktype, const char *protocol, const char *ip, uint16_t port) {
if(sockets->opened >= MAX_LISTEN_FDS) {
error("LISTENER: Too many listening sockets. Failed to add listening %s socket at ip '%s' port %d, protocol %s, socktype %d", protocol, ip, port, protocol, socktype);
close(fd);
@@ -296,7 +300,7 @@ void listen_sockets_close(LISTEN_SOCKETS *sockets) {
sockets->failed = 0;
}
-static inline int bind_to_this(LISTEN_SOCKETS *sockets, const char *definition, int default_port, int listen_backlog) {
+static inline int bind_to_this(LISTEN_SOCKETS *sockets, const char *definition, uint16_t default_port, int listen_backlog) {
int added = 0;
struct addrinfo hints;
struct addrinfo *result = NULL, *rp = NULL;
@@ -396,10 +400,10 @@ static inline int bind_to_this(LISTEN_SOCKETS *sockets, const char *definition,
for (rp = result; rp != NULL; rp = rp->ai_next) {
int fd = -1;
- int family = -1;
+ int family;
char rip[INET_ADDRSTRLEN + INET6_ADDRSTRLEN] = "INVALID";
- int rport = default_port;
+ uint16_t rport = default_port;
family = rp->ai_addr->sa_family;
switch (family) {
@@ -444,17 +448,19 @@ static inline int bind_to_this(LISTEN_SOCKETS *sockets, const char *definition,
int listen_sockets_setup(LISTEN_SOCKETS *sockets) {
listen_sockets_init(sockets);
- sockets->backlog = (int) config_get_number(sockets->config_section, "listen backlog", sockets->backlog);
+ sockets->backlog = (int) appconfig_get_number(sockets->config, sockets->config_section, "listen backlog", sockets->backlog);
- int old_port = sockets->default_port;
- sockets->default_port = (int) config_get_number(sockets->config_section, "default port", sockets->default_port);
- if(sockets->default_port < 1 || sockets->default_port > 65535) {
- error("LISTENER: Invalid listen port %d given. Defaulting to %d.", sockets->default_port, old_port);
- sockets->default_port = (int) config_set_number(sockets->config_section, "default port", old_port);
+ long long int old_port = sockets->default_port;
+ long long int new_port = appconfig_get_number(sockets->config, sockets->config_section, "default port", sockets->default_port);
+ if(new_port < 1 || new_port > 65535) {
+ error("LISTENER: Invalid listen port %lld given. Defaulting to %lld.", new_port, old_port);
+ sockets->default_port = (uint16_t) appconfig_set_number(sockets->config, sockets->config_section, "default port", old_port);
}
+ else sockets->default_port = (uint16_t)new_port;
+
debug(D_OPTIONS, "LISTENER: Default listen port set to %d.", sockets->default_port);
- char *s = config_get(sockets->config_section, "bind to", sockets->default_bind_to);
+ char *s = appconfig_get(sockets->config, sockets->config_section, "bind to", sockets->default_bind_to);
while(*s) {
char *e = s;
@@ -585,6 +591,8 @@ static inline int connect_to_this_ip46(int protocol, int socktype, const char *h
switch (ai->ai_addr->sa_family) {
case PF_INET: {
struct sockaddr_in *pSadrIn = (struct sockaddr_in *)ai->ai_addr;
+ (void)pSadrIn;
+
debug(D_CONNECT_TO, "ai_addr = sin_family: %d (AF_INET = %d, AF_INET6 = %d), sin_addr: '%s', sin_port: '%s'",
pSadrIn->sin_family,
AF_INET,
@@ -596,6 +604,8 @@ static inline int connect_to_this_ip46(int protocol, int socktype, const char *h
case PF_INET6: {
struct sockaddr_in6 *pSadrIn6 = (struct sockaddr_in6 *) ai->ai_addr;
+ (void)pSadrIn6;
+
debug(D_CONNECT_TO,"ai_addr = sin6_family: %d (AF_INET = %d, AF_INET6 = %d), sin6_addr: '%s', sin6_port: '%s', sin6_flowinfo: %u, sin6_scope_id: %u",
pSadrIn6->sin6_family,
AF_INET,
@@ -968,10 +978,10 @@ inline POLLINFO *poll_add_fd(POLLJOB *p
, uint32_t flags
, const char *client_ip
, const char *client_port
- , void *(*add_callback)(POLLINFO *pi, short int *events, void *data)
- , void (*del_callback)(POLLINFO *pi)
- , int (*rcv_callback)(POLLINFO *pi, short int *events)
- , int (*snd_callback)(POLLINFO *pi, short int *events)
+ , void *(*add_callback)(POLLINFO * /*pi*/, short int * /*events*/, void * /*data*/)
+ , void (*del_callback)(POLLINFO * /*pi*/)
+ , int (*rcv_callback)(POLLINFO * /*pi*/, short int * /*events*/)
+ , int (*snd_callback)(POLLINFO * /*pi*/, short int * /*events*/)
, void *data
) {
debug(D_POLLFD, "POLLFD: ADD: request to add fd %d, slots = %zu, used = %zu, min = %zu, max = %zu, next free = %zd", fd, p->slots, p->used, p->min, p->max, p->first_free?(ssize_t)p->first_free->slot:(ssize_t)-1);
@@ -1286,7 +1296,9 @@ static void poll_events_process(POLLJOB *p, POLLINFO *pi, struct pollfd *pf, sho
debug(D_POLLFD, "POLLFD: LISTENER: reading data from UDP slot %zu (fd %d)", i, fd);
- // FIXME: access_list is not applied to UDP
+ // TODO: access_list is not applied to UDP
+ // but checking the access list on every UDP packet will destroy
+ // performance, especially for statsd.
pf->events = 0;
pi->rcv_callback(pi, &pf->events);
@@ -1349,11 +1361,11 @@ static void poll_events_process(POLLJOB *p, POLLINFO *pi, struct pollfd *pf, sho
}
void poll_events(LISTEN_SOCKETS *sockets
- , void *(*add_callback)(POLLINFO *pi, short int *events, void *data)
- , void (*del_callback)(POLLINFO *pi)
- , int (*rcv_callback)(POLLINFO *pi, short int *events)
- , int (*snd_callback)(POLLINFO *pi, short int *events)
- , void (*tmr_callback)(void *timer_data)
+ , void *(*add_callback)(POLLINFO * /*pi*/, short int * /*events*/, void * /*data*/)
+ , void (*del_callback)(POLLINFO * /*pi*/)
+ , int (*rcv_callback)(POLLINFO * /*pi*/, short int * /*events*/)
+ , int (*snd_callback)(POLLINFO * /*pi*/, short int * /*events*/)
+ , void (*tmr_callback)(void * /*timer_data*/)
, SIMPLE_PATTERN *access_list
, void *data
, time_t tcp_request_timeout_seconds
@@ -1423,6 +1435,8 @@ void poll_events(LISTEN_SOCKETS *sockets
usec_t timer_usec = timer_milliseconds * USEC_PER_MS;
usec_t now_usec = 0, next_timer_usec = 0, last_timer_usec = 0;
+ (void)last_timer_usec;
+
if(unlikely(timer_usec)) {
now_usec = now_boottime_usec();
next_timer_usec = now_usec - (now_usec % timer_usec) + timer_usec;