#include "fs/tmpfs/FileSystem.h" #include "fs/devices/DeviceRegistry.h" #include "fs/tmpfs/Inode.h" #include #include #include namespace TmpFS { Result> FileSystem::create() { SharedPtr fs = TRY(adopt_shared_if_nonnull(new (std::nothrow) FileSystem())); SharedPtr root = TRY(fs->create_dir_inode({})); root->chmod(0755); fs->set_root(root); return (SharedPtr)fs; } Result> FileSystem::create_file_inode() { SharedPtr inode = TRY(make_shared()); inode->set_fs(*this, {}); inode->set_inode_number(m_next_inode_number++, {}); return (SharedPtr)inode; } Result> FileSystem::create_symlink_inode(StringView link) { SharedPtr inode = TRY(make_shared()); inode->set_fs(*this, {}); TRY(inode->set_link(link, {})); inode->set_inode_number(m_next_inode_number++, {}); return (SharedPtr)inode; } Result> FileSystem::create_dir_inode(SharedPtr parent) { SharedPtr inode = TRY(make_shared()); TRY(inode->add_entry(inode, ".")); TRY(inode->add_entry(parent ? parent : (SharedPtr)inode, "..")); inode->set_self(inode, {}); inode->set_fs(*this, {}); inode->set_inode_number(m_next_inode_number++, {}); return (SharedPtr)inode; } Result> FileSystem::create_device_inode(u32 major, u32 minor) { SharedPtr device = TRY(DeviceRegistry::fetch_special_device(major, minor)); SharedPtr inode = TRY(make_shared()); inode->set_fs(*this, {}); inode->set_inode_number(m_next_inode_number++, {}); inode->set_device(device, {}); // FIXME: This should be queried from Device directly, but Device doesn't have an API to store and retrieve its // device ID atm. inode->set_device_id(luna_dev_makedev(major, minor), {}); return (SharedPtr)inode; } FileSystem::FileSystem() { m_host_device_id = DeviceRegistry::next_null_device_id(); } Result FileSystem::set_mount_dir(SharedPtr parent) { return m_root_inode->replace_entry(parent, ".."); } void FileSystem::set_root(SharedPtr root) { m_root_inode = root; } }