X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fepa.cc;h=4af2029308559273775c628cd058a4180fffc7d7;hb=e7a154b9dd8ed43a77424f8624ce61db0fa390d9;hp=c7a1d41b0ebd8566f6aedc0240c455d5d95cef41;hpb=a882e96db1367c26660fd3d3079e9e3e19b1e149;p=ardour.git diff --git a/libs/pbd/epa.cc b/libs/pbd/epa.cc index c7a1d41b0e..4af2029308 100644 --- a/libs/pbd/epa.cc +++ b/libs/pbd/epa.cc @@ -1,5 +1,5 @@ /* - 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 @@ -64,7 +64,7 @@ EnvironmentalProtectionAgency::save () e.clear (); if (!_envname.empty()) { - + /* fetch environment from named environment variable, rather than "environ" */ @@ -73,8 +73,8 @@ EnvironmentalProtectionAgency::save () if (!estr) { return; } - - /* parse line by line, and save into "e" + + /* parse line by line, and save into "e" */ vector lines; @@ -84,40 +84,40 @@ EnvironmentalProtectionAgency::save () 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(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(before,after)); } } -} +} void EnvironmentalProtectionAgency::restore () const { @@ -126,24 +126,31 @@ EnvironmentalProtectionAgency::restore () const for (map::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 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 ('='); - 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()); } }