uhttpd: add manifest support
[project/uhttpd.git] / listen.c
index d51e600..2a54888 100644 (file)
--- a/listen.c
+++ b/listen.c
@@ -52,12 +52,12 @@ static void uh_block_listener(struct listener *l)
        l->blocked = true;
 }
 
-void uh_unblock_listeners(void)
+static void uh_poll_listeners(struct uloop_timeout *timeout)
 {
        struct listener *l;
 
-       if ((!n_blocked && conf.max_requests) ||
-           n_clients >= conf.max_requests)
+       if ((!n_blocked && conf.max_connections) ||
+           n_clients >= conf.max_connections)
                return;
 
        list_for_each_entry(l, &listeners, list) {
@@ -65,7 +65,7 @@ void uh_unblock_listeners(void)
                        continue;
 
                l->fd.cb(&l->fd, ULOOP_READ);
-           if (n_clients >= conf.max_requests)
+           if (n_clients >= conf.max_connections)
                        break;
 
                n_blocked--;
@@ -74,6 +74,15 @@ void uh_unblock_listeners(void)
        }
 }
 
+void uh_unblock_listeners(void)
+{
+       static struct uloop_timeout poll_timer = {
+               .cb = uh_poll_listeners
+       };
+
+       uloop_timeout_set(&poll_timer, 1);
+}
+
 static void listener_cb(struct uloop_fd *fd, unsigned int events)
 {
        struct listener *l = container_of(fd, struct listener, fd);
@@ -83,7 +92,7 @@ static void listener_cb(struct uloop_fd *fd, unsigned int events)
                        break;
        }
 
-       if (conf.max_requests && n_clients >= conf.max_requests)
+       if (conf.max_connections && n_clients >= conf.max_connections)
                uh_block_listener(l);
 }
 
@@ -98,15 +107,17 @@ void uh_setup_listeners(void)
                /* TCP keep-alive */
                if (conf.tcp_keepalive > 0) {
 #ifdef linux
-                       int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt;
+                       int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt, tcp_fstopn;
 
                        tcp_ka_idl = 1;
                        tcp_ka_cnt = 3;
                        tcp_ka_int = conf.tcp_keepalive;
+                       tcp_fstopn = 5;
 
                        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));
+                       setsockopt(sock, SOL_TCP, TCP_FASTOPEN,  &tcp_fstopn, sizeof(tcp_fstopn));
 #endif
 
                        setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes));
@@ -178,6 +189,7 @@ int uh_socket_bind(const char *host, const char *port, bool tls)
 
                l->fd.fd = sock;
                l->tls = tls;
+               l->addr = *(struct sockaddr_in6 *)p->ai_addr;
                list_add_tail(&l->list, &listeners);
                bound++;
 
@@ -192,3 +204,21 @@ error:
 
        return bound;
 }
+
+int uh_first_tls_port(int family)
+{
+       struct listener *l;
+       int tls_port = -1;
+
+       list_for_each_entry(l, &listeners, list) {
+               if (!l->tls || l->addr.sin6_family != family)
+                       continue;
+
+               if (tls_port != -1 && ntohs(l->addr.sin6_port) != 443)
+                       continue;
+
+               tls_port = ntohs(l->addr.sin6_port);
+       }
+
+       return tls_port;
+}