Fix warnings when compiling for Windows.
[tinc] / src / event.c
index 9cd7d07..1283edd 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-2018 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
@@ -237,6 +237,8 @@ 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) {
@@ -348,6 +350,8 @@ bool event_loop(void) {
                        continue;
                }
 
+               unsigned int curgen = io_tree.generation;
+
                for splay_each(io_t, io, &io_tree) {
                        if(FD_ISSET(io->fd, &writable)) {
                                io->cb(io->data, IO_WRITE);
@@ -360,10 +364,12 @@ bool event_loop(void) {
                        /*
                           There are scenarios in which the callback will remove another io_t from the tree
                           (e.g. closing a double connection). Since splay_each does not support that, we
-                          need to exit the loop now. That's okay, since any remaining events will get picked
-                          up by the next select() call.
+                          need to exit the loop if that happens. That's okay, since any remaining events will
+                          get picked up by the next select() call.
                         */
-                       break;
+                       if(curgen != io_tree.generation) {
+                               break;
+                       }
                }
        }
 
@@ -372,7 +378,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);
@@ -429,12 +435,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) {