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/compat/unix/os/os_filedesc.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/sys/compat/unix') diff --git a/src/sys/compat/unix/os/os_filedesc.c b/src/sys/compat/unix/os/os_filedesc.c index 48ea6be..673701f 100644 --- a/src/sys/compat/unix/os/os_filedesc.c +++ b/src/sys/compat/unix/os/os_filedesc.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -105,3 +106,35 @@ sys_mount(struct syscall_args *scargs) args.fstype = fstype; return kmount(&args, u_mountflags); } + +/* + * ARG0: fd + * ARG1: buf[] + * ARG2: count + */ +scret_t +sys_read(struct syscall_args *scargs) +{ + int fd = SCARG(scargs, int, 0); + char *u_buf = SCARG(scargs, char *, 1); + size_t count = SCARG(scargs, size_t, 2); + char *kbuf; + ssize_t retval; + int error; + + /* Do we have enough memory to fulfill this */ + kbuf = kalloc(count); + if (kbuf == NULL) { + return -ENOMEM; + } + + retval = read(fd, kbuf, count); + if (retval < 0) { + kfree(kbuf); + return retval; + } + + error = copyout(kbuf, u_buf, count); + kfree(kbuf); + return (error == 0) ? retval : error; +} -- cgit v1.2.3