Skip to content

Instantly share code, notes, and snippets.

@rksys
Created May 6, 2016 03:49
Show Gist options
  • Save rksys/6b663af48ff57bc551ac45b236887bc5 to your computer and use it in GitHub Desktop.
Save rksys/6b663af48ff57bc551ac45b236887bc5 to your computer and use it in GitHub Desktop.
struct retval myread(int fd_id, void *buf, size_t nbytes) {
struct retval retval;
retval.errno = NO_ERROR;
retval.val_h = (int*) FAILED;
retval.val_l = (int*) FAILED;
if (fd_id <= FREE_FD || fd_id >= OPEN_MAX) {
retval.errno = EBADF;
return retval;
}
lock_acquire(curthread->fd_table_lock);
struct file_descriptor* fd = curthread->file_descriptors[fd_id];
if (fd == NULL) {
lock_release(curthread->fd_table_lock);
retval.errno = EBADF;
return retval;
}
lock_release(curthread->fd_table_lock);
if ((fd->flags & O_WRONLY) == O_WRONLY) {
retval.errno = EACCES;
return retval;
}
lock_acquire(fd->lock);
struct iovec iov;
struct uio uio_reader;
uio_kinit(&iov, &uio_reader, (void*) buf, nbytes, fd->offset, UIO_READ);
uio_reader.uio_segflg = UIO_USERSPACE;
uio_reader.uio_space = curthread->t_proc->p_addrspace;
int err = VOP_READ(fd->vnode, &uio_reader);
if (err) {
lock_release(fd->lock);
retval.errno = err;
return retval;
}
fd->offset += nbytes - uio_reader.uio_resid;
retval.val_h = (void*)(nbytes - uio_reader.uio_resid);
lock_release(fd->lock);
return retval;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment