aboutsummaryrefslogtreecommitdiff
path: root/kernel/kernel/filesystem/ext2/inode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kernel/filesystem/ext2/inode.cpp')
-rw-r--r--kernel/kernel/filesystem/ext2/inode.cpp32
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;