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:
parent
23e10a30ad
commit
81863eaf57
3 changed files with 49 additions and 46 deletions
|
@ -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 {};
|
||||
});
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue