diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2023-06-19 17:39:24 +0200 |
---|---|---|
committer | Oliver Reiche <oliver.reiche@huawei.com> | 2023-06-20 14:18:23 +0200 |
commit | 66c964931d0a4fdb4d0257ff20a1d3bafe63c159 (patch) | |
tree | 9791ae1ef35f45af81aa11f05beee9440735fe18 /src/other_tools/utils/archive_ops.cpp | |
parent | 07ded51a0dda46e9b47b7dc0921ab0f2d44e8a58 (diff) | |
download | justbuild-66c964931d0a4fdb4d0257ff20a1d3bafe63c159.tar.gz |
ArchiveOps: Support unpacking tar.xz archives
Diffstat (limited to 'src/other_tools/utils/archive_ops.cpp')
-rw-r--r-- | src/other_tools/utils/archive_ops.cpp | 72 |
1 files changed, 42 insertions, 30 deletions
diff --git a/src/other_tools/utils/archive_ops.cpp b/src/other_tools/utils/archive_ops.cpp index 49fb8c50..c080c4e3 100644 --- a/src/other_tools/utils/archive_ops.cpp +++ b/src/other_tools/utils/archive_ops.cpp @@ -49,6 +49,38 @@ 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); + case ArchiveType::kArchiveTypeTarXz: + return (archive_write_add_filter_xz(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_xz(ar) == ARCHIVE_OK) and + (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); + case ArchiveType::kArchiveTypeTarXz: + return (archive_read_support_filter_xz(ar) == ARCHIVE_OK); + default: + return false; + } +} + } // namespace auto ArchiveOps::WriteEntry(archive_entry* entry, archive* aw) @@ -102,22 +134,12 @@ 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::kArchiveTypeTarBz2: { + case ArchiveType::kArchiveTypeTar: + case ArchiveType::kArchiveTypeTarGz: + case ArchiveType::kArchiveTypeTarBz2: + case ArchiveType::kArchiveTypeTarXz: { 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 +157,12 @@ 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::kArchiveTypeTarBz2: { + case ArchiveType::kArchiveTypeTar: + case ArchiveType::kArchiveTypeTarGz: + case ArchiveType::kArchiveTypeTarBz2: + case ArchiveType::kArchiveTypeTarXz: { 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)); } |