X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fevent.c;h=2710a8b85883035da99b6f08209ac87834e933e7;hb=c44b08613508c993e7fd9f625e0b1b4775efffed;hp=c547c46d1f2f5d5a5077d83c335d823c634bb601;hpb=b322126576c52ffbc9a91d818125fc461fa17d1b;p=tinc diff --git a/src/event.c b/src/event.c index c547c46d..2710a8b8 100644 --- a/src/event.c +++ b/src/event.c @@ -1,6 +1,6 @@ /* event.c -- I/O, timeout and signal event handling - Copyright (C) 2012-2021 Guus Sliepen + Copyright (C) 2012-2022 Guus Sliepen 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 @@ -18,7 +18,8 @@ */ #include "system.h" -#include "dropin.h" + +#include #ifdef HAVE_SYS_EPOLL_H #include @@ -29,7 +30,7 @@ #include "net.h" struct timeval now; -#ifndef HAVE_MINGW +#ifndef HAVE_WINDOWS #ifdef HAVE_SYS_EPOLL_H static int epollset = 0; @@ -46,7 +47,7 @@ static DWORD event_count = 0; static bool running; #ifdef HAVE_SYS_EPOLL_H -static inline int event_epoll_init() { +static inline int event_epoll_init(void) { /* NOTE: 1024 limit is only used on ancient (pre 2.6.27) kernels. Decent kernels will ignore this value making it unlimited. epoll_create1 might be better, but these kernels would not be supported @@ -57,7 +58,7 @@ static inline int event_epoll_init() { #endif static int io_compare(const io_t *a, const io_t *b) { -#ifndef HAVE_MINGW +#ifndef HAVE_WINDOWS return a->fd - b->fd; #else @@ -113,7 +114,7 @@ void io_add(io_t *io, io_cb_t cb, void *data, int fd, int flags) { } io->fd = fd; -#ifdef HAVE_MINGW +#ifdef HAVE_WINDOWS if(io->fd != -1) { io->event = WSACreateEvent(); @@ -140,7 +141,7 @@ void io_add(io_t *io, io_cb_t cb, void *data, int fd, int flags) { #endif } -#ifdef HAVE_MINGW +#ifdef HAVE_WINDOWS void io_add_event(io_t *io, io_cb_t cb, void *data, WSAEVENT event) { io->event = event; io_add(io, cb, data, -1, 0); @@ -166,7 +167,7 @@ void io_set(io_t *io, int flags) { return; } -#ifndef HAVE_MINGW +#ifndef HAVE_WINDOWS #ifdef HAVE_SYS_EPOLL_H epoll_ctl(epollset, EPOLL_CTL_DEL, io->fd, NULL); @@ -229,7 +230,7 @@ void io_del(io_t *io) { } io_set(io, 0); -#ifdef HAVE_MINGW +#ifdef HAVE_WINDOWS if(io->fd != -1 && WSACloseEvent(io->event) == FALSE) { abort(); @@ -280,7 +281,7 @@ void timeout_del(timeout_t *timeout) { }; } -#ifndef HAVE_MINGW +#ifndef HAVE_WINDOWS // From Matz's Ruby #ifndef NSIG @@ -290,11 +291,14 @@ void timeout_del(timeout_t *timeout) { static io_t signalio; static int pipefd[2] = {-1, -1}; -static signal_t *signal_handle[NSIG + 1] = {}; +static signal_t *signal_handle[NSIG + 1] = {NULL}; static void signal_handler(int signum) { unsigned char num = signum; - write(pipefd[1], &num, 1); + + if(write(pipefd[1], &num, 1) != 1) { + // Pipe full or broken, nothing we can do about it. + } } static void signalio_handler(void *data, int flags) { @@ -375,7 +379,7 @@ static struct timeval *timeout_execute(struct timeval *diff) { bool event_loop(void) { running = true; -#ifndef HAVE_MINGW +#ifndef HAVE_WINDOWS #ifdef HAVE_SYS_EPOLL_H @@ -480,6 +484,7 @@ bool event_loop(void) { } #else + assert(WSA_WAIT_EVENT_0 == 0); while(running) { struct timeval diff; @@ -541,12 +546,12 @@ bool event_loop(void) { break; } - if(result < WSA_WAIT_EVENT_0 || result >= WSA_WAIT_EVENT_0 + event_count - event_offset) { + if(result >= event_count - event_offset) { return false; } /* Look up io in the map by index. */ - event_index = result - WSA_WAIT_EVENT_0 + event_offset; + event_index = result + event_offset; io_t *io = io_map[event_index]; if(io->fd == -1) {