From 24ca27fe308189b05a2c8480305793cc8ee5e791 Mon Sep 17 00:00:00 2001 From: xgizzmo Date: Mon, 11 May 2009 22:00:51 -0400 Subject: [PATCH] Added XZ compression support. Signed-off-by: xgizzmo Signed-off-by: Slava Zanko --- edit/edit.c | 1 + misc/mc.ext.in | 14 ++++++++++++++ src/util.c | 11 +++++++++++ src/util.h | 3 ++- vfs/extfs/iso9660.in | 1 + vfs/extfs/lslR.in | 1 + vfs/extfs/mailfs.in | 3 +++ vfs/extfs/patchfs.in | 5 +++++ vfs/extfs/sfs.ini | 2 ++ 9 files changed, 40 insertions(+), 1 deletion(-) diff --git a/edit/edit.c b/edit/edit.c index 77f64ef16..1becefb47 100644 --- a/edit/edit.c +++ b/edit/edit.c @@ -321,6 +321,7 @@ edit_load_file_fast (WEdit *edit, const char *filename) static const struct edit_filters { const char *read, *write, *extension; } all_filters[] = { + { "xz -cd %s 2>&1", "xz > %s", ".xz" }, { "lzma -cd %s 2>&1", "lzma > %s", ".lzma" }, { "bzip2 -cd %s 2>&1", "bzip2 > %s", ".bz2" }, { "gzip -cd %s 2>&1", "gzip > %s", ".gz" }, diff --git a/misc/mc.ext.in b/misc/mc.ext.in index 6cef6bd9f..86fc7ff48 100644 --- a/misc/mc.ext.in +++ b/misc/mc.ext.in @@ -124,6 +124,11 @@ regex/\.t(ar\.lzma|lz)$ Open=%cd %p#utar View=%view{ascii} lzma -dc %f 2>/dev/null | tar tvvf - +# .tar.xz, .txz +regex/\.t(ar\.xz|xz)$ + Open=%cd %p#utar + View=%view{ascii} xz -dc %f 2>/dev/null | tar tvvf - + # .tar.F - used in QNX regex/\.tar\.F$ # Open=%cd %p#utar @@ -320,6 +325,10 @@ regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.lzma$ Open=case %d/%f in */log/*|*/logs/*) lzma -dc %f ;; *) lzma -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac | %var{PAGER:more} View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) lzma -dc %f ;; *) lzma -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac +regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.xz$ + Open=case %d/%f in */log/*|*/logs/*) xz -dc %f ;; *) xz -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac | %var{PAGER:more} + View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) xz -dc %f ;; *) xz -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac + ### Images ### @@ -601,6 +610,11 @@ regex/\.lzma$ Open=lzma -dc %f | %var{PAGER:more} View=%view{ascii} lzma -dc %f 2>/dev/null +# xz +regex/\.xz$ + Open=xz -dc %f | %var{PAGER:more} + View=%view{ascii} xz -dc %f 2>/dev/null + ### Default ### diff --git a/src/util.c b/src/util.c index b4b6e1479..2a84a78be 100644 --- a/src/util.c +++ b/src/util.c @@ -875,6 +875,16 @@ get_compression_type (int fd) } } + /* XZ compression magic */ + if (magic[0] == 0xFD + && magic[1] == 0x37 && magic[2] == 0x7A && magic[3] == 0x58) { + if (mc_read (fd, (char *) magic + 4, 2) == 2) { + if (magic[4] == 0x5A && magic[5] == 0x00) { + return COMPRESSION_XZ; + } + } + } + return 0; } @@ -886,6 +896,7 @@ decompress_extension (int type) case COMPRESSION_BZIP: return "#ubz"; case COMPRESSION_BZIP2: return "#ubz2"; case COMPRESSION_LZMA: return "#ulzma"; + case COMPRESSION_XZ: return "#uxz"; } /* Should never reach this place */ fprintf (stderr, "Fatal: decompress_extension called with an unknown argument\n"); diff --git a/src/util.h b/src/util.h index 557d70bdb..76c72e91a 100644 --- a/src/util.h +++ b/src/util.h @@ -183,7 +183,8 @@ enum compression_type { COMPRESSION_GZIP, COMPRESSION_BZIP, COMPRESSION_BZIP2, - COMPRESSION_LZMA + COMPRESSION_LZMA, + COMPRESSION_XZ }; /* Looks for ``magic'' bytes at the start of the VFS file to guess the diff --git a/vfs/extfs/iso9660.in b/vfs/extfs/iso9660.in index ad58e7428..7b2ba7063 100644 --- a/vfs/extfs/iso9660.in +++ b/vfs/extfs/iso9660.in @@ -30,6 +30,7 @@ mcisofs_list () { # left as a reminder to implement compressed image support =) case "$1" in *.lzma) MYCAT="lzma -dc";; + *.xz) MYCAT="xz -dc";; *.bz2) MYCAT="bzip2 -dc";; *.gz) MYCAT="gzip -dc";; *.z) MYCAT="gzip -dc";; diff --git a/vfs/extfs/lslR.in b/vfs/extfs/lslR.in index 67f5edbb3..2bc2bd059 100644 --- a/vfs/extfs/lslR.in +++ b/vfs/extfs/lslR.in @@ -13,6 +13,7 @@ AWK=@AWK@ mclslRfs_list () { case "$1" in *.lzma) MYCAT="lzma -dc";; + *.xz) MYCAT="xz -dc";; *.bz2) MYCAT="bzip2 -dc";; *.gz) MYCAT="gzip -dc";; *.z) MYCAT="gzip -dc";; diff --git a/vfs/extfs/mailfs.in b/vfs/extfs/mailfs.in index 91cf3d7d7..bb372e3ae 100644 --- a/vfs/extfs/mailfs.in +++ b/vfs/extfs/mailfs.in @@ -8,6 +8,7 @@ use bytes; $zcat="zcat"; # gunzip to stdout $bzcat="bzip2 -dc"; # bunzip2 to stdout $lzcat="lzma -dc"; # unlzma to stdout +$xzcat="xz -dc"; # unxz to stdout $file="file"; # "file" command $TZ='GMT'; # default timezone (for Date module) @@ -185,6 +186,8 @@ if (/gzip/) { exit 1 unless (open IN, "$bzcat $mbox_qname|"); } elsif (/lzma/) { exit 1 unless (open IN, "$lzcat $mbox_qname|"); +} elsif (/xz/) { + exit 1 unless (open IN, "$xzcat $mbox_qname|"); } else { exit 1 unless (open IN, "<$mbox_name"); } diff --git a/vfs/extfs/patchfs.in b/vfs/extfs/patchfs.in index 62a6d0d7b..7c6b4685a 100644 --- a/vfs/extfs/patchfs.in +++ b/vfs/extfs/patchfs.in @@ -13,6 +13,7 @@ use File::Temp 'tempfile'; # standard binaries my $lzma = 'lzma'; +my $xz = 'xz'; my $bzip = 'bzip2'; my $gzip = 'gzip'; my $fileutil = 'file'; @@ -73,6 +74,8 @@ sub myin $_=`$fileutil $qfname`; if (/lzma/) { return "$lzma -dc $qfname"; + } elsif (/xz/) { + return "$xz -dc $qfname"; } elsif (/bzip/) { return "$bzip -dc $qfname"; } elsif (/gzip/) { @@ -91,6 +94,8 @@ sub myout $_=`$fileutil $qfname`; if (/lzma/) { return "$lzma -c $sep $qfname"; + } elsif (/xz/) { + return "$xz -c $sep $qfname"; } elsif (/bzip/) { return "$bzip -c $sep $qfname"; } elsif (/gzip/) { diff --git a/vfs/extfs/sfs.ini b/vfs/extfs/sfs.ini index fc77e04a7..522cca10a 100644 --- a/vfs/extfs/sfs.ini +++ b/vfs/extfs/sfs.ini @@ -12,6 +12,8 @@ bz2/1 bzip2 < %1 > %3 ubz2/1 bzip2 -d < %1 > %3 lzma/1 lzma < %1 > %3 ulzma/1 lzma -d < %1 > %3 +xz/1 xz < %1 > %3 +uxz/1 xz -d < %1 > %3 tar/1 tar cf %3 %1 tgz/1 tar czf %3 %1 uhtml/1 lynx -force_html -dump %1 > %3