X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fepa.cc;h=0fc386072fa72c7e4deafeaf5f2151e70b5ffd4a;hb=bdd46bada9dd2750f2c6ae97675038db39658fe0;hp=2d5ec29506fe6c8b54c413a3021f29f2904e296c;hpb=61f879bcee4c8ba471837ad7f6a28339205b85fa;p=ardour.git diff --git a/libs/pbd/epa.cc b/libs/pbd/epa.cc index 2d5ec29506..0fc386072f 100644 --- a/libs/pbd/epa.cc +++ b/libs/pbd/epa.cc @@ -17,13 +17,19 @@ */ +#include + #include -#include #include "pbd/epa.h" #include "pbd/strsplit.h" +#ifdef COMPILER_MSVC +#define environ _environ +_CRTIMP extern char ** _environ; +#else extern char** environ; +#endif using namespace PBD; using namespace std; @@ -62,7 +68,7 @@ EnvironmentalProtectionAgency::save () /* fetch environment from named environment variable, rather than "environ" */ - const char* estr = getenv (_envname.c_str()); + const char* estr = g_getenv (_envname.c_str()); if (!estr) { return; @@ -118,26 +124,33 @@ EnvironmentalProtectionAgency::restore () const clear (); for (map::const_iterator i = e.begin(); i != e.end(); ++i) { - setenv (i->first.c_str(), i->second.c_str(), 1); + g_setenv (i->first.c_str(), i->second.c_str(), 1); } } void EnvironmentalProtectionAgency::clear () const { - char** the_environ = environ; + /* Copy the environment before using (g_)unsetenv() because on some + platforms (maybe all?) this directly modifies the environ array, + cause complications for iterating through it. + */ - for (size_t i = 0; the_environ[i]; ++i) { - - string estring = the_environ[i]; - string::size_type equal = estring.find_first_of ('='); + vector ecopy; + + for (size_t i = 0; environ[i]; ++i) { + ecopy.push_back (environ[i]); + } + + for (vector::const_iterator e = ecopy.begin(); e != ecopy.end(); ++e) { + string::size_type equal = (*e).find_first_of ('='); if (equal == string::npos) { /* say what? an environ value without = ? */ continue; } - string before = estring.substr (0, equal); - unsetenv(before.c_str()); + string var_name = (*e).substr (0, equal); + g_unsetenv(var_name.c_str()); } -} +}