# LZMA support for Midnight Commander # 2006-03-17 # # This patch adds basic support for LZMA compressed files to # Midnight Commander 4.6.1. You should have LZMA utils 4.32.x # or later. Older versions of LZMA utils will *not* work. # # Copyright (C) 2006 Lasse Collin # # This patch is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. diff -up mc-4.6.2-pre1/edit/edit.c.lzmavfs mc-4.6.2-pre1/edit/edit.c --- mc-4.6.2-pre1/edit/edit.c.lzmavfs 2008-08-05 15:31:29.000000000 +0200 +++ mc-4.6.2-pre1/edit/edit.c 2008-08-05 15:31:29.000000000 +0200 @@ -185,6 +185,7 @@ edit_load_file_fast (WEdit *edit, const static const struct edit_filters { const char *read, *write, *extension; } all_filters[] = { + { "lzma -cd %s 2>&1", "lzma > %s", ".lzma" }, { "bzip2 -cd %s 2>&1", "bzip2 > %s", ".bz2" }, { "gzip -cd %s 2>&1", "gzip > %s", ".gz" }, { "gzip -cd %s 2>&1", "gzip > %s", ".Z" } diff -up mc-4.6.2-pre1/src/util.c.lzmavfs mc-4.6.2-pre1/src/util.c --- mc-4.6.2-pre1/src/util.c.lzmavfs 2008-08-05 15:31:29.000000000 +0200 +++ mc-4.6.2-pre1/src/util.c 2008-08-05 15:31:29.000000000 +0200 @@ -1239,7 +1239,7 @@ get_current_wd (char *buffer, int size) enum compression_type get_compression_type (int fd) { - unsigned char magic[4]; + unsigned char magic[16]; /* Read the magic signature */ if (mc_read (fd, (char *) magic, 4) != 4) @@ -1283,6 +1283,31 @@ get_compression_type (int fd) return COMPRESSION_BZIP2; } } + + /* LZMA files; both LZMA_Alone and LZMA utils formats. The LZMA_Alone + * format is used by the LZMA_Alone tool from LZMA SDK. The LZMA utils + * format is the default format of LZMA utils 4.32.1 and later. */ + if (magic[0] < 0xE1 || (magic[0] == 0xFF && magic[1] == 'L' && + magic[2] == 'Z' && magic[3] == 'M')) { + if (mc_read (fd, (char *) magic + 4, 9) == 9) { + /* LZMA utils format */ + if (magic[0] == 0xFF && magic[4] == 'A' && magic[5] == 0x00) + return COMPRESSION_LZMA; + /* The LZMA_Alone format has no magic bytes, thus we + * need to play a wizard. This can give false positives, + * thus the detection below should be removed when + * the newer LZMA utils format has got popular. */ + if (magic[0] < 0xE1 && magic[4] < 0x20 && + ((magic[10] == 0x00 && magic[11] == 0x00 && + magic[12] == 0x00) || + (magic[5] == 0xFF && magic[6] == 0xFF && + magic[7] == 0xFF && magic[8] == 0xFF && + magic[9] == 0xFF && magic[10] == 0xFF && + magic[11] == 0xFF && magic[12] == 0xFF))) + return COMPRESSION_LZMA; + } + } + return 0; } @@ -1293,6 +1318,7 @@ decompress_extension (int type) case COMPRESSION_GZIP: return "#ugz"; case COMPRESSION_BZIP: return "#ubz"; case COMPRESSION_BZIP2: return "#ubz2"; + case COMPRESSION_LZMA: return "#ulzma"; } /* Should never reach this place */ fprintf (stderr, "Fatal: decompress_extension called with an unknown argument\n"); diff -up mc-4.6.2-pre1/src/util.h.lzmavfs mc-4.6.2-pre1/src/util.h --- mc-4.6.2-pre1/src/util.h.lzmavfs 2008-08-05 15:31:29.000000000 +0200 +++ mc-4.6.2-pre1/src/util.h 2008-08-05 15:31:29.000000000 +0200 @@ -186,7 +186,8 @@ enum compression_type { COMPRESSION_NONE, COMPRESSION_GZIP, COMPRESSION_BZIP, - COMPRESSION_BZIP2 + COMPRESSION_BZIP2, + COMPRESSION_LZMA }; /* Looks for ``magic'' bytes at the start of the VFS file to guess the diff -up mc-4.6.2-pre1/vfs/extfs/iso9660.in.lzmavfs mc-4.6.2-pre1/vfs/extfs/iso9660.in --- mc-4.6.2-pre1/vfs/extfs/iso9660.in.lzmavfs 2006-07-19 13:19:52.000000000 +0200 +++ mc-4.6.2-pre1/vfs/extfs/iso9660.in 2008-08-05 15:31:29.000000000 +0200 @@ -29,6 +29,7 @@ test_iso () { mcisofs_list () { # left as a reminder to implement compressed image support =) case "$1" in + *.lzma) MYCAT="lzma -dc";; *.bz2) MYCAT="bzip2 -dc";; *.gz) MYCAT="gzip -dc";; *.z) MYCAT="gzip -dc";; diff -up mc-4.6.2-pre1/vfs/extfs/lslR.in.lzmavfs mc-4.6.2-pre1/vfs/extfs/lslR.in --- mc-4.6.2-pre1/vfs/extfs/lslR.in.lzmavfs 2003-06-22 11:54:21.000000000 +0200 +++ mc-4.6.2-pre1/vfs/extfs/lslR.in 2008-08-05 15:31:29.000000000 +0200 @@ -12,6 +12,7 @@ AWK=@AWK@ mclslRfs_list () { case "$1" in + *.lzma) MYCAT="lzma -dc";; *.bz2) MYCAT="bzip2 -dc";; *.gz) MYCAT="gzip -dc";; *.z) MYCAT="gzip -dc";; diff -up mc-4.6.2-pre1/vfs/extfs/mailfs.in.lzmavfs mc-4.6.2-pre1/vfs/extfs/mailfs.in --- mc-4.6.2-pre1/vfs/extfs/mailfs.in.lzmavfs 2006-05-28 14:35:57.000000000 +0200 +++ mc-4.6.2-pre1/vfs/extfs/mailfs.in 2008-08-05 15:31:29.000000000 +0200 @@ -7,6 +7,7 @@ use bytes; $zcat="zcat"; # gunzip to stdout $bzcat="bzip2 -dc"; # bunzip2 to stdout +$lzcat="lzma -dc"; # unlzma to stdout $file="file"; # "file" command $TZ='GMT'; # default timezone (for Date module) @@ -182,6 +183,8 @@ if (/gzip/) { exit 1 unless (open IN, "$zcat $mbox_qname|"); } elsif (/bzip/) { exit 1 unless (open IN, "$bzcat $mbox_qname|"); +} elsif (/lzma/) { + exit 1 unless (open IN, "$lzcat $mbox_qname|"); } else { exit 1 unless (open IN, "<$mbox_name"); } diff -up mc-4.6.2-pre1/vfs/extfs/patchfs.in.lzmavfs mc-4.6.2-pre1/vfs/extfs/patchfs.in --- mc-4.6.2-pre1/vfs/extfs/patchfs.in.lzmavfs 2004-11-17 00:00:40.000000000 +0100 +++ mc-4.6.2-pre1/vfs/extfs/patchfs.in 2008-08-05 15:31:29.000000000 +0200 @@ -12,6 +12,7 @@ use POSIX; use File::Temp 'tempfile'; # standard binaries +my $lzma = 'lzma'; my $bzip = 'bzip2'; my $gzip = 'gzip'; my $fileutil = 'file'; @@ -70,7 +71,9 @@ sub myin my ($qfname)=(quotemeta $_[0]); $_=`$fileutil $qfname`; - if (/bzip/) { + if (/lzma/) { + return "$lzma -dc $qfname"; + } elsif (/bzip/) { return "$bzip -dc $qfname"; } elsif (/gzip/) { return "$gzip -dc $qfname"; @@ -86,7 +89,9 @@ sub myout my ($sep) = $append ? '>>' : '>'; $_=`$fileutil $qfname`; - if (/bzip/) { + if (/lzma/) { + return "$lzma -c $sep $qfname"; + } elsif (/bzip/) { return "$bzip -c $sep $qfname"; } elsif (/gzip/) { return "$gzip -c $sep $qfname"; diff -up mc-4.6.2-pre1/vfs/extfs/sfs.ini.lzmavfs mc-4.6.2-pre1/vfs/extfs/sfs.ini --- mc-4.6.2-pre1/vfs/extfs/sfs.ini.lzmavfs 1998-12-15 16:57:43.000000000 +0100 +++ mc-4.6.2-pre1/vfs/extfs/sfs.ini 2008-08-05 15:31:29.000000000 +0200 @@ -10,6 +10,8 @@ bz/1 bzip < %1 > %3 ubz/1 bzip -d < %1 > %3 bz2/1 bzip2 < %1 > %3 ubz2/1 bzip2 -d < %1 > %3 +lzma/1 lzma < %1 > %3 +ulzma/1 lzma -d < %1 > %3 tar/1 tar cf %3 %1 tgz/1 tar czf %3 %1 uhtml/1 lynx -force_html -dump %1 > %3