diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2023-07-13 18:06:21 +0200 |
---|---|---|
committer | Oliver Reiche <oliver.reiche@huawei.com> | 2023-07-13 18:06:21 +0200 |
commit | ebead34509f0720212563c93d16c93847720ae0f (patch) | |
tree | ef088ee16937880bc7cb386006275ce2df825a66 /src | |
parent | 771cf0eb75a8f910c9060599a188c1e770ecede0 (diff) | |
download | justbuild-ebead34509f0720212563c93d16c93847720ae0f.tar.gz |
ArchiveOps: Support unpacking tar.bz2 archives
(cherry picked from 66c964931d0a4fdb4d0257ff20a1d3bafe63c159)
Diffstat (limited to 'src')
-rw-r--r-- | src/other_tools/utils/archive_ops.cpp | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/src/other_tools/utils/archive_ops.cpp b/src/other_tools/utils/archive_ops.cpp index 49fb8c50..d1c79c62 100644 --- a/src/other_tools/utils/archive_ops.cpp +++ b/src/other_tools/utils/archive_ops.cpp @@ -49,6 +49,33 @@ void archive_read_closer(archive* a_in) { } } +auto enable_write_filter(archive* aw, ArchiveType type) -> bool { + switch (type) { + case ArchiveType::kArchiveTypeTar: + return true; // no compression filter + case ArchiveType::kArchiveTypeTarGz: + return (archive_write_add_filter_gzip(aw) == ARCHIVE_OK); + case ArchiveType::kArchiveTypeTarBz2: + return (archive_write_add_filter_bzip2(aw) == ARCHIVE_OK); + default: + return false; + } +} + +auto enable_read_filter(archive* ar, ArchiveType type) -> bool { + switch (type) { + case ArchiveType::kArchiveTypeTar: + return (archive_read_support_filter_gzip(ar) == ARCHIVE_OK) and + (archive_read_support_filter_bzip2(ar) == ARCHIVE_OK); + case ArchiveType::kArchiveTypeTarGz: + return (archive_read_support_filter_gzip(ar) == ARCHIVE_OK); + case ArchiveType::kArchiveTypeTarBz2: + return (archive_read_support_filter_bzip2(ar) == ARCHIVE_OK); + default: + return false; + } +} + } // namespace auto ArchiveOps::WriteEntry(archive_entry* entry, archive* aw) @@ -102,22 +129,11 @@ auto ArchiveOps::EnableWriteFormats(archive* aw, ArchiveType type) std::string(archive_error_string(aw)); } } break; - case ArchiveType::kArchiveTypeTar: { - if (archive_write_set_format_pax_restricted(aw) != ARCHIVE_OK) { - return std::string("ArchiveOps: ") + - std::string(archive_error_string(aw)); - } - } break; - case ArchiveType::kArchiveTypeTarGz: { - if ((archive_write_set_format_pax_restricted(aw) != ARCHIVE_OK) or - (archive_write_add_filter_gzip(aw) != ARCHIVE_OK)) { - return std::string("ArchiveOps: ") + - std::string(archive_error_string(aw)); - } - } break; + case ArchiveType::kArchiveTypeTar: + case ArchiveType::kArchiveTypeTarGz: case ArchiveType::kArchiveTypeTarBz2: { if ((archive_write_set_format_pax_restricted(aw) != ARCHIVE_OK) or - (archive_write_add_filter_bzip2(aw) != ARCHIVE_OK)) { + not enable_write_filter(aw, type)) { return std::string("ArchiveOps: ") + std::string(archive_error_string(aw)); } @@ -135,22 +151,11 @@ auto ArchiveOps::EnableReadFormats(archive* ar, ArchiveType type) std::string(archive_error_string(ar)); } } break; - case ArchiveType::kArchiveTypeTar: { - if (archive_read_support_format_tar(ar) != ARCHIVE_OK) { - return std::string("ArchiveOps: ") + - std::string(archive_error_string(ar)); - } - } break; - case ArchiveType::kArchiveTypeTarGz: { - if ((archive_read_support_format_tar(ar) != ARCHIVE_OK) or - (archive_read_support_filter_gzip(ar) != ARCHIVE_OK)) { - return std::string("ArchiveOps: ") + - std::string(archive_error_string(ar)); - } - } break; + case ArchiveType::kArchiveTypeTar: + case ArchiveType::kArchiveTypeTarGz: case ArchiveType::kArchiveTypeTarBz2: { if ((archive_read_support_format_tar(ar) != ARCHIVE_OK) or - (archive_read_support_filter_bzip2(ar) != ARCHIVE_OK)) { + not enable_read_filter(ar, type)) { return std::string("ArchiveOps: ") + std::string(archive_error_string(ar)); } |