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.