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 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 153e12c5d1SDavid du Colombier if(d<0 || d>=OPEN_MAX || !((f = &_fdinfo[d])->flags&FD_ISOPEN)){ 163e12c5d1SDavid du Colombier errno = EBADF; 173e12c5d1SDavid du Colombier return -1; 183e12c5d1SDavid du Colombier } 19*219b2ee8SDavid 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; 27*219b2ee8SDavid du Colombier isbuf = f->flags&(FD_BUFFERED|FD_BUFFEREDX); 283e12c5d1SDavid du Colombier if(noblock || isbuf){ 29*219b2ee8SDavid du Colombier if(f->flags&FD_BUFFEREDX) { 30*219b2ee8SDavid du Colombier errno = EIO; 31*219b2ee8SDavid du Colombier return -1; 32*219b2ee8SDavid du Colombier } 33*219b2ee8SDavid 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 } 39*219b2ee8SDavid 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