diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-08-01 19:29:03 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-05-11 17:15:44 +0200 |
commit | b732ffd28ddf50d3150e4f276a0e8488e38eaacb (patch) | |
tree | 67f1ad8764ed0758cad3a39d45b15cd567c8e6bd | |
parent | c51374c128cbe1f06acd95ba2d627a118a95aabf (diff) | |
download | guix-b732ffd28ddf50d3150e4f276a0e8488e38eaacb.tar.gz |
Call commonChildInit() before doing chroot init
This ensures that daemon clients see error messages from the chroot setup.
-rw-r--r-- | nix/libstore/build.cc | 10 | ||||
-rw-r--r-- | nix/libutil/util.cc | 18 |
2 files changed, 16 insertions, 12 deletions
diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc index 4376a8322c..348b3bdb0f 100644 --- a/nix/libstore/build.cc +++ b/nix/libstore/build.cc @@ -374,8 +374,6 @@ void Goal::trace(const format & f) /* Common initialisation performed in child processes. */ static void commonChildInit(Pipe & logPipe) { - restoreAffinity(); - /* Put the child in a separate session (and thus a separate process group) so that it has no controlling terminal (meaning that e.g. ssh cannot open /dev/tty) and it doesn't receive @@ -1974,6 +1972,12 @@ void DerivationGoal::initChild() try { /* child */ + _writeToStderr = 0; + + restoreAffinity(); + + commonChildInit(builderOut); + #if CHROOT_ENABLED if (useChroot) { /* Initialise the loopback interface. */ @@ -2092,8 +2096,6 @@ void DerivationGoal::initChild() } #endif - commonChildInit(builderOut); - if (chdir(tmpDir.c_str()) == -1) throw SysError(format("changing into `%1%'") % tmpDir); diff --git a/nix/libutil/util.cc b/nix/libutil/util.cc index 06c8441aed..b79212018b 100644 --- a/nix/libutil/util.cc +++ b/nix/libutil/util.cc @@ -466,10 +466,18 @@ void warnOnce(bool & haveWarned, const FormatOrString & fs) } +static void defaultWriteToStderr(const unsigned char * buf, size_t count) +{ + writeFull(STDERR_FILENO, buf, count); +} + + void writeToStderr(const string & s) { try { - _writeToStderr((const unsigned char *) s.data(), s.size()); + auto p = _writeToStderr; + if (!p) p = defaultWriteToStderr; + p((const unsigned char *) s.data(), s.size()); } catch (SysError & e) { /* Ignore failing writes to stderr if we're in an exception handler, otherwise throw an exception. We need to ignore @@ -481,12 +489,6 @@ void writeToStderr(const string & s) } -static void defaultWriteToStderr(const unsigned char * buf, size_t count) -{ - writeFull(STDERR_FILENO, buf, count); -} - - void (*_writeToStderr) (const unsigned char * buf, size_t count) = defaultWriteToStderr; @@ -849,7 +851,7 @@ pid_t startProcess(std::function<void()> fun, const string & errorPrefix) if (pid == -1) throw SysError("unable to fork"); if (pid == 0) { - _writeToStderr = defaultWriteToStderr; + _writeToStderr = 0; try { restoreAffinity(); fun(); |