Use threads for TCP connections.
[tinc] / src / net.c
index 0e58236..dbff75b 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -36,6 +36,9 @@
 #include "subnet.h"
 #include "xalloc.h"
 
+int contradicting_add_edge = 0;
+int contradicting_del_edge = 0;
+
 /* Purge edges and subnets of unreachable nodes. Use carefully. */
 
 void purge(void) {
@@ -189,10 +192,23 @@ static void timeout_handler(int fd, short events, void *event) {
                }
        }
 
+       if(contradicting_del_edge && contradicting_add_edge) {
+               logger(LOG_WARNING, "Possible node with same Name as us!");
+
+               if(rand() % 3 == 0) {
+                       logger(LOG_ERR, "Shutting down, check configuration of all nodes for duplicate Names!");
+                       event_loopexit(NULL);
+                       return;
+               }
+
+               contradicting_add_edge = 0;
+               contradicting_del_edge = 0;
+       }
+
        event_add(event, &(struct timeval){pingtimeout, 0});
 }
 
-void handle_meta_connection_data(int fd, short events, void *data) {
+void handle_meta_connection_data(void *data) {
        connection_t *c = data;
        int result;
        socklen_t len = sizeof result;
@@ -214,9 +230,11 @@ void handle_meta_connection_data(int fd, short events, void *data) {
                }
        }
 
-       if (!receive_meta(c)) {
-               terminate_connection(c, c->status.active);
-               return;
+       while(true) {
+               if (!receive_meta(c)) {
+                       terminate_connection(c, c->status.active);
+                       return;
+               }
        }
 }
 
@@ -275,6 +293,7 @@ int reload_configuration(void) {
        if(strictsubnets) {
                subnet_t *subnet;
 
+
                for(node = subnet_tree->head; node; node = node->next) {
                        subnet = node->data;
                        subnet->expires = 1;