diff options
Diffstat (limited to 'kernel/kernel/filesystem/ext2/inode.cpp')
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/kernel/filesystem/ext2/inode.cpp b/kernel/kernel/filesystem/ext2/inode.cpp index f42e2c0c..89e52232 100644 --- a/kernel/kernel/filesystem/ext2/inode.cpp +++ b/kernel/kernel/filesystem/ext2/inode.cpp @@ -3,6 +3,7 @@ #include <kernel/filesystem/ext2/filesystem.hpp> #include <kernel/filesystem/inode.hpp> +#include <kapi/filesystem.hpp> #include <kapi/system.hpp> #include <kstd/cstring.hpp> @@ -12,6 +13,7 @@ #include <algorithm> #include <cstddef> #include <cstdint> +#include <optional> using namespace kstd::units_literals; @@ -201,6 +203,36 @@ namespace kernel::filesystem::ext2 return (m_data.mode & constants::mode_mask) == constants::mode_symbolic_link; } + auto inode::status() const -> kstd::result<kapi::filesystem::file_status> + { + auto result = kernel::filesystem::inode::status(); + if (!result) + { + return result; + } + + result->size = size(); + result->inode_number = m_inode_number; + result->link_count = m_data.links_count; + + return result; + } + + auto inode::raw_device() const -> std::optional<kapi::filesystem::device_number> + { + if (!is_device()) + { + return std::nullopt; + } + + auto const raw_device_number = m_data.block[0]; + + return kapi::filesystem::device_number{ + .major = static_cast<std::uint8_t>((raw_device_number >> 8) & 0xff), + .minor = static_cast<std::uint8_t>(raw_device_number & 0xff), + }; + } + auto inode::size() const -> kstd::units::bytes { uint64_t size = m_data.size; |
