<pre style='margin:0'>
Ken (kencu) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/26de0bb48f12cafe3af73aad3d342f51c06c4675">https://github.com/macports/macports-ports/commit/26de0bb48f12cafe3af73aad3d342f51c06c4675</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 26de0bb48f12cafe3af73aad3d342f51c06c4675
</span>Author: Ken Cunningham <ken.cunningham.webuse@gmail.com>
AuthorDate: Sat Feb 23 11:43:36 2019 -0800
<span style='display:block; white-space:pre;color:#404040;'> ninja: freshen Tiger patch
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> all tests pass
</span><span style='display:block; white-space:pre;color:#404040;'> closes: https://trac.macports.org/ticket/58099
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> I'd like to add the posix_spawn functions to legacysupport if possible.
</span><span style='display:block; white-space:pre;color:#404040;'> Otherwise, perhaps we might be able to get upstream to accept
</span><span style='display:block; white-space:pre;color:#404040;'> a version of subprocess_posix.cc that continues to use fork() if
</span><span style='display:block; white-space:pre;color:#404040;'> posix_spawn is not available.
</span>---
devel/ninja/files/patch-tiger-no-posix-spawn.diff | 185 ++++++++++++----------
1 file changed, 97 insertions(+), 88 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/ninja/files/patch-tiger-no-posix-spawn.diff b/devel/ninja/files/patch-tiger-no-posix-spawn.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index 8f29f64..0e8076b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/ninja/files/patch-tiger-no-posix-spawn.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/ninja/files/patch-tiger-no-posix-spawn.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,6 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/subprocess-posix.cc src/subprocess-posix.cc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 1de22c3..75ef0b2 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/subprocess-posix.cc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/subprocess-posix.cc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -22,9 +22,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/subprocess-posix.cc~ 2019-02-18 23:10:37.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/subprocess-posix.cc 2019-02-18 23:17:13.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -23,9 +23,6 @@
</span> #include <stdio.h>
#include <string.h>
#include <sys/wait.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -12,26 +10,30 @@ index 1de22c3..75ef0b2 100644
</span>
#include "util.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -53,63 +50,62 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -54,74 +51,61 @@
</span> #endif // !USE_PPOLL
SetCloseOnExec(fd_);
- posix_spawn_file_actions_t action;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawn_file_actions_init(&action) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawn_file_actions_init: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- int err = posix_spawn_file_actions_init(&action);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawn_file_actions_init: %s", strerror(err));
</span> -
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawn_file_actions_addclose(&action, output_pipe[0]) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawn_file_actions_addclose: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawn_file_actions_addclose(&action, output_pipe[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawn_file_actions_addclose: %s", strerror(err));
</span> -
- posix_spawnattr_t attr;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawnattr_init(&attr) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawnattr_init: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawnattr_init(&attr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawnattr_init: %s", strerror(err));
</span> -
- short flags = 0;
-
- flags |= POSIX_SPAWN_SETSIGMASK;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawnattr_setsigmask(&attr, &set->old_mask_) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawnattr_setsigmask: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawnattr_setsigmask(&attr, &set->old_mask_);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawnattr_setsigmask: %s", strerror(err));
</span> - // Signals which are set to be caught in the calling process image are set to
- // default action in the new process image, so no explicit
- // POSIX_SPAWN_SETSIGDEF parameter is needed.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -42,71 +44,63 @@ index 1de22c3..75ef0b2 100644
</span> - // No need to posix_spawnattr_setpgroup(&attr, 0), it's the default.
-
- // Open /dev/null over stdin.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawn_file_actions_addopen(&action, 0, "/dev/null", O_RDONLY,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- 0) != 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawn_file_actions_addopen: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ pid_ = fork();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (pid_ < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Fatal("fork: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (pid_ == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ close(output_pipe[0]);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Track which fd we use to report errors on.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int error_pipe = output_pipe[1];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (sigaction(SIGINT, &set->old_int_act_, 0) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (sigaction(SIGTERM, &set->old_term_act_, 0) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (sigaction(SIGHUP, &set->old_hup_act_, 0) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (sigprocmask(SIG_SETMASK, &set->old_mask_, 0) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (!use_console_) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Put the child in its own process group, so ctrl-c won't reach it.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (setpgid(0, 0) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Open /dev/null over stdin.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int devnull = open("/dev/null", O_RDONLY);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (devnull < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (dup2(devnull, 0) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ close(devnull);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (dup2(output_pipe[1], 1) < 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ dup2(output_pipe[1], 2) < 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Now can use stderr for errors.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ error_pipe = 2;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ close(output_pipe[1]);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // In the console case, output_pipe is still inherited by the child and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // closed when the subprocess finishes, which then notifies ninja.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ execl("/bin/sh", "/bin/sh", "-c", command.c_str(), (char *) NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ } while (false);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // If we get here, something went wrong; the execl should have
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // replaced us.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char* err = strerror(errno);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (write(error_pipe, err, strlen(err)) < 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // If the write fails, there's nothing we can do.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // But this block seems necessary to silence the warning.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawn_file_actions_addopen(&action, 0, "/dev/null", O_RDONLY,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawn_file_actions_addopen: %s", strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pid_ = fork();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pid_ < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Fatal("fork: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pid_ == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ close(output_pipe[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Track which fd we use to report errors on.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int error_pipe = output_pipe[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sigaction(SIGINT, &set->old_int_act_, 0) < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sigaction(SIGTERM, &set->old_term_act_, 0) < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sigaction(SIGHUP, &set->old_hup_act_, 0) < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (sigprocmask(SIG_SETMASK, &set->old_mask_, 0) < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!use_console_) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Put the child in its own process group, so ctrl-c won't reach it.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (setpgid(0, 0) < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Open /dev/null over stdin.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int devnull = open("/dev/null", O_RDONLY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (devnull < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (dup2(devnull, 0) < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ close(devnull);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (dup2(output_pipe[1], 1) < 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ dup2(output_pipe[1], 2) < 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // Now can use stderr for errors.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ error_pipe = 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ close(output_pipe[1]);
</span> + }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ _exit(1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // In the console case, output_pipe is still inherited by the child and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // closed when the subprocess finishes, which then notifies ninja.
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawn_file_actions_adddup2(&action, output_pipe[1], 1) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawn_file_actions_adddup2: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawn_file_actions_adddup2(&action, output_pipe[1], 2) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawn_file_actions_adddup2: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawn_file_actions_addclose(&action, output_pipe[1]) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawn_file_actions_addclose: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawn_file_actions_adddup2(&action, output_pipe[1], 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawn_file_actions_adddup2: %s", strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawn_file_actions_adddup2(&action, output_pipe[1], 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawn_file_actions_adddup2: %s", strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawn_file_actions_addclose(&action, output_pipe[1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawn_file_actions_addclose: %s", strerror(err));
</span> - // In the console case, output_pipe is still inherited by the child and
- // closed when the subprocess finishes, which then notifies ninja.
- }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -114,22 +108,37 @@ index 1de22c3..75ef0b2 100644
</span> - flags |= POSIX_SPAWN_USEVFORK;
-#endif
-
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawnattr_setflags(&attr, flags) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawnattr_setflags: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawnattr_setflags(&attr, flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawnattr_setflags: %s", strerror(err));
</span> -
- const char* spawned_args[] = { "/bin/sh", "-c", command.c_str(), NULL };
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawn(&pid_, "/bin/sh", &action, &attr,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- const_cast<char**>(spawned_args), environ) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawn: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawnattr_destroy(&attr) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawnattr_destroy: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (posix_spawn_file_actions_destroy(&action) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- Fatal("posix_spawn_file_actions_destroy: %s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawn(&pid_, "/bin/sh", &action, &attr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- const_cast<char**>(spawned_args), environ);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawn: %s", strerror(err));
</span> -
<span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawnattr_destroy(&attr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawnattr_destroy: %s", strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- err = posix_spawn_file_actions_destroy(&action);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (err != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Fatal("posix_spawn_file_actions_destroy: %s", strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ execl("/bin/sh", "/bin/sh", "-c", command.c_str(), (char *) NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } while (false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // If we get here, something went wrong; the execl should have
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // replaced us.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char* err = strerror(errno);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (write(error_pipe, err, strlen(err)) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // If the write fails, there's nothing we can do.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ // But this block seems necessary to silence the warning.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ _exit(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> close(output_pipe[1]);
return true;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span> diff --git src/subprocess_test.cc src/subprocess_test.cc
index 0a8c206..672a2f1 100644
--- src/subprocess_test.cc
</pre><pre style='margin:0'>
</pre>