Allow list of environment variables to be passed to execute_script().
authorGuus Sliepen <guus@tinc-vpn.org>
Wed, 10 Jul 2002 11:27:06 +0000 (11:27 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Wed, 10 Jul 2002 11:27:06 +0000 (11:27 +0000)
When executing host-up/down scripts, include the address and port of the
remote host.

src/graph.c
src/net_setup.c
src/process.c
src/process.h

index 7f51c44eb92eb2d9408f53a724cb17494482ceba..7d9caf275660ecab40ae52185f29bcc744aeea1a 100644 (file)
@@ -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]);
       }
     }
 }
index fc93e9c3f8fce8e3228d03d24f6175e6c9d06a8a..2884c50ab9c637a448014ae4b7e93df976a9e2f4 100644 (file)
@@ -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
index 9d1c489ff88fbd1bbe2f583b40df802444a67649..8e701b2ed737483f69f898838f1d7eac3c11a941 100644 (file)
@@ -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);
 }
 
 
index 249792a701b249c01e6006b69a31748897e6aefd..6620489bbbdee8c1c2438de5e217d49efad49909 100644 (file)
@@ -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);