Mercurial > hg > octave-kai > gnulib-hg
changeset 13018:c898b2f6113c
pipe: Set errno upon failure.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sat, 20 Mar 2010 17:20:29 +0100 |
parents | d4b51e8a5c23 |
children | d30e3f8663c2 |
files | ChangeLog lib/pipe.c lib/pipe.h |
diffstat | 3 files changed, 15 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2010-03-20 Bruno Haible <bruno@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. + 2010-03-20 Bruno Haible <bruno@clisp.org> Jim Meyering <meyering@redhat.com>
--- a/lib/pipe.c +++ b/lib/pipe.c @@ -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);
--- a/lib/pipe.h +++ b/lib/pipe.h @@ -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.