1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#!/usr/bin/perl
#############################################################################
#
# rx_* dispatcher and handlers for VFU File Manager
# (c) Vladi Belperchinov-Shabanski "Cade" 2002
# <cade@biscom.net> <cade.datamax.bg> http://cade.webbg.com
# $Id: rx_deb,v 1.4 2002/11/07 23:22:21 cade Exp $
#
# usage:
# rx_* l archive directory # list archive directory
# rx_* v archive # list entire archive
# rx_* x archive files... # extract one file
# rx_* x archive @listfile # extract list of files
#
#############################################################################
use strict;
my $cmd = lc shift @ARGV;
my $archive = shift @ARGV;
my $cache = "$archive.data.tar.gz.rx.cache";
$cache =~ s/^(.+)\/([^\/]+)$/$2/;
if ( $cmd eq "l" || $cmd eq "v" || $cmd eq "x" )
{
if( ! -e "/tmp/$cache" )
{
# cache not found--fill it
system( "ar p \"$archive\" data.tar.gz > \"/tmp/$cache\"" );
chmod oct(600), "/tmp/$cache"; # a bit late but still... :)
}
else
{
utime time(), time(), "/tmp/$cache"; # update last modification time of the cache
}
chdir( "/tmp" );
system( "/usr/lib/vfu/rx_tar", $cmd, $cache, @ARGV );
}
else
{
die $0 . ": wrong command.\n";
}
=pod
if ( $command eq "v" )
{
$dir = shift @ARGV;
if ( $dir ) { $dir .= "/" unless $dir =~ /\/$/; }
if ( $dir eq "DATA/" )
{
open( i, "ar p $archive data.tar.gz | gzip -dc | tar tvf - |");
while(<i>)
{
chop;
s/\s+->\s+\S+$//;
if (/^(.[\-rwxsStT]{9})\s+\S+\s+(\d+)\s+(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d)\s+(\S+[^\/])$/)
{
print "NAME:$8\nSIZE:$2\nMODE:$1\nTIME:$3$4$5$6$7\n\n";
}
elsif (/^(.[\-rwxsStT]{9})\s+\S+\s+(\d+)\s+(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)\s+(\S+[^\/])$/)
{
print "NAME:$9\nSIZE:$2\nMODE:$1\nTIME:$3$4$5$6$7\n\n";
}
}
close( i );
}
else
{
# these are standard ones
print "NAME:control\n\nNAME:debian-binary\n\nNAME:DATA/\n\n";
# FIXME: here should take ar list and get files' sizes etc...
}
} # view command ends here
elsif ( $command eq "x" )
{
if ( $ARGV[0] eq "control" )
{
system( "ar p $archive control.tar.gz | gzip -d | tar xvf - control" );
}
elsif ( $ARGV[0] eq "debian-binary" )
{
system( "ar p $archive debian-binary > debian-binary" );
}
else
{
if ( $ARGV[0] =~ /^\@(.+)$/ )
{
$listfile = $1;
}
else
{
$listfile = "/tmp/rx_tar.list." . $$;
open( o, ">$listfile" );
while( $_ = shift @ARGV )
{
s/^DATA\///;
print o "$_\n";
}
close( o );
}
system( "mkdir -p DATA; cd DATA; ar p $archive data.tar.gz | gzip -d | tar xvf - -T $listfile" );
unlink $listfile;
}
}
=cut
|