ProcessDirectoryInode.cpp 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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/ProcessDirectoryInode.h>
  9. #include <Kernel/FileSystem/ProcFS/ProcessPropertyInode.h>
  10. #include <Kernel/FileSystem/ProcFS/ProcessSubDirectoryInode.h>
  11. #include <Kernel/Process.h>
  12. #include <Kernel/ProcessExposed.h>
  13. namespace Kernel {
  14. ErrorOr<NonnullLockRefPtr<ProcFSProcessDirectoryInode>> ProcFSProcessDirectoryInode::try_create(ProcFS const& procfs, ProcessID pid)
  15. {
  16. return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSProcessDirectoryInode(procfs, pid));
  17. }
  18. ProcFSProcessDirectoryInode::ProcFSProcessDirectoryInode(ProcFS const& procfs, ProcessID pid)
  19. : ProcFSProcessAssociatedInode(procfs, pid, SegmentedProcFSIndex::build_segmented_index_for_pid_directory(pid))
  20. {
  21. }
  22. ErrorOr<void> ProcFSProcessDirectoryInode::attach(OpenFileDescription&)
  23. {
  24. return {};
  25. }
  26. InodeMetadata ProcFSProcessDirectoryInode::metadata() const
  27. {
  28. MutexLocker locker(m_inode_lock);
  29. auto process = Process::from_pid_in_same_jail(associated_pid());
  30. if (!process)
  31. return {};
  32. auto traits = process->procfs_traits();
  33. InodeMetadata metadata;
  34. metadata.inode = { fsid(), traits->component_index() };
  35. metadata.mode = S_IFDIR | traits->required_mode();
  36. metadata.uid = traits->owner_user();
  37. metadata.gid = traits->owner_group();
  38. metadata.size = 0;
  39. metadata.mtime = traits->modified_time();
  40. return metadata;
  41. }
  42. ErrorOr<size_t> ProcFSProcessDirectoryInode::read_bytes_locked(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const
  43. {
  44. VERIFY_NOT_REACHED();
  45. }
  46. ErrorOr<void> ProcFSProcessDirectoryInode::traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const
  47. {
  48. MutexLocker locker(procfs().m_lock);
  49. auto process = Process::from_pid_in_same_jail(associated_pid());
  50. if (!process)
  51. return EINVAL;
  52. return process->procfs_traits()->traverse_as_directory(procfs().fsid(), move(callback));
  53. }
  54. ErrorOr<NonnullLockRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView name)
  55. {
  56. MutexLocker locker(procfs().m_lock);
  57. auto process = Process::from_pid_in_same_jail(associated_pid());
  58. if (!process)
  59. return ESRCH;
  60. if (name == "fd"sv)
  61. return TRY(ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::OpenFileDescriptions, associated_pid()));
  62. if (name == "stacks"sv)
  63. return TRY(ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::Stacks, associated_pid()));
  64. if (name == "children"sv)
  65. return TRY(ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::Children, associated_pid()));
  66. if (name == "unveil"sv)
  67. return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Unveil, associated_pid()));
  68. if (name == "pledge"sv)
  69. return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Pledge, associated_pid()));
  70. if (name == "fds"sv)
  71. return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::OpenFileDescriptions, associated_pid()));
  72. if (name == "exe"sv)
  73. return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::BinaryLink, associated_pid()));
  74. if (name == "cwd"sv)
  75. return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::CurrentWorkDirectoryLink, associated_pid()));
  76. if (name == "perf_events"sv)
  77. return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::PerformanceEvents, associated_pid()));
  78. if (name == "vm"sv)
  79. return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::VirtualMemoryStats, associated_pid()));
  80. if (name == "cmdline"sv)
  81. return TRY(ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::CommandLine, associated_pid()));
  82. return ENOENT;
  83. }
  84. }