*/
+#include <glib.h>
+
#include <cstdlib>
-#include <iostream>
#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;
/* 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;
void
EnvironmentalProtectionAgency::restore () const
{
+ clear ();
+
for (map<string,string>::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
+{
+ /* 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 ('=');
+
+ if (equal == string::npos) {
+ /* say what? an environ value without = ? */
+ continue;
+ }
+
+ string var_name = (*e).substr (0, equal);
+ g_unsetenv(var_name.c_str());
+ }
+}