Author: guillem Date: 2006-11-24 05:11:35 +0100 (Fri, 24 Nov 2006) New Revision: 602
Modified: trunk/ChangeLog trunk/debian/changelog trunk/debian/control trunk/dpkg-deb/dpkg-deb.h trunk/dpkg-deb/extract.c trunk/lib/compression.c trunk/lib/dpkg.h trunk/scripts/dpkg-source.pl Log: Support extracting lzma compressed source and binary packages, and add a Suggests on package lzma. Closes: #347715 Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-11-24 04:08:00 UTC (rev 601) +++ trunk/ChangeLog 2006-11-24 04:11:35 UTC (rev 602) @@ -1,3 +1,17 @@ +2006-11-24 Guillem Jover <[EMAIL PROTECTED]> + + * scripts/dpkg-source.pl: Add lzma extracting support. + (checkdiff): Likewise. + (forkgzipread): Likewise. + * lib/dpkg.h (LZMA): New macro. + (compression_type): Add compress_type_lzma. + * lib/compression.c (decompress_cat): Handle compress_type_lzma + decompression. + * dpkg-deb/dpkg-deb.h (DATAMEMBER_LZMA): New macro. + (DATAMEMBER_COMPAT_LZMA): Likewise. + * dpkg-deb/extract.c (extracthalf): Handle DATAMEMBER_LZMA and + DATAMEMBER_COMPAT_LZMA members. + 2006-11-24 Brendan O'Dea <[EMAIL PROTECTED]> * scripts/controllib.pl (subprocerr): Require POSIX for WIFEXITED, Modified: trunk/debian/changelog =================================================================== --- trunk/debian/changelog 2006-11-24 04:08:00 UTC (rev 601) +++ trunk/debian/changelog 2006-11-24 04:11:35 UTC (rev 602) @@ -8,6 +8,8 @@ Thanks to Tomas Pospisek <[EMAIL PROTECTED]>. * Require POSIX inside subprocerr in controllib.pl. Closes: #390636 Thanks to Brendan O'Dea <[EMAIL PROTECTED]>. + * Support extracting lzma compressed source and binary packages, + and add a Suggests on package lzma. Closes: #347715 [ Updated dpkg translations ] * Chinese (Traditional, Asho Yeh) Modified: trunk/debian/control =================================================================== --- trunk/debian/control 2006-11-24 04:08:00 UTC (rev 601) +++ trunk/debian/control 2006-11-24 04:11:35 UTC (rev 602) @@ -18,7 +18,7 @@ dpkg-dev (<< 1.10) Replaces: dpkg-doc-ja, dpkg-static, manpages-de (<= 0.4-3), manpages-pl (<= 20051117-1) -Suggests: apt +Suggests: apt, lzma Description: package maintenance system for Debian This package contains the low-level commands for handling the installation and removal of packages on your system. Modified: trunk/dpkg-deb/dpkg-deb.h =================================================================== --- trunk/dpkg-deb/dpkg-deb.h 2006-11-24 04:08:00 UTC (rev 601) +++ trunk/dpkg-deb/dpkg-deb.h 2006-11-24 04:11:35 UTC (rev 602) @@ -45,6 +45,8 @@ #define DATAMEMBER_COMPAT_GZ "data.tar.gz/ " #define DATAMEMBER_BZ2 "data.tar.bz2 " #define DATAMEMBER_COMPAT_BZ2 "data.tar.bz2/ " +#define DATAMEMBER_LZMA "data.tar.lzma " +#define DATAMEMBER_COMPAT_LZMA "data.tar.lzma/ " #define DATAMEMBER_CAT "data.tar " #define DATAMEMBER_COMPAT_CAT "data.tar/ " Modified: trunk/dpkg-deb/extract.c =================================================================== --- trunk/dpkg-deb/extract.c 2006-11-24 04:08:00 UTC (rev 601) +++ trunk/dpkg-deb/extract.c 2006-11-24 04:11:35 UTC (rev 602) @@ -157,6 +157,10 @@ !memcmp(arh.ar_name,DATAMEMBER_COMPAT_BZ2,sizeof(arh.ar_name))) { adminmember= 0; compress_type= BZ2; + } else if (!memcmp(arh.ar_name, DATAMEMBER_LZMA, sizeof(arh.ar_name)) || + !memcmp(arh.ar_name, DATAMEMBER_COMPAT_LZMA, sizeof(arh.ar_name))) { + adminmember = 0; + compress_type = compress_type_lzma; } else if (!memcmp(arh.ar_name,DATAMEMBER_CAT,sizeof(arh.ar_name)) || !memcmp(arh.ar_name,DATAMEMBER_COMPAT_CAT,sizeof(arh.ar_name))) { adminmember= 0; Modified: trunk/lib/compression.c =================================================================== --- trunk/lib/compression.c 2006-11-24 04:08:00 UTC (rev 601) +++ trunk/lib/compression.c 2006-11-24 04:11:35 UTC (rev 602) @@ -90,6 +90,17 @@ } execlp(BZIP2,"bzip2","-dc",(char*)0); ohshite(_("%s: failed to exec bzip2 -dc"), v.buf); #endif + case compress_type_lzma: + if (fd_in != 0) { + m_dup2(fd_in, 0); + close(fd_in); + } + if (fd_out != 1) { + m_dup2(fd_out, 1); + close(fd_out); + } + execlp(LZMA, "lzma", "-dc", (char *)0); + ohshite(_("%s: failed to exec %s"), v.buf, "lzma -dc"); case CAT: fd_fd_copy(fd_in, fd_out, -1, _("%s: decompression"), v.buf); exit(0); Modified: trunk/lib/dpkg.h =================================================================== --- trunk/lib/dpkg.h 2006-11-24 04:08:00 UTC (rev 601) +++ trunk/lib/dpkg.h 2006-11-24 04:11:35 UTC (rev 602) @@ -139,6 +139,7 @@ #define TAR "tar" #define GZIP "gzip" #define BZIP2 "bzip2" +#define LZMA "lzma" #define RM "rm" #define FIND "find" #define SHELL "sh" @@ -373,7 +374,7 @@ /*** from compression.c ***/ -enum compression_type { CAT, GZ, BZ2 }; +enum compression_type { CAT, GZ, BZ2, compress_type_lzma }; void decompress_cat(enum compression_type type, int fd_in, int fd_out, char *desc, ...) NONRETURNING; void compress_cat(enum compression_type type, int fd_in, int fd_out, const char *compression, char *desc, ...) NONRETURNING; Modified: trunk/scripts/dpkg-source.pl =================================================================== --- trunk/scripts/dpkg-source.pl 2006-11-24 04:08:00 UTC (rev 601) +++ trunk/scripts/dpkg-source.pl 2006-11-24 04:11:35 UTC (rev 602) @@ -680,7 +680,7 @@ &error(sprintf(_g("Files field contains invalid filename `%s'"), $file)) unless s/^\Q$sourcepackage\E_\Q$baseversion\E(?=[.-])// and - s/\.(gz|bz2)$//; + s/\.(gz|bz2|lzma)$//; s/^-\Q$revision\E(?=\.)// if length $revision; &error(sprintf(_g("repeated file type - files `%s' and `%s'"), $seen{$_}, $file)) if $seen{$_}; @@ -835,7 +835,7 @@ for my $patch (@patches) { printf(_g("%s: applying %s")."\n", $progname, $patch); - if ($patch =~ /\.(gz|bz2)$/) { + if ($patch =~ /\.(gz|bz2|lzma)$/) { &forkgzipread($patch); *DIFF = *GZIP; } else { @@ -855,7 +855,7 @@ $c2 == waitpid($c2,0) || &syserr(_g("wait for patch")); $? && subprocerr("patch"); - &reapgzip if $patch =~ /\.(gz|bz2)$/; + &reapgzip if $patch =~ /\.(gz|bz2|lzma)$/; } my $now = time; @@ -1138,7 +1138,7 @@ sub checkdiff { my $diff = shift; - if ($diff =~ /\.(gz|bz2)$/) { + if ($diff =~ /\.(gz|bz2|lzma)$/) { &forkgzipread($diff); *DIFF = *GZIP; } else { @@ -1212,7 +1212,7 @@ } close(DIFF); - &reapgzip if $diff =~ /\.(gz|bz2)$/; + &reapgzip if $diff =~ /\.(gz|bz2|lzma)$/; } sub extracttar { @@ -1307,7 +1307,18 @@ sub forkgzipread { local $SIG{PIPE} = 'DEFAULT'; - my $prog = $_[0] =~ /\.gz$/ ? 'gunzip' : 'bunzip2'; + my $prog; + + if ($_[0] =~ /\.gz$/) { + $prog = 'gunzip'; + } elsif ($_[0] =~ /\.bz2$/) { + $prog = 'bunzip2'; + } elsif ($_[0] =~ /\.lzma$/) { + $prog = 'unlzma'; + } else { + &error(sprintf(_g("unknown compression type on file %s"), $_[0])); + } + open(GZIPFILE,"< $_[0]") || &syserr(sprintf(_g("read file %s"), $_[0])); pipe(GZIP,GZIPWRITE) || &syserr(sprintf(_g("pipe for %s"), $prog)); defined($cgz= fork) || &syserr(sprintf(_g("fork for %s"), $prog)); -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]