summaryrefslogtreecommitdiffstats
path: root/src/vfs/extfs/helpers/a+.in
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 20:22:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 20:22:03 +0000
commitffccd5b2b05243e7976db80f90f453dccfae9886 (patch)
tree39a43152d27f7390d8f7a6fb276fa6887f87c6e8 /src/vfs/extfs/helpers/a+.in
parentInitial commit. (diff)
downloadmc-upstream/3%4.8.30.tar.xz
mc-upstream/3%4.8.30.zip
Adding upstream version 3:4.8.30.upstream/3%4.8.30
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/vfs/extfs/helpers/a+.in')
-rw-r--r--src/vfs/extfs/helpers/a+.in126
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;