#!/usr/bin/perl
#
# 1999 (c) Piotr Roszatycki <dexter@debian.org>
# This software is under GNU license
# last modification: 1999-12-08
#
# deba

sub bt
{
    my ($dt) = @_;
    my (@time);
    @time = localtime($dt);
    $bt = sprintf "%02d-%02d-%02d %02d:%02d", $time[4], $time[3], $time[5], $time[2], $time[1];
    return $bt;
}


sub ft
{
    my ($f) = @_;
    return "d" if -d $f;
    return "l" if -l $f;
    return "p" if -p $f;
    return "S" if -S $f;
    return "b" if -b $f;
    return "c" if -c $f;
    return "-";
}

sub fm
{
    my ($n) = @_;
    my ($m);

    if( $n & 0400 ) {
       $m .= "r";
    } else {
       $m .= "-";
    }
    if( $n & 0200 ) {
       $m .= "w";
    } else {
       $m .= "-";
    }
    if( $n & 04000 ) {
       $m .= "s";
    } elsif( $n & 0100 ) {
       $m .= "x";
    } else {
       $m .= "-";
    }

    if( $n & 0040 ) {
       $m .= "r";
    } else {
       $m .= "-";
    }
    if( $n & 0020 ) {
       $m .= "w";
    } else {
       $m .= "-";
    }
    if( $n & 02000 ) {
       $m .= "s";
    } elsif( $n & 0010 ) {
       $m .= "x";
    } else {
       $m .= "-";
    }

    if( $n & 0004 ) {
       $m .= "r";
    } else {
       $m .= "-";
    }
    if( $n & 0002 ) {
       $m .= "w";
    } else {
       $m .= "-";
    }
    if( $n & 01000 ) {
       $m .= "t";
    } elsif( $n & 0001 ) {
       $m .= "x";
    } else {
       $m .= "-";
    }

    return $m;
}

sub ls {
    my ($file) = @_;
    my @stat = stat($file);
    # mode, nlink, uid, gid, size, mtime, filename
    printf "%s%s %d %d %d %d %s CONTENTS%s\n", ft($file), fm($stat[2] & 07777),
    $stat[3], $stat[4], $stat[5], $stat[7], bt($stat[9]), $file;
}

sub list
{
       my($archive)=@_;
       chop($date=`LC_ALL=C date "+%b %d %Y %H:%M"`);
       chop($info_size=`apt-cache show $archive | wc -c`);
       $install_size=length($pressinstall);
       $upgrade_size=length($pressupgrade);

       print "-r--r--r--   1 root     root     $info_size $date INFO\n";

       chop($debd = `dpkg -s $archive | grep -i ^Version | sed 's/^version: //i'`);
       chop($deba = `apt-cache show $archive | grep -i ^Version | sed 's/^version: //i'`);
       if( ! $debd ) {
           print "-r-xr--r--   1 root     root     $install_size $date INSTALL\n";
       } elsif( $debd ne $deba ) {
           print "-r-xr--r--   1 root     root     $upgrade_size $date UPGRADE\n";
       }
}

sub copyout
{
       my($archive,$filename,$destfile)=@_;

       if($filename eq "INFO") {
           system("apt-cache show $archive > $destfile");
        } elsif($filename eq "INSTALL")        {
           if ( open(FILEOUT,">$destfile") ) {
               print FILEOUT $pressinstall;
               close FILEOUT;
               system("chmod a+x $destfile");
           }
       } elsif($filename eq "UPGRADE") {
           if ( open(FILEOUT,">$destfile") ) {
               print FILEOUT $pressupgrade;
               close FILEOUT;
               system("chmod a+x $destfile");
           }
       } else {
           die "extfs: $filename: No such file or directory\n";
       }
}

sub run
{
       my($archive,$filename)=@_;
       if($filename eq "INSTALL") {
           system("apt-get install $archive");
       } elsif($filename eq "UPGRADE") {
           system("apt-get install $archive");
       } else {
           die "extfs: $filename: Permission denied\n";
       }
}

$pressinstall=<<EOInstall;

                                WARNING
  Don\'t use this method if you are not willing to install this package...

This is not a real file. It is a way to install the package you are browsing.

To install this package go back to the panel and press Enter on this file.

EOInstall

$pressupgrade=<<EOInstall;

                                WARNING
  Don\'t use this method if you are not willing to upgrade this package...

This is not a real file. It is a way to upgrade the package you are browsing.

To upgrade this package go back to the panel and press Enter on this file.

EOInstall


umask 077;

chop($name = `if [ -f "$ARGV[1]" ]; then cat $ARGV[1]; else echo $ARGV[1]; fi`);
$name =~ s%.*/([0-9a-z.-]*)_.*%$1%;

exit 1 unless $name;

if($ARGV[0] eq "list") { &list($name); exit 0; }
elsif($ARGV[0] eq "copyout") { &copyout($name,$ARGV[2],$ARGV[3]); exit 0; }
elsif($ARGV[0] eq "run") { &run($name,$ARGV[2]); exit 0; }

exit 1;