<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>