CharacterDevicesDirectory.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /*
  2. * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/FileSystem/SysFS/Registry.h>
  7. #include <Kernel/FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.h>
  8. #include <Kernel/Sections.h>
  9. namespace Kernel {
  10. NonnullRefPtr<SysFSCharacterDevicesDirectory> SysFSCharacterDevicesDirectory::must_create(SysFSDevicesDirectory const& devices_directory)
  11. {
  12. return adopt_ref_if_nonnull(new SysFSCharacterDevicesDirectory(devices_directory)).release_nonnull();
  13. }
  14. SysFSCharacterDevicesDirectory::SysFSCharacterDevicesDirectory(SysFSDevicesDirectory const& devices_directory)
  15. : SysFSDirectory(devices_directory)
  16. {
  17. }
  18. ErrorOr<void> SysFSCharacterDevicesDirectory::traverse_as_directory(FileSystemID fsid, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const
  19. {
  20. VERIFY(m_parent_directory);
  21. TRY(callback({ ".", { fsid, component_index() }, 0 }));
  22. TRY(callback({ "..", { fsid, m_parent_directory->component_index() }, 0 }));
  23. return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> ErrorOr<void> {
  24. for (auto& exposed_device : list) {
  25. if (exposed_device.is_block_device())
  26. continue;
  27. TRY(callback({ exposed_device.name(), { fsid, exposed_device.component_index() }, 0 }));
  28. }
  29. return {};
  30. });
  31. }
  32. RefPtr<SysFSComponent> SysFSCharacterDevicesDirectory::lookup(StringView name)
  33. {
  34. return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> RefPtr<SysFSComponent> {
  35. for (auto& exposed_device : list) {
  36. if (exposed_device.is_block_device())
  37. continue;
  38. if (exposed_device.name() == name)
  39. return exposed_device;
  40. }
  41. return nullptr;
  42. });
  43. }
  44. }