Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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 || !(_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
}