annotate lib/closeout.c @ 1772:69f2bf72fbe3

fix comments add FIXME
author Jim Meyering <jim@meyering.net>
date Sun, 04 Apr 1999 14:30:30 +0000
parents 096732ffc839
children be6bb70a4fea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1197
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* closeout.c - close standard output
1662
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
2 Copyright (C) 1998, 1999 Free Software Foundation, Inc.
1197
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 any later version.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 GNU General Public License for more details.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 along with this program; if not, write to the Free Software Foundation,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 #if HAVE_CONFIG_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19 # include <config.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 #if ENABLE_NLS
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23 # include <libintl.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 # define _(Text) gettext (Text)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 # define _(Text) Text
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28
1278
9ad625a30b7d Use #if, not #ifdef with HAVE_ macros
Jim Meyering <jim@meyering.net>
parents: 1197
diff changeset
29 #if HAVE_STDLIB_H
1197
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 # include <stdlib.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 #ifndef EXIT_FAILURE
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 # define EXIT_FAILURE 1
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 #include <errno.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 #ifndef errno
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 extern int errno;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 #include <stdio.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 #include "closeout.h"
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 #include "error.h"
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44
1662
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
45 /* Close standard output, exiting with status STATUS on failure.
1772
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
46 If a program writes *anything* to stdout, that program should `fflush'
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
47 stdout and make sure that it succeeds before exiting. Otherwise,
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
48 suppose that you go to the extreme of checking the return status
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
49 of every function that does an explicit write to stdout. The last
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
50 printf can succeed in writing to the internal stream buffer, and yet
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
51 the fclose(stdout) could still fail (due e.g., to a disk full error)
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
52 when it tries to write out that buffered data. Thus, you would be
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
53 left with an incomplete output file and the offending program would
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
54 exit successfully.
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
55
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
56 FIXME: note the fflush suggested above is implicit in the fclose
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
57 we actually do below. Consider doing only the fflush and/or using
69f2bf72fbe3 fix comments
Jim Meyering <jim@meyering.net>
parents: 1662
diff changeset
58 setvbuf to inhibit buffering.
1662
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
59
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
60 Besides, it's wasteful to check the return value from every call
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
61 that writes to stdout -- just let the internal stream state record
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
62 the failure. That's what the ferror test is checking below.
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
63
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
64 It's important to detect such failures and exit nonzero because many
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
65 tools (most notably `make' and other build-management systems) depend
096732ffc839 Add comments.
Jim Meyering <jim@meyering.net>
parents: 1278
diff changeset
66 on being able to detect failure in other tools via their exit status. */
1197
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 void
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 close_stdout_status (int status)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 if (ferror (stdout))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 error (status, 0, _("write error"));
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 if (fclose (stdout) != 0)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 error (status, errno, _("write error"));
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 /* Close standard output, exiting with status EXIT_FAILURE on failure. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 void
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 close_stdout (void)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 close_stdout_status (EXIT_FAILURE);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81 }