fclose: don't fail on non-seekable input stream
authorEric Blake <eblake@redhat.com>
Sat, 30 Apr 2011 21:40:00 +0000 (15:40 -0600)
committerEric Blake <eblake@redhat.com>
Sat, 30 Apr 2011 22:59:18 +0000 (16:59 -0600)
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>
ChangeLog
lib/fclose.c
modules/fclose

index eb233f6061da3607d7a7f6f973c080fa051f0b21..3b5331c632dbb2c5f4509d44b1fb393d9fa9e26f 100644 (file)
--- 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
index 1d7e85b66882b6029e5e8e7e189fb96198a20b55..bce409c960bf313749fcf4b884b982ff85a5fd09 100644 (file)
@@ -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 @@ 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)
index 4f6f786910e17bb2b327a7c5a446c2da42d2b793..d8727c30751579fb4a9eec1451ae7aeeb9deabbc 100644 (file)
@@ -8,6 +8,9 @@ m4/fclose.m4
 Depends-on:
 stdio
 close
+fflush
+freading
+fseeko
 
 configure.ac:
 gl_FUNC_FCLOSE