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,
fflush (stdout);
raise_stat_sig = 1;
break;
+ case SIGTERM:
+ stop = 1;
+ break;
}
}
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;
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)) {
/* 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: */