2 # $Id: deb2targz,v 1.1 2002/12/17 11:57:54 mike Exp $
4 # deb2targz - convert a Debian Linux .deb file to a .tar.gz
6 # This is a hack based only on my eyeball inspection of a single .deb
7 # file (scottfree_1.14-5_i386.deb) and not on a deep understanding of
8 # the format. However, so far as I can tell, here's how it works:
10 # First line -- file header: "!<arch>" or similar
11 # Multiple blocks -- each one, a header line followed by data
12 # Header line -- <filename> <num1> <num2> <num3> <mode> <len>
13 # Data -- <len> bytes of data
14 # We want the block called "data.tar.gz"
16 # This naive algorithm seems to work on the other .deb files that I've
17 # tested it on, so I'm happy enough with it:
18 # libapache-reload-perl_0.07-1_all.deb
19 # libogg0_1.0.0-1_i386.deb
20 # abiword_1.0.2+cvs.2002.06.05-1_i386.deb
27 print STDERR "Usage: $0 <deb-file> [<deb-file> ...]\n";
31 FILE: foreach my $filename (@ARGV) {
32 if ($filename !~ /\.deb$/) {
33 print "$0: ignoring '$filename' (not a .deb)\n";
37 print "$0: converting '$filename' ...\n";
38 my $fh = new IO::File("<$filename")
39 or die "$0: can't read '$filename': $!";
41 <$fh>; # discard file-header line
42 my $data = join('', <$fh>);
47 ($header, $data) = ($data =~ /(.*?)\n(.*)/s);
48 my($name, $num1, $num2, $num3, $num4, $len) = split /\s+/, $header;
49 #print "header='$header'\n\tname='$name', len=$len\n";
50 if ($name eq "data.tar.gz") {
52 $data = substr($data, 0, $len);
53 $filename =~ s/\.deb$/.tar.gz/;
54 my $fh = new IO::File(">$filename")
55 or die "can't write '$filename': $!";
58 print "$0: wrote '$filename'\n";
62 print "$0: skipping section '$name'\n";
63 if (substr($data, $len, 1) eq "\n") {
66 $data = substr($data, $len);