/* Close a stream, with nicer error checking than fclose's.

   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006 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 2, 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, write to the Free Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */

#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.

   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;
}
