#include #include #include #include "fileutil.h" int fflush(FILE *fp) { /* TODO: fflush(NULL) should flush "all" files (do we track them?) */ if(!fp) { errno = EINVAL; return EOF; } if(!fp->buf) return 0; int rc = 0; /* In reading mode, reset the file offset */ if(__fp_hasbuf_read(fp)) { fp->fdpos = fp->fdpos - fp->bufread + fp->bufpos; lseek(fp->fd, fp->fdpos, SEEK_SET); } /* In writing mode, write pending data */ else if(__fp_hasbuf_write(fp)) { ssize_t written = __fp_write(fp, fp->buf, fp->bufpos); rc = (written == (ssize_t)fp->bufpos ? 0 : EOF); /* TODO: fflush(): Keep data that couldn't be written */ } fp->bufpos = 0; fp->bufread = 0; fp->bufungetc = 0; /* Clear buffering for unbuffered streams that used ungetc() */ if(fp->bufmode == _IONBF) __fp_remove_buffer(fp); return rc; }