better signal managment
authorLaurent Mazet <mazet@softndesign.org>
Tue, 15 Jul 2025 05:55:45 +0000 (07:55 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Tue, 15 Jul 2025 05:56:25 +0000 (07:56 +0200)
test.sh
ulvpn.c

diff --git a/test.sh b/test.sh
index b71bf59044b58f2440ef46e81fea89039cc81a70..9a11104ed1fea956fb48d5117909f82b6524c2bc 100755 (executable)
--- a/test.sh
+++ b/test.sh
@@ -80,10 +80,6 @@ pids="$pids $vpn"
 
 sleep 4
 
-kill -USR1 $vpn
-
-sleep 1
-
 for p in $pids; do
     echo killing $p
     pkill -TERM -P $p 2>/dev/null
diff --git a/ulvpn.c b/ulvpn.c
index 71a4c3eaff5fc5911ca752ec286489acfac60557..d39c61f58aa5dd7083f8fce8cf6d94dfff58cd96 100644 (file)
--- a/ulvpn.c
+++ b/ulvpn.c
@@ -70,14 +70,19 @@ int raise_stat_sig = 0;
 
 void sig_handler (int sig)
 {
+    VERBOSE (ulvpn, WARNING, PRINTF ("signal: %d\n", sig));
     switch (sig) {
+    case SIGHUP:
+        stat_tun_fd.rx = stat_tun_fd.tx = 0;
+        stat_udp_fd.rx = stat_udp_fd.tx = 0;
+        stat_blk_fd.rx = stat_blk_fd.tx = 0;
+        stat_red_fd.rx = stat_red_fd.tx = 0;
+        raise_stat_sig = 1;
+        break;
     case SIGINT:
         exit (0);
         break;
-    case SIGTERM:
-        stop = 1;
-        break;
-    case SIGUSR1:
+    case SIGTRAP:
         printf ("tun: RX %9d TX %9d\nudp: RX %9d TX %9d\nblk: RX %9d TX %9d\nred: RX %9d TX %9d\n",
                 stat_tun_fd.rx, stat_tun_fd.tx, stat_udp_fd.rx,
                 stat_udp_fd.tx, stat_blk_fd.rx, stat_blk_fd.tx,
@@ -85,6 +90,9 @@ void sig_handler (int sig)
         fflush (stdout);
         raise_stat_sig = 1;
         break;
+    case SIGTERM:
+        stop = 1;
+        break;
     }
 }
 
@@ -398,9 +406,16 @@ int main (int argc, char **argv)
     VERBOSE (ulvpn, INFO, PRINTF ("fids: %d %d %d %d %d %d\n", tun_fd, udp_fd, rxblack_fd, txblack_fd, rxred_fd, txred_fd));
 
     /* signals */
-    signal(SIGINT, sig_handler);
-    signal(SIGTERM, sig_handler);
-    signal(SIGUSR1, sig_handler);
+    sigset_t mask;
+    struct sigaction action = {0};
+    sigemptyset (&mask);
+    action.sa_mask = mask;
+    action.sa_flags = SA_NODEFER;
+    action.sa_handler = sig_handler;
+    sigaction (SIGHUP, &action, NULL);
+    sigaction (SIGTRAP, &action, NULL);
+    sigaction (SIGINT, &action, NULL);
+    sigaction (SIGTERM, &action, NULL);
 
     /* main loop */
     int rc = 0;
@@ -437,12 +452,15 @@ int main (int argc, char **argv)
 
         if (-1 == select (max_fd + 1, &readset, NULL, NULL, NULL)) {
             if (raise_stat_sig) {
-               raise_stat_sig = 0;
-            } else if (!stop) {
-                VERBOSE (ulvpn, ERROR, PRINTF ("select error\n"));
-                rc = 2;
+                raise_stat_sig = 0;
+                continue;
+            } else {
+                if (!stop) {
+                    VERBOSE (ulvpn, ERROR, PRINTF ("select error\n"));
+                    rc = 2;
+                }
+                break;
             }
-            break;
         }
 
         if (FD_ISSET (tun_fd, &readset)) {
@@ -669,4 +687,6 @@ int main (int argc, char **argv)
 /* test: ./test.sh ulvpn.exe */
 /* test: ./test-rb.sh ulvpn.exe */
 
+/* test: ulvpn.exe -v 5 -n black -n red -t udp://\*:1234 -u udp://localhost:1235 > ulvpn.log & pid=$!; sleep 1; echo TEST | nc -Nuq0 10.2.1.1 3000; kill -USR1 $pid; sleep 1; kill -HUP $pid; sleep 1; echo TEST | nc -Nuq0 10.2.1.1 3000; kill -USR1 $pid; sleep 1; kill -TERM $pid; grep 'tun: RX' ulvpn.log | wc -l | xargs test 2 -eq */
+
 /* vim: set ts=4 sw=4 si et: */