1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-02 23:12:08 +00:00

Kernel: Use AK::Stream to write packed binary data

This commit is contained in:
Tim Schumacher 2023-02-07 12:43:54 +01:00 committed by Linus Groh
parent 23e10a30ad
commit 81863eaf57
3 changed files with 49 additions and 46 deletions

View file

@ -5,7 +5,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/DeprecatedMemoryStream.h>
#include <AK/MemoryStream.h>
#include <Kernel/API/POSIX/errno.h>
#include <Kernel/Devices/BlockDevice.h>
#include <Kernel/FileSystem/Custody.h>
@ -222,31 +222,34 @@ ErrorOr<size_t> OpenFileDescription::get_dir_entries(UserOrKernelBuffer& output_
size_t remaining = size;
u8 stack_buffer[PAGE_SIZE];
Bytes temp_buffer(stack_buffer, sizeof(stack_buffer));
DeprecatedOutputMemoryStream stream { temp_buffer };
FixedMemoryStream stream { temp_buffer };
auto flush_stream_to_output_buffer = [&stream, &remaining, &output_buffer]() -> ErrorOr<void> {
if (stream.size() == 0)
auto flush_stream_to_output_buffer = [&stream, &remaining, &temp_buffer, &output_buffer]() -> ErrorOr<void> {
auto buffered_size = TRY(stream.tell());
if (buffered_size == 0)
return {};
if (remaining < stream.size())
if (remaining < buffered_size)
return Error::from_errno(EINVAL);
TRY(output_buffer.write(stream.bytes()));
output_buffer = output_buffer.offset(stream.size());
remaining -= stream.size();
stream.reset();
TRY(output_buffer.write(temp_buffer.trim(buffered_size)));
output_buffer = output_buffer.offset(buffered_size);
remaining -= buffered_size;
TRY(stream.seek(0));
return {};
};
ErrorOr<void> result = VirtualFileSystem::the().traverse_directory_inode(*m_inode, [&flush_stream_to_output_buffer, &stream, this](auto& entry) -> ErrorOr<void> {
// FIXME: Double check the calculation, at least the type for the name length mismatches.
size_t serialized_size = sizeof(ino_t) + sizeof(u8) + sizeof(size_t) + sizeof(char) * entry.name.length();
if (serialized_size > stream.remaining())
if (serialized_size > TRY(stream.size()) - TRY(stream.tell()))
TRY(flush_stream_to_output_buffer());
stream << (u64)entry.inode.index().value();
stream << m_inode->fs().internal_file_type_to_directory_entry_type(entry);
stream << (u32)entry.name.length();
stream << entry.name.bytes();
MUST(stream.write_value<u64>(entry.inode.index().value()));
MUST(stream.write_value(m_inode->fs().internal_file_type_to_directory_entry_type(entry)));
MUST(stream.write_value<u32>(entry.name.length()));
MUST(stream.write_entire_buffer(entry.name.bytes()));
return {};
});