diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2008-08-02 12:54:35 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2008-08-02 12:54:35 +0000 |
commit | 3c92ea399d717dc45b3fa91424c0dadc0239ebf2 (patch) | |
tree | 7cde9f533a6ee575615da5452e04c05dc0939f02 /src/libutil | |
parent | fc691e1cbdcddb8c553cba06d4089bc1b60e3d98 (diff) |
* Make nix-env --dry-run print the paths to be substituted correctly
again. (After the previous substituter mechanism refactoring I
didn't update the code that obtains the references of substitutable
paths.) This required some refactoring: the substituter programs
are now kept running and receive/respond to info requests via
stdin/stdout.
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/util.cc | 22 | ||||
-rw-r--r-- | src/libutil/util.hh | 4 |
2 files changed, 24 insertions, 2 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 4f6c367da..c28f4e1bb 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -579,7 +579,14 @@ AutoCloseFD::AutoCloseFD(int fd) AutoCloseFD::AutoCloseFD(const AutoCloseFD & fd) { - abort(); + /* Copying a AutoCloseFD isn't allowed (who should get to close + it?). But as a edge case, allow copying of closed + AutoCloseFDs. This is necessary due to tiresome reasons + involving copy constructor use on default object values in STL + containers (like when you do `map[value]' where value isn't in + the map yet). */ + this->fd = fd.fd; + if (this->fd != -1) abort(); } @@ -832,7 +839,7 @@ string runProgram(Path program, bool searchPath, const Strings & args) pipe.readSide.close(); if (dup2(pipe.writeSide, STDOUT_FILENO) == -1) - throw SysError("dupping from-hook write side"); + throw SysError("dupping stdout"); std::vector<const char *> cargs; /* careful with c_str()! */ cargs.push_back(program.c_str()); @@ -868,6 +875,17 @@ string runProgram(Path program, bool searchPath, const Strings & args) } +void closeMostFDs(const set<int> & exceptions) +{ + int maxFD = 0; + maxFD = sysconf(_SC_OPEN_MAX); + for (int fd = 0; fd < maxFD; ++fd) + if (fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO + && exceptions.find(fd) == exceptions.end()) + close(fd); /* ignore result */ +} + + void quickExit(int status) { #ifdef __CYGWIN__ diff --git a/src/libutil/util.hh b/src/libutil/util.hh index 5d28a8308..6c67e450b 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -245,6 +245,10 @@ void killUser(uid_t uid); string runProgram(Path program, bool searchPath = false, const Strings & args = Strings()); +/* Close all file descriptors except stdin, stdout, stderr, and those + listed in the given set. Good practice in child processes. */ +void closeMostFDs(const set<int> & exceptions); + /* Wrapper around _exit() on Unix and ExitProcess() on Windows. (On Cygwin, _exit() doesn't seem to do the right thing.) */ void quickExit(int status); |