no SCCS file; new copyright; att/bsd/shared
[unix-history] / usr / src / lib / libc / stdio / fflush.c
CommitLineData
c9be6cfe
KB
1/*-
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Chris Torek.
7 *
8 * %sccs.include.redist.c%
9 */
10
11#if defined(LIBC_SCCS) && !defined(lint)
12static char sccsid[] = "@(#)fflush.c 5.1 (Berkeley) %G%";
13#endif /* LIBC_SCCS and not lint */
14
15#include <sys/errno.h>
16#include <stdio.h>
17#include "local.h"
18
19/* Flush a single file, or (if fp is NULL) all files. */
20fflush(fp)
21 register FILE *fp;
22{
23 if (fp == NULL)
24 return (_fwalk(__sflush));
25
26 if ((fp->_flags & __SWR) == 0) {
27 errno = EBADF;
28 return (EOF);
29 }
30 return (__sflush(fp));
31}
32
33__sflush(fp)
34 register FILE *fp;
35{
36 register unsigned char *p;
37 register int n, t;
38
39 t = fp->_flags;
40 if ((t & __SWR) == 0)
41 return (0);
42
43 if ((p = fp->_bf._base) == NULL)
44 return (0);
45
46 n = fp->_p - p; /* write this much */
47
48 /*
49 * Set these immediately to avoid problems with longjmp and to allow
50 * exchange buffering (via setvbuf) in user write function.
51 */
52 fp->_p = p;
53 fp->_w = t & (__SLBF|__SNBF) ? 0 : fp->_bf._size;
54
55 for (; n > 0; n -= t, p += t) {
56 t = (*fp->_write)(fp->_cookie, (char *)p, n);
57 if (t <= 0) {
58 fp->_flags |= __SERR;
59 return (EOF);
60 }
61 }
62 return (0);
63}