From e3be059d4da38aa36f1aee1d56f8ceb943d92f1c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 14 Apr 2024 22:34:44 +0200 Subject: Adding upstream version 2:4.0.4. Signed-off-by: Daniel Baumann --- local/fileutils.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 local/fileutils.c (limited to 'local/fileutils.c') diff --git a/local/fileutils.c b/local/fileutils.c new file mode 100644 index 0000000..14c7452 --- /dev/null +++ b/local/fileutils.c @@ -0,0 +1,45 @@ +#include +#ifdef HAVE_ERROR_H +# include +#endif +#ifdef HAVE_STDIO_EXT_H +# include +#else +/* FIXME: use a more portable definition of __fpending() (from gnulib?) */ +# include +# define __fpending(fp) ((fp)->_p - (fp)->_bf._base) +#endif +#include +#include + +#include "nls.h" +#include "fileutils.h" +#ifndef HAVE_ERROR_H +# include "c.h" /* for error() emulation */ +#endif + +int close_stream(FILE * stream) +{ + const int some_pending = (__fpending(stream) != 0); + const int prev_fail = (ferror(stream) != 0); + const int fclose_fail = (fclose(stream) != 0); + if (prev_fail || (fclose_fail && (some_pending || errno != EBADF))) { + if (!fclose_fail && errno != EPIPE) + errno = 0; + return EOF; + } + return 0; +} + +/* Use atexit(); */ +void close_stdout(void) +{ + if (close_stream(stdout) != 0 && !(errno == EPIPE)) { + char const *write_error = _("write error"); + error(0, errno, "%s", write_error); + _exit(EXIT_FAILURE); + } + + if (close_stream(stderr) != 0) + _exit(EXIT_FAILURE); +} -- cgit v1.2.3