On MacOS X 10.5, I'm seeing this test failure: test-pipe-filter-gi2-main.c:89: assertion failed FAIL: test-pipe-filter-gi2.sh
The reason is that pipe-filter-gi.c assumes that create_pipe_bidi sets errno when it fails, but it does not actually do so. This fixes it. 2010-03-20 Bruno Haible <br...@clisp.org> pipe: Set errno upon failure. * lib/pipe.h: Specify that when -1 is returned, errno is set. * lib/pipe.c (create_pipe): Set errno when returning -1. Use the right errno value in error message. --- lib/pipe.c.orig Sat Mar 20 17:18:07 2010 +++ lib/pipe.c Sat Mar 20 17:13:15 2010 @@ -128,6 +128,7 @@ int nulloutfd; int stdinfd; int stdoutfd; + int saved_errno; /* FIXME: Need to free memory allocated by prepare_spawn. */ prog_argv = prepare_spawn (prog_argv); @@ -203,6 +204,8 @@ (const char **) environ); } } + if (child == -1) + saved_errno = errno; if (stdinfd >= 0) close (stdinfd); if (stdoutfd >= 0) @@ -225,12 +228,13 @@ if (child == -1) { if (exit_on_error || !null_stderr) - error (exit_on_error ? EXIT_FAILURE : 0, errno, + error (exit_on_error ? EXIT_FAILURE : 0, saved_errno, _("%s subprocess failed"), progname); if (pipe_stdout) close (ifd[0]); if (pipe_stdin) close (ofd[1]); + errno = saved_errno; return -1; } @@ -350,6 +354,7 @@ close (ofd[0]); close (ofd[1]); } + errno = err; return -1; } posix_spawn_file_actions_destroy (&actions); --- lib/pipe.h.orig Sat Mar 20 17:18:07 2010 +++ lib/pipe.h Sat Mar 20 17:13:14 2010 @@ -36,7 +36,8 @@ one or two file descriptors for communication with the subprocess. If the subprocess creation fails: if exit_on_error is true, the main process exits with an error message; otherwise, an error message is given - if null_stderr is false, then -1 is returned and fd[] remain uninitialized. + if null_stderr is false, then -1 is returned, with errno set, and fd[] + remain uninitialized. After finishing communication, the caller should call wait_subprocess() to get rid of the subprocess in the process table.