Simplify signal handling.
[tinc] / src / event.c
index 1283edd..226a452 100644 (file)
@@ -1,6 +1,6 @@
 /*
     event.c -- I/O, timeout and signal event handling
-    Copyright (C) 2012-2018 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;
@@ -245,9 +244,7 @@ static void signalio_handler(void *data, int flags) {
                return;
        }
 
-       signal_t *sig = splay_search(&signal_tree, &((signal_t) {
-               .signum = signum
-       }));
+       signal_t *sig = signal_handle[signum];
 
        if(sig) {
                sig->cb(sig->data);
@@ -265,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) {
@@ -288,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
@@ -435,12 +429,12 @@ bool event_loop(void) {
                                break;
                        }
 
-                       if(result >= event_count - event_offset) {
-                               return(false);
+                       if(result < WSA_WAIT_EVENT_0 || result >= WSA_WAIT_EVENT_0 + event_count - event_offset) {
+                               return false;
                        }
 
                        /* Look up io in the map by index. */
-                       event_index = result - event_offset;
+                       event_index = result - WSA_WAIT_EVENT_0 + event_offset;
                        io_t *io = io_map[event_index];
 
                        if(io->fd == -1) {