From 2c4fee4a82f61f11486cc36b4766f8e1da3a636c Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 8 Aug 2026 01:41:48 +0300 Subject: [PATCH] Kernel: Expose Inode::can_access as static member --- kernel/include/kernel/FS/Inode.h | 1 + kernel/kernel/FS/Inode.cpp | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/kernel/include/kernel/FS/Inode.h b/kernel/include/kernel/FS/Inode.h index 83063a81..94367a1b 100644 --- a/kernel/include/kernel/FS/Inode.h +++ b/kernel/include/kernel/FS/Inode.h @@ -83,6 +83,7 @@ namespace Kernel public: virtual ~Inode() {} + static bool can_access(uid_t uid, gid_t gid, mode_t mode, const Credentials& credentials, int); bool can_access(const Credentials&, int) const; bool operator==(const Inode& other) const { return dev() == other.dev() && ino() == other.ino(); } diff --git a/kernel/kernel/FS/Inode.cpp b/kernel/kernel/FS/Inode.cpp index 4a31c03a..69d2a2f3 100644 --- a/kernel/kernel/FS/Inode.cpp +++ b/kernel/kernel/FS/Inode.cpp @@ -11,18 +11,18 @@ namespace Kernel { - bool Inode::can_access(const Credentials& credentials, int flags) const + bool Inode::can_access(uid_t uid, gid_t gid, mode_t mode, const Credentials& credentials, int flags) { if (credentials.is_superuser()) return true; if (flags & O_RDONLY) { - if (mode().mode & S_IROTH) + if (mode & S_IROTH) { } - else if ((mode().mode & S_IRUSR) && credentials.euid() == uid()) + else if ((mode & S_IRUSR) && credentials.euid() == uid) { } - else if ((mode().mode & S_IRGRP) && credentials.has_egid(gid())) + else if ((mode & S_IRGRP) && credentials.has_egid(gid)) { } else { @@ -32,11 +32,11 @@ namespace Kernel if (flags & O_WRONLY) { - if (mode().mode & S_IWOTH) + if (mode & S_IWOTH) { } - else if ((mode().mode & S_IWUSR) && credentials.euid() == uid()) + else if ((mode & S_IWUSR) && credentials.euid() == uid) { } - else if ((mode().mode & S_IWGRP) && credentials.has_egid(gid())) + else if ((mode & S_IWGRP) && credentials.has_egid(gid)) { } else { @@ -44,13 +44,13 @@ namespace Kernel } } - if ((flags & O_EXEC) || (mode().ifdir() && (flags & O_SEARCH))) + if ((flags & O_EXEC) || (Mode { mode }.ifdir() && (flags & O_SEARCH))) { - if (mode().mode & S_IXOTH) + if (mode & S_IXOTH) { } - else if ((mode().mode & S_IXUSR) && credentials.euid() == uid()) + else if ((mode & S_IXUSR) && credentials.euid() == uid) { } - else if ((mode().mode & S_IXGRP) && credentials.has_egid(gid())) + else if ((mode & S_IXGRP) && credentials.has_egid(gid)) { } else { @@ -61,6 +61,11 @@ namespace Kernel return true; } + bool Inode::can_access(const Credentials& credentials, int flags) const + { + return can_access(uid(), gid(), mode().mode, credentials, flags); + } + BAN::ErrorOr> Inode::find_inode(BAN::StringView name) { if (!mode().ifdir())