util.{hh,cc}: Split out child.{hh,cc}
Change-Id: Iec4824e071f537b17dd62dbb8c01b8eec14e9783
This commit is contained in:
parent
2473e1253d
commit
e81ed5f12d
33
src/libstore/build/child.cc
Normal file
33
src/libstore/build/child.cc
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
11
src/libstore/build/child.hh
Normal file
11
src/libstore/build/child.hh
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#pragma once
|
||||||
|
///@file
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Common initialisation performed in child processes.
|
||||||
|
*/
|
||||||
|
void commonChildInit();
|
||||||
|
|
||||||
|
}
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue