DirectoryInode.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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/DirectoryInode.h>
  9. namespace Kernel {
  10. ErrorOr<NonnullLockRefPtr<ProcFSDirectoryInode>> ProcFSDirectoryInode::try_create(ProcFS const& procfs, ProcFSExposedComponent const& component)
  11. {
  12. return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSDirectoryInode(procfs, component));
  13. }
  14. ProcFSDirectoryInode::ProcFSDirectoryInode(ProcFS const& fs, ProcFSExposedComponent const& component)
  15. : ProcFSGlobalInode(fs, component)
  16. {
  17. }
  18. ProcFSDirectoryInode::~ProcFSDirectoryInode() = default;
  19. InodeMetadata ProcFSDirectoryInode::metadata() const
  20. {
  21. MutexLocker locker(m_inode_lock);
  22. InodeMetadata metadata;
  23. metadata.inode = { fsid(), m_associated_component->component_index() };
  24. metadata.mode = S_IFDIR | m_associated_component->required_mode();
  25. metadata.uid = m_associated_component->owner_user();
  26. metadata.gid = m_associated_component->owner_group();
  27. metadata.size = 0;
  28. metadata.mtime = m_associated_component->modified_time();
  29. return metadata;
  30. }
  31. ErrorOr<void> ProcFSDirectoryInode::traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const
  32. {
  33. MutexLocker locker(procfs().m_lock);
  34. return m_associated_component->traverse_as_directory(procfs().fsid(), move(callback));
  35. }
  36. ErrorOr<NonnullLockRefPtr<Inode>> ProcFSDirectoryInode::lookup(StringView name)
  37. {
  38. MutexLocker locker(procfs().m_lock);
  39. auto component = TRY(m_associated_component->lookup(name));
  40. return component->to_inode(procfs());
  41. }
  42. }