X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprocess.c;h=a670368ac3c9d56c941d2741f00064f9ad75866a;hp=51c9e2a04f2b04d437554488c1d8f922877ae7b1;hb=013bd456084337974aa0b7f2af49e3d9d1afc74c;hpb=4d53b075d85d7517730109c92cb7c7b09bf69dee diff --git a/src/process.c b/src/process.c index 51c9e2a0..a670368a 100644 --- a/src/process.c +++ b/src/process.c @@ -1,7 +1,7 @@ /* process.c -- process management functions Copyright (C) 1999-2005 Ivo Timmermans, - 2000-2013 Guus Sliepen + 2000-2015 Guus Sliepen 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 @@ -347,6 +347,43 @@ bool detach(void) { return true; } +#ifdef HAVE_PUTENV +void unputenv(char *p) { + char *e = strchr(p, '='); + if(!e) + return; + int len = e - p; +#ifndef HAVE_UNSETENV +#ifdef HAVE_MINGW + // Windows requires putenv("FOO=") to unset %FOO% + len++; +#endif +#endif + char var[len]; + strncpy(var, p, len); +#ifdef HAVE_UNSETENV + unsetenv(var); +#else + // We must keep what we putenv() around in memory. + // To do this without memory leaks, keep things in a list and reuse if possible. + static list_t list = {}; + for(list_node_t *node = list->head; node; node++) { + char *data = node->data; + if(!strcmp(data, var)) { + putenv(data); + return; + } + } + char *data = strcmp(var); + list_insert_tail(list, data); + putenv(data); +#endif +} +#else +void putenv(const char *p) {} +void unputenv(const char *p) {} +#endif + bool execute_script(const char *name, char **envp) { #ifdef HAVE_SYSTEM char *scriptname; @@ -386,12 +423,10 @@ bool execute_script(const char *name, char **envp) { ifdebug(STATUS) logger(LOG_INFO, "Executing script %s", name); -#ifdef HAVE_PUTENV /* Set environment */ for(i = 0; envp[i]; i++) putenv(envp[i]); -#endif scriptname[len - 1] = '\"'; status = system(scriptname); @@ -400,15 +435,8 @@ bool execute_script(const char *name, char **envp) { /* Unset environment */ - for(i = 0; envp[i]; i++) { - char *e = strchr(envp[i], '='); - if(e) { - char p[e - envp[i] + 1]; - strncpy(p, envp[i], e - envp[i]); - p[e - envp[i]] = '\0'; - putenv(p); - } - } + for(i = 0; envp[i]; i++) + unputenv(envp[i]); if(status != -1) { #ifdef WEXITSTATUS