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
read(int d,void * buf,size_t nbytes)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 || !(_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