1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:47:36 +00:00

Userland: tar: support extracting gzipped files

This commit is contained in:
Peter Elliott 2020-10-03 11:59:41 -07:00 committed by Andreas Kling
parent b7c7c80ee2
commit 1b3f9c170c
5 changed files with 27 additions and 8 deletions

View file

@ -46,6 +46,7 @@ enum FileType {
};
constexpr size_t block_size = 512;
constexpr const char* ustar_magic = "ustar ";
class Header {
public:
@ -59,14 +60,14 @@ public:
time_t timestamp() const { return get_tar_field(m_timestamp); }
FileType type_flag() const { return FileType(m_type_flag); }
const StringView link_name() const { return m_link_name; }
const StringView magic() const { return m_magic; }
const StringView version() const { return m_version; }
const StringView magic() const { return StringView(m_magic, sizeof(m_magic)); }
const StringView version() const { return StringView(m_version, sizeof(m_version)); }
const StringView owner_name() const { return m_owner_name; }
const StringView group_name() const { return m_group_name; }
int major() const { return get_tar_field(m_major); }
int minor() const { return get_tar_field(m_minor); }
//private:
private:
char m_file_name[100];
char m_mode[8];
char m_uid[8];

View file

@ -111,7 +111,7 @@ void TarStream::advance()
m_finished = true;
return;
}
if (m_header.magic() == "") {
if (!valid()) {
m_finished = true;
return;
}
@ -119,6 +119,11 @@ void TarStream::advance()
ASSERT(m_stream.discard_or_error(block_size - sizeof(Header)));
}
bool TarStream::valid() const
{
return header().magic() == ustar_magic;
}
TarFileStream TarStream::file_contents()
{
ASSERT(!m_finished);

View file

@ -55,6 +55,7 @@ public:
TarStream(InputStream&);
void advance();
bool finished() const { return m_finished; }
bool valid() const;
const Header& header() const { return m_header; }
TarFileStream file_contents();