diff --git a/src/libstore/build.cc b/src/libstore/build.cc index d1c9f1727..6def0c1c5 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -368,8 +368,6 @@ void commonChildInit(Pipe & logPipe) /* Dup the write side of the logger pipe into stderr. */ if (dup2(logPipe.writeSide, STDERR_FILENO) == -1) throw SysError("cannot pipe standard error into log file"); - logPipe.readSide.close(); - logPipe.writeSide.close(); /* Dup stderr to stdout. */ if (dup2(STDERR_FILENO, STDOUT_FILENO) == -1) @@ -681,12 +679,10 @@ HookInstance::HookInstance() if (chdir("/") == -1) throw SysError("changing into `/"); /* Dup the communication pipes. */ - toHook.writeSide.close(); if (dup2(toHook.readSide, STDIN_FILENO) == -1) throw SysError("dupping to-hook read side"); /* Use fd 4 for the builder's stdout/stderr. */ - builderOut.readSide.close(); if (dup2(builderOut.writeSide, 4) == -1) throw SysError("dupping builder's stdout/stderr"); @@ -2680,8 +2676,6 @@ void SubstitutionGoal::tryToRun() if (dup2(outPipe.writeSide, STDOUT_FILENO) == -1) throw SysError("cannot dup output pipe into stdout"); - outPipe.readSide.close(); - outPipe.writeSide.close(); /* Pass configuration options (including those overriden with --option) to the substituter. */ diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index bcf367d65..d6cdd10d6 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -968,8 +968,6 @@ void LocalStore::startSubstituter(const Path & substituter, RunningSubstituter & with --option) to the substituter. */ setenv("_NIX_OPTIONS", settings.pack().c_str(), 1); - fromPipe.readSide.close(); - toPipe.writeSide.close(); if (dup2(toPipe.readSide, STDIN_FILENO) == -1) throw SysError("dupping stdin"); if (dup2(fromPipe.writeSide, STDOUT_FILENO) == -1) diff --git a/src/libutil/util.cc b/src/libutil/util.cc index bfed96846..7e5d8bb80 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -870,7 +870,13 @@ void killUser(uid_t uid) string runProgram(Path program, bool searchPath, const Strings & args) { checkInterrupt(); - + + std::vector cargs; /* careful with c_str()! */ + cargs.push_back(program.c_str()); + for (Strings::const_iterator i = args.begin(); i != args.end(); ++i) + cargs.push_back(i->c_str()); + cargs.push_back(0); + /* Create a pipe. */ Pipe pipe; pipe.create(); @@ -885,23 +891,15 @@ string runProgram(Path program, bool searchPath, const Strings & args) case 0: /* child */ try { - pipe.readSide.close(); - if (dup2(pipe.writeSide, STDOUT_FILENO) == -1) throw SysError("dupping stdout"); - std::vector cargs; /* careful with c_str()! */ - cargs.push_back(program.c_str()); - for (Strings::const_iterator i = args.begin(); i != args.end(); ++i) - cargs.push_back(i->c_str()); - cargs.push_back(0); - if (searchPath) execvp(program.c_str(), (char * *) &cargs[0]); else execv(program.c_str(), (char * *) &cargs[0]); throw SysError(format("executing `%1%'") % program); - + } catch (std::exception & e) { std::cerr << "error: " << e.what() << std::endl; }