X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffwriteerror.c;h=b3d6d2ae48546ac93fccdc5ba4913222a7d8f716;hb=d90792110b23736fb629c7f3ee150d917e8e9e3a;hp=4d4ad81b99efc1f051ee70725c63559c2f74d278;hpb=99099106c3c1cb16ed1e91be970332fe225e278b;p=gnulib.git diff --git a/lib/fwriteerror.c b/lib/fwriteerror.c index 4d4ad81b9..b3d6d2ae4 100644 --- a/lib/fwriteerror.c +++ b/lib/fwriteerror.c @@ -24,14 +24,20 @@ #include #include -int -fwriteerror (FILE *fp) +static int +do_fwriteerror (FILE *fp, bool ignore_ebadf) { /* State to allow multiple calls to fwriteerror (stdout). */ static bool stdout_closed = false; - if (fp == stdout && stdout_closed) - return 0; + if (fp == stdout) + { + if (stdout_closed) + return 0; + + /* If we are closing stdout, don't attempt to do it later again. */ + stdout_closed = true; + } /* Need to 1. test the error indicator of the stream, @@ -56,25 +62,47 @@ fwriteerror (FILE *fp) goto close_preserving_errno; /* errno is set here */ /* Give up on errno. */ errno = 0; - close_preserving_errno: - /* There's an error. Nevertheless call fclose(fp), for consistency - with the other cases. */ - { - int saved_errno = errno; - fclose (fp); - errno = saved_errno; - return -1; - } + goto close_preserving_errno; } - /* If we are closing stdout, don't attempt to do it later again. */ - if (fp == stdout) - stdout_closed = true; - - if (fclose (fp)) - return -1; /* errno is set here */ + if (ignore_ebadf) + { + /* We need an explicit fflush to tell whether some output was already + done on FP. */ + if (fflush (fp)) + goto close_preserving_errno; /* errno is set here */ + if (fclose (fp) && errno != EBADF) + return -1; /* errno is set here */ + } + else + { + if (fclose (fp)) + return -1; /* errno is set here */ + } return 0; + + close_preserving_errno: + /* There's an error. Nevertheless call fclose(fp), for consistency + with the other cases. */ + { + int saved_errno = errno; + fclose (fp); + errno = saved_errno; + return -1; + } +} + +int +fwriteerror (FILE *fp) +{ + return do_fwriteerror (fp, false); +} + +int +fwriteerror_no_ebadf (FILE *fp) +{ + return do_fwriteerror (fp, true); }