summaryrefslogtreecommitdiff
path: root/misc.c
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2013-09-14 20:40:30 -0400
committerPaul Smith <psmith@gnu.org>2013-09-14 20:40:30 -0400
commit29a94ceb76936b88e74052dcb81fe506145f6ff4 (patch)
tree9ecba816136119896da6df2a94c74c5116a5d688 /misc.c
parentab78cbc71ce16dd39e4b6b9e42c02f75bf1d8a50 (diff)
downloadgunmake-29a94ceb76936b88e74052dcb81fe506145f6ff4.tar.gz
[SV 33134] Don't try to close stdout when it's already closed.
Diffstat (limited to 'misc.c')
-rw-r--r--misc.c47
1 files changed, 0 insertions, 47 deletions
diff --git a/misc.c b/misc.c
index df8bd43..d915032 100644
--- a/misc.c
+++ b/misc.c
@@ -723,50 +723,3 @@ get_path_max (void)
return value;
}
#endif
-
-
-/* This code is stolen from gnulib.
- If/when we abandon the requirement to work with K&R compilers, we can
- remove this (and perhaps other parts of GNU make!) and migrate to using
- gnulib directly.
-
- This is called only through atexit(), which means die() has already been
- invoked. So, call exit() here directly. Apparently that works...?
-*/
-
-/* Close standard output, exiting with status 'exit_failure' on failure.
- If a program writes *anything* to stdout, that program should close
- stdout and make sure that it succeeds before exiting. Otherwise,
- suppose that you go to the extreme of checking the return status
- of every function that does an explicit write to stdout. The last
- printf can succeed in writing to the internal stream buffer, and yet
- the fclose(stdout) could still fail (due e.g., to a disk full error)
- when it tries to write out that buffered data. Thus, you would be
- left with an incomplete output file and the offending program would
- exit successfully. Even calling fflush is not always sufficient,
- since some file systems (NFS and CODA) buffer written/flushed data
- until an actual close call.
-
- Besides, it's wasteful to check the return value from every call
- that writes to stdout -- just let the internal stream state record
- the failure. That's what the ferror test is checking below.
-
- It's important to detect such failures and exit nonzero because many
- tools (most notably 'make' and other build-management systems) depend
- on being able to detect failure in other tools via their exit status. */
-
-void
-close_stdout (void)
-{
- int prev_fail = ferror (stdout);
- int fclose_fail = fclose (stdout);
-
- if (prev_fail || fclose_fail)
- {
- if (fclose_fail)
- error (NILF, _("write error: %s"), strerror (errno));
- else
- error (NILF, _("write error"));
- exit (EXIT_FAILURE);
- }
-}