# HG changeset patch # User Olaf Wintermann # Date 1761942662 -3600 # Node ID 4e2bac64c95047027f5e617efc38e3c9afa9e86f # Parent e42a8de6d66f6be3a9e44eab5c126298715216de add srvctrl stop command diff -r e42a8de6d66f -r 4e2bac64c950 src/server/daemon/main.c --- a/src/server/daemon/main.c Fri Oct 31 21:15:19 2025 +0100 +++ b/src/server/daemon/main.c Fri Oct 31 21:31:02 2025 +0100 @@ -85,7 +85,7 @@ * SIGTERM: stop the server */ void sig_term(int sig) { - webserver_shutdown(); + webserver_shutdown(TRUE); //exit(EXIT_SUCCESS); } diff -r e42a8de6d66f -r 4e2bac64c950 src/server/daemon/srvctrl.c --- a/src/server/daemon/srvctrl.c Fri Oct 31 21:15:19 2025 +0100 +++ b/src/server/daemon/srvctrl.c Fri Oct 31 21:31:02 2025 +0100 @@ -105,10 +105,18 @@ int fd = accept(srvctrl, NULL, 0); if(fd < 0) { if(srv_shutdown) break; + log_ereport( LOG_FAILURE, "srvctrl: accept failed: %s", strerror(errno)); + + int err = errno; + if(err == EMFILE || err == ENFILE) { + sleep(5); + continue; + } + break; } @@ -186,6 +194,8 @@ } } else if(!cx_strcmp(cx_strcast(cmd), cx_str("shutdown"))) { webserver_shutdown(); + } else if(!cx_strcmp(cx_strcast(cmd), cx_str("stop"))) { + webserver_stop(); } else if(!cx_strcmp(cx_strcast(cmd), cx_str("stat"))) { // TODO: implement } else if(!cx_strcmp(cx_strcast(cmd), cx_str("log"))) { diff -r e42a8de6d66f -r 4e2bac64c950 src/server/daemon/webserver.c --- a/src/server/daemon/webserver.c Fri Oct 31 21:15:19 2025 +0100 +++ b/src/server/daemon/webserver.c Fri Oct 31 21:31:02 2025 +0100 @@ -284,13 +284,22 @@ srvctrl_shutdown(); } +static volatile int ws_clean_shutdown = TRUE; + +void webserver_stop() { + log_ereport(LOG_INFORM, "webserver stop"); + ws_clean_shutdown = FALSE; + srvctrl_shutdown(); +} + void webserver_end() { - cfgmgr_shutdown(); - shutdown_threadpools(60); - - shutdown_eventhandlers_wait(); // TODO: timeout - - shutdown_logging(); + if(ws_clean_shutdown) { + cfgmgr_shutdown(); + shutdown_threadpools(60); + + shutdown_eventhandlers_wait(); // TODO: timeout + shutdown_logging(); + } // execute restart callbacks RestartCallback *re = atrestart; @@ -301,8 +310,11 @@ free(re); re = re_next; } - - webserver_destroy(); + + if(ws_clean_shutdown) { + // TODO: check if previous shutdown was successful + webserver_destroy(); + } } int webserver_reconfig() { diff -r e42a8de6d66f -r 4e2bac64c950 src/server/daemon/webserver.h --- a/src/server/daemon/webserver.h Fri Oct 31 21:15:19 2025 +0100 +++ b/src/server/daemon/webserver.h Fri Oct 31 21:31:02 2025 +0100 @@ -45,6 +45,7 @@ int webserver_init(); int webserver_run(); void webserver_shutdown(); +void webserver_stop(); void webserver_end(); int webserver_reconfig(); diff -r e42a8de6d66f -r 4e2bac64c950 templates/bin/stopserv.template --- a/templates/bin/stopserv.template Fri Oct 31 21:15:19 2025 +0100 +++ b/templates/bin/stopserv.template Fri Oct 31 21:31:02 2025 +0100 @@ -53,4 +53,4 @@ exit 1 fi -bin/wstool -s $WS_TMP_DIR/private/srvctrl.sock shutdown +bin/wstool -s $WS_TMP_DIR/private/srvctrl.sock stop