diff options
| -rw-r--r-- | kernel/kernel/filesystem/devfs/inode.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/kernel/kernel/filesystem/devfs/inode.cpp b/kernel/kernel/filesystem/devfs/inode.cpp index b1ac17c2..67f03768 100644 --- a/kernel/kernel/filesystem/devfs/inode.cpp +++ b/kernel/kernel/filesystem/devfs/inode.cpp @@ -47,12 +47,17 @@ namespace kernel::filesystem::devfs auto inode::read_directory(directory_listing_cursor position, std::span<directory_listing_entry> entries) const -> kstd::result<std::pair<std::size_t, directory_listing_cursor>> { - auto requested = entries.size(); + auto const requested = entries.size(); if (requested == 0) { return kstd::failure(vfs_errc::invalid_argument); } + if (position == sentinel) + { + return std::pair{0, sentinel}; + } + auto devices = kernel::filesystem::device_number_registry::get().all(); if (devices.empty()) { @@ -61,11 +66,12 @@ namespace kernel::filesystem::devfs std::ranges::stable_sort(devices, std::ranges::less{}, &kernel::filesystem::device_number_registry::entry::number); - auto device_number = std::bit_cast<kapi::filesystem::device_number>(static_cast<std::uint16_t>(position.value)); - auto begin = std::ranges::lower_bound(devices, device_number, std::ranges::less{}, - &kernel::filesystem::device_number_registry::entry::number); - auto end = std::ranges::end(devices); - auto to_read = std::min(requested, static_cast<std::size_t>(std::ranges::distance(begin, end))); + auto const device_number = kapi::filesystem::device_number{static_cast<std::uint8_t>(position.value >> 8), + static_cast<std::uint8_t>(position.value & 0xff)}; + auto const begin = std::ranges::lower_bound(devices, device_number, std::ranges::less{}, + &kernel::filesystem::device_number_registry::entry::number); + auto const end = std::ranges::end(devices); + auto const to_read = std::min(requested, static_cast<std::size_t>(std::ranges::distance(begin, end))); if (to_read == 0) { @@ -78,14 +84,15 @@ namespace kernel::filesystem::devfs .inode_number = std::bit_cast<std::uint16_t>(entry.number)}; }); - auto last_copied = begin + to_read; + auto const last_copied = begin + to_read; if (last_copied == end) { return std::pair{to_read, sentinel}; } - auto new_cursor = - directory_listing_cursor{static_cast<std::uint64_t>(std::bit_cast<std::uint16_t>(last_copied->number))}; + auto const new_device_number = last_copied->number; + auto const new_cursor = directory_listing_cursor{static_cast<std::uint64_t>(new_device_number.minor) | + (static_cast<std::uint64_t>(new_device_number.major) << 8)}; return std::pair{to_read, new_cursor}; } } // namespace kernel::filesystem::devfs
\ No newline at end of file |
