xref: /plan9/sys/src/ape/lib/ap/plan9/read.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
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