aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2010-12-17 11:28:26 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2010-12-17 11:28:26 +0000
commitb1eb25217217087cb70a730da5311bd0890cf6ad (patch)
treea95273ff41849891960d878d9935bb82771bafcd /src
parenteac93d6efeba68d9da95f01e10cd859eef6d85dd (diff)
* Propagate the "100" exit status for failed builds through the Nix
daemon.
Diffstat (limited to 'src')
-rw-r--r--src/libstore/remote-store.cc7
-rw-r--r--src/libstore/worker-protocol.hh2
-rw-r--r--src/nix-worker/nix-worker.cc5
3 files changed, 9 insertions, 5 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 26093a5d3..ae99846a3 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -509,8 +509,11 @@ void RemoteStore::processStderr(Sink * sink, Source * source)
writeToStderr((const unsigned char *) s.c_str(), s.size());
}
}
- if (msg == STDERR_ERROR)
- throw Error(readString(from));
+ if (msg == STDERR_ERROR) {
+ string error = readString(from);
+ unsigned int status = GET_PROTOCOL_MINOR(daemonVersion) >= 8 ? readInt(from) : 1;
+ throw Error(error, status);
+ }
else if (msg != STDERR_LAST)
throw Error("protocol error processing standard error");
}
diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh
index d77049bc7..acb8bc8b2 100644
--- a/src/libstore/worker-protocol.hh
+++ b/src/libstore/worker-protocol.hh
@@ -8,7 +8,7 @@ namespace nix {
#define WORKER_MAGIC_1 0x6e697863
#define WORKER_MAGIC_2 0x6478696f
-#define PROTOCOL_VERSION 0x107
+#define PROTOCOL_VERSION 0x108
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
diff --git a/src/nix-worker/nix-worker.cc b/src/nix-worker/nix-worker.cc
index ec5ca58aa..0fa1b40ae 100644
--- a/src/nix-worker/nix-worker.cc
+++ b/src/nix-worker/nix-worker.cc
@@ -178,7 +178,7 @@ static void startWork()
/* stopWork() means that we're done; stop sending stderr to the
client. */
-static void stopWork(bool success = true, const string & msg = "")
+static void stopWork(bool success = true, const string & msg = "", unsigned int status = 0)
{
/* Stop handling async client death; we're going to a state where
we're either sending or receiving from the client, so we'll be
@@ -192,6 +192,7 @@ static void stopWork(bool success = true, const string & msg = "")
else {
writeInt(STDERR_ERROR, to);
writeString(msg, to);
+ if (status != 0) writeInt(status, to);
}
}
@@ -637,7 +638,7 @@ static void processConnection()
try {
performOp(clientVersion, from, to, op);
} catch (Error & e) {
- stopWork(false, e.msg());
+ stopWork(false, e.msg(), GET_PROTOCOL_MINOR(clientVersion) >= 8 ? e.status : 0);
}
assert(!canSendStderr);