e78c6c97b1
Milan Broz - use correct extension for lzma and regenerate so that it applies with fuzz==0
183 lines
6.9 KiB
Diff
183 lines
6.9 KiB
Diff
# 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 <lasse.collin@tukaani.org>
|
|
#
|
|
# 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
|