blob: 0970c68a678efa32d634b7d8d119f3523f0a46cf [file] [log] [blame]
/*
* fflush.c
*/
#include "stdioint.h"
int fflush(FILE *f)
{
ssize_t rv;
char *p;
if (!f) {
int err = 0;
for (f = __stdio_headnode.next; f != &__stdio_headnode;
f = f->next)
err |= fflush(f);
return err;
}
if (!(f->flags & _IO_FILE_FLAG_WRITE))
return 0;
p = f->buf;
while (f->bytes) {
rv = write(f->fd, p, f->bytes);
if (rv == -1) {
if (errno == EINTR || errno == EAGAIN)
continue;
f->flags |= _IO_FILE_FLAG_ERR;
return EOF;
} else if (rv == 0) {
/* EOF on output? */
f->flags |= _IO_FILE_FLAG_EOF;
return EOF;
}
p += rv;
f->bytes -= rv;
}
f->offset = _IO_UNGET_SLOP;
f->flags &= ~_IO_FILE_FLAG_WRITE;
return 0;
}