1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:57:45 +00:00

tar: Implement support for GNU longname headers

This commit is contained in:
Tim Schumacher 2022-06-06 18:17:45 +02:00 committed by Linus Groh
parent b4e409f721
commit 87da3e0004
2 changed files with 25 additions and 3 deletions

View file

@ -26,7 +26,10 @@ enum class TarFileType : char {
FIFO = '6', FIFO = '6',
ContiguousFile = '7', ContiguousFile = '7',
GlobalExtendedHeader = 'g', GlobalExtendedHeader = 'g',
ExtendedHeader = 'x' ExtendedHeader = 'x',
// GNU extensions
LongName = 'L',
}; };
constexpr size_t block_size = 512; constexpr size_t block_size = 512;

View file

@ -125,6 +125,27 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
continue; continue;
} }
Archive::TarFileStream file_stream = tar_stream.file_contents();
// Handle other header types that don't just have an effect on extraction.
switch (header.type_flag()) {
case Archive::TarFileType::LongName: {
StringBuilder long_name;
Array<u8, buffer_size> buffer;
size_t bytes_read;
while ((bytes_read = file_stream.read(buffer)) > 0)
long_name.append(reinterpret_cast<char*>(buffer.data()), bytes_read);
local_overrides.set("path", long_name.to_string());
continue;
}
default:
// None of the relevant headers, so continue as normal.
break;
}
LexicalPath path = LexicalPath(header.filename()); LexicalPath path = LexicalPath(header.filename());
if (!header.prefix().is_empty()) if (!header.prefix().is_empty())
path = path.prepend(header.prefix()); path = path.prepend(header.prefix());
@ -134,8 +155,6 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
outln("{}", filename); outln("{}", filename);
if (extract) { if (extract) {
Archive::TarFileStream file_stream = tar_stream.file_contents();
String absolute_path = Core::File::absolute_path(filename); String absolute_path = Core::File::absolute_path(filename);
auto parent_path = LexicalPath(absolute_path).parent(); auto parent_path = LexicalPath(absolute_path).parent();