diff options
Diffstat (limited to 'src/vfs/extfs/helpers/a+.in')
-rw-r--r-- | src/vfs/extfs/helpers/a+.in | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/vfs/extfs/helpers/a+.in b/src/vfs/extfs/helpers/a+.in new file mode 100644 index 0000000..fe446f4 --- /dev/null +++ b/src/vfs/extfs/helpers/a+.in @@ -0,0 +1,126 @@ +#! @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; |