diff --git a/kernel/kernel/Syscall.cpp b/kernel/kernel/Syscall.cpp index 9b2d8630..ea46f8c6 100644 --- a/kernel/kernel/Syscall.cpp +++ b/kernel/kernel/Syscall.cpp @@ -144,6 +144,14 @@ namespace Kernel return 0; } + long sys_read_dir_entries(int fd, API::DirectoryEntryList* buffer, size_t buffer_size) + { + auto ret = Process::current().read_next_directory_entries(fd, buffer, buffer_size); + if (ret.is_error()) + return -ret.error().get_error_code(); + return 0; + } + extern "C" long sys_fork_trampoline(); extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5) @@ -215,6 +223,9 @@ namespace Kernel case SYS_SETENVP: ret = sys_setenvp((char**)arg1); break; + case SYS_READ_DIR_ENTRIES: + ret = sys_read_dir_entries((int)arg1, (API::DirectoryEntryList*)arg2, (size_t)arg3); + break; default: Kernel::panic("Unknown syscall {}", syscall); } diff --git a/libc/include/sys/syscall.h b/libc/include/sys/syscall.h index ad8b5cb3..ecee3d14 100644 --- a/libc/include/sys/syscall.h +++ b/libc/include/sys/syscall.h @@ -24,6 +24,7 @@ __BEGIN_DECLS #define SYS_WAIT 17 #define SYS_STAT 18 #define SYS_SETENVP 19 +#define SYS_READ_DIR_ENTRIES 20 __END_DECLS diff --git a/libc/unistd.cpp b/libc/unistd.cpp index 32553888..5fba2fec 100644 --- a/libc/unistd.cpp +++ b/libc/unistd.cpp @@ -163,6 +163,14 @@ long syscall(long syscall, ...) ret = Kernel::syscall(SYS_SETENVP, (uintptr_t)envp); break; } + case SYS_READ_DIR_ENTRIES: + { + int fd = va_arg(args, int); + void* buffer = va_arg(args, void*); + size_t buffer_size = va_arg(args, size_t); + ret = Kernel::syscall(SYS_READ_DIR_ENTRIES, fd, (uintptr_t)buffer, buffer_size); + break; + } default: puts("LibC: Unhandeled syscall"); ret = -ENOSYS;