aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-06-17 14:45:12 +0200
committerEelco Dolstra <edolstra@gmail.com>2019-06-17 14:45:12 +0200
commitd6c4fe55db57c46aa113dc2f88e60b4a5e55ccf9 (patch)
tree60d14149505f5ddb550672419ec7193880f19c0c /src
parent415fc233e3f01a3bb3cfac01deb9f4ca4af7fb19 (diff)
parent4b214e6e4566a52fa073166d8164b79627eb5601 (diff)
Merge remote-tracking branch 'origin/master' into flakes
Diffstat (limited to 'src')
-rw-r--r--src/libmain/common-args.cc9
-rw-r--r--src/libmain/shared.cc4
-rw-r--r--src/libstore/build.cc62
-rw-r--r--src/nix-daemon/nix-daemon.cc2
-rw-r--r--src/nix/main.cc1
5 files changed, 65 insertions, 13 deletions
diff --git a/src/libmain/common-args.cc b/src/libmain/common-args.cc
index 4c35a4199..9e1d7cee6 100644
--- a/src/libmain/common-args.cc
+++ b/src/libmain/common-args.cc
@@ -35,6 +35,15 @@ MixCommonArgs::MixCommonArgs(const string & programName)
}
});
+ mkFlag()
+ .longName("max-jobs")
+ .shortName('j')
+ .label("jobs")
+ .description("maximum number of parallel builds")
+ .handler([=](std::string s) {
+ settings.set("max-jobs", s);
+ });
+
std::string cat = "config";
globalConfig.convertToArgs(*this, cat);
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index 4ed34e54d..cd752f467 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -175,10 +175,6 @@ LegacyArgs::LegacyArgs(const std::string & programName,
.description("build from source if substitution fails")
.set(&(bool&) settings.tryFallback, true);
- mkFlag1('j', "max-jobs", "jobs", "maximum number of parallel builds", [=](std::string s) {
- settings.set("max-jobs", s);
- });
-
auto intSettingAlias = [&](char shortName, const std::string & longName,
const std::string & description, const std::string & dest) {
mkFlag<unsigned int>(shortName, longName, description, [=](unsigned int n) {
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index a69592219..5187750cf 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -38,6 +38,7 @@
#include <unistd.h>
#include <errno.h>
#include <cstring>
+#include <termios.h>
#include <pwd.h>
#include <grp.h>
@@ -1558,8 +1559,8 @@ void DerivationGoal::buildDone()
if (hook) {
hook->builderOut.readSide = -1;
hook->fromHook.readSide = -1;
- }
- else builderOut.readSide = -1;
+ } else
+ builderOut.readSide = -1;
/* Close the log file. */
closeLogFile();
@@ -2181,7 +2182,48 @@ void DerivationGoal::startBuilder()
Path logFile = openLogFile();
/* Create a pipe to get the output of the builder. */
- builderOut.create();
+ //builderOut.create();
+
+ builderOut.readSide = posix_openpt(O_RDWR | O_NOCTTY);
+ if (!builderOut.readSide)
+ throw SysError("opening pseudoterminal master");
+
+ std::string slaveName(ptsname(builderOut.readSide.get()));
+
+ if (buildUser) {
+ if (chmod(slaveName.c_str(), 0600))
+ throw SysError("changing mode of pseudoterminal slave");
+
+ if (chown(slaveName.c_str(), buildUser->getUID(), 0))
+ throw SysError("changing owner of pseudoterminal slave");
+ } else {
+ if (grantpt(builderOut.readSide.get()))
+ throw SysError("granting access to pseudoterminal slave");
+ }
+
+ #if 0
+ // Mount the pt in the sandbox so that the "tty" command works.
+ // FIXME: this doesn't work with the new devpts in the sandbox.
+ if (useChroot)
+ dirsInChroot[slaveName] = {slaveName, false};
+ #endif
+
+ if (unlockpt(builderOut.readSide.get()))
+ throw SysError("unlocking pseudoterminal");
+
+ builderOut.writeSide = open(slaveName.c_str(), O_RDWR | O_NOCTTY);
+ if (!builderOut.writeSide)
+ throw SysError("opening pseudoterminal slave");
+
+ // Put the pt into raw mode to prevent \n -> \r\n translation.
+ struct termios term;
+ if (tcgetattr(builderOut.writeSide.get(), &term))
+ throw SysError("getting pseudoterminal attributes");
+
+ cfmakeraw(&term);
+
+ if (tcsetattr(builderOut.writeSide.get(), TCSANOW, &term))
+ throw SysError("putting pseudoterminal into raw mode");
result.startTime = time(0);
@@ -2406,6 +2448,9 @@ void DerivationGoal::initEnv()
may change that in the future. So tell the builder which file
descriptor to use for that. */
env["NIX_LOG_FD"] = "2";
+
+ /* Trigger colored output in various tools. */
+ env["TERM"] = "xterm-256color";
}
@@ -4361,14 +4406,15 @@ void Worker::waitForInput()
for (auto & k : fds2) {
if (FD_ISSET(k, &fds)) {
ssize_t rd = read(k, buffer.data(), buffer.size());
- if (rd == -1) {
- if (errno != EINTR)
- throw SysError(format("reading from %1%")
- % goal->getName());
- } else if (rd == 0) {
+ // FIXME: is there a cleaner way to handle pt close
+ // than EIO? Is this even standard?
+ if (rd == 0 || (rd == -1 && errno == EIO)) {
debug(format("%1%: got EOF") % goal->getName());
goal->handleEOF(k);
j->fds.erase(k);
+ } else if (rd == -1) {
+ if (errno != EINTR)
+ throw SysError("%s: read failed", goal->getName());
} else {
printMsg(lvlVomit, format("%1%: read %2% bytes")
% goal->getName() % rd);
diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc
index 8d63b8f36..e88aaf636 100644
--- a/src/nix-daemon/nix-daemon.cc
+++ b/src/nix-daemon/nix-daemon.cc
@@ -574,7 +574,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
else if (setSubstituters(settings.extraSubstituters))
;
else
- debug("ignoring untrusted setting '%s'", name);
+ warn("ignoring the user-specified setting '%s', because it is a restricted setting and you are not a trusted user", name);
} catch (UsageError & e) {
warn(e.what());
}
diff --git a/src/nix/main.cc b/src/nix/main.cc
index a1fcb892a..80b77cc71 100644
--- a/src/nix/main.cc
+++ b/src/nix/main.cc
@@ -45,6 +45,7 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
mkFlag()
.longName("print-build-logs")
+ .shortName('L')
.description("print full build logs on stderr")
.set(&printBuildLogs, true);