X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuhttpd.git;a=blobdiff_plain;f=listen.c;h=c4b6b2bb9faeab050ade6e257e04f463bfd3908e;hp=13054fb9c3f055c11752c22f442259e9c5db63a7;hb=38801a320d3f10de1f8ebfffd8964a1ad6d511f4;hpb=b6d9114baa1f8323084001fd4bc44fb08f7f1b35 diff --git a/listen.c b/listen.c index 13054fb..c4b6b2b 100644 --- a/listen.c +++ b/listen.c @@ -37,6 +37,14 @@ struct listener { static LIST_HEAD(listeners); static int n_blocked; +void uh_close_listen_fds(void) +{ + struct listener *l; + + list_for_each_entry(l, &listeners, list) + close(l->fd.fd); +} + static void uh_block_listener(struct listener *l) { uloop_fd_delete(&l->fd); @@ -75,8 +83,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 +144,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) {