ProcFS.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/HashMap.h>
  8. #include <AK/Types.h>
  9. #include <Kernel/FileSystem/FileSystem.h>
  10. #include <Kernel/FileSystem/Inode.h>
  11. #include <Kernel/Forward.h>
  12. #include <Kernel/KBufferBuilder.h>
  13. #include <Kernel/Locking/Mutex.h>
  14. #include <Kernel/ProcessExposed.h>
  15. #include <Kernel/UnixTypes.h>
  16. namespace Kernel {
  17. class ProcFS final : public FileSystem {
  18. friend class ProcFSInode;
  19. friend class ProcFSDirectoryInode;
  20. friend class ProcFSProcessDirectoryInode;
  21. friend class ProcFSGlobalInode;
  22. friend class ProcFSAssociatedProcessInode;
  23. friend class ProcFSProcessSubDirectoryInode;
  24. public:
  25. virtual ~ProcFS() override;
  26. static ErrorOr<NonnullRefPtr<ProcFS>> try_create();
  27. virtual ErrorOr<void> initialize() override;
  28. virtual StringView class_name() const override { return "ProcFS"sv; }
  29. virtual Inode& root_inode() override;
  30. private:
  31. ProcFS();
  32. RefPtr<ProcFSDirectoryInode> m_root_inode;
  33. };
  34. class ProcFSInode : public Inode {
  35. friend class ProcFS;
  36. public:
  37. virtual ~ProcFSInode() override;
  38. protected:
  39. ProcFSInode(const ProcFS&, InodeIndex);
  40. ProcFS& procfs() { return static_cast<ProcFS&>(Inode::fs()); }
  41. ProcFS const& procfs() const { return static_cast<ProcFS const&>(Inode::fs()); }
  42. // ^Inode
  43. virtual ErrorOr<void> attach(OpenFileDescription& description) override = 0;
  44. virtual void did_seek(OpenFileDescription&, off_t) override = 0;
  45. virtual ErrorOr<void> flush_metadata() override final;
  46. virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override final;
  47. virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override final;
  48. virtual ErrorOr<void> remove_child(StringView name) override final;
  49. virtual ErrorOr<void> chmod(mode_t) override final;
  50. virtual ErrorOr<void> chown(UserID, GroupID) override final;
  51. };
  52. class ProcFSGlobalInode : public ProcFSInode {
  53. friend class ProcFS;
  54. public:
  55. static ErrorOr<NonnullRefPtr<ProcFSGlobalInode>> try_create(const ProcFS&, const ProcFSExposedComponent&);
  56. virtual ~ProcFSGlobalInode() override {};
  57. StringView name() const;
  58. protected:
  59. ProcFSGlobalInode(const ProcFS&, const ProcFSExposedComponent&);
  60. // ^Inode
  61. virtual ErrorOr<void> attach(OpenFileDescription& description) override final;
  62. virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
  63. virtual ErrorOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override final;
  64. virtual void did_seek(OpenFileDescription&, off_t) override final;
  65. virtual InodeMetadata metadata() const override;
  66. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  67. virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView) override;
  68. virtual ErrorOr<void> truncate(u64) override final;
  69. virtual ErrorOr<void> set_mtime(time_t) override final;
  70. NonnullRefPtr<ProcFSExposedComponent> m_associated_component;
  71. };
  72. class ProcFSLinkInode : public ProcFSGlobalInode {
  73. friend class ProcFS;
  74. public:
  75. static ErrorOr<NonnullRefPtr<ProcFSLinkInode>> try_create(const ProcFS&, const ProcFSExposedComponent&);
  76. protected:
  77. ProcFSLinkInode(const ProcFS&, const ProcFSExposedComponent&);
  78. virtual InodeMetadata metadata() const override;
  79. };
  80. class ProcFSDirectoryInode final : public ProcFSGlobalInode {
  81. friend class ProcFS;
  82. public:
  83. static ErrorOr<NonnullRefPtr<ProcFSDirectoryInode>> try_create(const ProcFS&, const ProcFSExposedComponent&);
  84. virtual ~ProcFSDirectoryInode() override;
  85. protected:
  86. ProcFSDirectoryInode(const ProcFS&, const ProcFSExposedComponent&);
  87. // ^Inode
  88. virtual InodeMetadata metadata() const override;
  89. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  90. virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
  91. };
  92. class ProcFSProcessAssociatedInode : public ProcFSInode {
  93. friend class ProcFS;
  94. protected:
  95. ProcFSProcessAssociatedInode(const ProcFS&, ProcessID, InodeIndex);
  96. ProcessID associated_pid() const { return m_pid; }
  97. // ^Inode
  98. virtual ErrorOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, OpenFileDescription*) override final;
  99. private:
  100. const ProcessID m_pid;
  101. };
  102. class ProcFSProcessDirectoryInode final : public ProcFSProcessAssociatedInode {
  103. friend class ProcFS;
  104. public:
  105. static ErrorOr<NonnullRefPtr<ProcFSProcessDirectoryInode>> try_create(const ProcFS&, ProcessID);
  106. private:
  107. ProcFSProcessDirectoryInode(const ProcFS&, ProcessID);
  108. // ^Inode
  109. virtual ErrorOr<void> attach(OpenFileDescription& description) override;
  110. virtual void did_seek(OpenFileDescription&, off_t) override { }
  111. virtual InodeMetadata metadata() const override;
  112. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  113. virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
  114. virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
  115. };
  116. class ProcFSProcessSubDirectoryInode final : public ProcFSProcessAssociatedInode {
  117. friend class ProcFS;
  118. public:
  119. static ErrorOr<NonnullRefPtr<ProcFSProcessSubDirectoryInode>> try_create(const ProcFS&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID);
  120. private:
  121. ProcFSProcessSubDirectoryInode(const ProcFS&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID);
  122. // ^Inode
  123. virtual ErrorOr<void> attach(OpenFileDescription& description) override;
  124. virtual void did_seek(OpenFileDescription&, off_t) override;
  125. virtual InodeMetadata metadata() const override;
  126. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  127. virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
  128. virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
  129. const SegmentedProcFSIndex::ProcessSubDirectory m_sub_directory_type;
  130. };
  131. class ProcFSProcessPropertyInode final : public ProcFSProcessAssociatedInode {
  132. friend class ProcFS;
  133. public:
  134. static ErrorOr<NonnullRefPtr<ProcFSProcessPropertyInode>> try_create_for_file_description_link(const ProcFS&, unsigned, ProcessID);
  135. static ErrorOr<NonnullRefPtr<ProcFSProcessPropertyInode>> try_create_for_thread_stack(const ProcFS&, ThreadID, ProcessID);
  136. static ErrorOr<NonnullRefPtr<ProcFSProcessPropertyInode>> try_create_for_pid_property(const ProcFS&, SegmentedProcFSIndex::MainProcessProperty, ProcessID);
  137. private:
  138. ProcFSProcessPropertyInode(const ProcFS&, SegmentedProcFSIndex::MainProcessProperty, ProcessID);
  139. ProcFSProcessPropertyInode(const ProcFS&, ThreadID, ProcessID);
  140. ProcFSProcessPropertyInode(const ProcFS&, unsigned, ProcessID);
  141. // ^Inode
  142. virtual ErrorOr<void> attach(OpenFileDescription& description) override;
  143. virtual void did_seek(OpenFileDescription&, off_t) override;
  144. virtual InodeMetadata metadata() const override;
  145. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  146. virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
  147. virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override final;
  148. ErrorOr<void> refresh_data(OpenFileDescription& description);
  149. ErrorOr<void> try_to_acquire_data(Process& process, KBufferBuilder& builder) const;
  150. const SegmentedProcFSIndex::ProcessSubDirectory m_parent_sub_directory_type;
  151. union {
  152. SegmentedProcFSIndex::MainProcessProperty property_type;
  153. unsigned property_index;
  154. } m_possible_data;
  155. mutable Mutex m_refresh_lock;
  156. };
  157. }