From 26eb66c95a5c7af2e27d2f1ac1d096f9115d7804 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Tue, 15 Jul 2025 07:55:45 +0200 Subject: [PATCH] better signal managment --- test.sh | 4 ---- ulvpn.c | 44 ++++++++++++++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/test.sh b/test.sh index b71bf59..9a11104 100755 --- 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 71a4c3e..d39c61f 100644 --- 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: */ -- 2.30.2