X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fgraph.c;h=8ffd70e455892935b2675bcfa6a1f5061761f737;hp=203942dbdf2ec9d5e9427ed77d262266025dfb70;hb=110ca1958af2465e383b4ca20b67fd0e780f3fb5;hpb=85a841258c1a19282b48c6b8663128568c16d9ab diff --git a/src/graph.c b/src/graph.c index 203942db..8ffd70e4 100644 --- a/src/graph.c +++ b/src/graph.c @@ -1,6 +1,6 @@ /* graph.c -- graph algorithms - Copyright (C) 2001-2013 Guus Sliepen , + Copyright (C) 2001-2014 Guus Sliepen , 2001-2005 Ivo Timmermans This program is free software; you can redistribute it and/or modify @@ -45,7 +45,7 @@ #include "system.h" #include "avl_tree.h" -#include "config.h" +#include "conf.h" #include "connection.h" #include "device.h" #include "edge.h" @@ -156,7 +156,7 @@ static void sssp_bfs(void) { bool indirect; char *name; char *address, *port; - char *envp[7]; + char *envp[8] = {NULL}; int i; todo_list = list_alloc(NULL); @@ -212,9 +212,13 @@ static void sssp_bfs(void) { && (!e->to->status.indirect || indirect)) continue; + // Only update nexthop the first time we visit this node. + + if(!e->to->status.visited) + e->to->nexthop = (n->nexthop == myself) ? e->to : n->nexthop; + 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; @@ -269,7 +273,7 @@ static void sssp_bfs(void) { sockaddr2str(&n->address, &address, &port); xasprintf(&envp[4], "REMOTEADDRESS=%s", address); xasprintf(&envp[5], "REMOTEPORT=%s", port); - envp[6] = NULL; + xasprintf(&envp[6], "NAME=%s", myself->name); execute_script(n->status.reachable ? "host-up" : "host-down", envp); @@ -282,7 +286,7 @@ static void sssp_bfs(void) { free(address); free(port); - for(i = 0; i < 6; i++) + for(i = 0; i < 7; i++) free(envp[i]); subnet_update(n, NULL, n->status.reachable); @@ -336,6 +340,7 @@ void dump_graph(void) { if(!file) { logger(LOG_ERR, "Unable to open graph dump file %s: %s", filename, strerror(errno)); + free(filename); free(tmpname); return; } @@ -363,7 +368,10 @@ void dump_graph(void) { #ifdef HAVE_MINGW unlink(filename); #endif - rename(tmpname, filename); + if(rename(tmpname, filename)) + logger(LOG_ERR, "Could not rename %s to %s: %s\n", tmpname, filename, strerror(errno)); free(tmpname); } + + free(filename); }