Clean up environment after executing scripts.
[tinc] / src / process.c
index 4eb1cd8..7500259 100644 (file)
@@ -1,7 +1,7 @@
 /*
     process.c -- process management functions
-    Copyright (C) 1999-2003 Ivo Timmermans <ivo@o2w.nl>,
-                  2000-2003 Guus Sliepen <guus@sliepen.eu.org>
+    Copyright (C) 1999-2004 Ivo Timmermans <ivo@tinc-vpn.org>,
+                  2000-2004 Guus Sliepen <guus@tinc-vpn.org>
 
     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: process.c,v 1.1.2.77 2003/11/27 23:24:59 guus Exp $
+    $Id$
 */
 
 #include "system.h"
@@ -338,7 +338,7 @@ bool detach(void)
                /* Now UPDATE the pid in the pidfile, because we changed it... */
 
                if(!write_pid(pidfilename)) {
-                       fprintf(stderr, _("Could not write pidfile %s: %s\n"), pidfilename, strerror(errno));
+                       fprintf(stderr, _("Could not write pid file %s: %s\n"), pidfilename, strerror(errno));
                        return false;
                }
 #else
@@ -363,6 +363,7 @@ bool execute_script(const char *name, char **envp)
        int status, len;
        struct stat s;
        char *scriptname;
+       int i;
 
        cp();
 
@@ -386,8 +387,8 @@ bool execute_script(const char *name, char **envp)
 #ifdef HAVE_PUTENV
        /* Set environment */
        
-       while(*envp)
-               putenv(*envp++);
+       for(i = 0; envp[i]; i++)
+               putenv(envp[i]);
 #endif
 
        scriptname[len - 1] = '\"';
@@ -395,7 +396,13 @@ bool execute_script(const char *name, char **envp)
 
        free(scriptname);
 
-       /* Unset environment? */
+       /* Unset environment */
+
+       for(i = 0; envp[i]; i++) {
+               char *e = strchr(envp[i], '=');
+               if(e)
+                       putenv(strndupa(envp[i], e - envp[i]));
+       }
 
 #ifdef WEXITSTATUS
        if(status != -1) {
@@ -431,13 +438,19 @@ bool execute_script(const char *name, char **envp)
 static RETSIGTYPE sigterm_handler(int a)
 {
        logger(LOG_NOTICE, _("Got %s signal"), "TERM");
-       running = false;
+       if(running)
+               running = false;
+       else
+               exit(1);
 }
 
 static RETSIGTYPE sigquit_handler(int a)
 {
        logger(LOG_NOTICE, _("Got %s signal"), "QUIT");
-       running = false;
+       if(running)
+               running = false;
+       else
+               exit(1);
 }
 
 static RETSIGTYPE fatal_signal_square(int a)