/*
- Copyright (C) 2010 Paul Davis
+ Copyright (C) 2010 Paul Davis
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
e.clear ();
if (!_envname.empty()) {
-
+
/* fetch environment from named environment variable, rather than "environ"
*/
if (!estr) {
return;
}
-
- /* parse line by line, and save into "e"
+
+ /* parse line by line, and save into "e"
*/
vector<string> lines;
string estring = *i;
string::size_type equal = estring.find_first_of ('=');
-
+
if (equal == string::npos) {
/* say what? an environ value without = ? */
continue;
}
-
+
string before = estring.substr (0, equal);
string after = estring.substr (equal+1);
-
+
e.insert (pair<string,string>(before,after));
}
-
+
} else {
/* fetch environment from "environ"
*/
for (size_t i = 0; environ[i]; ++i) {
-
+
string estring = environ[i];
string::size_type equal = estring.find_first_of ('=');
-
+
if (equal == string::npos) {
/* say what? an environ value without = ? */
continue;
}
-
+
string before = estring.substr (0, equal);
string after = estring.substr (equal+1);
-
+
e.insert (pair<string,string>(before,after));
}
}
-}
+}
void
EnvironmentalProtectionAgency::restore () const
{
for (map<string,string>::const_iterator i = e.begin(); i != e.end(); ++i) {
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.
+ */
+
+ vector<string> ecopy;
+
+ for (size_t i = 0; environ[i]; ++i) {
+ ecopy.push_back (environ[i]);
+ }
+
+ for (vector<string>::const_iterator e = ecopy.begin(); e != ecopy.end(); ++e) {
+ string::size_type equal = (*e).find_first_of ('=');
- for (size_t i = 0; the_environ[i]; ++i) {
-
- string estring = the_environ[i];
- string::size_type equal = estring.find_first_of ('=');
-
if (equal == string::npos) {
/* say what? an environ value without = ? */
continue;
}
-
- string before = estring.substr (0, equal);
- g_unsetenv(before.c_str());
+
+ string var_name = (*e).substr (0, equal);
+ g_unsetenv(var_name.c_str());
}
}