From 18e2559b1e7d8f3f3f5b9c39f942a11d930c595a Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 28 May 2024 01:08:04 +0300 Subject: [PATCH] Kernel/LibC: Add SYS_TRUNCATE --- kernel/include/kernel/OpenFileDescriptorSet.h | 2 ++ kernel/include/kernel/Process.h | 2 ++ kernel/kernel/OpenFileDescriptorSet.cpp | 6 ++++++ kernel/kernel/Process.cpp | 7 +++++++ libc/include/sys/syscall.h | 1 + libc/unistd.cpp | 5 +++++ 6 files changed, 23 insertions(+) diff --git a/kernel/include/kernel/OpenFileDescriptorSet.h b/kernel/include/kernel/OpenFileDescriptorSet.h index 99386657..43321fe7 100644 --- a/kernel/include/kernel/OpenFileDescriptorSet.h +++ b/kernel/include/kernel/OpenFileDescriptorSet.h @@ -36,6 +36,8 @@ namespace Kernel BAN::ErrorOr seek(int fd, off_t offset, int whence); BAN::ErrorOr tell(int) const; + BAN::ErrorOr truncate(int fd, off_t length); + BAN::ErrorOr fstat(int fd, struct stat*) const; BAN::ErrorOr fstatat(int fd, BAN::StringView path, struct stat* buf, int flag); BAN::ErrorOr stat(BAN::StringView absolute_path, struct stat* buf, int flag); diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 97e9aec8..72df79c8 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -138,6 +138,8 @@ namespace Kernel BAN::ErrorOr sys_seek(int fd, off_t offset, int whence); BAN::ErrorOr sys_tell(int fd); + BAN::ErrorOr sys_truncate(int fd, off_t length); + BAN::ErrorOr sys_fstat(int fd, struct stat*); BAN::ErrorOr sys_fstatat(int fd, const char* path, struct stat* buf, int flag); BAN::ErrorOr sys_stat(const char* path, struct stat* buf, int flag); diff --git a/kernel/kernel/OpenFileDescriptorSet.cpp b/kernel/kernel/OpenFileDescriptorSet.cpp index bd09d0b0..2043ead3 100644 --- a/kernel/kernel/OpenFileDescriptorSet.cpp +++ b/kernel/kernel/OpenFileDescriptorSet.cpp @@ -242,6 +242,12 @@ namespace Kernel return m_open_files[fd]->offset; } + BAN::ErrorOr OpenFileDescriptorSet::truncate(int fd, off_t length) + { + TRY(validate_fd(fd)); + return m_open_files[fd]->inode->truncate(length); + } + static void read_stat_from_inode(BAN::RefPtr inode, struct stat* out) { out->st_dev = inode->dev(); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 80945b20..9685a2f5 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -1145,6 +1145,13 @@ namespace Kernel return TRY(m_open_file_descriptors.tell(fd)); } + BAN::ErrorOr Process::sys_truncate(int fd, off_t length) + { + LockGuard _(m_process_lock); + TRY(m_open_file_descriptors.truncate(fd, length)); + return 0; + } + BAN::ErrorOr Process::mount(BAN::StringView source, BAN::StringView target) { BAN::String absolute_source, absolute_target; diff --git a/libc/include/sys/syscall.h b/libc/include/sys/syscall.h index c2382c15..daebd556 100644 --- a/libc/include/sys/syscall.h +++ b/libc/include/sys/syscall.h @@ -73,6 +73,7 @@ __BEGIN_DECLS O(SYS_CONNECT, connect) \ O(SYS_LISTEN, listen) \ O(SYS_PSELECT, pselect) \ + O(SYS_TRUNCATE, truncate) \ enum Syscall { diff --git a/libc/unistd.cpp b/libc/unistd.cpp index 689a19c0..3ad3e91b 100644 --- a/libc/unistd.cpp +++ b/libc/unistd.cpp @@ -99,6 +99,11 @@ off_t lseek(int fildes, off_t offset, int whence) return syscall(SYS_SEEK, fildes, offset, whence); } +int ftruncate(int fildes, off_t length) +{ + return syscall(SYS_TRUNCATE, fildes, length); +} + int dup(int fildes) { return syscall(SYS_DUP, fildes);