Inode.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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/Inode.h>
  9. namespace Kernel {
  10. static InodeIndex pty_index_to_inode_index(unsigned pty_index)
  11. {
  12. return pty_index + 2;
  13. }
  14. DevPtsFSInode::DevPtsFSInode(DevPtsFS& fs, InodeIndex index, SlavePTY* pty)
  15. : Inode(fs, index)
  16. {
  17. if (pty)
  18. m_pty = *pty;
  19. }
  20. DevPtsFSInode::~DevPtsFSInode() = default;
  21. ErrorOr<size_t> DevPtsFSInode::read_bytes_locked(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const
  22. {
  23. VERIFY_NOT_REACHED();
  24. }
  25. ErrorOr<size_t> DevPtsFSInode::write_bytes_locked(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*)
  26. {
  27. VERIFY_NOT_REACHED();
  28. }
  29. InodeMetadata DevPtsFSInode::metadata() const
  30. {
  31. if (auto pty = m_pty.strong_ref()) {
  32. auto metadata = m_metadata;
  33. metadata.mtime = Time::from_timespec({ pty->time_of_last_write(), 0 });
  34. return metadata;
  35. }
  36. return m_metadata;
  37. }
  38. ErrorOr<void> DevPtsFSInode::traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const
  39. {
  40. if (identifier().index() > 1)
  41. return ENOTDIR;
  42. TRY(callback({ "."sv, identifier(), 0 }));
  43. TRY(callback({ ".."sv, identifier(), 0 }));
  44. return SlavePTY::all_instances().with([&](auto& list) -> ErrorOr<void> {
  45. StringBuilder builder;
  46. for (SlavePTY& slave_pty : list) {
  47. builder.clear();
  48. TRY(builder.try_appendff("{}", slave_pty.index()));
  49. TRY(callback({ builder.string_view(), { fsid(), pty_index_to_inode_index(slave_pty.index()) }, 0 }));
  50. }
  51. return {};
  52. });
  53. }
  54. ErrorOr<NonnullLockRefPtr<Inode>> DevPtsFSInode::lookup(StringView name)
  55. {
  56. VERIFY(identifier().index() == 1);
  57. if (name == "." || name == "..")
  58. return *this;
  59. auto pty_index = name.to_uint();
  60. if (!pty_index.has_value())
  61. return ENOENT;
  62. return SlavePTY::all_instances().with([&](auto& list) -> ErrorOr<NonnullLockRefPtr<Inode>> {
  63. for (SlavePTY& slave_pty : list) {
  64. if (slave_pty.index() != pty_index.value())
  65. continue;
  66. return fs().get_inode({ fsid(), pty_index_to_inode_index(pty_index.value()) });
  67. }
  68. return ENOENT;
  69. });
  70. }
  71. ErrorOr<void> DevPtsFSInode::flush_metadata()
  72. {
  73. return {};
  74. }
  75. ErrorOr<void> DevPtsFSInode::add_child(Inode&, StringView, mode_t)
  76. {
  77. return EROFS;
  78. }
  79. ErrorOr<NonnullLockRefPtr<Inode>> DevPtsFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
  80. {
  81. return EROFS;
  82. }
  83. ErrorOr<void> DevPtsFSInode::remove_child(StringView)
  84. {
  85. return EROFS;
  86. }
  87. ErrorOr<void> DevPtsFSInode::replace_child(StringView, Inode&)
  88. {
  89. return EROFS;
  90. }
  91. ErrorOr<void> DevPtsFSInode::chmod(mode_t)
  92. {
  93. return EROFS;
  94. }
  95. ErrorOr<void> DevPtsFSInode::chown(UserID, GroupID)
  96. {
  97. return EROFS;
  98. }
  99. }