| /* Copyright (C) 2009 Eric Blake |
| * Permission to use, copy, modify, and distribute this software |
| * is freely granted, provided that this notice is preserved. |
| */ |
| |
| /* |
| FUNCTION |
| <<fpurge>>---discard pending file I/O |
| |
| INDEX |
| fpurge |
| INDEX |
| _fpurge_r |
| |
| ANSI_SYNOPSIS |
| #include <stdio.h> |
| int fpurge(FILE *<[fp]>); |
| |
| int _fpurge_r(struct _reent *<[reent]>, FILE *<[fp]>); |
| |
| DESCRIPTION |
| Use <<fpurge>> to clear all buffers of the given stream. For output |
| streams, this discards data not yet written to disk. For input streams, |
| this discards any data from <<ungetc>> and any data retrieved from disk |
| but not yet read via <<getc>>. This is more severe than <<fflush>>, |
| and generally is only needed when manually altering the underlying file |
| descriptor of a stream. |
| |
| The alternate function <<_fpurge_r>> is a reentrant version, where the |
| extra argument <[reent]> is a pointer to a reentrancy structure, and |
| <[fp]> must not be NULL. |
| |
| RETURNS |
| <<fpurge>> returns <<0>> unless <[fp]> is not valid, in which case it |
| returns <<EOF>> and sets <<errno>>. |
| |
| PORTABILITY |
| These functions are not portable to any standard. |
| |
| No supporting OS subroutines are required. |
| */ |
| |
| #include <_ansi.h> |
| #include <stdio.h> |
| #include <errno.h> |
| #include "local.h" |
| |
| /* Discard I/O from a single file. */ |
| |
| int |
| _DEFUN(_fpurge_r, (ptr, fp), |
| struct _reent *ptr _AND |
| register FILE * fp) |
| { |
| int t; |
| |
| CHECK_INIT (ptr, fp); |
| |
| _flockfile (fp); |
| |
| t = fp->_flags; |
| if (!t) |
| { |
| ptr->_errno = EBADF; |
| _funlockfile (fp); |
| return EOF; |
| } |
| fp->_p = fp->_bf._base; |
| if ((t & __SWR) == 0) |
| { |
| fp->_r = 0; |
| if (HASUB (fp)) |
| FREEUB (ptr, fp); |
| } |
| else |
| fp->_w = t & (__SLBF | __SNBF) ? 0 : fp->_bf._size; |
| _funlockfile (fp); |
| return 0; |
| } |
| |
| #ifndef _REENT_ONLY |
| |
| int |
| _DEFUN(fpurge, (fp), |
| register FILE * fp) |
| { |
| return _fpurge_r (_REENT, fp); |
| } |
| |
| #endif /* _REENT_ONLY */ |