Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#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 || !(_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;
}