[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
pipe-filter-gi: fix
From: |
Bruno Haible |
Subject: |
pipe-filter-gi: fix |
Date: |
Sat, 20 Mar 2010 17:20:39 +0100 |
User-agent: |
KMail/1.9.9 |
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 <address@hidden>
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.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- pipe-filter-gi: fix,
Bruno Haible <=