]> git.cworth.org Git - tar/blobdiff - lib/close-stream.c
Imported Upstream version 1.23
[tar] / lib / close-stream.c
diff --git a/lib/close-stream.c b/lib/close-stream.c
deleted file mode 100644 (file)
index 59ab616..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Close a stream, with nicer error checking than fclose's.
-
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006, 2007, 2008 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
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include <config.h>
-
-#include "close-stream.h"
-
-#include <errno.h>
-#include <stdbool.h>
-
-#include "fpending.h"
-
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
-/* Close STREAM.  Return 0 if successful, EOF (setting errno)
-   otherwise.  A failure might set errno to 0 if the error number
-   cannot be determined.
-
-   A failure with errno set to EPIPE may or may not indicate an error
-   situation worth signaling to the user.  See the documentation of the
-   close_stdout_set_ignore_EPIPE function for details.
-
-   If a program writes *anything* to STREAM, that program should close
-   STREAM 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 STREAM.  The last
-   printf can succeed in writing to the internal stream buffer, and yet
-   the fclose(STREAM) 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.  Even calling fflush is not always sufficient,
-   since some file systems (NFS and CODA) buffer written/flushed data
-   until an actual close call.
-
-   Besides, it's wasteful to check the return value from every call
-   that writes to STREAM -- just let the internal stream state record
-   the failure.  That's what the ferror test is checking below.  */
-
-int
-close_stream (FILE *stream)
-{
-  bool some_pending = (__fpending (stream) != 0);
-  bool prev_fail = (ferror (stream) != 0);
-  bool fclose_fail = (fclose (stream) != 0);
-
-  /* Return an error indication if there was a previous failure or if
-     fclose failed, with one exception: ignore an fclose failure if
-     there was no previous error, no data remains to be flushed, and
-     fclose failed with EBADF.  That can happen when a program like cp
-     is invoked like this `cp a b >&-' (i.e., with standard output
-     closed) and doesn't generate any output (hence no previous error
-     and nothing to be flushed).  */
-
-  if (prev_fail || (fclose_fail && (some_pending || errno != EBADF)))
-    {
-      if (! fclose_fail)
-       errno = 0;
-      return EOF;
-    }
-
-  return 0;
-}