From: Eric Blake Date: Sat, 30 Apr 2011 21:40:00 +0000 (-0600) Subject: fclose: don't fail on non-seekable input stream X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=096d7e1c450cff94143fd0681439ab42a3a63079;p=pspp 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 --- diff --git a/ChangeLog b/ChangeLog index eb233f6061..3b5331c632 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-04-30 Eric Blake + + 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 dup3: cleanup diff --git a/lib/fclose.c b/lib/fclose.c index 1d7e85b668..bce409c960 100644 --- a/lib/fclose.c +++ b/lib/fclose.c @@ -22,6 +22,8 @@ #include #include +#include "freading.h" + /* Override fclose() to call the overridden close(). */ int @@ -30,7 +32,9 @@ rpl_fclose (FILE *fp) { 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) diff --git a/modules/fclose b/modules/fclose index 4f6f786910..d8727c3075 100644 --- a/modules/fclose +++ b/modules/fclose @@ -8,6 +8,9 @@ m4/fclose.m4 Depends-on: stdio close +fflush +freading +fseeko configure.ac: gl_FUNC_FCLOSE