#! @PERL@
#
# External filesystem for mc, using mtools
# Written Ludek Brukner <lubr@barco.cz>, 1997
# Much improved by Tom Perkins <968794022@noid.net>, 2000
#
# WARNING - This software is ALPHA - Absolutely NO WARRANTY
# 

# These mtools components must be in PATH for this to work

use warnings;

sub quote {
    $_ = shift(@_);
    s/([^\w\/.+-])/\\$1/g;
    return($_);
}

$mmd = "mmd";
$mrd = "mrd";
$mdel = "mdel";
$mdir = "mdir -a";
$mcopy = "mcopy -noQ";

$0 =~ s|.*/||;
$qdisk = quote($0);

$ENV{MTOOLS_DATE_STRING} = "mm-dd-yyyy";
$ENV{MTOOLS_TWENTY_FOUR_HOUR_CLOCK} = "1";

SWITCH: for ( $ARGV[0] ) {
  /list/ && do {
    @dirs = get_dirs("");
    while ($dir = shift(@dirs)) {
      push @dirs, get_dirs("$dir/");
    } exit 0; };
  /mkdir/ && do {
    shift; shift;
    exit 1 if scalar(@ARGV) != 1;
    $qname = quote($ARGV[0]);
    system("$mmd $qdisk:/$qname >/dev/null");
    exit 0; };
  /rmdir/ && do {
    shift; shift;
    exit 1 if scalar(@ARGV) != 1;
    $qname = quote($ARGV[0]);
    system("$mrd $qdisk:/$qname >/dev/null");
    exit 0; };
  /rm/ && do {
    shift; shift;
    exit 1 if scalar(@ARGV) != 1;
    $qname = quote($ARGV[0]);
    system("$mdel $qdisk:/$qname >/dev/null");
    exit 0; };
  /copyout/ && do {
    shift; shift;
    exit 1 if scalar(@ARGV) != 2;
    ( $qsrc, $qdest ) = @ARGV;
    $qsrc = quote($qsrc);
    $qdest = quote($qdest);
    system("$mcopy $qdisk:/$qsrc $qdest >/dev/null");
    exit 0; };
  /copyin/ && do {
    shift; shift;
    exit 1 if scalar(@ARGV) != 2;
    ( $qdest, $qsrc ) = @ARGV;
    $qsrc = quote($qsrc);
    $qdest = quote($qdest);
    system("$mcopy $qsrc $qdisk:/$qdest >/dev/null");
    exit 0; };
  /.*/ && do {                               # an unfamiliar command
    exit 1; };
}

sub get_dirs {
  my ($path, $name, $size, $date, $time, $longname, @lst, @rv);
  $path = shift(@_);
  my $qpath = quote($path);
  @rv = ();

  open(FILE,"$mdir $qdisk:/$qpath |");
  while ( <FILE> ) {
    chomp();
    /^ / && next;                            # ignore `non-file' lines
    m{^Directory for $0:/}i && next;         # ignore `non-file' lines
    /^$/ && next;                            # ignore empty lines
    /^\.\.?/ && next;                        # ignore `.' and `..'

    $name = substr($_,0,12);
    $name =~ s/^([^ ]*) +([^ ]+)[ \t]*$/$1.$2/;
    $name =~ s/[ .]+$//;

    $_ = substr($_,12);
    s/^[ ]+//;

    ($size,$date,$time,$longname) = split(/[ \t]+/, $_, 4);

    defined $time || next;

    # process "am" and "pm".  Should not be needed if
    # MTOOLS_TWENTY_FOUR_HOUR_CLOCK is respected.
    @lst = split(/([:ap])/, $time);
    $lst[0] += 12 if (defined $lst[3] && $lst[3] eq "p");

    $time = sprintf("%02d:%02d", $lst[0], $lst[2]);
    @lst = split(/-/, $date);
    $lst[2] %= 100 if ($lst[2] > 100);
    $date = sprintf ("%02d-%02d-%02d", @lst);

    $name = $path . lc(($longname) ? $longname : $name);

    if ($size =~ /DIR/) {
      printf("drwxr-xr-x   1 %-8d %-8d %8d %s %s %s\n",
        0, 0, 0, $date, $time, $name);
      push @rv, $name;
    } else {
      printf("-rw-r--r--   1 %-8d %-8d %8d %s %s %s\n",
        0, 0, $size, $date, $time, $name);
    }
  }
  close(FILE);
  return @rv;
}

1;
