diff options
author | Bruno Haible <bruno@clisp.org> | 2010-03-20 17:20:29 +0100 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2010-03-20 17:20:29 +0100 |
commit | 062cad2d07081f9a60adbb90fc1184a435a1a93f (patch) | |
tree | 267f1c0aa49dab4304d07987b0302b35f3d3b1e0 /lib | |
parent | b1eaa47f003b6a9a227a56967e2c650515a6432b (diff) | |
download | gnulib-062cad2d07081f9a60adbb90fc1184a435a1a93f.tar.gz |
pipe: Set errno upon failure.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pipe.c | 7 | ||||
-rw-r--r-- | lib/pipe.h | 3 |
2 files changed, 8 insertions, 2 deletions
diff --git a/lib/pipe.c b/lib/pipe.c index 6986525081..1c81d14523 100644 --- a/lib/pipe.c +++ b/lib/pipe.c @@ -128,6 +128,7 @@ create_pipe (const char *progname, 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 @@ create_pipe (const char *progname, (const char **) environ); } } + if (child == -1) + saved_errno = errno; if (stdinfd >= 0) close (stdinfd); if (stdoutfd >= 0) @@ -225,12 +228,13 @@ create_pipe (const char *progname, 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 @@ create_pipe (const char *progname, close (ofd[0]); close (ofd[1]); } + errno = err; return -1; } posix_spawn_file_actions_destroy (&actions); diff --git a/lib/pipe.h b/lib/pipe.h index 2f23903ab4..7517892ba4 100644 --- a/lib/pipe.h +++ b/lib/pipe.h @@ -36,7 +36,8 @@ extern "C" { 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. |