Replace asprintf() by xasprintf().
[tinc] / src / graph.c
index eadb36a..a267f05 100644 (file)
@@ -1,6 +1,6 @@
 /*
     graph.c -- graph algorithms
-    Copyright (C) 2001-2006 Guus Sliepen <guus@tinc-vpn.org>,
+    Copyright (C) 2001-2009 Guus Sliepen <guus@tinc-vpn.org>,
                   2001-2005 Ivo Timmermans
 
     This program is free software; you can redistribute it and/or modify
@@ -57,6 +57,7 @@
 #include "process.h"
 #include "subnet.h"
 #include "utils.h"
+#include "xalloc.h"
 
 static bool graph_changed = true;
 
@@ -101,7 +102,13 @@ void mst_kruskal(void)
 
        /* Starting point */
 
-       ((edge_t *) edge_weight_tree->head->data)->from->status.visited = true;
+       for(node = edge_weight_tree->head; node; node = node->next) {
+               e = node->data;
+               if(e->from->status.reachable) {
+                       e->from->status.visited = true;
+                       break;
+               }
+       }
 
        /* Add safe edges */
 
@@ -220,27 +227,8 @@ void sssp_bfs(void)
                        e->to->via = indirect ? n->via : e->to;
                        e->to->options = e->options;
 
-                       if(sockaddrcmp(&e->to->address, &e->address)) {
-                               node = avl_unlink(node_udp_tree, e->to);
-                               sockaddrfree(&e->to->address);
-                               sockaddrcpy(&e->to->address, &e->address);
-
-                               if(e->to->hostname)
-                                       free(e->to->hostname);
-
-                               e->to->hostname = sockaddr2hostname(&e->to->address);
-
-                               if(node)
-                                       avl_insert_node(node_udp_tree, node);
-
-                               if(e->to->options & OPTION_PMTU_DISCOVERY) {
-                                       e->to->mtuprobes = 0;
-                                       e->to->minmtu = 0;
-                                       e->to->maxmtu = MTU;
-                                       if(e->to->status.validkey)
-                                               send_mtu_probe(e->to);
-                               }
-                       }
+                       if(e->to->address.sa.sa_family == AF_UNSPEC && e->address.sa.sa_family != AF_UNKNOWN)
+                               update_node_udp(e->to, &e->address);
 
                        list_insert_tail(todo_list, e->to);
                }
@@ -263,13 +251,13 @@ void sssp_bfs(void)
                        if(n->status.reachable) {
                                ifdebug(TRAFFIC) logger(LOG_DEBUG, _("Node %s (%s) became reachable"),
                                           n->name, n->hostname);
-                               avl_insert(node_udp_tree, n);
                        } else {
                                ifdebug(TRAFFIC) logger(LOG_DEBUG, _("Node %s (%s) became unreachable"),
                                           n->name, n->hostname);
-                               avl_delete(node_udp_tree, n);
                        }
 
+                       /* TODO: only clear status.validkey if node is unreachable? */
+
                        n->status.validkey = false;
                        n->status.waitingforkey = false;
 
@@ -277,18 +265,23 @@ void sssp_bfs(void)
                        n->minmtu = 0;
                        n->mtuprobes = 0;
 
-                       asprintf(&envp[0], "NETNAME=%s", netname ? : "");
-                       asprintf(&envp[1], "DEVICE=%s", device ? : "");
-                       asprintf(&envp[2], "INTERFACE=%s", iface ? : "");
-                       asprintf(&envp[3], "NODE=%s", n->name);
+                       if(n->mtuevent) {
+                               event_del(n->mtuevent);
+                               n->mtuevent = NULL;
+                       }
+
+                       xasprintf(&envp[0], "NETNAME=%s", netname ? : "");
+                       xasprintf(&envp[1], "DEVICE=%s", device ? : "");
+                       xasprintf(&envp[2], "INTERFACE=%s", iface ? : "");
+                       xasprintf(&envp[3], "NODE=%s", n->name);
                        sockaddr2str(&n->address, &address, &port);
-                       asprintf(&envp[4], "REMOTEADDRESS=%s", address);
-                       asprintf(&envp[5], "REMOTEPORT=%s", port);
+                       xasprintf(&envp[4], "REMOTEADDRESS=%s", address);
+                       xasprintf(&envp[5], "REMOTEPORT=%s", port);
                        envp[6] = NULL;
 
                        execute_script(n->status.reachable ? "host-up" : "host-down", envp);
 
-                       asprintf(&name,
+                       xasprintf(&name,
                                         n->status.reachable ? "hosts/%s-up" : "hosts/%s-down",
                                         n->name);
                        execute_script(name, envp);
@@ -307,8 +300,9 @@ void sssp_bfs(void)
 
 void graph(void)
 {
-       mst_kruskal();
+       subnet_cache_flush();
        sssp_bfs();
+       mst_kruskal();
        graph_changed = true;
 }
 
@@ -338,7 +332,7 @@ void dump_graph(void)
        if(filename[0] == '|') {
                file = popen(filename + 1, "w");
        } else {
-               asprintf(&tmpname, "%s.new", filename);
+               xasprintf(&tmpname, "%s.new", filename);
                file = fopen(tmpname, "w");
        }
 
@@ -368,6 +362,9 @@ void dump_graph(void)
                pclose(file);
        } else {
                fclose(file);
+#ifdef HAVE_MINGW
+               unlink(filename);
+#endif
                rename(tmpname, filename);
                free(tmpname);
        }