summaryrefslogtreecommitdiff
path: root/libarchive
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@redhat.com>2023-12-17 18:53:26 +0100
committerTomas Bzatek <tbzatek@redhat.com>2023-12-17 18:53:26 +0100
commit36867ac3af93e933184204bb95df0dbdcb3205c5 (patch)
tree46d6305598dea035d8b3a8db4bfc95590e61efcc /libarchive
parent32d2925cddbadc85aab19c9ee1f4582d10329e3b (diff)
downloadtuxcmd-modules-36867ac3af93e933184204bb95df0dbdcb3205c5.tar.xz
libarchive: Port to libarchive-3.0.2+
Avoid using deprecated API (that will be removed with libarchive-4) and update the list of supported archive and compression formats.
Diffstat (limited to 'libarchive')
-rw-r--r--libarchive/libarchive.c155
1 files changed, 76 insertions, 79 deletions
diff --git a/libarchive/libarchive.c b/libarchive/libarchive.c
index 4d1f859..96b0956 100644
--- a/libarchive/libarchive.c
+++ b/libarchive/libarchive.c
@@ -1,11 +1,11 @@
/* libarchive plugin for Tux Commander
- * version 0.2.3, designed for libarchive v2.5.5 - v2.8.0 (recommended)
- * Copyright (C) 2008-2010 Tomas Bzatek <tbzatek@users.sourceforge.net>
+ * version 0.3, designed for libarchive v3.6.1
+ * Copyright (C) 2008-2023 Tomas Bzatek <tbzatek@users.sourceforge.net>
* Check for updates on tuxcmd.sourceforge.net
*
* Uses libarchive library
- * Copyright (c) 2003-2007 Tim Kientzle
- * http://code.google.com/p/libarchive/
+ * Copyright (c) 2003-2010 Tim Kientzle
+ * https://libarchive.org/
*
*
@@ -41,22 +41,13 @@
#include <archive.h>
#include <archive_entry.h>
-#ifndef MODULE_SHARED
- #include <config.h>
- #if ARCHIVE_VERSION_NUMBER >= 2008000
- #define __LIBARCHIVE_BUILD
- #include <archive_hash.h>
- #undef __LIBARCHIVE_BUILD
- #endif
-#endif
-
-#if ARCHIVE_VERSION_NUMBER < 2005005
- #error "libarchive 2.5.5 or greater is required to compile this module."
+#if ARCHIVE_VERSION_NUMBER < 3000002
+ #error "libarchive 3.0.2 or greater is required to compile this module."
#endif
-#define MODULE_VERSION "0.2.3"
-#define MODULE_BUILD_DATE "2010-02-05"
+#define MODULE_VERSION "0.3"
+#define MODULE_BUILD_DATE "2023-12-17"
#define DEFAULT_BLOCK_SIZE 65536
@@ -163,7 +154,7 @@ VFSGetInfo()
module_info->Name = g_strdup ("libarchive plugin");
module_info->About = g_strdup_printf ("version %s, build date: %s\nusing %s%s\n",
MODULE_VERSION, MODULE_BUILD_DATE, archive_version_string (), shared_module);
- module_info->Copyright = g_strdup ("Plugin Copyright (C) 2008-2010 Tomáš Bžatek\nlibarchive sources Copyright (c) 2003-2007 Tim Kientzle");
+ module_info->Copyright = g_strdup ("Plugin Copyright (C) 2008-2023 Tomáš Bžatek\nlibarchive sources Copyright (c) 2003-2010 Tim Kientzle");
return module_info;
}
@@ -181,56 +172,23 @@ VFSGetArchiveExts ()
{
/* Make sure these end with a semicolon */
#define BASIC_FORMATS "tar;cpio;iso;a;shar;"
-#define BZIP_FORMATS "tar.bz2;tbz2;tbz;"
-#define ZLIB_FORMATS "tar.gz;tgz;tar.z;iso.z;cpio.gz;deb;"
-#define XZ_FORMATS "tar.lzma;tlz;tar.xz;txz;"
+#define BZIP_FORMATS "tar.bz2;tbz2;tbz;img.bz2;"
+#define ZLIB_FORMATS "tar.gz;tgz;tar.z;iso.z;cpio.gz;deb;img.gz;"
+#define XZ_FORMATS "tar.lzma;tlz;tar.xz;txz;img.xz;"
#define LZMA_FORMATS "tar.lzma;tlz;"
+#define LZIP_FORMATS "tar.lz;"
+#define LRZIP_FORMATS "tar.lrz;"
+#define LZOP_FORMATS "tar.lzo;tzo;"
+#define LZ4_FORMATS "tar.lz4;img.lz4;"
+#define ZSTD_FORMATS "tar.zst;img.zst;"
#define RPM_FORMATS "rpm;"
#define UU_FORMATS "uu;"
#define XAR_FORMATS "xar;"
+#define CAB_FORMATS "cab;"
+#define _7Z_FORMATS "7z;"
+#define WARC_FORMATS "warc;warc.gz;warc.bz2;warc.lzma;warc.xz;warc.lz4;warc.lzo;warc.zst;"
-char *formats;
-
-#ifndef MODULE_SHARED
- #ifdef HAVE_BZLIB_H
- #define FORMAT_BZLIB BZIP_FORMATS
- #else
- #define FORMAT_BZLIB
- #endif
-
- #ifdef HAVE_ZLIB_H
- #define FORMAT_ZLIB ZLIB_FORMATS
- #else
- #define FORMAT_ZLIB
- #endif
-
- #if HAVE_LZMA_H && HAVE_LIBLZMA
- #define FORMAT_LZMA XZ_FORMATS
- #elif HAVE_LZMADEC_H && HAVE_LIBLZMADEC
- #define FORMAT_LZMA LZMA_FORMATS
- #else
- #define FORMAT_LZMA
- #endif
-
- #if ARCHIVE_VERSION_NUMBER >= 2008000
- #define FORMAT_RPM RPM_FORMATS
- #define FORMAT_UU UU_FORMATS
- #else
- #define FORMAT_RPM
- #define FORMAT_UU
- #endif
-
- #if ((ARCHIVE_VERSION_NUMBER >= 2008000) && \
- (defined(HAVE_LIBXML_XMLREADER_H) || defined(HAVE_BSDXML_H) || defined(HAVE_EXPAT_H)) && \
- defined(HAVE_ZLIB_H) && defined(ARCHIVE_HAS_MD5) && defined(ARCHIVE_HAS_SHA1))
- #define FORMAT_XAR XAR_FORMATS
- #else
- #define FORMAT_XAR
- #endif
-
- formats = g_strdup (BASIC_FORMATS FORMAT_ZLIB FORMAT_BZLIB FORMAT_LZMA FORMAT_RPM FORMAT_UU FORMAT_XAR);
-
-#else
+ char *formats;
struct archive *archive;
char *s;
@@ -238,49 +196,88 @@ char *formats;
/* We ignore external program pass-through */
archive = archive_read_new ();
formats = g_strdup (BASIC_FORMATS);
- if (archive_read_support_compression_bzip2 (archive) == ARCHIVE_OK) {
+ if (archive_read_support_filter_bzip2 (archive) == ARCHIVE_OK) {
s = g_strconcat (formats, BZIP_FORMATS, NULL);
g_free (formats);
formats = s;
}
- if (archive_read_support_compression_gzip (archive) == ARCHIVE_OK) {
+ if (archive_read_support_filter_gzip (archive) == ARCHIVE_OK) {
s = g_strconcat (formats, ZLIB_FORMATS, NULL);
g_free (formats);
formats = s;
}
-#if ARCHIVE_VERSION_NUMBER >= 2006990
- if (archive_read_support_compression_xz (archive) == ARCHIVE_OK) {
+ if (archive_read_support_filter_xz (archive) == ARCHIVE_OK) {
s = g_strconcat (formats, XZ_FORMATS, NULL);
g_free (formats);
formats = s;
} else
-#endif
-#if ARCHIVE_VERSION_NUMBER >= 2005902
- if (archive_read_support_compression_lzma (archive) == ARCHIVE_OK) {
+ if (archive_read_support_filter_lzma (archive) == ARCHIVE_OK) {
s = g_strconcat (formats, LZMA_FORMATS, NULL);
g_free (formats);
formats = s;
}
+ if (archive_read_support_filter_lzip (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, LZIP_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
+#if ARCHIVE_VERSION_NUMBER >= 3001000
+ if (archive_read_support_filter_lrzip (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, LRZIP_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
+ if (archive_read_support_filter_lzop (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, LZOP_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
#endif
-#if ARCHIVE_VERSION_NUMBER >= 2008000
- if (archive_read_support_compression_rpm (archive) == ARCHIVE_OK) {
+ if (archive_read_support_filter_rpm (archive) == ARCHIVE_OK) {
s = g_strconcat (formats, RPM_FORMATS, NULL);
g_free (formats);
formats = s;
}
- if (archive_read_support_compression_uu (archive) == ARCHIVE_OK) {
+ if (archive_read_support_filter_uu (archive) == ARCHIVE_OK) {
s = g_strconcat (formats, UU_FORMATS, NULL);
g_free (formats);
formats = s;
}
- if (archive_read_support_format_xar (archive) == ARCHIVE_OK) {
- s = g_strconcat (formats, XAR_FORMATS, NULL);
+#if ARCHIVE_VERSION_NUMBER >= 3002000
+ if (archive_read_support_filter_lz4 (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, LZ4_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
+ if (archive_read_support_format_warc (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, WARC_FORMATS, NULL);
g_free (formats);
formats = s;
}
#endif
- archive_read_finish (archive);
+#if ARCHIVE_VERSION_NUMBER >= 3003003
+ if (archive_read_support_filter_zstd (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, ZSTD_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
#endif
+ if (archive_read_support_format_xar (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, XAR_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
+ if (archive_read_support_format_cab (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, CAB_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
+ if (archive_read_support_format_7zip (archive) == ARCHIVE_OK) {
+ s = g_strconcat (formats, _7Z_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
+ archive_read_free (archive);
#ifdef MODULE_SHARED
g_print ("(II) dynamically linked\n");
@@ -304,7 +301,7 @@ libarchive_open (struct archive **a, const char *filename, guint32 block_size, G
*a = archive_read_new ();
/* Register supported formats */
- archive_read_support_compression_all (*a);
+ archive_read_support_filter_all (*a);
archive_read_support_format_all (*a);
r = archive_read_open_filename (*a, filename, block_size);
@@ -426,7 +423,7 @@ VFSOpenArchive (struct TVFSGlobs *globs, const char *sName, GError **error)
}
archive_read_close (a);
}
- archive_read_finish (a);
+ archive_read_free (a);
fprintf (stderr, "(II) VFSOpenArchive: done. \n");
/* Resolve symlinks */
@@ -787,7 +784,7 @@ VFSStopCopyOperation (struct TVFSGlobs *globs, GError **error)
printf ("(II) VFSStopCopyOperation: closing archive.\n");
archive_read_close (globs->op_archive);
- archive_read_finish (globs->op_archive);
+ archive_read_free (globs->op_archive);
globs->op_archive = NULL;
return TRUE;