changeset 8700:f82b54db5bb8

Make fflush rely on fpurge. * lib/fflush.c (rpl_fflush): Rely on fpurge module, rather than open coding all variants. * modules/fflush (Depends-on): Add fpurge and unistd. * modules/fflush-tests (Depends-on): Unistd is no longer extra. * m4/fflush.m4 (gl_REPLACE_FFLUSH): Simplify.
author Eric Blake <ebb9@byu.net>
date Tue, 17 Apr 2007 03:38:08 +0000
parents 996bed2dc377
children da3f12e86b1a
files ChangeLog lib/fflush.c m4/fflush.m4 modules/fflush modules/fflush-tests
diffstat 5 files changed, 22 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2007-04-16  Eric Blake  <ebb9@byu.net>
 
+	Make fflush rely on fpurge.
+	* lib/fflush.c (rpl_fflush): Rely on fpurge module, rather than
+	open coding all variants.
+	* modules/fflush (Depends-on): Add fpurge and unistd.
+	* modules/fflush-tests (Depends-on): Unistd is no longer extra.
+	* m4/fflush.m4 (gl_REPLACE_FFLUSH): Simplify.
+
 	Fix --with-tests compilation on cygwin.
 	* modules/argmatch-tests (Makefile.am): List gnulib library first
 	in LDADD.
--- a/lib/fflush.c
+++ b/lib/fflush.c
@@ -21,13 +21,7 @@
 #include <errno.h>
 #include <stdio.h>
 
-#if HAVE_STDIO_EXT_H
-# include <stdio_ext.h>
-#endif
-
-#if HAVE_FPURGE && ! HAVE_DECL_FPURGE
-int fpurge (FILE *);
-#endif
+#include "fpurge.h"
 
 #undef fflush
 
@@ -36,53 +30,31 @@
 int
 rpl_fflush (FILE *stream)
 {
-  int e; /* Capture errno of first fflush if nothing else succeeds.  */
   int result;
+  off_t pos;
 
   /* Try flushing the stream.  C89 guarantees behavior of output
      streams, so we only need to worry if failure might have been on
      an input stream.  When stream is NULL, POSIX only requires
      flushing of output streams.  */
   result = fflush (stream);
-  if (! stream || result == 0 || (e = errno) != EBADF)
+  if (! stream || result == 0 || errno != EBADF)
     return result;
 
-  /* POSIX does not specify behavior for non-seekable streams.  */
-  if (fseeko (stream, 0, SEEK_CUR) != 0)
+  /* POSIX does not specify fflush behavior for non-seekable input
+     streams.  */
+  pos = ftello (stream);
+  if (pos == -1)
     {
-      errno = e;
+      errno = EBADF;
       return EOF;
     }
 
   /* To get here, we must be flushing a seekable input stream, so the
-     semantics of fpurge are now appropriate.  */
-#if HAVE_FPURGE
+     semantics of fpurge are now appropriate to clear the buffer.  To
+     avoid losing data, the lseek is also necessary.  */
   result = fpurge (stream);
-#elif HAVE___FPURGE
-  /* __fpurge has no return value, and on Solaris, we can't even trust
-     errno.  So assume it succeeds.  */
-  __fpurge (stream);
-  result = 0;
-#else /* ! HAVE___FPURGE */
-
-  /* No single replacement; do it manually.  */
-  {
-    off_t position = ftello (stream);
-    if (position == -1)
-      {
-	result = EOF; /* Should not happen; we know stream is seekable.  */
-      }
-    /* Set position of stream; hopefully the stdio routines don't
-       overoptimize by not setting the underlying file position.  */
-    else if (fseeko (stream, position, SEEK_SET) != 0)
-      {
-	result = EOF;
-	errno = e;
-      }
-    else
-      result = 0;
-  }
-#endif /* ! HAVE___FPURGE */
-
+  if (result == 0 && lseek (fileno (stream), pos, SEEK_SET) == -1)
+    return EOF;
   return result;
 }
--- a/m4/fflush.m4
+++ b/m4/fflush.m4
@@ -1,4 +1,4 @@
-#serial 1
+#serial 2
 
 # Copyright (C) 2007 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
--- a/modules/fflush
+++ b/modules/fflush
@@ -6,7 +6,9 @@
 m4/fflush.m4
 
 Depends-on:
+fpurge
 stdio
+unistd
 
 configure.ac:
 gl_FUNC_FFLUSH
--- a/modules/fflush-tests
+++ b/modules/fflush-tests
@@ -2,7 +2,6 @@
 tests/test-fflush.c
 
 Depends-on:
-unistd
 
 configure.ac: