Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
script3r
GitHub Repository: script3r/os161
Path: blob/master/kern/syscall/read.c
2093 views
1
#include <types.h>
2
#include <lib.h>
3
#include <copyinout.h>
4
#include <proc.h>
5
#include <kern/iovec.h>
6
#include <uio.h>
7
#include <file.h>
8
#include <kern/fcntl.h>
9
#include <kern/errno.h>
10
#include <vnode.h>
11
#include <current.h>
12
#include <syscall.h>
13
14
int
15
sys_read( int fd, userptr_t ubuf, size_t ulen, int *retval ) {
16
struct proc *p = NULL;
17
struct file *f = NULL;
18
struct uio ruio;
19
struct iovec iov;
20
int err;
21
22
KASSERT( curthread != NULL );
23
KASSERT( curthread->td_proc != NULL );
24
25
p = curthread->td_proc;
26
27
//attempt to open the file
28
err = file_get( p, fd, &f );
29
if( err )
30
return err;
31
32
//check whether we have reading permissions
33
if( f->f_oflags & O_WRONLY ) {
34
F_UNLOCK( f );
35
return EBADF;
36
}
37
38
//prepare the uio for read
39
uio_kinit (
40
&iov,
41
&ruio,
42
ubuf,
43
ulen,
44
f->f_offset,
45
UIO_READ
46
);
47
48
ruio.uio_space = curthread->t_addrspace;
49
ruio.uio_segflg = UIO_USERSPACE;
50
51
//perform the read
52
err = VOP_READ( f->f_vnode, &ruio );
53
54
if( err ) {
55
F_UNLOCK( f );
56
return err;
57
}
58
59
//advance the offset
60
f->f_offset = ruio.uio_offset;
61
62
//set the number of bytes read to be retval
63
*retval = ulen - ruio.uio_resid;
64
65
//unlock and quit
66
F_UNLOCK( f );
67
return 0;
68
}
69
70