/*
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;
}
#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;
}
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);
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) {
signal(sig->signum, SIG_DFL);
- splay_unlink_node(&signal_tree, &sig->node);
+ signal_handle[sig->signum] = NULL;
sig->cb = NULL;
}
#endif
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);
}
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. */