Serenity Operating System
at master 68 lines 2.1 kB view raw
1/* 2 * Copyright (c) 2019-2020, Sergey Bugaev <bugaevc@serenityos.org> 3 * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include <Kernel/Devices/DeviceManagement.h> 9#include <Kernel/FileSystem/DevPtsFS/FileSystem.h> 10#include <Kernel/FileSystem/DevPtsFS/Inode.h> 11#include <Kernel/TTY/SlavePTY.h> 12#include <Kernel/Time/TimeManagement.h> 13 14namespace Kernel { 15 16ErrorOr<NonnullLockRefPtr<FileSystem>> DevPtsFS::try_create() 17{ 18 return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevPtsFS)); 19} 20 21DevPtsFS::DevPtsFS() = default; 22DevPtsFS::~DevPtsFS() = default; 23 24ErrorOr<void> DevPtsFS::initialize() 25{ 26 m_root_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFSInode(*this, 1, nullptr))); 27 m_root_inode->m_metadata.inode = { fsid(), 1 }; 28 m_root_inode->m_metadata.mode = 0040555; 29 m_root_inode->m_metadata.uid = 0; 30 m_root_inode->m_metadata.gid = 0; 31 m_root_inode->m_metadata.size = 0; 32 m_root_inode->m_metadata.mtime = TimeManagement::boot_time(); 33 return {}; 34} 35 36static unsigned inode_index_to_pty_index(InodeIndex inode_index) 37{ 38 VERIFY(inode_index > 1); 39 return inode_index.value() - 2; 40} 41 42Inode& DevPtsFS::root_inode() 43{ 44 return *m_root_inode; 45} 46 47ErrorOr<NonnullRefPtr<Inode>> DevPtsFS::get_inode(InodeIdentifier inode_id) const 48{ 49 if (inode_id.index() == 1) 50 return *m_root_inode; 51 52 unsigned pty_index = inode_index_to_pty_index(inode_id.index()); 53 auto* device = DeviceManagement::the().get_device(201, pty_index); 54 VERIFY(device); 55 56 auto inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFSInode(const_cast<DevPtsFS&>(*this), inode_id.index(), static_cast<SlavePTY*>(device)))); 57 inode->m_metadata.inode = inode_id; 58 inode->m_metadata.size = 0; 59 inode->m_metadata.uid = device->uid(); 60 inode->m_metadata.gid = device->gid(); 61 inode->m_metadata.mode = 0020600; 62 inode->m_metadata.major_device = device->major(); 63 inode->m_metadata.minor_device = device->minor(); 64 inode->m_metadata.mtime = TimeManagement::boot_time(); 65 return inode; 66} 67 68}