Clear status and options fields of unreachable nodes.
[tinc] / src / graph.c
index 3495f23..586aee8 100644 (file)
@@ -1,6 +1,6 @@
 /*
     graph.c -- graph algorithms
-    Copyright (C) 2001-2011 Guus Sliepen <guus@tinc-vpn.org>,
+    Copyright (C) 2001-2012 Guus Sliepen <guus@tinc-vpn.org>,
                   2001-2005 Ivo Timmermans
 
     This program is free software; you can redistribute it and/or modify
@@ -49,6 +49,7 @@
 #include "connection.h"
 #include "device.h"
 #include "edge.h"
+#include "graph.h"
 #include "logger.h"
 #include "netutl.h"
 #include "node.h"
@@ -65,7 +66,7 @@ static bool graph_changed = true;
    Please note that sorting on weight is already done by add_edge().
 */
 
-void mst_kruskal(void) {
+static void mst_kruskal(void) {
        avl_node_t *node, *next;
        edge_t *e;
        node_t *n;
@@ -146,7 +147,7 @@ void mst_kruskal(void) {
    Running time: O(E)
 */
 
-void sssp_bfs(void) {
+static void sssp_bfs(void) {
        avl_node_t *node, *next, *to;
        edge_t *e;
        node_t *n;
@@ -173,6 +174,7 @@ void sssp_bfs(void) {
        myself->status.visited = true;
        myself->status.indirect = false;
        myself->nexthop = myself;
+       myself->prevedge = NULL;
        myself->via = myself;
        list_insert_head(todo_list, myself);
 
@@ -213,6 +215,7 @@ void sssp_bfs(void) {
                        e->to->status.visited = true;
                        e->to->status.indirect = indirect;
                        e->to->nexthop = (n->nexthop == myself) ? e->to : n->nexthop;
+                       e->to->prevedge = e;
                        e->to->via = indirect ? n->via : e->to;
                        e->to->options = e->options;
 
@@ -284,10 +287,13 @@ void sssp_bfs(void) {
 
                        subnet_update(n, NULL, n->status.reachable);
 
-                       if(!n->status.reachable)
+                       if(!n->status.reachable) {
                                update_node_udp(n, NULL);
-                       else if(n->connection)
+                               memset(&n->status, 0, sizeof n->status);
+                               n->options = 0;
+                       } else if(n->connection) {
                                send_ans_key(n);
+                       }
                }
        }
 }
@@ -312,7 +318,7 @@ void dump_graph(void) {
        node_t *n;
        edge_t *e;
        char *filename = NULL, *tmpname = NULL;
-       FILE *file;
+       FILE *file, *pipe;
        
        if(!graph_changed || !get_config_string(lookup_config(config_tree, "GraphDumpFile"), &filename))
                return;
@@ -322,7 +328,7 @@ void dump_graph(void) {
        ifdebug(PROTOCOL) logger(LOG_NOTICE, "Dumping graph");
        
        if(filename[0] == '|') {
-               file = popen(filename + 1, "w");
+               file = pipe = popen(filename + 1, "w");
        } else {
                xasprintf(&tmpname, "%s.new", filename);
                file = fopen(tmpname, "w");
@@ -351,7 +357,7 @@ void dump_graph(void) {
        fprintf(file, "}\n");   
        
        if(filename[0] == '|') {
-               pclose(file);
+               pclose(pipe);
        } else {
                fclose(file);
 #ifdef HAVE_MINGW