#include "fs/tmpfs/FileSystem.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({})); 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, {}); TRY(m_inodes.try_append(inode)); 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_fs(*this, {}); inode->set_inode_number(m_next_inode_number, {}); TRY(m_inodes.try_append(inode)); m_next_inode_number++; return (SharedPtr)inode; } void FileSystem::set_root(SharedPtr root) { m_root_inode = root; } Result> DirInode::find(const char* name) const { for (const auto& entry : m_entries) { if (!strcmp(name, entry.name.chars())) return entry.inode; } return err(ENOENT); } Result DirInode::add_entry(SharedPtr inode, const char* name) { Entry entry { inode, name }; TRY(m_entries.try_append(move(entry))); return {}; } Result> DirInode::create_file(const char* name) { auto inode = TRY(m_fs->create_file_inode()); TRY(add_entry(inode, name)); return inode; } }