X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fgraph.c;h=7d9caf275660ecab40ae52185f29bcc744aeea1a;hp=53152a545155736e43974f5eabaaba6e23a5d03e;hb=36cbaa32f480b481bf2ee99fd4835586a02ebc60;hpb=d699f3079c658e05f928c358d110d1d27849ea71 diff --git a/src/graph.c b/src/graph.c index 53152a54..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.11 2002/03/24 16:28:27 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: @@ -50,7 +50,7 @@ #include #include "config.h" #include -#if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD) +#ifdef HAVE_SYS_PARAM_H #include #endif #include @@ -63,6 +63,7 @@ #include "edge.h" #include "connection.h" #include "process.h" +#include "device.h" #include "system.h" @@ -157,6 +158,9 @@ void sssp_bfs(void) avl_tree_t *todo_tree; int indirect; char *name; + char *address, *port; + char *envp[7]; + int i; todo_tree = avl_alloc_tree(NULL, NULL); @@ -253,32 +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; - asprintf(&name, "hosts/%s-up", n->name); - execute_script(name); - free(name); - } - } - 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; - asprintf(&name, "hosts/%s-down", n->name); - execute_script(name); - free(name); - } + 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]); } } }