ac89bb064a
All OS and IO operations should be moved out, leaving only some misc portable pure functions. This is useful to avoid copious CPP when doing things like Windows and Emscripten ports. Newly exposed functions to break cycles: - `restoreSignals` - `updateWindowSize`
50 lines
1.1 KiB
C++
50 lines
1.1 KiB
C++
#include "util.hh"
|
|
#include "environment-variables.hh"
|
|
|
|
extern char * * environ __attribute__((weak));
|
|
|
|
namespace nix {
|
|
|
|
std::optional<std::string> getEnv(const std::string & key)
|
|
{
|
|
char * value = getenv(key.c_str());
|
|
if (!value) return {};
|
|
return std::string(value);
|
|
}
|
|
|
|
std::optional<std::string> getEnvNonEmpty(const std::string & key) {
|
|
auto value = getEnv(key);
|
|
if (value == "") return {};
|
|
return value;
|
|
}
|
|
|
|
std::map<std::string, std::string> getEnv()
|
|
{
|
|
std::map<std::string, std::string> env;
|
|
for (size_t i = 0; environ[i]; ++i) {
|
|
auto s = environ[i];
|
|
auto eq = strchr(s, '=');
|
|
if (!eq)
|
|
// invalid env, just keep going
|
|
continue;
|
|
env.emplace(std::string(s, eq), std::string(eq + 1));
|
|
}
|
|
return env;
|
|
}
|
|
|
|
|
|
void clearEnv()
|
|
{
|
|
for (auto & name : getEnv())
|
|
unsetenv(name.first.c_str());
|
|
}
|
|
|
|
void replaceEnv(const std::map<std::string, std::string> & newEnv)
|
|
{
|
|
clearEnv();
|
|
for (auto & newEnvVar : newEnv)
|
|
setenv(newEnvVar.first.c_str(), newEnvVar.second.c_str(), 1);
|
|
}
|
|
|
|
}
|