/* Detect write error on a stream.
   Copyright (C) 2003, 2005-2006, 2009-2026 Free Software Foundation, Inc.
   Written by Bruno Haible <bruno@clisp.org>, 2003.

   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 <https://www.gnu.org/licenses/>.  */

/* There are two approaches for detecting a write error on a stream opened
   for writing:

     (a) Test the return value of every fwrite() or fprintf() call, and react
         immediately.
     (b) Just before fclose(), test the error indicator in the stream and
         the return value of the final fclose() call.

   The benefit of (a) is that non file related errors (such that ENOMEM during
   fprintf) and temporary error conditions can be diagnosed accurately.

   A theoretical benefit of (a) is also that, on POSIX systems, in the case of
   an ENOSPC error, errno is set and can be used by error() to provide a more
   accurate error message. But in practice, this benefit is not big because
   users can easily figure out by themselves why a file cannot be written to,
   and furthermore the function fwriteerror() can provide errno as well.

   The big drawback of (a) is extensive error checking code: Every function
   which does stream output must return an error indicator.

   This file provides support for (b).  */

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Write out the not yet written buffered contents of the stream FP, close
   the stream FP, and test whether some error occurred on the stream FP.
   FP must be a stream opened for writing.
   Return 0 if no error occurred and fclose (fp) succeeded.
   Return -1 and set errno if there was an error.  The errno value will be 0
   if the cause of the error cannot be determined.
   For any given stream FP other than stdout, fwriteerror (FP) may only be
   called once.  */
extern int fwriteerror (FILE *fp);

/* Likewise, but don't consider it an error if FP has an invalid file
   descriptor and no output was done to FP.  */
extern int fwriteerror_no_ebadf (FILE *fp);

#ifdef __cplusplus
}
#endif
