Kernel: Implement chown to ext2 and tmpfs
This commit is contained in:
@@ -46,6 +46,7 @@ namespace Kernel
|
|||||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
||||||
virtual BAN::ErrorOr<void> truncate_impl(size_t) override;
|
virtual BAN::ErrorOr<void> truncate_impl(size_t) override;
|
||||||
virtual BAN::ErrorOr<void> chmod_impl(mode_t) override;
|
virtual BAN::ErrorOr<void> chmod_impl(mode_t) override;
|
||||||
|
virtual BAN::ErrorOr<void> chown_impl(uid_t, gid_t) override;
|
||||||
virtual BAN::ErrorOr<void> utimens_impl(const timespec[2]) override;
|
virtual BAN::ErrorOr<void> utimens_impl(const timespec[2]) override;
|
||||||
virtual BAN::ErrorOr<void> fsync_impl() override;
|
virtual BAN::ErrorOr<void> fsync_impl() override;
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ namespace Kernel
|
|||||||
TmpInode(TmpFileSystem&, ino_t, const TmpInodeInfo&);
|
TmpInode(TmpFileSystem&, ino_t, const TmpInodeInfo&);
|
||||||
|
|
||||||
virtual BAN::ErrorOr<void> chmod_impl(mode_t) override;
|
virtual BAN::ErrorOr<void> chmod_impl(mode_t) override;
|
||||||
|
virtual BAN::ErrorOr<void> chown_impl(uid_t, gid_t) override;
|
||||||
virtual BAN::ErrorOr<void> utimens_impl(const timespec[2]) override;
|
virtual BAN::ErrorOr<void> utimens_impl(const timespec[2]) override;
|
||||||
virtual BAN::ErrorOr<void> fsync_impl() override { return {}; }
|
virtual BAN::ErrorOr<void> fsync_impl() override { return {}; }
|
||||||
|
|
||||||
|
|||||||
@@ -289,6 +289,26 @@ namespace Kernel
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> Ext2Inode::chown_impl(uid_t uid, gid_t gid)
|
||||||
|
{
|
||||||
|
if (m_inode.uid == uid && m_inode.gid == gid)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
const auto old_uid = m_inode.uid;
|
||||||
|
const auto old_gid = m_inode.gid;
|
||||||
|
|
||||||
|
m_inode.uid = uid;
|
||||||
|
m_inode.gid = gid;
|
||||||
|
if (auto ret = sync(); ret.is_error())
|
||||||
|
{
|
||||||
|
m_inode.uid = old_uid;
|
||||||
|
m_inode.gid = old_gid;
|
||||||
|
return ret.release_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> Ext2Inode::utimens_impl(const timespec times[2])
|
BAN::ErrorOr<void> Ext2Inode::utimens_impl(const timespec times[2])
|
||||||
{
|
{
|
||||||
const uint32_t old_times[2] {
|
const uint32_t old_times[2] {
|
||||||
|
|||||||
@@ -100,6 +100,13 @@ namespace Kernel
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> TmpInode::chown_impl(uid_t new_uid, gid_t new_gid)
|
||||||
|
{
|
||||||
|
m_inode_info.uid = new_uid;
|
||||||
|
m_inode_info.gid = new_gid;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> TmpInode::utimens_impl(const timespec times[2])
|
BAN::ErrorOr<void> TmpInode::utimens_impl(const timespec times[2])
|
||||||
{
|
{
|
||||||
if (times[0].tv_nsec != UTIME_OMIT)
|
if (times[0].tv_nsec != UTIME_OMIT)
|
||||||
|
|||||||
Reference in New Issue
Block a user