1 #include <errno.h> 2 #include <unistd.h> 3 #include <string.h> 4 #include "lib.h" 5 #include "sys9.h" 6 7 #include <stdio.h> 8 9 ssize_t 10 read(int d, void *buf, size_t nbytes) 11 { 12 int n, noblock, isbuf; 13 Fdinfo *f; 14 15 if(d<0 || d>=OPEN_MAX || !((f = &_fdinfo[d])->flags&FD_ISOPEN)){ 16 errno = EBADF; 17 return -1; 18 } 19 if(nbytes <= 0) 20 return 0; 21 if(buf == 0){ 22 errno = EFAULT; 23 return -1; 24 } 25 f = &_fdinfo[d]; 26 noblock = f->oflags&O_NONBLOCK; 27 isbuf = f->flags&(FD_BUFFERED|FD_BUFFEREDX); 28 if(noblock || isbuf){ 29 if(f->flags&FD_BUFFEREDX) { 30 errno = EIO; 31 return -1; 32 } 33 if(!isbuf) { 34 if(_startbuf(d) != 0) { 35 errno = EIO; 36 return -1; 37 } 38 } 39 n = _readbuf(d, buf, nbytes, noblock); 40 }else{ 41 n = _READ(d, buf, nbytes); 42 if(n < 0) 43 _syserrno(); 44 } 45 return n; 46 } 47