From b9e8dbfd957337ff064c4cb8bb5bd7b23ac88b8d Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Wed, 15 Oct 2025 13:01:39 -0400 Subject: kern: Add SYS_read system call for file I/O Signed-off-by: Ian Moffett --- src/sys/os/os_filedes.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src/sys/os') 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 -- cgit v1.2.3