diff -r 96d2ba2f28db -r 834351da593b src/server/daemon/httplistener.c --- a/src/server/daemon/httplistener.c Sun Nov 27 15:58:37 2022 +0100 +++ b/src/server/daemon/httplistener.c Sat Dec 03 12:27:00 2022 +0100 @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -476,10 +477,17 @@ } + +void http_listener_shutdown_acceptors(HttpListener *listener) { + // not implemented yet +} + + Acceptor* acceptor_new(HttpListener *listener) { Acceptor *acceptor = malloc(sizeof(Acceptor)); acceptor->listener = listener; acceptor->ipv6 = WS_FALSE; + acceptor->exit = WS_FALSE; return acceptor; } @@ -491,7 +499,7 @@ (void*(*)(void*))acceptor_thread, a) != 0) { - log_ereport(LOG_FAILURE, "Listener %s: acceptor_start: %s", a->listener->name.ptr, strerror(errno)); + log_ereport(LOG_FAILURE, "Listener %s: acceptor_start: %s acceptor", a->listener->name.ptr, strerror(errno)); cfg_unref(a->listener->cfg); } } @@ -503,6 +511,7 @@ WS_ASSERT(acceptor->listener->session_handler); WS_ASSERT(acceptor->listener->session_handler->enqueue_connection); + acceptor->running = TRUE; HttpListener *listener = acceptor->listener; int server_socket; @@ -523,6 +532,7 @@ addr_type = CONN_ADDR_IPV4; } + log_ereport(LOG_DEBUG, "acceptor: %p listener: %p start", acceptor, acceptor->listener); for (;;) { // accept connections @@ -563,17 +573,26 @@ flags = 0; } if(fcntl(conn->fd, F_SETFL, flags | O_NONBLOCK)) { - perror("Error: acceptor_thread: fcntl"); - // TODO: error + log_ereport(LOG_FAILURE, "acceptor: fcntl failed: %s", strerror(errno)); + close(clientfd); + free(conn); + conn = NULL; + } else { + SSL *ssl = SSL_new(ls->ssl->sslctx); + if(ssl) { + SSL_set_fd(ssl, clientfd); + + conn->ssl = ssl; + conn->read = connection_ssl_read; + conn->write = connection_ssl_write; + conn->close = connection_ssl_close; + } else { + log_ereport(LOG_FAILURE, "acceptor: %p listener: %p SSL_new() failed", acceptor, acceptor->listener); + free(conn); + close(clientfd); + conn = NULL; + } } - - SSL *ssl = SSL_new(ls->ssl->sslctx); - SSL_set_fd(ssl, clientfd); - - conn->ssl = ssl; - conn->read = connection_ssl_read; - conn->write = connection_ssl_write; - conn->close = connection_ssl_close; } else { conn->ssl = NULL; conn->read = connection_read; @@ -592,13 +611,16 @@ // ready for new connection - if(acceptor_exit) { + if(acceptor_exit || acceptor->exit) { // this acceptor is outdated log_ereport(LOG_VERBOSE, "acceptor thread %p: exit", (void*)acceptor->tid); break; } } + acceptor->running = FALSE; + log_ereport(LOG_DEBUG, "acceptor: %p listener %p exit thread", acceptor, acceptor->listener); + cfg_unref(acceptor->listener->cfg); return NULL;