summaryrefslogtreecommitdiff
path: root/libarchive
diff options
context:
space:
mode:
Diffstat (limited to 'libarchive')
-rw-r--r--libarchive/libarchive.c87
1 files changed, 71 insertions, 16 deletions
diff --git a/libarchive/libarchive.c b/libarchive/libarchive.c
index 86823cb..e9ecfc0 100644
--- a/libarchive/libarchive.c
+++ b/libarchive/libarchive.c
@@ -1,10 +1,11 @@
/* libarchive plugin for Tux Commander
- * version 0.1.6, designed for libarchive 2.7.1
- * Copyright (C) 2008 Tomas Bzatek <tbzatek@users.sourceforge.net>
+ * version 0.1.7, designed for libarchive v2.5.5 - v2.7.1 (recommended)
+ * Copyright (C) 2008-2009 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/
*
*
@@ -49,10 +50,16 @@
# include <config.h>
#endif
+#if ARCHIVE_VERSION_NUMBER >= 3000000
+ #error "This module is designed for libarchive 2.x series only."
+#endif
+#if ARCHIVE_VERSION_NUMBER < 2005005
+ #error "libarchive 2.5.5 or greater is required to compile this module."
+#endif
-#define MODULE_VERSION "0.1.6"
-#define MODULE_BUILD_DATE "2009-11-15"
+#define MODULE_VERSION "0.1.7"
+#define MODULE_BUILD_DATE "2009-11-17"
#define DEFAULT_BLOCK_SIZE 65536
@@ -138,7 +145,7 @@ int VFSVersion()
return cVFSVersion;
}
-struct TVFSInfo *
+struct TVFSInfo *
VFSGetInfo()
{
struct TVFSInfo *module_info = g_malloc0 (sizeof (struct TVFSInfo));
@@ -150,7 +157,7 @@ VFSGetInfo()
module_info->ID = g_strdup ("libarchive_plugin");
module_info->Name = g_strdup ("libarchive plugin");
- module_info->About = g_strdup_printf ("version %s, build date: %s\nusing %s%s\n",
+ module_info->About = g_strdup_printf ("version %s, build date: %s\nusing %s%s\n",
MODULE_VERSION, MODULE_BUILD_DATE, ARCHIVE_LIBRARY_VERSION, shared_module);
module_info->Copyright = g_strdup ("Plugin Copyright (C) 2008-2009 Tomáš Bžatek\nlibarchive sources Copyright (c) 2003-2007 Tim Kientzle");
@@ -160,33 +167,81 @@ VFSGetInfo()
char *
VFSGetArchiveExts ()
{
+/* Make sure these end with a semicolon */
+#define BASIC_FORMATS "tar;cpio;iso;a;shar;"
+#define BZIP_FORMATS "tar.bz2;tbz2;"
+#define ZLIB_FORMATS "tar.gz;tgz;tar.z;deb;"
+#define XZ_FORMATS "tar.lzma;tar.xz;"
+#define LZMA_FORMATS "tar.lzma;"
+
+char *formats;
+
#ifndef MODULE_SHARED
#ifdef HAVE_BZLIB_H
- #define FORMAT_BZLIB "tar.bz2;tbz2;"
+ #define FORMAT_BZLIB BZIP_FORMATS
#else
- #define FORMAT_BZLIB
+ #define FORMAT_BZLIB
#endif
#ifdef HAVE_ZLIB_H
- #define FORMAT_ZLIB "tar.gz;tgz;deb;"
+ #define FORMAT_ZLIB ZLIB_FORMATS
#else
- #define FORMAT_ZLIB
+ #define FORMAT_ZLIB
#endif
#if HAVE_LZMA_H && HAVE_LIBLZMA
- #define FORMAT_LZMA "tar.lzma;tar.xz;"
+ #define FORMAT_LZMA XZ_FORMATS
#elif HAVE_LZMADEC_H && HAVE_LIBLZMADEC
- #define FORMAT_LZMA "tar.lzma;"
+ #define FORMAT_LZMA LZMA_FORMATS
#else
#define FORMAT_LZMA
#endif
- return g_strdup ("tar;cpio;iso;a;" FORMAT_ZLIB FORMAT_BZLIB FORMAT_LZMA);
+ formats = g_strdup (BASIC_FORMATS FORMAT_ZLIB FORMAT_BZLIB FORMAT_LZMA);
+
#else
- /* Dynamic linking; we're unable to determine supported formats,
- let's suppose distribution vendors always compile full set */
- return g_strdup ("tar;tar.gz;tar.bz2;tgz;tbz2;cpio;iso;a;deb;tar.lzma;tar.xz");
+ struct archive *archive;
+ char *s;
+
+ /* Determine supported compression formats by calling each one. */
+ /* We ignore external program pass-through */
+ archive = archive_read_new ();
+ formats = g_strdup (BASIC_FORMATS);
+ if (archive_read_support_compression_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) {
+ 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) {
+ 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) {
+ s = g_strconcat (formats, LZMA_FORMATS, NULL);
+ g_free (formats);
+ formats = s;
+ }
+#endif
+ archive_read_finish (archive);
+#endif
+
+#ifdef MODULE_SHARED
+ g_print ("(II) dynamically linked\n");
+#else
+ g_print ("(II) statically linked\n");
+#endif
+
+ g_print ("(II) VFSGetArchiveExts: supported archives = '%s'\n", formats);
+ return formats;
}