/* * Copyright (c) 2019-2020, Sergey Bugaev * Copyright (c) 2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include namespace Kernel { ErrorOr> DevPtsFS::try_create(ReadonlyBytes) { return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFS)); } DevPtsFS::DevPtsFS() = default; DevPtsFS::~DevPtsFS() = default; ErrorOr DevPtsFS::initialize() { m_root_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFSInode(*this, 1, nullptr))); m_root_inode->m_metadata.inode = { fsid(), 1 }; m_root_inode->m_metadata.mode = 0040555; m_root_inode->m_metadata.uid = 0; m_root_inode->m_metadata.gid = 0; m_root_inode->m_metadata.size = 0; m_root_inode->m_metadata.mtime = TimeManagement::boot_time(); return {}; } static unsigned inode_index_to_pty_index(InodeIndex inode_index) { VERIFY(inode_index > 1); return inode_index.value() - 2; } Inode& DevPtsFS::root_inode() { return *m_root_inode; } u8 DevPtsFS::internal_file_type_to_directory_entry_type(DirectoryEntryView const& entry) const { return ram_backed_file_type_to_directory_entry_type(entry); } ErrorOr> DevPtsFS::get_inode(InodeIdentifier inode_id) const { if (inode_id.index() == 1) return *m_root_inode; unsigned pty_index = inode_index_to_pty_index(inode_id.index()); auto* device = DeviceManagement::the().get_device(201, pty_index); VERIFY(device); auto* pts_device = static_cast(device); auto inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFSInode(const_cast(*this), inode_id.index(), pts_device))); inode->m_metadata.inode = inode_id; inode->m_metadata.size = 0; inode->m_metadata.uid = pts_device->uid(); inode->m_metadata.gid = pts_device->gid(); inode->m_metadata.mode = 0020600; inode->m_metadata.major_device = device->major(); inode->m_metadata.minor_device = device->minor(); inode->m_metadata.mtime = TimeManagement::boot_time(); return inode; } }