add srvctrl stop command

Fri, 31 Oct 2025 21:31:02 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 31 Oct 2025 21:31:02 +0100
changeset 619
4e2bac64c950
parent 618
e42a8de6d66f
child 620
a202cb1ee175

add srvctrl stop command

src/server/daemon/main.c file | annotate | diff | comparison | revisions
src/server/daemon/srvctrl.c file | annotate | diff | comparison | revisions
src/server/daemon/webserver.c file | annotate | diff | comparison | revisions
src/server/daemon/webserver.h file | annotate | diff | comparison | revisions
templates/bin/stopserv.template file | annotate | diff | comparison | revisions
--- 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);
 }
 
--- 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"))) {
--- 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() {
--- 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();
 
--- 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

mercurial