From 36867ac3af93e933184204bb95df0dbdcb3205c5 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 17 Dec 2023 18:53:26 +0100 Subject: 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. --- libarchive/libarchive.c | 155 ++++++++++++++++++++++++------------------------ 1 file changed, 76 insertions(+), 79 deletions(-) (limited to 'libarchive') 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 + * version 0.3, designed for libarchive v3.6.1 + * Copyright (C) 2008-2023 Tomas Bzatek * 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 #include -#ifndef MODULE_SHARED - #include - #if ARCHIVE_VERSION_NUMBER >= 2008000 - #define __LIBARCHIVE_BUILD - #include - #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; -- cgit v1.2.3