From: Felix Fietkau Date: Mon, 31 Dec 2012 16:43:07 +0000 (+0100) Subject: set keepalive option after all command line parameters have been processed X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=4f73862b48183465adfd30a2f7fc2b5a7dab12a3;p=oweals%2Fuhttpd.git set keepalive option after all command line parameters have been processed --- diff --git a/listen.c b/listen.c index 13054fb..55d7143 100644 --- a/listen.c +++ b/listen.c @@ -75,8 +75,28 @@ static void listener_cb(struct uloop_fd *fd, unsigned int events) void uh_setup_listeners(void) { struct listener *l; + int yes = 1; list_for_each_entry(l, &listeners, list) { + int sock = l->fd.fd; + + /* TCP keep-alive */ + if (conf.tcp_keepalive > 0) { +#ifdef linux + int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt; + + tcp_ka_idl = 1; + tcp_ka_cnt = 3; + tcp_ka_int = conf.tcp_keepalive; + + setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &tcp_ka_idl, sizeof(tcp_ka_idl)); + setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &tcp_ka_int, sizeof(tcp_ka_int)); + setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &tcp_ka_cnt, sizeof(tcp_ka_cnt)); +#endif + + setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes)); + } + l->fd.cb = listener_cb; uloop_fd_add(&l->fd, ULOOP_READ); } @@ -116,25 +136,6 @@ int uh_socket_bind(const char *host, const char *port, bool tls) goto error; } - /* TCP keep-alive */ - if (conf.tcp_keepalive > 0) { - int ret = 0; -#ifdef linux - int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt; - - tcp_ka_idl = 1; - tcp_ka_cnt = 3; - tcp_ka_int = conf.tcp_keepalive; - ret = setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &tcp_ka_idl, sizeof(tcp_ka_idl)) || - setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &tcp_ka_int, sizeof(tcp_ka_int)) || - setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &tcp_ka_cnt, sizeof(tcp_ka_cnt)); -#endif - - if (ret || setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes))) - fprintf(stderr, "Notice: Unable to enable TCP keep-alive: %s\n", - strerror(errno)); - } - /* required to get parallel v4 + v6 working */ if (p->ai_family == AF_INET6 && setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(yes)) < 0) {