xref: /plan9/sys/src/ape/lib/ap/plan9/read.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
13e12c5d1SDavid du Colombier #include <errno.h>
23e12c5d1SDavid du Colombier #include <unistd.h>
33e12c5d1SDavid du Colombier #include <string.h>
43e12c5d1SDavid du Colombier #include "lib.h"
53e12c5d1SDavid du Colombier #include "sys9.h"
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier #include <stdio.h>
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier ssize_t
read(int d,void * buf,size_t nbytes)103e12c5d1SDavid du Colombier read(int d, void *buf, size_t nbytes)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	int n, noblock, isbuf;
133e12c5d1SDavid du Colombier 	Fdinfo *f;
143e12c5d1SDavid du Colombier 
15*781103c4SDavid du Colombier 	if(d<0 || d>=OPEN_MAX || !(_fdinfo[d].flags&FD_ISOPEN)){
163e12c5d1SDavid du Colombier 		errno = EBADF;
173e12c5d1SDavid du Colombier 		return -1;
183e12c5d1SDavid du Colombier 	}
19219b2ee8SDavid du Colombier 	if(nbytes <= 0)
203e12c5d1SDavid du Colombier 		return 0;
213e12c5d1SDavid du Colombier 	if(buf == 0){
223e12c5d1SDavid du Colombier 		errno = EFAULT;
233e12c5d1SDavid du Colombier 		return -1;
243e12c5d1SDavid du Colombier 	}
253e12c5d1SDavid du Colombier 	f = &_fdinfo[d];
263e12c5d1SDavid du Colombier 	noblock = f->oflags&O_NONBLOCK;
27219b2ee8SDavid du Colombier 	isbuf = f->flags&(FD_BUFFERED|FD_BUFFEREDX);
283e12c5d1SDavid du Colombier 	if(noblock || isbuf){
29219b2ee8SDavid du Colombier 		if(f->flags&FD_BUFFEREDX) {
30219b2ee8SDavid du Colombier 			errno = EIO;
31219b2ee8SDavid du Colombier 			return -1;
32219b2ee8SDavid du Colombier 		}
33219b2ee8SDavid du Colombier 		if(!isbuf) {
343e12c5d1SDavid du Colombier 			if(_startbuf(d) != 0) {
353e12c5d1SDavid du Colombier 				errno = EIO;
363e12c5d1SDavid du Colombier 				return -1;
373e12c5d1SDavid du Colombier 			}
383e12c5d1SDavid du Colombier 		}
39219b2ee8SDavid du Colombier 		n = _readbuf(d, buf, nbytes, noblock);
403e12c5d1SDavid du Colombier 	}else{
413e12c5d1SDavid du Colombier 		n = _READ(d,  buf, nbytes);
423e12c5d1SDavid du Colombier 		if(n < 0)
433e12c5d1SDavid du Colombier 			_syserrno();
443e12c5d1SDavid du Colombier 	}
453e12c5d1SDavid du Colombier 	return n;
463e12c5d1SDavid du Colombier }
47