util.{hh,cc}: Split out child.{hh,cc}

Change-Id: Iec4824e071f537b17dd62dbb8c01b8eec14e9783
This commit is contained in:
Tom Hubrecht 2024-05-28 13:44:39 +02:00
parent 2473e1253d
commit e81ed5f12d
7 changed files with 48 additions and 35 deletions

View file

@ -0,0 +1,33 @@
#include "current-process.hh"
#include "logging.hh"
namespace nix {
void commonChildInit()
{
logger = makeSimpleLogger();
const static std::string pathNullDevice = "/dev/null";
restoreProcessContext(false);
/* 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 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);
}
}

View file

@ -0,0 +1,11 @@
#pragma once
///@file
namespace nix {
/**
* Common initialisation performed in child processes.
*/
void commonChildInit();
}

View file

@ -1,3 +1,4 @@
#include "child.hh"
#include "file-system.hh" #include "file-system.hh"
#include "globals.hh" #include "globals.hh"
#include "hook-instance.hh" #include "hook-instance.hh"

View file

@ -14,6 +14,7 @@
#include "cgroup.hh" #include "cgroup.hh"
#include "personality.hh" #include "personality.hh"
#include "namespaces.hh" #include "namespaces.hh"
#include "child.hh"
#include <regex> #include <regex>
#include <queue> #include <queue>

View file

@ -79,6 +79,7 @@ libstore_sources = files(
'store-api.cc', 'store-api.cc',
'uds-remote-store.cc', 'uds-remote-store.cc',
'worker-protocol.cc', 'worker-protocol.cc',
'build/child.cc',
'build/derivation-goal.cc', 'build/derivation-goal.cc',
'build/drv-output-substitution-goal.cc', 'build/drv-output-substitution-goal.cc',
'build/entry-points.cc', 'build/entry-points.cc',
@ -96,6 +97,7 @@ libstore_sources = files(
libstore_headers = files( libstore_headers = files(
'binary-cache-store.hh', 'binary-cache-store.hh',
'build/child.hh',
'build/derivation-goal.hh', 'build/derivation-goal.hh',
'build/drv-output-substitution-goal.hh', 'build/drv-output-substitution-goal.hh',
'build/goal.hh', 'build/goal.hh',

View file

@ -559,33 +559,4 @@ std::string showBytes(uint64_t bytes)
return fmt("%.2f MiB", bytes / (1024.0 * 1024.0)); return fmt("%.2f MiB", bytes / (1024.0 * 1024.0));
} }
// FIXME: move to libstore/build
void commonChildInit()
{
logger = makeSimpleLogger();
const static std::string pathNullDevice = "/dev/null";
restoreProcessContext(false);
/* 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 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);
}
} }

View file

@ -406,12 +406,6 @@ struct MaintainCount
}; };
/**
* Common initialisation performed in child processes.
*/
void commonChildInit();
/** /**
* Bind a Unix domain socket to a path. * Bind a Unix domain socket to a path.
*/ */