Mercurial > hg > octave-lojdl > gnulib-hg
changeset 14667:1f6b1f7275d0
fclose: don't fail on non-seekable input stream
On mingw, for a project that uses both sockets and streams,
then fclose(stdin) when getting input from a terminal or pipe
was spuriously failing.
* modules/fclose (Depends-on): Add freading, fflush, fseeko.
* lib/fclose.c (rpl_fclose): Skip fflush for non-seekable input,
since fflush is allowed to fail in that case.
Signed-off-by: Eric Blake <eblake@redhat.com>
author | Eric Blake <eblake@redhat.com> |
---|---|
date | Sat, 30 Apr 2011 15:40:00 -0600 |
parents | b80300d0dc5e |
children | 087560f4f1c6 |
files | ChangeLog lib/fclose.c modules/fclose |
diffstat | 3 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-04-30 Eric Blake <eblake@redhat.com> + + fclose: don't fail on non-seekable input stream + * modules/fclose (Depends-on): Add freading, fflush, fseeko. + * lib/fclose.c (rpl_fclose): Skip fflush for non-seekable input, + since fflush is allowed to fail in that case. + 2011-04-30 Bruno Haible <bruno@clisp.org> dup3: cleanup
--- a/lib/fclose.c +++ b/lib/fclose.c @@ -22,6 +22,8 @@ #include <errno.h> #include <unistd.h> +#include "freading.h" + /* Override fclose() to call the overridden close(). */ int @@ -30,7 +32,9 @@ { int saved_errno = 0; - if (fflush (fp)) + /* We only need to flush the file if it is not reading or if it is + seekable. */ + if ((!freading (fp) || fseeko (fp, 0, SEEK_CUR) == 0) && fflush (fp)) saved_errno = errno; if (close (fileno (fp)) < 0 && saved_errno == 0)