X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fgraph.c;h=7d9caf275660ecab40ae52185f29bcc744aeea1a;hp=29e25db16f16258330b4244ecdb6072046c882ad;hb=36cbaa32f480b481bf2ee99fd4835586a02ebc60;hpb=f48f8f4fedba365ceea30e1133bf1c560e9a522a diff --git a/src/graph.c b/src/graph.c index 29e25db1..7d9caf27 100644 --- a/src/graph.c +++ b/src/graph.c @@ -1,7 +1,7 @@ /* graph.c -- graph algorithms - Copyright (C) 2001-2002 Guus Sliepen , - 2001-2002 Ivo Timmermans + Copyright (C) 2001-2002 Guus Sliepen , + 2001-2002 Ivo Timmermans 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 @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: graph.c,v 1.1.2.10 2002/03/19 22:48:25 guus Exp $ + $Id: graph.c,v 1.1.2.14 2002/07/10 11:27:06 guus Exp $ */ /* We need to generate two trees from the graph: @@ -44,10 +44,13 @@ destination address and port of a node if possible. */ +#include "config.h" + +#include #include #include "config.h" #include -#if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD) +#ifdef HAVE_SYS_PARAM_H #include #endif #include @@ -59,6 +62,8 @@ #include "node.h" #include "edge.h" #include "connection.h" +#include "process.h" +#include "device.h" #include "system.h" @@ -152,6 +157,10 @@ void sssp_bfs(void) halfconnection_t to_hc, from_hc; avl_tree_t *todo_tree; int indirect; + char *name; + char *address, *port; + char *envp[7]; + int i; todo_tree = avl_alloc_tree(NULL, NULL); @@ -248,26 +257,40 @@ void sssp_bfs(void) next = node->next; n = (node_t *)node->data; - if(n->status.visited) + if(n->status.visited ^ n->status.reachable) { - if(!n->status.reachable) - { - if(debug_lvl >= DEBUG_TRAFFIC) + n->status.reachable = !n->status.reachable; + if(debug_lvl >= DEBUG_TRAFFIC) + if(n->status.reachable) syslog(LOG_DEBUG, _("Node %s (%s) became reachable"), n->name, n->hostname); - n->status.reachable = 1; - } - } - else - { - if(n->status.reachable) - { - if(debug_lvl >= DEBUG_TRAFFIC) - syslog(LOG_DEBUG, _("Node %s (%s) became unreachable"), n->name, n->hostname); - n->status.reachable = 0; - n->status.validkey = 0; - n->status.waitingforkey = 0; - n->sent_seqno = 0; - } + else + syslog(LOG_DEBUG, _("Node %s (%s) became unreachable"), n->name, n->hostname); + + if(!n->status.reachable) + { + n->status.reachable = 0; + n->status.validkey = 0; + n->status.waitingforkey = 0; + n->sent_seqno = 0; + } + + asprintf(&envp[0], "NETNAME=%s", netname?netname:""); + asprintf(&envp[1], "DEVICE=%s", device?device:""); + asprintf(&envp[2], "INTERFACE=%s", interface?interface:""); + asprintf(&envp[3], "NODE=%s", n->name); + sockaddr2str(&n->address, &address, &port); + asprintf(&envp[4], "REMOTEADDRESS=%s", address); + asprintf(&envp[5], "REMOTEPORT=%s", port); + envp[6] = NULL; + + asprintf(&name, n->status.reachable?"hosts/%s-up":"hosts/%s-down", n->name); + execute_script(name, envp); + free(name); + free(address); + free(port); + + for(i = 0; i < 7; i++) + free(envp[i]); } } }