123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #! @PERL@ -w
- #
- # 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
- 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;
|