From e7f31c67094dbe9adb07e68467a3f1b9ac95cada Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Tue, 17 Apr 2007 03:38:08 +0000 Subject: [PATCH] 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. --- ChangeLog | 7 ++++++ lib/fflush.c | 52 ++++++++++---------------------------------- m4/fflush.m4 | 2 +- modules/fflush | 2 ++ modules/fflush-tests | 1 - 5 files changed, 22 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 70198231d6..f4455c3c02 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2007-04-16 Eric Blake + 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. diff --git a/lib/fflush.c b/lib/fflush.c index 5271e17dfa..8c902f80d8 100755 --- a/lib/fflush.c +++ b/lib/fflush.c @@ -21,13 +21,7 @@ #include #include -#if HAVE_STDIO_EXT_H -# include -#endif - -#if HAVE_FPURGE && ! HAVE_DECL_FPURGE -int fpurge (FILE *); -#endif +#include "fpurge.h" #undef fflush @@ -36,53 +30,31 @@ int fpurge (FILE *); 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; } diff --git a/m4/fflush.m4 b/m4/fflush.m4 index 161680f2ce..d4ebeccb6c 100755 --- 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 diff --git a/modules/fflush b/modules/fflush index ccb58b0889..ff79fa6112 100755 --- a/modules/fflush +++ b/modules/fflush @@ -6,7 +6,9 @@ lib/fflush.c m4/fflush.m4 Depends-on: +fpurge stdio +unistd configure.ac: gl_FUNC_FFLUSH diff --git a/modules/fflush-tests b/modules/fflush-tests index 0f0e5670ef..c0979dd30e 100755 --- a/modules/fflush-tests +++ b/modules/fflush-tests @@ -2,7 +2,6 @@ Files: tests/test-fflush.c Depends-on: -unistd configure.ac: -- 2.30.2