diff options
author | Ian Moffett <ian@osmora.org> | 2025-10-15 13:01:39 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-10-15 13:01:39 -0400 |
commit | b9e8dbfd957337ff064c4cb8bb5bd7b23ac88b8d (patch) | |
tree | 888d6e5c69a0178c4b00e11c80fdd96c22dfa53a /src/sys/os/os_filedes.c | |
parent | 9970641f0ee8c80be660e2b49e63f6ed4e3b8859 (diff) |
kern: Add SYS_read system call for file I/O
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys/os/os_filedes.c')
-rw-r--r-- | src/sys/os/os_filedes.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/sys/os/os_filedes.c b/src/sys/os/os_filedes.c index 5789427..9ba0c63 100644 --- a/src/sys/os/os_filedes.c +++ b/src/sys/os/os_filedes.c @@ -273,6 +273,40 @@ write(int fd, const void *buf, size_t count) return count; } +ssize_t +read(int fd, void *buf, size_t count) +{ + struct proc *self = proc_self(); + struct filedesc *fdp; + int error; + + if (buf == NULL) { + return -EINVAL; + } + + /* Must be valid */ + error = proc_check_addr(self, (uintptr_t)buf, count); + if (error < 0) { + return error; + } + + /* We need the actual descriptor */ + if ((fdp = fd_get(self, fd)) == NULL) { + return -EBADF; + } + + /* Can we read from it? */ + if (fdp->mode == O_WRONLY) { + return -EPERM; + } + + if (fdp->vp == NULL) { + return -EIO; + } + + return vop_read(fdp->vp, buf, count); +} + /* * ARG0: Path * ARG1: Mode |