K&R style braces.
[tinc] / src / net.c
index e834f92..0b617bd 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -1,7 +1,7 @@
 /*
     net.c -- most of the network code
     Copyright (C) 1998-2005 Ivo Timmermans,
-                  2000-2006 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2009 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
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-    $Id$
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
 #include "system.h"
@@ -48,8 +46,7 @@ time_t now = 0;
 
 /* Purge edges and subnets of unreachable nodes. Use carefully. */
 
-static void purge(void)
-{
+static void purge(void) {
        avl_node_t *nnode, *nnext, *enode, *enext, *snode, *snext;
        node_t *n;
        edge_t *e;
@@ -112,8 +109,7 @@ static void purge(void)
   put all file descriptors in an fd_set array
   While we're at it, purge stuff that needs to be removed.
 */
-static int build_fdset(fd_set *readset, fd_set *writeset)
-{
+static int build_fdset(fd_set *readset, fd_set *writeset) {
        avl_node_t *node, *next;
        connection_t *c;
        int i, max = 0;
@@ -149,7 +145,8 @@ static int build_fdset(fd_set *readset, fd_set *writeset)
                        max = listen_socket[i].udp;
        }
 
-       FD_SET(device_fd, readset);
+       if(device_fd >= 0)
+               FD_SET(device_fd, readset);
        if(device_fd > max)
                max = device_fd;
        
@@ -163,8 +160,7 @@ static int build_fdset(fd_set *readset, fd_set *writeset)
   - Check if we need to retry making an outgoing connection
   - Deactivate the host
 */
-void terminate_connection(connection_t *c, bool report)
-{
+void terminate_connection(connection_t *c, bool report) {
        cp();
 
        if(c->status.remove)
@@ -227,8 +223,7 @@ void terminate_connection(connection_t *c, bool report)
   end does not reply in time, we consider them dead
   and close the connection.
 */
-static void check_dead_connections(void)
-{
+static void check_dead_connections(void) {
        avl_node_t *node, *next;
        connection_t *c;
 
@@ -251,7 +246,7 @@ static void check_dead_connections(void)
                        } else {
                                if(c->status.remove) {
                                        logger(LOG_WARNING, _("Old connection_t for %s (%s) status %04x still lingering, deleting..."),
-                                                  c->name, c->hostname, c->status.value);
+                                                  c->name, c->hostname, bitfield_to_int(&c->status, sizeof c->status));
                                        connection_del(c);
                                        continue;
                                }
@@ -283,8 +278,7 @@ static void check_dead_connections(void)
   check all connections to see if anything
   happened on their sockets
 */
-static void check_network_activity(fd_set * readset, fd_set * writeset)
-{
+static void check_network_activity(fd_set * readset, fd_set * writeset) {
        connection_t *c;
        avl_node_t *node;
        int result, i;
@@ -294,9 +288,11 @@ static void check_network_activity(fd_set * readset, fd_set * writeset)
        cp();
 
        /* check input from kernel */
-       if(FD_ISSET(device_fd, readset)) {
-               if(read_packet(&packet))
+       if(device_fd >= 0 && FD_ISSET(device_fd, readset)) {
+               if(read_packet(&packet)) {
+                       packet.priority = 0;
                        route(myself, &packet);
+               }
        }
 
        /* check meta connections */
@@ -349,8 +345,7 @@ static void check_network_activity(fd_set * readset, fd_set * writeset)
 /*
   this is where it all happens...
 */
-int main_loop(void)
-{
+int main_loop(void) {
        fd_set readset, writeset;
        struct timeval tv;
        int r, maxfd;
@@ -376,7 +371,13 @@ int main_loop(void)
 
                maxfd = build_fdset(&readset, &writeset);
 
+#ifdef HAVE_MINGW
+               LeaveCriticalSection(&mutex);
+#endif
                r = select(maxfd + 1, &readset, &writeset, NULL, &tv);
+#ifdef HAVE_MINGW
+               EnterCriticalSection(&mutex);
+#endif
 
                if(r < 0) {
                        if(errno != EINTR && errno != EAGAIN) {
@@ -411,33 +412,35 @@ int main_loop(void)
                        /* Should we regenerate our key? */
 
                        if(keyexpires < now) {
-                               ifdebug(STATUS) logger(LOG_INFO, _("Regenerating symmetric key"));
+                               avl_node_t *node;
+                               node_t *n;
+
+                               ifdebug(STATUS) logger(LOG_INFO, _("Expiring symmetric keys"));
+
+                               for(node = node_tree->head; node; node = node->next) {
+                                       n = node->data;
+                                       if(n->inkey) {
+                                               free(n->inkey);
+                                               n->inkey = NULL;
+                                       }
+                               }
 
-                               RAND_pseudo_bytes((unsigned char *)myself->key, myself->keylength);
-                               if(myself->cipher)
-                                       EVP_DecryptInit_ex(&packet_ctx, myself->cipher, NULL, (unsigned char *)myself->key, (unsigned char *)myself->key + myself->cipher->key_len);
                                send_key_changed(broadcast, myself);
                                keyexpires = now + keylifetime;
                        }
                }
 
+               if(sigalrm) {
+                       logger(LOG_INFO, _("Flushing event queue"));
+                       expire_events();
+                       sigalrm = false;
+               }
 
                while((event = get_expired_event())) {
                        event->handler(event->data);
                        free_event(event);
                }
 
-               if(sigalrm) {
-                       logger(LOG_INFO, _("Flushing event queue"));
-
-                       while(event_tree->head) {
-                               event = event_tree->head->data;
-                               event->handler(event->data);
-                               event_del(event);
-                       }
-                       sigalrm = false;
-               }
-
                if(sighup) {
                        connection_t *c;
                        avl_node_t *node;
@@ -461,14 +464,7 @@ int main_loop(void)
                        for(node = connection_tree->head; node; node = node->next) {
                                c = node->data;
                                
-                               if(c->outgoing) {
-                                       free(c->outgoing->name);
-                                       freeaddrinfo(c->outgoing->ai);
-                                       free(c->outgoing);
-                                       c->outgoing = NULL;
-                               }
-                               
-                               asprintf(&fname, "%s/hosts/%s", confbase, c->name);
+                               xasprintf(&fname, "%s/hosts/%s", confbase, c->name);
                                if(stat(fname, &s) || s.st_mtime > last_config_check)
                                        terminate_connection(c, c->status.active);
                                free(fname);