annotate lib/fwriteerror.h @ 7388:de85bc61c2dc

New function fwriteerror_no_ebadf.
author Bruno Haible <bruno@clisp.org>
date Fri, 29 Sep 2006 13:44:52 +0000
parents a48fb0e98c8c
children adf3720ff325
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4709
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Detect write error on a stream.
7388
de85bc61c2dc New function fwriteerror_no_ebadf.
Bruno Haible <bruno@clisp.org>
parents: 5848
diff changeset
2 Copyright (C) 2003, 2005-2006 Free Software Foundation, Inc.
4709
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <bruno@clisp.org>, 2003.
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 any later version.
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 along with this program; if not, write to the Free Software Foundation,
5848
a48fb0e98c8c *** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents: 5581
diff changeset
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
4709
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 /* There are two approaches for detecting a write error on a stream opened
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20 for writing:
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 (a) Test the return value of every fwrite() or fprintf() call, and react
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23 immediately.
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 (b) Just before fclose(), test the error indicator in the stream and
5581
c8676e66b5da The fwriteerror() function now needs to fclose() the stream,
Bruno Haible <bruno@clisp.org>
parents: 4709
diff changeset
25 the return value of the final fclose() call.
4709
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 The benefit of (a) is that non file related errors (such that ENOMEM during
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 fprintf) and temporary error conditions can be diagnosed accurately.
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 A theoretical benefit of (a) is also that, on POSIX systems, in the case of
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 an ENOSPC error, errno is set and can be used by error() to provide a more
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 accurate error message. But in practice, this benefit is not big because
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 users can easily figure out by themselves why a file cannot be written to,
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 and furthermore the function fwriteerror() can provide errno as well.
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 The big drawback of (a) is extensive error checking code: Every function
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 which does stream output must return an error indicator.
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 This file provides support for (b). */
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 #include <stdio.h>
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42
5581
c8676e66b5da The fwriteerror() function now needs to fclose() the stream,
Bruno Haible <bruno@clisp.org>
parents: 4709
diff changeset
43 /* Write out the not yet written buffered contents of the stream FP, close
c8676e66b5da The fwriteerror() function now needs to fclose() the stream,
Bruno Haible <bruno@clisp.org>
parents: 4709
diff changeset
44 the stream FP, and test whether some error occurred on the stream FP.
c8676e66b5da The fwriteerror() function now needs to fclose() the stream,
Bruno Haible <bruno@clisp.org>
parents: 4709
diff changeset
45 FP must be a stream opened for writing.
c8676e66b5da The fwriteerror() function now needs to fclose() the stream,
Bruno Haible <bruno@clisp.org>
parents: 4709
diff changeset
46 Return 0 if no error occurred and fclose (fp) succeeded.
4709
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 Return -1 and set errno if there was an error. The errno value will be 0
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 if the cause of the error cannot be determined.
5581
c8676e66b5da The fwriteerror() function now needs to fclose() the stream,
Bruno Haible <bruno@clisp.org>
parents: 4709
diff changeset
49 For any given stream FP other than stdout, fwriteerror (FP) may only be
c8676e66b5da The fwriteerror() function now needs to fclose() the stream,
Bruno Haible <bruno@clisp.org>
parents: 4709
diff changeset
50 called once. */
4709
86c722c44f87 New module 'fwriteerror'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 extern int fwriteerror (FILE *fp);
7388
de85bc61c2dc New function fwriteerror_no_ebadf.
Bruno Haible <bruno@clisp.org>
parents: 5848
diff changeset
52
de85bc61c2dc New function fwriteerror_no_ebadf.
Bruno Haible <bruno@clisp.org>
parents: 5848
diff changeset
53 /* Likewise, but don't consider it an error if FP has an invalid file
de85bc61c2dc New function fwriteerror_no_ebadf.
Bruno Haible <bruno@clisp.org>
parents: 5848
diff changeset
54 descriptor and no output was done to FP. */
de85bc61c2dc New function fwriteerror_no_ebadf.
Bruno Haible <bruno@clisp.org>
parents: 5848
diff changeset
55 extern int fwriteerror_no_ebadf (FILE *fp);