1 /* fflush.c -- allow flushing input streams
2 Copyright (C) 2007 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18 /* Written by Eric Blake. */
33 /* Flush all pending data on STREAM according to POSIX rules. Both
34 output and seekable input streams are supported. */
36 rpl_fflush (FILE *stream)
41 /* When stream is NULL, POSIX only requires flushing of output
42 streams. C89 guarantees behavior of output streams, and fflush
43 should be safe on read-write streams that are not currently
45 if (! stream || ! freading (stream))
46 return fflush (stream);
48 /* POSIX does not specify fflush behavior for non-seekable input
50 pos = ftello (stream);
57 /* To get here, we must be flushing a seekable input stream, so the
58 semantics of fpurge are now appropriate to clear the buffer. To
59 avoid losing data, the lseek is also necessary. */
60 result = fpurge (stream);
63 pos = lseek (fileno (stream), pos, SEEK_SET);
66 #if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
67 stream->_offset = pos;
68 stream->_flags |= __SOFF;