do not ignore errors like ENOSPC,EIO when writing to stdout

Standard output was never explicitly closed, so we could not
detect failure.  Thus, bison would ignore the errors of writing
to a full file system and getting an I/O error on write, but only
for standard output, e.g., for --print-localedir, --print-datadir,
--help and some verbose output.
Now, "bison --print-datadir > /dev/full" reports the write failure:
bison: write error: No space left on device
Before, it would exit 0 with no diagnostic, implying success.
This is not an issue for "--output=-" or the other FILE-accepting
command-line options, because unlike most other GNU programs,
an output file argument of "-" is treated as the literal "./-",
rather than standard output.
* bootstrap.conf (gnulib_modules): Add closeout.
* src/main.c: Include "closeout.h".
Use atexit to ensure we close stdout.
* .gitignore: Ignore new files pulled in via gnulib-tool.
This commit is contained in:
Jim Meyering
2012-01-29 12:50:32 +01:00
parent 888b6ddfe4
commit acb5895680
4 changed files with 13 additions and 1 deletions

View File

@@ -17,7 +17,7 @@
# gnulib modules used by this package.
gnulib_modules='
announce-gen argmatch assert calloc-posix close config-h c-strcase
announce-gen argmatch assert calloc-posix close closeout config-h c-strcase
configmake dirname error extensions fdl fopen-safer gendocs getopt-gnu
gettext git-version-gen gitlog-to-changelog
gpl-3.0 hash inttypes isnan javacomp-script

6
lib/.gitignore vendored
View File

@@ -259,3 +259,9 @@
/strerror-override.h
/strerror_r.c
/xalloc-oversized.h
/close-stream.c
/close-stream.h
/closeout.c
/closeout.h
/fpending.c
/fpending.h

3
m4/.gitignore vendored
View File

@@ -166,3 +166,6 @@
/raise.m4
/ssize_t.m4
/strerror_r.m4
/close-stream.m4
/closeout.m4
/fpending.m4

View File

@@ -28,6 +28,7 @@
#include <timevar.h>
#include "LR0.h"
#include "closeout.h"
#include "complain.h"
#include "conflicts.h"
#include "derives.h"
@@ -62,6 +63,8 @@ main (int argc, char *argv[])
(void) bindtextdomain ("bison-runtime", LOCALEDIR);
(void) textdomain (PACKAGE);
atexit (close_stdout);
uniqstrs_new ();
muscle_init ();