Kernel/LibC: Implement utime* family functions

This patch adds *working*
 - utime
 - utimes
 - utimensat
 - futimens
This commit is contained in:
2025-05-29 05:01:26 +03:00
parent 8392472bac
commit 1bd454b8fd
13 changed files with 150 additions and 20 deletions

View File

@@ -4,6 +4,8 @@
#include <kernel/FS/Ext2/Inode.h>
#include <kernel/Timer/Timer.h>
#include <sys/stat.h>
namespace Kernel
{
@@ -287,6 +289,28 @@ namespace Kernel
return {};
}
BAN::ErrorOr<void> Ext2Inode::utimens_impl(const timespec times[2])
{
const uint32_t old_times[2] {
m_inode.atime,
m_inode.mtime,
};
if (times[0].tv_nsec != UTIME_OMIT)
m_inode.atime = times[0].tv_sec;
if (times[1].tv_nsec != UTIME_OMIT)
m_inode.mtime = times[1].tv_sec;
if (auto ret = sync(); ret.is_error())
{
m_inode.atime = old_times[0];
m_inode.mtime = old_times[1];
return ret.release_error();
}
return {};
}
BAN::ErrorOr<void> Ext2Inode::fsync_impl()
{
for (size_t i = 0; i < max_used_data_block_count(); i++)

View File

@@ -231,6 +231,12 @@ namespace Kernel
return chown_impl(uid, gid);
}
BAN::ErrorOr<void> Inode::utimens(const timespec times[2])
{
LockGuard _(m_mutex);
return utimens_impl(times);
}
BAN::ErrorOr<void> Inode::fsync()
{
LockGuard _(m_mutex);

View File

@@ -2,6 +2,8 @@
#include <kernel/FS/TmpFS/Inode.h>
#include <kernel/Timer/Timer.h>
#include <sys/stat.h>
namespace Kernel
{
@@ -90,6 +92,23 @@ namespace Kernel
m_fs.delete_inode(ino());
}
BAN::ErrorOr<void> TmpInode::chmod_impl(mode_t new_mode)
{
ASSERT(!(new_mode & Mode::TYPE_MASK));
m_inode_info.mode &= ~Mode::TYPE_MASK;
m_inode_info.mode |= new_mode;
return {};
}
BAN::ErrorOr<void> TmpInode::utimens_impl(const timespec times[2])
{
if (times[0].tv_nsec != UTIME_OMIT)
m_inode_info.atime = times[0];
if (times[1].tv_nsec != UTIME_OMIT)
m_inode_info.atime = times[1];
return {};
}
void TmpInode::sync()
{
m_fs.write_inode(m_ino, m_inode_info);
@@ -219,12 +238,6 @@ namespace Kernel
return {};
}
BAN::ErrorOr<void> TmpFileInode::chmod_impl(mode_t new_mode)
{
m_inode_info.mode = new_mode;
return {};
}
/* SOCKET INODE */
BAN::ErrorOr<BAN::RefPtr<TmpSocketInode>> TmpSocketInode::create_new(TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid)
{
@@ -248,12 +261,6 @@ namespace Kernel
{
}
BAN::ErrorOr<void> TmpSocketInode::chmod_impl(mode_t new_mode)
{
m_inode_info.mode = new_mode;
return {};
}
/* SYMLINK INODE */
BAN::ErrorOr<BAN::RefPtr<TmpSymlinkInode>> TmpSymlinkInode::create_new(TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid, BAN::StringView target)