#include "filesystem/inode.hpp" #include "kapi/system.hpp" #include "devices/device.hpp" #include "filesystem/inode_metadata.hpp" #include #include namespace filesystem { inode::inode(inode_kind kind) : m_kind(kind) {} inode::inode(kstd::shared_ptr device) : m_kind(inode_kind::device) , m_device(device) { if (!m_device) { kapi::system::panic("[FILESYSTEM] inode constructed with null device."); } } auto inode::metadata() const -> inode_metadata { auto meta = inode_metadata{}; meta.kind = m_kind; if (is_device()) { meta.major = m_device->major(); meta.minor = m_device->minor(); } return meta; } auto inode::is_directory() const -> bool { return m_kind == inode_kind::directory; } auto inode::is_regular() const -> bool { return m_kind == inode_kind::regular; } auto inode::is_device() const -> bool { return m_kind == inode_kind::device; } auto inode::is_block_device() const -> bool { return is_device() && m_device->is_block_device(); } auto inode::major_device() const -> size_t { if (!is_device()) { kapi::system::panic("[FILESYSTEM] inode::major_device called on non-device inode."); } return m_device->major(); } auto inode::minor_device() const -> size_t { if (!is_device()) { kapi::system::panic("[FILESYSTEM] inode::minor_device called on non-device inode."); } return m_device->minor(); } auto inode::backing_device() const -> kstd::shared_ptr { return m_device; } auto inode::read(void * /*buffer*/, size_t /*offset*/, size_t /*size*/) const -> size_t { if (is_device()) { kapi::system::panic("[FILESYSTEM] inode::read called on device inode. Open it as a device file first."); } // TODO BA-FS26 return 0; } auto inode::write(void const *, size_t, size_t) -> size_t { if (is_device()) { kapi::system::panic("[FILESYSTEM] inode::write called on device inode. Open it as a device file first."); } kapi::system::panic("[FILESYSTEM] inode::write is not implemented yet"); return 0; } } // namespace filesystem