#!/usr/bin/perl # unpack-binpkg-l1 -- maemian unpack script (binary packages level 1) # # syntax: unpack-binpkg-l1 # # Note that must be specified with absolute path. # Copyright (C) 1998 Christian Schwarz # # This program 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. # # You should have received a copy of the GNU General Public License # along with this program. If not, you can find it on the World Wide # Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, # MA 02110-1301, USA. use strict; use vars qw($verbose); ($#ARGV == 1) or die "syntax: unpack-binpkg-l1 "; my $base_dir = shift; my $file = shift; # import perl libraries use lib "$ENV{'MAEMIAN_ROOT'}/lib"; use Util; use Maemian::Command qw(spawn reap); # stat $file (my @stat = stat $file) or fail("$file: cannot stat: $!"); my (@jobs, $job); # create directory in lab print "N: Creating directory $base_dir ...\n" if $verbose; mkdir("$base_dir", 0777) or fail("mkdir $base_dir: $!"); mkdir("$base_dir/control", 0777) or fail("mkdir $base_dir/control: $!"); mkdir("$base_dir/fields", 0777) or fail("mkdir $base_dir/fields: $!"); symlink($file,"$base_dir/deb") or fail("symlink: $!"); # The following calls use knowledge of the .deb format for speed # (replaces dpkg-deb -e) # extract control files' tarball spawn({ fail => 'error', out => "$base_dir/control.tar" }, ['ar', 'p', $file, 'control.tar.gz'], '|', ['gzip', '-dc']); $job = { fail => 'error', err => "$base_dir/control-errors" }; push @jobs, $job; # extract the tarball's contents spawn($job, ["tar", "xf", "$base_dir/control.tar", "-C", "$base_dir/control", '&']); $job = { fail => 'error', out => "$base_dir/control-index", err => "$base_dir/control-index-errors" }; push @jobs, $job; # create index of control.tar.gz spawn($job, ["tar", "tvf", "$base_dir/control.tar"], '|', ["sort", "-k", "6"], '&'); reap(@jobs); undef @jobs; # clean up control.tar unlink("$base_dir/control.tar") or fail(); # fix permissions spawn({ fail => 'error' }, ["chmod", "-R", "u+rX,o-w", "$base_dir/control"]); $job = { fail => 'error', out => "$base_dir/index", err => "$base_dir/index-errors" }; push @jobs, $job; # (replaces dpkg-deb -c) # create index file for package spawn($job, ["dpkg-deb", "--fsys-tarfile", $file ], '|', ["tar", "tfv", "-"], '|', ["sed", "-e", "s/^h/-/"], '|', ["sort", "-k", "6"], '&'); $job = { fail => 'error', out => "$base_dir/index-owner-id", err => '/dev/null' }; push @jobs, $job; # (replaces dpkg-deb -c) # create index file for package with owner IDs instead of names spawn($job, ["dpkg-deb", "--fsys-tarfile", $file], '|', ["tar", "--numeric-owner", "-tvf", "-"], '|', ["sed", "-e", "s/^h/-/"], '|', ["sort", "-k", "6"], '&'); # get package control information my $data = (read_dpkg_control("$base_dir/control/control"))[0]; $data->{'source'} or ($data->{'source'} = $data->{'package'}); # create control field files for my $field (keys %$data) { my $field_file = "$base_dir/fields/$field"; open(F, '>', $field_file) or fail("cannot open file $field_file for writing: $!"); print F $data->{$field},"\n"; close(F); } # create symlink to source package $data->{'source'} =~ s/\s*\(.*\)\s*$//; symlink("../../source/$data->{'source'}","$base_dir/source") or fail("symlink: $!"); reap(@jobs); undef @jobs; exit 0;