From de6e8b4197fbbb1a6b97f30af8961c05cb937b55 Mon Sep 17 00:00:00 2001 From: Philipp Schafft Date: Fri, 28 Sep 2018 13:52:39 +0000 Subject: [PATCH] Feature: Added support to set listen(2) backlog. Closes: #2225 --- src/cfgfile.c | 3 +++ src/cfgfile.h | 1 + src/listensocket.c | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/cfgfile.c b/src/cfgfile.c index ab5d1cb1..2a014b1e 100644 --- a/src/cfgfile.c +++ b/src/cfgfile.c @@ -1911,6 +1911,8 @@ static void _parse_listen_socket(xmlDocPtr doc, node->xmlChildrenNode, 1); } else if (xmlStrcmp(node->name, XMLSTR("so-sndbuf")) == 0) { __read_int(doc, node, &listener->so_sndbuf, " must not be empty."); + } else if (xmlStrcmp(node->name, XMLSTR("listen-backlog")) == 0) { + __read_int(doc, node, &listener->listen_backlog, " must not be empty."); } else if (xmlStrcmp(node->name, XMLSTR("authentication")) == 0) { _parse_authentication_node(node, &(listener->authstack)); } @@ -2629,6 +2631,7 @@ listener_t *config_copy_listener_one(const listener_t *listener) { n->next = NULL; n->port = listener->port; n->so_sndbuf = listener->so_sndbuf; + n->listen_backlog = listener->listen_backlog; n->type = listener->type; n->id = (char*)xmlStrdup(XMLSTR(listener->id)); if (listener->on_behalf_of) { diff --git a/src/cfgfile.h b/src/cfgfile.h index cda95b51..a44a8605 100644 --- a/src/cfgfile.h +++ b/src/cfgfile.h @@ -161,6 +161,7 @@ typedef struct _listener_t { listener_type_t type; int port; int so_sndbuf; + int listen_backlog; char *bind_address; int shoutcast_compat; char *shoutcast_mount; diff --git a/src/listensocket.c b/src/listensocket.c index de83f812..f188ef56 100644 --- a/src/listensocket.c +++ b/src/listensocket.c @@ -73,6 +73,20 @@ static inline const char * __string_default(const char *str, const char *def) return str != NULL ? str : def; } +static inline int __socket_listen(sock_t serversock, const listener_t *listener) +{ + int listen_backlog = listener->listen_backlog; + + if (listen_backlog < 1) + listen_backlog = ICECAST_LISTEN_QUEUE; + if (listen_backlog > 128) { + listen_backlog = 128; + ICECAST_LOG_WARN("Listen backlog for listen socket on %s port %i is set insanely high. Limiting to sane range.", __string_default(listener->bind_address, ""), listener->port); + } + + return sock_listen(serversock, listen_backlog); +} + static inline int __listener_cmp(const listener_t *a, const listener_t *b) { if (a == b) @@ -581,6 +595,8 @@ static int listensocket_apply_config__unlocked(listensocket_t *self sock_set_send_buffer(self->sock, listener->so_sndbuf); sock_set_blocking(self->sock, 0); + + __socket_listen(self->sock, listener); } if (self->listener_update) { @@ -632,7 +648,7 @@ int listensocket_refsock(listensocket_t *self) return -1; } - if (sock_listen(self->sock, ICECAST_LISTEN_QUEUE) == 0) { + if (__socket_listen(self->sock, self->listener) == 0) { sock_close(self->sock); self->sock = SOCK_ERROR; thread_rwlock_rlock(&self->listener_rwlock);