ProcessSubDirectoryInode.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Spencer Dixon <spencercdixon@gmail.com>
  4. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #include <Kernel/FileSystem/ProcFS/ProcessSubDirectoryInode.h>
  9. #include <Kernel/Process.h>
  10. #include <Kernel/ProcessExposed.h>
  11. namespace Kernel {
  12. ErrorOr<NonnullLockRefPtr<ProcFSProcessSubDirectoryInode>> ProcFSProcessSubDirectoryInode::try_create(ProcFS const& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid)
  13. {
  14. return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSProcessSubDirectoryInode(procfs, sub_directory_type, pid));
  15. }
  16. ProcFSProcessSubDirectoryInode::ProcFSProcessSubDirectoryInode(ProcFS const& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid)
  17. : ProcFSProcessAssociatedInode(procfs, pid, SegmentedProcFSIndex::build_segmented_index_for_sub_directory(pid, sub_directory_type))
  18. , m_sub_directory_type(sub_directory_type)
  19. {
  20. }
  21. ErrorOr<size_t> ProcFSProcessSubDirectoryInode::read_bytes_locked(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const
  22. {
  23. VERIFY_NOT_REACHED();
  24. }
  25. ErrorOr<void> ProcFSProcessSubDirectoryInode::attach(OpenFileDescription&)
  26. {
  27. return {};
  28. }
  29. void ProcFSProcessSubDirectoryInode::did_seek(OpenFileDescription&, off_t)
  30. {
  31. VERIFY_NOT_REACHED();
  32. }
  33. InodeMetadata ProcFSProcessSubDirectoryInode::metadata() const
  34. {
  35. MutexLocker locker(m_inode_lock);
  36. auto process = Process::from_pid_in_same_jail(associated_pid());
  37. if (!process)
  38. return {};
  39. auto traits = process->procfs_traits();
  40. InodeMetadata metadata;
  41. metadata.inode = { fsid(), traits->component_index() };
  42. metadata.mode = S_IFDIR | traits->required_mode();
  43. metadata.uid = traits->owner_user();
  44. metadata.gid = traits->owner_group();
  45. metadata.size = 0;
  46. metadata.mtime = traits->modified_time();
  47. return metadata;
  48. }
  49. ErrorOr<void> ProcFSProcessSubDirectoryInode::traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const
  50. {
  51. MutexLocker locker(procfs().m_lock);
  52. auto process = Process::from_pid_in_same_jail(associated_pid());
  53. if (!process)
  54. return EINVAL;
  55. switch (m_sub_directory_type) {
  56. case SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions:
  57. return process->traverse_file_descriptions_directory(procfs().fsid(), move(callback));
  58. case SegmentedProcFSIndex::ProcessSubDirectory::Stacks:
  59. return process->traverse_stacks_directory(procfs().fsid(), move(callback));
  60. case SegmentedProcFSIndex::ProcessSubDirectory::Children:
  61. return process->traverse_children_directory(procfs().fsid(), move(callback));
  62. default:
  63. VERIFY_NOT_REACHED();
  64. }
  65. VERIFY_NOT_REACHED();
  66. }
  67. ErrorOr<NonnullLockRefPtr<Inode>> ProcFSProcessSubDirectoryInode::lookup(StringView name)
  68. {
  69. MutexLocker locker(procfs().m_lock);
  70. auto process = Process::from_pid_in_same_jail(associated_pid());
  71. if (!process)
  72. return ESRCH;
  73. switch (m_sub_directory_type) {
  74. case SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions:
  75. return process->lookup_file_descriptions_directory(procfs(), name);
  76. case SegmentedProcFSIndex::ProcessSubDirectory::Stacks:
  77. return process->lookup_stacks_directory(procfs(), name);
  78. case SegmentedProcFSIndex::ProcessSubDirectory::Children:
  79. return process->lookup_children_directory(procfs(), name);
  80. default:
  81. VERIFY_NOT_REACHED();
  82. }
  83. }
  84. }