From 36cbaa32f480b481bf2ee99fd4835586a02ebc60 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Wed, 10 Jul 2002 11:27:06 +0000 Subject: [PATCH] Allow list of environment variables to be passed to execute_script(). When executing host-up/down scripts, include the address and port of the remote host. --- src/graph.c | 62 +++++++++++++++++++++++++++++-------------------- src/net_setup.c | 25 +++++++++++++++++--- src/process.c | 37 +++++++---------------------- src/process.h | 4 ++-- 4 files changed, 69 insertions(+), 59 deletions(-) diff --git a/src/graph.c b/src/graph.c index 7f51c44e..7d9caf27 100644 --- a/src/graph.c +++ b/src/graph.c @@ -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.13 2002/06/21 10:11:12 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: @@ -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]); } } } diff --git a/src/net_setup.c b/src/net_setup.c index fc93e9c3..2884c50a 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -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: net_setup.c,v 1.1.2.20 2002/06/21 10:11:12 guus Exp $ + $Id: net_setup.c,v 1.1.2.21 2002/07/10 11:27:06 guus Exp $ */ #include "config.h" @@ -523,6 +523,8 @@ cp */ int setup_network_connections(void) { + char *envp[4]; + int i; cp now = time(NULL); @@ -547,7 +549,15 @@ cp return -1; /* Run tinc-up script to further initialize the tap interface */ - execute_script("tinc-up"); + asprintf(&envp[0], "NETNAME=%s", netname?netname:""); + asprintf(&envp[1], "DEVICE=%s", device?device:""); + asprintf(&envp[2], "INTERFACE=%s", interface?interface:""); + envp[3] = NULL; + + execute_script("tinc-up", envp); + + for(i = 0; i < 4; i++) + free(envp[i]); if(setup_myself() < 0) return -1; @@ -564,6 +574,7 @@ void close_network_connections(void) { avl_node_t *node, *next; connection_t *c; + char *envp[4]; int i; cp for(node = connection_tree->head; node; node = next) @@ -591,7 +602,15 @@ cp exit_nodes(); exit_connections(); - execute_script("tinc-down"); + asprintf(&envp[0], "NETNAME=%s", netname?netname:""); + asprintf(&envp[1], "DEVICE=%s", device?device:""); + asprintf(&envp[2], "INTERFACE=%s", interface?interface:""); + envp[3] = NULL; + + execute_script("tinc-down", envp); + + for(i = 0; i < 4; i++) + free(envp[i]); close_device(); cp diff --git a/src/process.c b/src/process.c index 9d1c489f..8e701b2e 100644 --- a/src/process.c +++ b/src/process.c @@ -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: process.c,v 1.1.2.41 2002/06/21 10:11:13 guus Exp $ + $Id: process.c,v 1.1.2.42 2002/07/10 11:27:06 guus Exp $ */ #include "config.h" @@ -207,35 +207,14 @@ cp Execute the program name, with sane environment. All output will be redirected to syslog. */ -void _execute_script(const char *scriptname) __attribute__ ((noreturn)); -void _execute_script(const char *scriptname) +void _execute_script(const char *scriptname, char **envp) __attribute__ ((noreturn)); +void _execute_script(const char *scriptname, char **envp) { char *s; cp -#ifdef HAVE_UNSETENV - unsetenv("NETNAME"); - unsetenv("DEVICE"); - unsetenv("INTERFACE"); -#endif - - if(netname) - { - asprintf(&s, "NETNAME=%s", netname); - putenv(s); /* Don't free s! see man 3 putenv */ - } - - if(device) - { - asprintf(&s, "DEVICE=%s", device); - putenv(s); /* Don't free s! see man 3 putenv */ - } - - if(interface) - { - asprintf(&s, "INTERFACE=%s", interface); - putenv(s); /* Don't free s! see man 3 putenv */ - } - + while(*envp) + putenv(*envp++); + chdir("/"); /* Close all file descriptors */ @@ -253,7 +232,7 @@ cp /* Fork and execute the program pointed to by name. */ -int execute_script(const char *name) +int execute_script(const char *name, char **envp) { pid_t pid; int status; @@ -313,7 +292,7 @@ cp cp /* Child here */ - _execute_script(scriptname); + _execute_script(scriptname, envp); } diff --git a/src/process.h b/src/process.h index 249792a7..6620489b 100644 --- a/src/process.h +++ b/src/process.h @@ -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: process.h,v 1.1.2.11 2002/06/21 10:11:13 guus Exp $ + $Id: process.h,v 1.1.2.12 2002/07/10 11:27:06 guus Exp $ */ #ifndef __TINC_PROCESS_H__ @@ -28,7 +28,7 @@ extern int do_detach; extern void setup_signals(void); -extern int execute_script(const char *); +extern int execute_script(const char *, char **); extern int detach(void); extern int kill_other(int); extern void cleanup_and_exit(int); -- 2.20.1