+ int e = fclose_fail ? errno : 0;
+ char const *write_error;
+
+ /* If ferror returned zero, no data remains to be flushed, and we'd
+ otherwise fail with EBADF due to a failed fclose, then assume that
+ it's ok to ignore the fclose failure. That can happen when a
+ program like cp is invoked like this `cp a b >&-' (i.e., with
+ stdout closed) and doesn't generate any output (hence no previous
+ error and nothing to be flushed). */
+ if (e == EBADF && !prev_fail && none_pending)
+ return;
+
+ write_error = _("write error");