diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-10-27 00:46:59 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-10-27 00:46:59 +0000 |
commit | 9397cd30c8a6ffd65fc3b85985ea59ecfb72672b (patch) | |
tree | a3382c4031b84e518e6d8a133a98cdc84ba8e3d1 /src/libutil/util.cc | |
parent | 0b4ed64d295316146fc4de8a5a2e971b771058b8 (diff) |
* Support for doing builds in a chroot under Linux. The builder is
executed in a chroot that contains just the Nix store, the temporary
build directory, and a configurable set of additional directories
(/dev and /proc by default). This allows a bit more purity
enforcement: hidden build-time dependencies on directories such as
/usr or /nix/var/nix/profiles are no longer possible. As an added
benefit, accidental network downloads (cf. NIXPKGS-52) are prevented
as well (because files such as /etc/resolv.conf are not available in
the chroot).
However the usefulness of chroots is diminished by the fact that
many builders depend on /bin/sh, so you need /bin in the list of
additional directories. (And then on non-NixOS you need /lib as
well...)
Diffstat (limited to 'src/libutil/util.cc')
-rw-r--r-- | src/libutil/util.cc | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc index d8d3751a1..428b1ff9a 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -350,13 +350,16 @@ Path createTempDir(const Path & tmpRoot) } -void createDirs(const Path & path) +Paths createDirs(const Path & path) { - if (path == "/") return; - createDirs(dirOf(path)); - if (!pathExists(path)) + if (path == "/") return Paths(); + Paths created = createDirs(dirOf(path)); + if (!pathExists(path)) { if (mkdir(path.c_str(), 0777) == -1) throw SysError(format("creating directory `%1%'") % path); + created.push_back(path); + } + return created; } @@ -509,14 +512,25 @@ string drainFD(int fd) ////////////////////////////////////////////////////////////////////// -AutoDelete::AutoDelete(const string & p) : path(p) +AutoDelete::AutoDelete(const string & p, bool recursive) : path(p) { del = true; + this->recursive = recursive; } AutoDelete::~AutoDelete() { - if (del) deletePath(path); + try { + if (del) + if (recursive) + deletePath(path); + else { + if (remove(path.c_str()) == -1) + throw SysError(format("cannot unlink `%1%'") % path); + } + } catch (...) { + ignoreException(); + } } void AutoDelete::cancel() @@ -752,10 +766,10 @@ void killUser(uid_t uid) if (errno != EINTR) throw SysError(format("cannot kill processes for uid `%1%'") % uid); } - + } catch (std::exception & e) { - std::cerr << format("killing processes beloging to uid `%1%': %1%\n") - % uid % e.what(); + std::cerr << format("killing processes beloging to uid `%1%': %1%") + % uid % e.what() << std::endl; quickExit(1); } quickExit(0); |