xref: /plan9-contrib/sys/src/libstdio/fflush.c (revision 22df390c30710ddd2119f3e7bb6c92dc399cabb9)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * pANS stdio -- fflush
33e12c5d1SDavid du Colombier  */
43e12c5d1SDavid du Colombier #include "iolib.h"
53e12c5d1SDavid du Colombier /*
63e12c5d1SDavid du Colombier  * pANS stdio -- data (put here, since loader won't load a separate file)
73e12c5d1SDavid du Colombier  */
83e12c5d1SDavid du Colombier FILE _IO_stream[]={
9*22df390cSDavid du Colombier 	{ .fd 0, .state OPEN, },
10*22df390cSDavid du Colombier 	{ .fd 1, .state OPEN, },
11*22df390cSDavid du Colombier 	{ .fd 2, .state OPEN, },
123e12c5d1SDavid du Colombier };
137dd7cddfSDavid du Colombier 
_fflush(FILE * f)147dd7cddfSDavid du Colombier int _fflush(FILE *f){
153e12c5d1SDavid du Colombier 	int error, cnt;
167dd7cddfSDavid du Colombier 
173e12c5d1SDavid du Colombier 	if(f==NULL){
183e12c5d1SDavid du Colombier 		error=0;
193e12c5d1SDavid du Colombier 		for(f=_IO_stream;f!=&_IO_stream[FOPEN_MAX];f++)
207dd7cddfSDavid du Colombier 			if(f->state==WR && _fflush(f)==EOF)
213e12c5d1SDavid du Colombier 				error=EOF;
223e12c5d1SDavid du Colombier 		return error;
233e12c5d1SDavid du Colombier 	}
243e12c5d1SDavid du Colombier 	if(f->flags&STRING) return EOF;
253e12c5d1SDavid du Colombier 	switch(f->state){
263e12c5d1SDavid du Colombier 	default:	/* OPEN RDWR EOF RD */
273e12c5d1SDavid du Colombier 		return 0;
283e12c5d1SDavid du Colombier 	case CLOSED:
293e12c5d1SDavid du Colombier 	case ERR:
303e12c5d1SDavid du Colombier 		return EOF;
313e12c5d1SDavid du Colombier 	case WR:
323e12c5d1SDavid du Colombier 		cnt=(f->flags&LINEBUF?f->lp:f->wp)-f->buf;
333e12c5d1SDavid du Colombier 		if(cnt && write(f->fd, f->buf, cnt)!=cnt){
343e12c5d1SDavid du Colombier 			f->state=ERR;
353e12c5d1SDavid du Colombier 			return EOF;
363e12c5d1SDavid du Colombier 		}
373e12c5d1SDavid du Colombier 		f->rp=f->wp=f->buf;
383e12c5d1SDavid du Colombier 		f->state=RDWR;
393e12c5d1SDavid du Colombier 		return 0;
403e12c5d1SDavid du Colombier 	}
413e12c5d1SDavid du Colombier }
427dd7cddfSDavid du Colombier 
fflush(FILE * f)437dd7cddfSDavid du Colombier int fflush(FILE *f)
447dd7cddfSDavid du Colombier {
457dd7cddfSDavid du Colombier 	int r;
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier 	qlock(&_stdiolk);
487dd7cddfSDavid du Colombier 	r = _fflush(f);
497dd7cddfSDavid du Colombier 	qunlock(&_stdiolk);
507dd7cddfSDavid du Colombier 	return r;
517dd7cddfSDavid du Colombier }
52