X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fepa.cc;h=3d3f7477d7dfe56151a809b52398fed86698b1b1;hb=24b418598ad2637f1f929380047f85d2cf2b7b33;hp=8665823d771872fc0de7973986f3d21da501da18;hpb=8e201d18a88d4cf4ca1163c32bdc2400c28ead8d;p=ardour.git diff --git a/libs/pbd/epa.cc b/libs/pbd/epa.cc index 8665823d77..3d3f7477d7 100644 --- a/libs/pbd/epa.cc +++ b/libs/pbd/epa.cc @@ -21,6 +21,7 @@ #include #include "pbd/epa.h" +#include "pbd/strsplit.h" extern char** environ; @@ -29,8 +30,9 @@ using namespace std; EnvironmentalProtectionAgency* EnvironmentalProtectionAgency::_global_epa = 0; -EnvironmentalProtectionAgency::EnvironmentalProtectionAgency (bool arm) +EnvironmentalProtectionAgency::EnvironmentalProtectionAgency (bool arm, const std::string& envname) : _armed (arm) + , _envname (envname) { if (_armed) { save (); @@ -55,29 +57,65 @@ EnvironmentalProtectionAgency::save () { e.clear (); - for (size_t i = 0; environ[i]; ++i) { + if (!_envname.empty()) { + + /* fetch environment from named environment variable, rather than "environ" + */ - string estring = environ[i]; - string::size_type equal = estring.find_first_of ('='); + const char* estr = getenv (_envname.c_str()); - if (equal == string::npos) { - /* say what? an environ value without = ? */ - continue; + if (!estr) { + return; + } + + /* parse line by line, and save into "e" + */ + + vector lines; + split (estr, lines, '\n'); + + for (vector::iterator i = lines.begin(); i != lines.end(); ++i) { + + 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)); } - - string before = estring.substr (0, equal); - string after = estring.substr (equal+1); - - cerr << "Save [" << before << "] = " << after << endl; - - e.insert (pair(before,after)); } } void EnvironmentalProtectionAgency::restore () const { for (map::const_iterator i = e.begin(); i != e.end(); ++i) { - cerr << "Restore [" << i->first << "] = " << i->second << endl; setenv (i->first.c_str(), i->second.c_str(), 1); } }