summaryrefslogtreecommitdiffstats
path: root/bison-2.4-reap_subpipe.patch
diff options
context:
space:
mode:
authorRemi Collet <fedora@famillecollet.com>2014-12-14 09:38:11 +0100
committerRemi Collet <fedora@famillecollet.com>2014-12-14 09:38:11 +0100
commitae3652c020cbaeafbcd07135559193a04900698d (patch)
tree9ccf5ffd62fda8fc9a06a80f3ef54dbcffc7f5af /bison-2.4-reap_subpipe.patch
import from RHEL-6HEADmaster
Diffstat (limited to 'bison-2.4-reap_subpipe.patch')
-rw-r--r--bison-2.4-reap_subpipe.patch87
1 files changed, 87 insertions, 0 deletions
diff --git a/bison-2.4-reap_subpipe.patch b/bison-2.4-reap_subpipe.patch
new file mode 100644
index 0000000..3f72c3e
--- /dev/null
+++ b/bison-2.4-reap_subpipe.patch
@@ -0,0 +1,87 @@
+diff -urp bison-2.4-pm/lib/subpipe.c bison-2.4/lib/subpipe.c
+--- bison-2.4-pm/lib/subpipe.c 2008-07-14 10:56:12.000000000 +0200
++++ bison-2.4/lib/subpipe.c 2008-11-20 14:37:42.000000000 +0100
+@@ -143,7 +143,9 @@ create_subpipe (char const * const *argv
+ }
+
+
+-/* Wait for the subprocess to exit. */
++/* Wait for the subprocess to exit. PROGRAM==NULL means errors
++ shouldn't be emitted, typically becuase we are reaping the subpipe
++ in response to some other error. */
+
+ void
+ reap_subpipe (pid_t pid, char const *program)
+@@ -151,11 +153,14 @@ reap_subpipe (pid_t pid, char const *pro
+ #if HAVE_WAITPID || defined waitpid
+ int wstatus;
+ if (waitpid (pid, &wstatus, 0) < 0)
+- error (EXIT_FAILURE, errno, "waitpid");
++ {
++ if (program)
++ error (EXIT_FAILURE, errno, "waitpid");
++ }
+ else
+ {
+ int status = WIFEXITED (wstatus) ? WEXITSTATUS (wstatus) : -1;
+- if (status)
++ if (status && program)
+ error (EXIT_FAILURE, 0,
+ _(status == 126
+ ? "subsidiary program `%s' could not be invoked"
+diff -urp bison-2.4-pm/src/output.c bison-2.4/src/output.c
+--- bison-2.4-pm/src/output.c 2008-11-02 19:09:10.000000000 +0100
++++ bison-2.4/src/output.c 2008-11-20 14:39:08.000000000 +0100
+@@ -467,6 +467,21 @@ prepare_actions (void)
+ | Call the skeleton parser. |
+ `---------------------------*/
+
++static pid_t pid = 0;
++
++/* Clean up opened pipe. */
++static void
++die (void)
++{
++ static int dying = 0;
++ if (pid && !dying)
++ {
++ dying = 1;
++ reap_subpipe (pid, NULL);
++ pid = 0;
++ }
++}
++
+ static void
+ output_skeleton (void)
+ {
+@@ -474,7 +489,6 @@ output_skeleton (void)
+ FILE *out;
+ int filter_fd[2];
+ char const *argv[9];
+- pid_t pid;
+
+ /* Compute the names of the package data dir and skeleton files. */
+ char const m4sugar[] = "m4sugar/m4sugar.m4";
+@@ -586,6 +600,7 @@ output_skeleton (void)
+ scan_skel (in);
+ xfclose (in);
+ reap_subpipe (pid, m4);
++ pid = 0;
+ timevar_pop (TV_M4);
+ }
+
+@@ -653,6 +669,14 @@ prepare (void)
+ void
+ output (void)
+ {
++ /* Register shutdown handler. */
++ static int registered = 0;
++ if (!registered)
++ {
++ registered = 1;
++ atexit (die);
++ }
++
+ obstack_init (&format_obstack);
+
+ prepare_symbols ();