Simplify signal handling.
[tinc] / src / event.c
index 8c7de47..226a452 100644 (file)
@@ -1,6 +1,6 @@
 /*
     event.c -- I/O, timeout and signal event handling
-    Copyright (C) 2012-2013 Guus Sliepen <guus@tinc-vpn.org>
+    Copyright (C) 2012-2021 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 */
 
 #include "system.h"
-
-#include "dropin.h"
 #include "event.h"
-#include "net.h"
 #include "utils.h"
-#include "xalloc.h"
 
 struct timeval now;
 
@@ -223,13 +219,16 @@ void timeout_del(timeout_t *timeout) {
 }
 
 #ifndef HAVE_MINGW
-static int signal_compare(const signal_t *a, const signal_t *b) {
-       return a->signum - b->signum;
-}
+
+// From Matz's Ruby
+#ifndef NSIG
+# define NSIG (_SIGMAX + 1)      /* For QNX */
+#endif
+
 
 static io_t signalio;
 static int pipefd[2] = {-1, -1};
-static splay_tree_t signal_tree = {.compare = (splay_compare_t)signal_compare};
+static signal_t *signal_handle[NSIG + 1] = {};
 
 static void signal_handler(int signum) {
        unsigned char num = signum;
@@ -237,15 +236,15 @@ static void signal_handler(int signum) {
 }
 
 static void signalio_handler(void *data, int flags) {
+       (void)data;
+       (void)flags;
        unsigned char signum;
 
        if(read(pipefd[0], &signum, 1) != 1) {
                return;
        }
 
-       signal_t *sig = splay_search(&signal_tree, &((signal_t) {
-               .signum = signum
-       }));
+       signal_t *sig = signal_handle[signum];
 
        if(sig) {
                sig->cb(sig->data);
@@ -263,20 +262,17 @@ void signal_add(signal_t *sig, signal_cb_t cb, void *data, int signum) {
                return;
        }
 
+       sig->signum = signum;
        sig->cb = cb;
        sig->data = data;
-       sig->signum = signum;
-       sig->node.data = sig;
 
        if(pipefd[0] == -1) {
                pipe_init();
        }
 
-       signal(sig->signum, signal_handler);
+       signal(signum, signal_handler);
 
-       if(!splay_insert_node(&signal_tree, &sig->node)) {
-               abort();
-       }
+       signal_handle[signum] = sig;
 }
 
 void signal_del(signal_t *sig) {
@@ -286,7 +282,7 @@ void signal_del(signal_t *sig) {
 
        signal(sig->signum, SIG_DFL);
 
-       splay_unlink_node(&signal_tree, &sig->node);
+       signal_handle[sig->signum] = NULL;
        sig->cb = NULL;
 }
 #endif
@@ -376,7 +372,7 @@ bool event_loop(void) {
        while(running) {
                struct timeval diff;
                struct timeval *tv = get_time_remaining(&diff);
-               DWORD timeout_ms = tv ? (tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1) : WSA_INFINITE;
+               DWORD timeout_ms = tv ? (DWORD)(tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1) : WSA_INFINITE;
 
                if(!event_count) {
                        Sleep(timeout_ms);
@@ -434,7 +430,7 @@ bool event_loop(void) {
                        }
 
                        if(result < WSA_WAIT_EVENT_0 || result >= WSA_WAIT_EVENT_0 + event_count - event_offset) {
-                               return(false);
+                               return false;
                        }
 
                        /* Look up io in the map by index. */