From 31bcad25352358be0090c59603e1dcec78c92708 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sun, 1 Jun 2025 05:07:15 +0300 Subject: [PATCH] LibC: Implement truncate --- kernel/include/kernel/Process.h | 2 +- kernel/kernel/Process.cpp | 2 +- userspace/libraries/LibC/include/sys/syscall.h | 2 +- userspace/libraries/LibC/unistd.cpp | 12 +++++++++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 4499960802..cbd1d78819 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -150,7 +150,7 @@ 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_ftruncate(int fd, off_t length); BAN::ErrorOr sys_fsync(int fd); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 54d9810b54..a83e526964 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -1856,7 +1856,7 @@ namespace Kernel return TRY(m_open_file_descriptors.tell(fd)); } - BAN::ErrorOr Process::sys_truncate(int fd, off_t length) + BAN::ErrorOr Process::sys_ftruncate(int fd, off_t length) { TRY(m_open_file_descriptors.truncate(fd, length)); return 0; diff --git a/userspace/libraries/LibC/include/sys/syscall.h b/userspace/libraries/LibC/include/sys/syscall.h index 7a15417cf4..c3c77c819f 100644 --- a/userspace/libraries/LibC/include/sys/syscall.h +++ b/userspace/libraries/LibC/include/sys/syscall.h @@ -74,7 +74,7 @@ __BEGIN_DECLS O(SYS_LISTEN, listen) \ O(SYS_PSELECT, pselect) \ O(SYS_PPOLL, ppoll) \ - O(SYS_TRUNCATE, truncate) \ + O(SYS_FTRUNCATE, ftruncate) \ O(SYS_SMO_CREATE, smo_create) \ O(SYS_SMO_DELETE, smo_delete) \ O(SYS_SMO_MAP, smo_map) \ diff --git a/userspace/libraries/LibC/unistd.cpp b/userspace/libraries/LibC/unistd.cpp index 48f2172071..68d4d3646a 100644 --- a/userspace/libraries/LibC/unistd.cpp +++ b/userspace/libraries/LibC/unistd.cpp @@ -157,9 +157,19 @@ off_t lseek(int fildes, off_t offset, int whence) return syscall(SYS_SEEK, fildes, offset, whence); } +int truncate(const char* path, off_t length) +{ + const int fd = open(path, O_WRONLY); + if (fd == -1) + return -1; + int ret = ftruncate(fd, length); + close(fd); + return ret; +} + int ftruncate(int fildes, off_t length) { - return syscall(SYS_TRUNCATE, fildes, length); + return syscall(SYS_FTRUNCATE, fildes, length); } int fsync(int fildes)