diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-09-20T13·39+0200 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-09-20T13·41+0200 |
commit | 4de06391058724814756a8c74ae36c279cf34006 (patch) | |
tree | 70a889545dc8a51a1839106da66e9f03e009fcc0 /src/libutil | |
parent | 9fc4cb2ae970f860bc309cbaf40957f53a36d423 (diff) |
nix-shell: Fix $PATH handling in the impure case
We were passing "p=$PATH" rather than "p=$PATH;", resulting in some invalid shell code. Also, construct a separate environment for the child rather than overwriting the parent's.
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/util.cc | 15 | ||||
-rw-r--r-- | src/libutil/util.hh | 5 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 1750e03737b7..c95a713fa112 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -59,6 +59,21 @@ string getEnv(const string & key, const string & def) } +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; +} + + Path absPath(Path path, Path dir) { if (path[0] != '/') { diff --git a/src/libutil/util.hh b/src/libutil/util.hh index 182a38fb3928..221165780a37 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -8,9 +8,11 @@ #include <dirent.h> #include <unistd.h> #include <signal.h> + #include <functional> #include <limits> #include <cstdio> +#include <map> #ifndef HAVE_STRUCT_DIRENT_D_TYPE #define DT_UNKNOWN 0 @@ -25,6 +27,9 @@ namespace nix { /* Return an environment variable. */ string getEnv(const string & key, const string & def = ""); +/* Get the entire environment. */ +std::map<std::string, std::string> getEnv(); + /* Return an absolutized path, resolving paths relative to the specified directory, or the current directory otherwise. The path is also canonicalised. */ |