diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 067ae4ad..e0d4d180 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -105,6 +105,8 @@ namespace Kernel BAN::ErrorOr sys_readlink(const char* path, char* buffer, size_t bufsize); BAN::ErrorOr sys_readlinkat(int fd, const char* path, char* buffer, size_t bufsize); + BAN::ErrorOr sys_pread(int fd, void* buffer, size_t count, off_t offset); + BAN::ErrorOr sys_chmod(const char*, mode_t); BAN::ErrorOr sys_pipe(int fildes[2]); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 121fa107..b00945b2 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -823,6 +823,14 @@ namespace Kernel return readlink_impl(absolute_path.sv(), buffer, bufsize); } + BAN::ErrorOr Process::sys_pread(int fd, void* buffer, size_t count, off_t offset) + { + LockGuard _(m_lock); + validate_pointer_access(buffer, count); + auto inode = TRY(m_open_file_descriptors.inode_of(fd)); + return TRY(inode->read(offset, { (uint8_t*)buffer, count })); + } + BAN::ErrorOr Process::sys_chmod(const char* path, mode_t mode) { if (mode & S_IFMASK) diff --git a/kernel/kernel/Syscall.cpp b/kernel/kernel/Syscall.cpp index f7613b2f..ec8a953e 100644 --- a/kernel/kernel/Syscall.cpp +++ b/kernel/kernel/Syscall.cpp @@ -220,6 +220,9 @@ namespace Kernel case SYS_MSYNC: ret = Process::current().sys_msync((void*)arg1, (size_t)arg2, (int)arg3); break; + case SYS_PREAD: + ret = Process::current().sys_pread((int)arg1, (void*)arg2, (size_t)arg3, (off_t)arg4); + break; default: dwarnln("Unknown syscall {}", syscall); break; diff --git a/libc/include/sys/syscall.h b/libc/include/sys/syscall.h index 3a8c9d95..7c568950 100644 --- a/libc/include/sys/syscall.h +++ b/libc/include/sys/syscall.h @@ -62,6 +62,7 @@ __BEGIN_DECLS #define SYS_READLINK 59 #define SYS_READLINKAT 60 #define SYS_MSYNC 61 +#define SYS_PREAD 62 __END_DECLS diff --git a/libc/unistd.cpp b/libc/unistd.cpp index 0e35d625..7b401d49 100644 --- a/libc/unistd.cpp +++ b/libc/unistd.cpp @@ -88,6 +88,11 @@ ssize_t readlinkat(int fd, const char* __restrict path, char* __restrict buf, si return syscall(SYS_READLINKAT, fd, path, buf, bufsize); } +ssize_t pread(int fildes, void* buf, size_t nbyte, off_t offset) +{ + return syscall(SYS_PREAD, fildes, buf, nbyte, offset); +} + int dup(int fildes) { return syscall(SYS_DUP, fildes);