FileSystem.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. #include <Kernel/Devices/DeviceManagement.h>
  8. #include <Kernel/FileSystem/DevPtsFS/FileSystem.h>
  9. #include <Kernel/FileSystem/DevPtsFS/Inode.h>
  10. #include <Kernel/TTY/SlavePTY.h>
  11. #include <Kernel/Time/TimeManagement.h>
  12. namespace Kernel {
  13. ErrorOr<NonnullLockRefPtr<FileSystem>> DevPtsFS::try_create()
  14. {
  15. return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevPtsFS));
  16. }
  17. DevPtsFS::DevPtsFS() = default;
  18. DevPtsFS::~DevPtsFS() = default;
  19. ErrorOr<void> DevPtsFS::initialize()
  20. {
  21. m_root_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevPtsFSInode(*this, 1, nullptr)));
  22. m_root_inode->m_metadata.inode = { fsid(), 1 };
  23. m_root_inode->m_metadata.mode = 0040555;
  24. m_root_inode->m_metadata.uid = 0;
  25. m_root_inode->m_metadata.gid = 0;
  26. m_root_inode->m_metadata.size = 0;
  27. m_root_inode->m_metadata.mtime = TimeManagement::boot_time();
  28. return {};
  29. }
  30. static unsigned inode_index_to_pty_index(InodeIndex inode_index)
  31. {
  32. VERIFY(inode_index > 1);
  33. return inode_index.value() - 2;
  34. }
  35. Inode& DevPtsFS::root_inode()
  36. {
  37. return *m_root_inode;
  38. }
  39. ErrorOr<NonnullLockRefPtr<Inode>> DevPtsFS::get_inode(InodeIdentifier inode_id) const
  40. {
  41. if (inode_id.index() == 1)
  42. return *m_root_inode;
  43. unsigned pty_index = inode_index_to_pty_index(inode_id.index());
  44. auto* device = DeviceManagement::the().get_device(201, pty_index);
  45. VERIFY(device);
  46. auto inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevPtsFSInode(const_cast<DevPtsFS&>(*this), inode_id.index(), static_cast<SlavePTY*>(device))));
  47. inode->m_metadata.inode = inode_id;
  48. inode->m_metadata.size = 0;
  49. inode->m_metadata.uid = device->uid();
  50. inode->m_metadata.gid = device->gid();
  51. inode->m_metadata.mode = 0020600;
  52. inode->m_metadata.major_device = device->major();
  53. inode->m_metadata.minor_device = device->minor();
  54. inode->m_metadata.mtime = TimeManagement::boot_time();
  55. return inode;
  56. }
  57. }