1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:18:11 +00:00

LibArchive: Port TarOutputStream to Core::Stream

This commit is contained in:
Tim Schumacher 2022-12-14 01:20:38 +01:00 committed by Linus Groh
parent 9ec2cb3741
commit 1ec646ab94
3 changed files with 18 additions and 19 deletions

View file

@ -137,8 +137,8 @@ TarFileStream TarInputStream::file_contents()
return TarFileStream(*this); return TarFileStream(*this);
} }
TarOutputStream::TarOutputStream(OutputStream& stream) TarOutputStream::TarOutputStream(Core::Stream::Handle<Core::Stream::Stream> stream)
: m_stream(stream) : m_stream(move(stream))
{ {
} }
@ -153,9 +153,9 @@ void TarOutputStream::add_directory(DeprecatedString const& path, mode_t mode)
header.set_magic(gnu_magic); header.set_magic(gnu_magic);
header.set_version(gnu_version); header.set_version(gnu_version);
header.calculate_checksum(); header.calculate_checksum();
VERIFY(m_stream.write_or_error(Bytes { &header, sizeof(header) })); MUST(m_stream->write_entire_buffer(Bytes { &header, sizeof(header) }));
u8 padding[block_size] = { 0 }; u8 padding[block_size] = { 0 };
VERIFY(m_stream.write_or_error(Bytes { &padding, block_size - sizeof(header) })); MUST(m_stream->write_entire_buffer(Bytes { &padding, block_size - sizeof(header) }));
} }
void TarOutputStream::add_file(DeprecatedString const& path, mode_t mode, ReadonlyBytes bytes) void TarOutputStream::add_file(DeprecatedString const& path, mode_t mode, ReadonlyBytes bytes)
@ -169,14 +169,14 @@ void TarOutputStream::add_file(DeprecatedString const& path, mode_t mode, Readon
header.set_magic(gnu_magic); header.set_magic(gnu_magic);
header.set_version(gnu_version); header.set_version(gnu_version);
header.calculate_checksum(); header.calculate_checksum();
VERIFY(m_stream.write_or_error(ReadonlyBytes { &header, sizeof(header) })); MUST(m_stream->write_entire_buffer(ReadonlyBytes { &header, sizeof(header) }));
constexpr Array<u8, block_size> padding { 0 }; constexpr Array<u8, block_size> padding { 0 };
VERIFY(m_stream.write_or_error(ReadonlyBytes { &padding, block_size - sizeof(header) })); MUST(m_stream->write_entire_buffer(ReadonlyBytes { &padding, block_size - sizeof(header) }));
size_t n_written = 0; size_t n_written = 0;
while (n_written < bytes.size()) { while (n_written < bytes.size()) {
n_written += m_stream.write(bytes.slice(n_written, min(bytes.size() - n_written, block_size))); n_written += MUST(m_stream->write(bytes.slice(n_written, min(bytes.size() - n_written, block_size))));
} }
VERIFY(m_stream.write_or_error(ReadonlyBytes { &padding, block_size - (n_written % block_size) })); MUST(m_stream->write_entire_buffer(ReadonlyBytes { &padding, block_size - (n_written % block_size) }));
} }
void TarOutputStream::add_link(DeprecatedString const& path, mode_t mode, StringView link_name) void TarOutputStream::add_link(DeprecatedString const& path, mode_t mode, StringView link_name)
@ -191,17 +191,18 @@ void TarOutputStream::add_link(DeprecatedString const& path, mode_t mode, String
header.set_version(gnu_version); header.set_version(gnu_version);
header.set_link_name(link_name); header.set_link_name(link_name);
header.calculate_checksum(); header.calculate_checksum();
VERIFY(m_stream.write_or_error(Bytes { &header, sizeof(header) })); MUST(m_stream->write_entire_buffer(Bytes { &header, sizeof(header) }));
u8 padding[block_size] = { 0 }; u8 padding[block_size] = { 0 };
VERIFY(m_stream.write_or_error(Bytes { &padding, block_size - sizeof(header) })); MUST(m_stream->write_entire_buffer(Bytes { &padding, block_size - sizeof(header) }));
} }
void TarOutputStream::finish() void TarOutputStream::finish()
{ {
VERIFY(!m_finished); VERIFY(!m_finished);
constexpr Array<u8, block_size> padding { 0 }; constexpr Array<u8, block_size> padding { 0 };
m_stream.write_or_error(ReadonlyBytes { &padding, block_size }); // 2 empty records that are used to signify the end of the archive // 2 empty records that are used to signify the end of the archive.
m_stream.write_or_error(ReadonlyBytes { &padding, block_size }); MUST(m_stream->write_entire_buffer(ReadonlyBytes { &padding, block_size }));
MUST(m_stream->write_entire_buffer(ReadonlyBytes { &padding, block_size }));
m_finished = true; m_finished = true;
} }

View file

@ -58,14 +58,14 @@ private:
class TarOutputStream { class TarOutputStream {
public: public:
TarOutputStream(OutputStream&); TarOutputStream(Core::Stream::Handle<Core::Stream::Stream>);
void add_file(DeprecatedString const& path, mode_t, ReadonlyBytes); void add_file(DeprecatedString const& path, mode_t, ReadonlyBytes);
void add_link(DeprecatedString const& path, mode_t, StringView); void add_link(DeprecatedString const& path, mode_t, StringView);
void add_directory(DeprecatedString const& path, mode_t); void add_directory(DeprecatedString const& path, mode_t);
void finish(); void finish();
private: private:
OutputStream& m_stream; Core::Stream::Handle<Core::Stream::Stream> m_stream;
bool m_finished { false }; bool m_finished { false };
friend class TarFileStream; friend class TarFileStream;

View file

@ -215,12 +215,10 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
if (!directory.is_empty()) if (!directory.is_empty())
TRY(Core::System::chdir(directory)); TRY(Core::System::chdir(directory));
Core::OutputFileStream file_stream(file); NonnullOwnPtr<OutputStream> file_output_stream = make<Core::OutputFileStream>(file);
Compress::GzipCompressor gzip_stream(file_stream); NonnullOwnPtr<OutputStream> gzip_output_stream = make<Compress::GzipCompressor>(*file_output_stream);
OutputStream& file_output_stream = file_stream; Archive::TarOutputStream tar_stream(make<Core::Stream::WrappedAKOutputStream>(move((gzip) ? gzip_output_stream : file_output_stream)));
OutputStream& gzip_output_stream = gzip_stream;
Archive::TarOutputStream tar_stream((gzip) ? gzip_output_stream : file_output_stream);
auto add_file = [&](DeprecatedString path) -> ErrorOr<void> { auto add_file = [&](DeprecatedString path) -> ErrorOr<void> {
auto file = Core::File::construct(path); auto file = Core::File::construct(path);