summaryrefslogtreecommitdiffstats
path: root/src/vfs/extfs/helpers/a+.in
blob: fe446f46c1d67b73da0ea0019052c4ec11c09051 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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;