Skip to content

Commit

Permalink
Split out commonChildInit
Browse files Browse the repository at this point in the history
  • Loading branch information
Ericson2314 committed Oct 11, 2020
1 parent 725488b commit aef44cb
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 29 deletions.
29 changes: 0 additions & 29 deletions src/libstore/build.cc
Original file line number Diff line number Diff line change
Expand Up @@ -456,35 +456,6 @@ void Goal::trace(const FormatOrString & fs)
//////////////////////////////////////////////////////////////////////


/* Common initialisation performed in child processes. */
static void commonChildInit(Pipe & logPipe)
{
restoreSignals();

/* 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
terminal signals. */
if (setsid() == -1)
throw SysError("creating a new session");

/* Dup the write side of the logger pipe into stderr. */
if (dup2(logPipe.writeSide.get(), STDERR_FILENO) == -1)
throw SysError("cannot pipe standard error into log file");

/* Dup stderr to stdout. */
if (dup2(STDERR_FILENO, STDOUT_FILENO) == -1)
throw SysError("cannot dup stderr into stdout");

/* Reroute stdin to /dev/null. */
int fdDevNull = open(pathNullDevice.c_str(), O_RDWR);
if (fdDevNull == -1)
throw SysError("cannot open '%1%'", pathNullDevice);
if (dup2(fdDevNull, STDIN_FILENO) == -1)
throw SysError("cannot dup null device into stdin");
close(fdDevNull);
}

void handleDiffHook(
uid_t uid, uid_t gid,
const Path & tryA, const Path & tryB,
Expand Down
29 changes: 29 additions & 0 deletions src/libutil/util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1660,4 +1660,33 @@ string showBytes(uint64_t bytes)
}


void commonChildInit(Pipe & logPipe)
{
const static string pathNullDevice = "/dev/null";
restoreSignals();

/* 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
terminal signals. */
if (setsid() == -1)
throw SysError("creating a new session");

/* Dup the write side of the logger pipe into stderr. */
if (dup2(logPipe.writeSide.get(), STDERR_FILENO) == -1)
throw SysError("cannot pipe standard error into log file");

/* Dup stderr to stdout. */
if (dup2(STDERR_FILENO, STDOUT_FILENO) == -1)
throw SysError("cannot dup stderr into stdout");

/* Reroute stdin to /dev/null. */
int fdDevNull = open(pathNullDevice.c_str(), O_RDWR);
if (fdDevNull == -1)
throw SysError("cannot open '%1%'", pathNullDevice);
if (dup2(fdDevNull, STDIN_FILENO) == -1)
throw SysError("cannot dup null device into stdin");
close(fdDevNull);
}

}
2 changes: 2 additions & 0 deletions src/libutil/util.hh
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,8 @@ typedef std::function<bool(const Path & path)> PathFilter;

extern PathFilter defaultPathFilter;

/* Common initialisation performed in child processes. */
void commonChildInit(Pipe & logPipe);

/* Create a Unix domain socket in listen mode. */
AutoCloseFD createUnixDomainSocket(const Path & path, mode_t mode);
Expand Down

0 comments on commit aef44cb

Please sign in to comment.