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)
--- a/modules/fclose
+++ b/modules/fclose
@@ -8,6 +8,9 @@
 Depends-on:
 stdio
 close
+fflush
+freading
+fseeko
 
 configure.ac:
 gl_FUNC_FCLOSE