Mercurial > hg > octave-nkf > gnulib-hg
annotate lib/closeout.c @ 2838:fd547e6c4244
Include "__fpending.h".
(close_stdout_status): Return right away if there's nothing to flush.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sat, 26 Aug 2000 12:05:50 +0000 |
parents | 31ce9e1b6eea |
children | 72422d1e9181 |
rev | line source |
---|---|
1197 | 1 /* closeout.c - close standard output |
2513
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
2 Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. |
1197 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software Foundation, | |
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
17 | |
18 #if HAVE_CONFIG_H | |
19 # include <config.h> | |
20 #endif | |
21 | |
22 #if ENABLE_NLS | |
23 # include <libintl.h> | |
24 # define _(Text) gettext (Text) | |
25 #else | |
26 # define _(Text) Text | |
27 #endif | |
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 | 30 # include <stdlib.h> |
31 #endif | |
32 #ifndef EXIT_FAILURE | |
33 # define EXIT_FAILURE 1 | |
34 #endif | |
35 | |
2519
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
36 #include <stdio.h> |
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
37 |
1197 | 38 #include <errno.h> |
39 #ifndef errno | |
40 extern int errno; | |
41 #endif | |
42 | |
43 #include "closeout.h" | |
44 #include "error.h" | |
2522
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
45 #include "quotearg.h" |
2838 | 46 #include "__fpending.h" |
1197 | 47 |
2513
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
48 static int default_exit_status = EXIT_FAILURE; |
2522
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
49 static const char *file_name; |
2513
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
50 |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
51 /* Set the value to be used for the exit status when close_stdout is called. |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
52 This is useful when it is not convenient to call close_stdout_status, |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
53 e.g., when close_stdout is called via atexit. */ |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
54 void |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
55 close_stdout_set_status (int status) |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
56 { |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
57 default_exit_status = status; |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
58 } |
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
59 |
2519
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
60 /* Set the file name to be reported in the event an error is detected |
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
61 by close_stdout_status. */ |
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
62 void |
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
63 close_stdout_set_file_name (const char *file) |
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
64 { |
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
65 file_name = file; |
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
66 } |
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
67 |
1662 | 68 /* Close standard output, exiting with status STATUS on failure. |
1772 | 69 If a program writes *anything* to stdout, that program should `fflush' |
70 stdout and make sure that it succeeds before exiting. Otherwise, | |
71 suppose that you go to the extreme of checking the return status | |
72 of every function that does an explicit write to stdout. The last | |
73 printf can succeed in writing to the internal stream buffer, and yet | |
74 the fclose(stdout) could still fail (due e.g., to a disk full error) | |
75 when it tries to write out that buffered data. Thus, you would be | |
76 left with an incomplete output file and the offending program would | |
77 exit successfully. | |
78 | |
79 FIXME: note the fflush suggested above is implicit in the fclose | |
80 we actually do below. Consider doing only the fflush and/or using | |
81 setvbuf to inhibit buffering. | |
1662 | 82 |
83 Besides, it's wasteful to check the return value from every call | |
84 that writes to stdout -- just let the internal stream state record | |
85 the failure. That's what the ferror test is checking below. | |
86 | |
87 It's important to detect such failures and exit nonzero because many | |
88 tools (most notably `make' and other build-management systems) depend | |
89 on being able to detect failure in other tools via their exit status. */ | |
2838 | 90 |
1197 | 91 void |
92 close_stdout_status (int status) | |
93 { | |
2522
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
94 int e = ferror (stdout) ? 0 : -1; |
2519
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
95 |
2838 | 96 if (__fpending (stdout) == 0) |
97 return; | |
98 | |
1197 | 99 if (fclose (stdout) != 0) |
2522
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
100 e = errno; |
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
101 |
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
102 if (0 <= e) |
2519
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
103 { |
2522
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
104 char const *write_error = _("write error"); |
2519
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
105 if (file_name) |
2522
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
106 error (status, e, "%s: %s", quotearg_colon (file_name), write_error); |
2519
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
107 else |
2522
31ce9e1b6eea
<sys/stat.h>, <sys/types.h>, <unistd.h>, (STDOUT_FILENO):
Jim Meyering <jim@meyering.net>
parents:
2519
diff
changeset
|
108 error (status, e, "%s", write_error); |
2519
53352ce5b0d1
(close_stdout_set_file_name): New function.
Jim Meyering <jim@meyering.net>
parents:
2513
diff
changeset
|
109 } |
1197 | 110 } |
111 | |
112 /* Close standard output, exiting with status EXIT_FAILURE on failure. */ | |
113 void | |
114 close_stdout (void) | |
115 { | |
2513
be6bb70a4fea
[default_exit_status]: New file-scoped variable.
Jim Meyering <jim@meyering.net>
parents:
1772
diff
changeset
|
116 close_stdout_status (default_exit_status); |
1197 | 117 } |