X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fcloseout.c;h=46c9f5750e4162a1ea612e4757c1c631e4254b7a;hb=5cd34d5993366f3da19cfb620caad4532411389f;hp=a6fbbf7191b37c7ae64c9f4cae45a6a59f42bb62;hpb=23928550db5d400f27fa67de29c738ca324a31ea;p=gnulib.git diff --git a/lib/closeout.c b/lib/closeout.c index a6fbbf719..46c9f5750 100644 --- a/lib/closeout.c +++ b/lib/closeout.c @@ -1,5 +1,5 @@ /* closeout.c - close standard output - Copyright (C) 1998 Free Software Foundation, Inc. + Copyright (C) 1998, 1999 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ # define _(Text) Text #endif -#ifdef HAVE_STDLIB_H +#if HAVE_STDLIB_H # include #endif #ifndef EXIT_FAILURE @@ -42,7 +42,28 @@ extern int errno; #include "closeout.h" #include "error.h" -/* Close standard output, exiting with status STATUS on failure. */ +/* Close standard output, exiting with status STATUS on failure. + If a program writes *anything* to stdout, that program should `fflush' + 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. + + FIXME: note the fflush suggested above is implicit in the fclose + we actually do below. Consider doing only the fflush and/or using + setvbuf to inhibit buffering. + + 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_status (int status) {