diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2009-11-17 17:41:58 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2009-11-17 17:41:58 +0100 |
| commit | 70eeaa4ec712895539ca6ecd60a42b93ec9b0904 (patch) | |
| tree | 8944973596f6d3d0e07393ba54401476234992ec /libarchive | |
| parent | 5dbc655ca28ffa7a53d6d3d7520023eeed5e2c43 (diff) | |
| download | tuxcmd-modules-70eeaa4ec712895539ca6ecd60a42b93ec9b0904.tar.xz | |
libarchive: better runtime supported formats detection
Requires libarchive 2.7.1 for accurate results.
Diffstat (limited to 'libarchive')
| -rw-r--r-- | libarchive/libarchive.c | 87 |
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; } |
