1/*- 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Chris Torek. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 25 unchanged lines hidden (view full) --- 34 * SUCH DAMAGE. 35 */ 36 37#if defined(LIBC_SCCS) && !defined(lint) 38#if 0 39static char sccsid[] = "@(#)refill.c 8.1 (Berkeley) 6/4/93"; 40#endif 41static const char rcsid[] = |
42 "$FreeBSD: head/lib/libc/stdio/refill.c 72373 2001-02-11 22:06:43Z deischen $"; |
43#endif /* LIBC_SCCS and not lint */ 44 |
45#include "namespace.h" |
46#include <errno.h> 47#include <stdio.h> 48#include <stdlib.h> |
49#include "un-namespace.h" |
50 |
51#include "libc_private.h" |
52#include "local.h" 53 54static int lflush __P((FILE *)); 55 56static int |
57lflush(FILE *fp) |
58{ |
59 int ret = 0; |
60 |
61 if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR)) { 62 FLOCKFILE(fp); 63 ret = __sflush(fp); 64 FUNLOCKFILE(fp); 65 } 66 return (ret); |
67} 68 69/* 70 * Refill a stdio buffer. 71 * Return EOF on eof or error, 0 otherwise. 72 */ 73int |
74__srefill(FILE *fp) |
75{ |
76 /* make sure stdio is set up */ 77 if (!__sdidinit) 78 __sinit(); 79 80 fp->_r = 0; /* largely a convenience for callers */ 81 82 /* SysV does not make this test; take it out for compatibility */ 83 if (fp->_flags & __SEOF) --- 34 unchanged lines hidden (view full) --- 118 if (fp->_bf._base == NULL) 119 __smakebuf(fp); 120 121 /* 122 * Before reading from a line buffered or unbuffered file, 123 * flush all line buffered output files, per the ANSI C 124 * standard. 125 */ |
126 if (fp->_flags & (__SLBF|__SNBF)) { 127 /* Ignore this file in _fwalk to avoid potential deadlock. */ 128 fp->_flags |= __SIGN; |
129 (void) _fwalk(lflush); |
130 fp->_flags &= ~__SIGN; 131 132 /* Now flush this file without locking it. */ 133 if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR)) 134 __sflush(fp); 135 } |
136 fp->_p = fp->_bf._base; 137 fp->_r = (*fp->_read)(fp->_cookie, (char *)fp->_p, fp->_bf._size); 138 fp->_flags &= ~__SMOD; /* buffer contents are again pristine */ 139 if (fp->_r <= 0) { 140 if (fp->_r == 0) 141 fp->_flags |= __SEOF; 142 else { 143 fp->_r = 0; 144 fp->_flags |= __SERR; 145 } 146 return (EOF); 147 } 148 return (0); 149} |