summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/other_tools/utils/archive_ops.cpp72
-rw-r--r--src/other_tools/utils/archive_ops.hpp5
2 files changed, 45 insertions, 32 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));
}
diff --git a/src/other_tools/utils/archive_ops.hpp b/src/other_tools/utils/archive_ops.hpp
index 50110c18..22cf7e4b 100644
--- a/src/other_tools/utils/archive_ops.hpp
+++ b/src/other_tools/utils/archive_ops.hpp
@@ -29,7 +29,8 @@ enum class ArchiveType : size_t {
kArchiveTypeZip,
kArchiveTypeTar,
kArchiveTypeTarGz,
- kArchiveTypeTarBz2
+ kArchiveTypeTarBz2,
+ kArchiveTypeTarXz
};
/// \brief Class handling archiving and unarchiving operations via libarchive
@@ -97,4 +98,4 @@ class ArchiveOps {
-> std::optional<std::string>;
};
-#endif // INCLUDED_SRC_OTHER_TOOLS_UTILS_ARCHIVE_OPS_HPP \ No newline at end of file
+#endif // INCLUDED_SRC_OTHER_TOOLS_UTILS_ARCHIVE_OPS_HPP