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 ();