OpenCoverage

close-stream.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/close-stream.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* Close a stream, with nicer error checking than fclose's.-
2-
3 Copyright (C) 1998-2002, 2004, 2006-2018 Free Software Foundation, Inc.-
4-
5 This program is free software: you can redistribute it and/or modify-
6 it under the terms of the GNU General Public License as published by-
7 the Free Software Foundation; either version 3 of the License, or-
8 (at your option) any later version.-
9-
10 This program is distributed in the hope that it will be useful,-
11 but WITHOUT ANY WARRANTY; without even the implied warranty of-
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
13 GNU General Public License for more details.-
14-
15 You should have received a copy of the GNU General Public License-
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
17-
18#include <config.h>-
19-
20#include "close-stream.h"-
21-
22#include <errno.h>-
23#include <stdbool.h>-
24-
25#include "fpending.h"-
26-
27#if USE_UNLOCKED_IO-
28# include "unlocked-io.h"-
29#endif-
30-
31/* Close STREAM. Return 0 if successful, EOF (setting errno)-
32 otherwise. A failure might set errno to 0 if the error number-
33 cannot be determined.-
34-
35 A failure with errno set to EPIPE may or may not indicate an error-
36 situation worth signaling to the user. See the documentation of the-
37 close_stdout_set_ignore_EPIPE function for details.-
38-
39 If a program writes *anything* to STREAM, that program should close-
40 STREAM and make sure that it succeeds before exiting. Otherwise,-
41 suppose that you go to the extreme of checking the return status-
42 of every function that does an explicit write to STREAM. The last-
43 printf can succeed in writing to the internal stream buffer, and yet-
44 the fclose(STREAM) could still fail (due e.g., to a disk full error)-
45 when it tries to write out that buffered data. Thus, you would be-
46 left with an incomplete output file and the offending program would-
47 exit successfully. Even calling fflush is not always sufficient,-
48 since some file systems (NFS and CODA) buffer written/flushed data-
49 until an actual close call.-
50-
51 Besides, it's wasteful to check the return value from every call-
52 that writes to STREAM -- just let the internal stream state record-
53 the failure. That's what the ferror test is checking below. */-
54-
55int-
56close_stream (FILE *stream)-
57{-
58 const bool some_pending = (__fpending (stream) != 0);-
59 const bool prev_fail = (ferror (stream) != 0);-
60 const bool fclose_fail = (fclose (stream) != 0);-
61-
62 /* Return an error indication if there was a previous failure or if-
63 fclose failed, with one exception: ignore an fclose failure if-
64 there was no previous error, no data remains to be flushed, and-
65 fclose failed with EBADF. That can happen when a program like cp-
66 is invoked like this 'cp a b >&-' (i.e., with standard output-
67 closed) and doesn't generate any output (hence no previous error-
68 and nothing to be flushed). */-
69-
70 if (prev_fail || (fclose_fail && (some_pending || errno != EBADF)))
prev_failDescription
TRUEnever evaluated
FALSEevaluated 78835 times by 106 tests
Evaluated by:
  • [
  • b2sum
  • base32
  • base64
  • basename
  • cat
  • chcon
  • chgrp
  • chmod
  • chown
  • chroot
  • cksum
  • comm
  • cp
  • csplit
  • cut
  • date
  • dd
  • df
  • dir
  • dircolors
  • dirname
  • du
  • echo
  • env
  • ...
fclose_failDescription
TRUEevaluated 28 times by 15 tests
Evaluated by:
  • chmod
  • cp
  • dd
  • ln
  • mkdir
  • mktemp
  • mv
  • printf
  • rm
  • rmdir
  • sleep
  • tail
  • test
  • timeout
  • touch
FALSEevaluated 78807 times by 106 tests
Evaluated by:
  • [
  • b2sum
  • base32
  • base64
  • basename
  • cat
  • chcon
  • chgrp
  • chmod
  • chown
  • chroot
  • cksum
  • comm
  • cp
  • csplit
  • cut
  • date
  • dd
  • df
  • dir
  • dircolors
  • dirname
  • du
  • echo
  • env
  • ...
some_pendingDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • mktemp
FALSEevaluated 24 times by 14 tests
Evaluated by:
  • chmod
  • cp
  • dd
  • ln
  • mkdir
  • mv
  • printf
  • rm
  • rmdir
  • sleep
  • tail
  • test
  • timeout
  • touch
(*__errno_location ()) != 9Description
TRUEnever evaluated
FALSEevaluated 24 times by 14 tests
Evaluated by:
  • chmod
  • cp
  • dd
  • ln
  • mkdir
  • mv
  • printf
  • rm
  • rmdir
  • sleep
  • tail
  • test
  • timeout
  • touch
0-78835
71 {-
72 if (! fclose_fail)
! fclose_failDescription
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • mktemp
0-4
73 errno = 0;
never executed: (*__errno_location ()) = 0;
0
74 return EOF;
executed 4 times by 1 test: return (-1) ;
Executed by:
  • mktemp
4
75 }-
76-
77 return 0;
executed 78831 times by 106 tests: return 0;
Executed by:
  • [
  • b2sum
  • base32
  • base64
  • basename
  • cat
  • chcon
  • chgrp
  • chmod
  • chown
  • chroot
  • cksum
  • comm
  • cp
  • csplit
  • cut
  • date
  • dd
  • df
  • dir
  • dircolors
  • dirname
  • du
  • echo
  • env
  • ...
78831
78}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2