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