diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-12-05 18:21:16 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-12-05 18:21:16 +0000 |
commit | 6f0d05032410873bd5cdb573b998c7a7939d09b5 (patch) | |
tree | 6ce0e1c578f6681c868d20f59b01b79e3f6117ea /src | |
parent | 4c1c37d0b6f4f8e7331b359617d7071c5e6e42fb (diff) |
* Tricky: child processes should not send data to the client since
that might mess up the protocol. And besides, the socket file
descriptor is probably closed.
Diffstat (limited to 'src')
-rw-r--r-- | src/nix-worker/main.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/nix-worker/main.cc b/src/nix-worker/main.cc index a4372b4a5..a1e080933 100644 --- a/src/nix-worker/main.cc +++ b/src/nix-worker/main.cc @@ -29,6 +29,8 @@ static FdSource from(STDIN_FILENO); static FdSink to(STDOUT_FILENO); bool canSendStderr; +pid_t myPid; + /* This function is called anytime we want to write something to @@ -37,7 +39,11 @@ bool canSendStderr; socket. */ static void tunnelStderr(const unsigned char * buf, size_t count) { - if (canSendStderr) { + /* Don't send the message to the client if we're a child of the + process handling the connection. Otherwise we could screw up + the protocol. It's up to the parent to redirect stderr and + send it to the client somehow (e.g., as in build.cc). */ + if (canSendStderr && myPid == getpid()) { try { writeInt(STDERR_NEXT, to); writeString(string((char *) buf, count), to); @@ -47,7 +53,8 @@ static void tunnelStderr(const unsigned char * buf, size_t count) canSendStderr = false; throw; } - } + } else + writeFull(STDERR_FILENO, buf, count); } @@ -344,6 +351,7 @@ static void performOp(Source & from, Sink & to, unsigned int op) static void processConnection() { canSendStderr = false; + myPid = getpid(); writeToStderr = tunnelStderr; /* Allow us to receive SIGPOLL for events on the client socket. */ |