mirror of
https://github.com/NixOS/nix
synced 2024-10-18 00:16:11 -04:00
6c861b9c51
This ended up motivating a good deal of other infra improvements in order to get Windows right: - `OsString` to complement `std::filesystem::path` - env var code for working with the underlying `OsString`s - Rename `PATHNG_LITERAL` to `OS_STR` - `NativePathTrait` renamed to `OsPathTrait`, given a character template parameter until #9205 is complete. Split `tests.cc` matching split of `util.{cc,hh}` last year. Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
52 lines
1.1 KiB
C++
52 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());
|
|
}
|
|
|
|
}
|