X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fevent.c;h=5e6908f58a2db5150c7bcb83c7e11d21fd8f5768;hb=2f9a1d4ab5ff51b05a5e8cc41a1528fdeb36c723;hp=0e4e2bdfa2aada1c62b44eea0a0e521e78d70454;hpb=611217c96ec684799882cf330f40a0936131b6b5;p=tinc diff --git a/src/event.c b/src/event.c index 0e4e2bdf..5e6908f5 100644 --- a/src/event.c +++ b/src/event.c @@ -72,9 +72,11 @@ void io_add(io_t *io, io_cb_t cb, void *data, int fd, int flags) { io->fd = fd; #ifdef HAVE_MINGW - io->event = WSACreateEvent(); - if (io->event == WSA_INVALID_EVENT) - abort(); + if (io->fd != -1) { + io->event = WSACreateEvent(); + if (io->event == WSA_INVALID_EVENT) + abort(); + } event_count++; #endif io->cb = cb; @@ -87,10 +89,19 @@ void io_add(io_t *io, io_cb_t cb, void *data, int fd, int flags) { abort(); } +#ifdef HAVE_MINGW +void io_add_event(io_t *io, io_cb_t cb, void *data, WSAEVENT event) { + io_add(io, cb, data, -1, 0); + io->event = event; +} +#endif + void io_set(io_t *io, int flags) { if (flags == io->flags) return; io->flags = flags; + if (io->fd == -1) + return; #ifndef HAVE_MINGW if(flags & IO_READ) @@ -119,7 +130,7 @@ void io_del(io_t *io) { io_set(io, 0); #ifdef HAVE_MINGW - if (WSACloseEvent(io->event) == FALSE) + if (io->fd != -1 && WSACloseEvent(io->event) == FALSE) abort(); event_count--; #endif @@ -334,13 +345,17 @@ bool event_loop(void) { if (!io) abort(); - WSANETWORKEVENTS network_events; - if (WSAEnumNetworkEvents(io->fd, io->event, &network_events) != 0) - return false; - if (network_events.lNetworkEvents & WRITE_EVENTS) - io->cb(io->data, IO_WRITE); - if (network_events.lNetworkEvents & READ_EVENTS) - io->cb(io->data, IO_READ); + if (io->fd == -1) { + io->cb(io->data, 0); + } else { + WSANETWORKEVENTS network_events; + if (WSAEnumNetworkEvents(io->fd, io->event, &network_events) != 0) + return false; + if (network_events.lNetworkEvents & WRITE_EVENTS) + io->cb(io->data, IO_WRITE); + if (network_events.lNetworkEvents & READ_EVENTS) + io->cb(io->data, IO_READ); + } } #endif