ref: 065c3557af8de1b20d94c2e86a4a29c5d33ccc67
dir: /sys/src/ape/lib/ap/plan9/read.c/
#include <errno.h> #include <unistd.h> #include <string.h> #include "lib.h" #include "sys9.h" #include <stdio.h> ssize_t read(int d, void *buf, size_t nbytes) { int n, noblock, isbuf; Fdinfo *f; if(d<0 || d>=OPEN_MAX || !((f = &_fdinfo[d])->flags&FD_ISOPEN)){ errno = EBADF; return -1; } if(nbytes <= 0) return 0; if(buf == 0){ errno = EFAULT; return -1; } f = &_fdinfo[d]; noblock = f->oflags&O_NONBLOCK; isbuf = f->flags&(FD_BUFFERED|FD_BUFFEREDX); if(noblock || isbuf){ if(f->flags&FD_BUFFEREDX) { errno = EIO; return -1; } if(!isbuf) { if(_startbuf(d) != 0) { errno = EIO; return -1; } } n = _readbuf(d, buf, nbytes, noblock); }else{ n = _READ(d, buf, nbytes); if(n < 0) _syserrno(); } return n; }