1#***************************************************************************
2#                                  _   _ ____  _
3#  Project                     ___| | | |  _ \| |
4#                             / __| | | | |_) | |
5#                            | (__| |_| |  _ <| |___
6#                             \___|\___/|_| \_\_____|
7#
8# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
9#
10# This software is licensed as described in the file COPYING, which
11# you should have received as part of this distribution. The terms
12# are also available at http://curl.haxx.se/docs/copyright.html.
13#
14# You may opt to use, copy, modify, merge, publish, distribute and/or sell
15# copies of the Software, and permit persons to whom the Software is
16# furnished to do so, under the terms of the COPYING file.
17#
18# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19# KIND, either express or implied.
20#
21###########################################################################
22%file_chmod1 = (
23  'name'      => 'chmod1',
24  'content'   => "This file should have permissions 444\n",
25  'perm'      => 'r--r--r--',
26  'time'      => 'Jan 11 10:00',
27  'dostime'   => '01-11-10  10:00AM',
28);
29
30%file_chmod2 = (
31  'name'      => 'chmod2',
32  'content'   => "This file should have permissions 666\n",
33  'perm'      => 'rw-rw-rw-',
34  'time'      => 'Feb  1  8:00',
35  'dostime'   => '02-01-10  08:00AM',
36);
37
38%file_chmod3 = (
39  'name'      => 'chmod3',
40  'content'   => "This file should have permissions 777\n",
41  'perm'      => 'rwxrwxrwx',
42  'time'      => 'Feb  1  8:00',
43  'dostime'   => '02-01-10  08:00AM',
44);
45
46%file_chmod4 = (
47  'type'      => 'd',
48  'name'      => 'chmod4',
49  'content'   => "This file should have permissions 001\n",
50  'perm'      => '--S--S--t',
51  'time'      => 'May  4  4:31',
52  'dostime'   => '05-04-10  04:31AM'
53);
54
55%file_chmod5 = (
56  'type'      => 'd',
57  'name'      => 'chmod5',
58  'content'   => "This file should have permissions 110\n",
59  'perm'      => '--s--s--T',
60  'time'      => 'May  4  4:31',
61  'dostime'   => '05-04-10  04:31AM'
62);
63
64%link_link = (
65  'type'      => 'l',
66  'name'      => 'link -> file.txt',
67  'size'      => '8',
68  'perm'      => 'rwxrwxrwx',
69  'time'      => 'Jan  6  4:42'
70);
71
72%link_link_absolute = (
73  'type'      => 'l',
74  'name'      => 'link_absolute -> /data/ftp/file.txt',
75  'size'      => '15',
76  'perm'      => 'rwxrwxrwx',
77  'time'      => 'Jan  6  4:45'
78);
79
80%dir_dot = (
81  'type'      => "d",
82  'name'      => ".",
83  'hlink'     => "4",
84  'time'      => "Apr 27  5:12",
85  'size'      => "20480",
86  'dostime'   => "04-27-10  05:12AM",
87  'perm'      => "rwxrwxrwx"
88);
89
90%dir_ddot = (
91  'type'      => "d",
92  'name'      => "..",
93  'hlink'     => "4",
94  'size'      => "20480",
95  'time'      => "Apr 23  3:12",
96  'dostime'   => "04-23-10  03:12AM",
97  'perm'      => "rwxrwxrwx"
98);
99
100%dir_weirddir_txt = (
101  'type'      => "d",
102  'name'      => "weirddir.txt",
103  'hlink'     => "2",
104  'size'      => "4096",
105  'time'      => "Apr 23  3:12",
106  'dostime'   => "04-23-10  03:12AM",
107  'perm'      => "rwxr-xrwx"
108);
109
110%dir_UNIX = (
111  'type'      => "d",
112  'name'      => "UNIX",
113  'hlink'     => "11",
114  'size'      => "4096",
115  'time'      => "Nov 01  2008",
116  'dostime'   => "11-01-08  11:11AM",
117  'perm'      => "rwx--x--x"
118);
119
120%dir_DOS = (
121  'type'      => "d",
122  'name'      => "DOS",
123  'hlink'     => "11",
124  'size'      => "4096",
125  'time'      => "Nov 01  2008",
126  'dostime'   => "11-01-08  11:11AM",
127  'perm'      => "rwx--x--x"
128);
129
130%dir_dot_NeXT = (
131  'type'      => "d",
132  'name'      => ".NeXT",
133  'hlink'     => "4",
134  'size'      => "4096",
135  'time'      => "Jan 23  2:05",
136  'dostime'   => "01-23-05  02:05AM",
137  'perm'      => "rwxrwxrwx"
138);
139
140%file_empty_file_dat = (
141  'name'      => "empty_file.dat",
142  'content'   => "",
143  'perm'      => "rw-r--r--",
144  'time'      => "Apr 27 11:01",
145  'dostime'   => "04-27-10  11:01AM"
146);
147
148%file_file_txt = (
149  'name'      => "file.txt",
150  'content'   => "This is content of file \"file.txt\"\n",
151  'time'      => "Apr 27 11:01",
152  'dostime'   => "04-27-10  11:01AM",
153  'perm'      => "rw-r--r--"
154);
155
156%file_someothertext_txt = (
157  'name'      => "someothertext.txt",
158  'content'   => "Some junk ;-) This file does not really exist.\n",
159  'time'      => "Apr 27 11:01",
160  'dostime'   => "04-27-10  11:01AM",
161  'perm'      => "rw-r--r--"
162);
163
164%lists = (
165  '/fully_simulated/' => {
166    'files'   => [ \%dir_dot, \%dir_ddot, \%dir_DOS, \%dir_UNIX ],
167    'eol'     => "\r\n",
168    'type'    => "unix"
169  },
170  '/fully_simulated/UNIX/' => {
171    'files'   => [ \%dir_dot, \%dir_ddot,
172                   \%file_chmod1, \%file_chmod2, \%file_chmod3, \%file_chmod4, \%file_chmod5,
173                   \%file_empty_file_dat, \%file_file_txt,
174                   \%link_link, \%link_link_absolute, \%dir_dot_NeXT,
175                   \%file_someothertext_txt, \%dir_weirddir_txt ],
176    'eol'     => "\r\n",
177    'type'    => 'unix'
178  },
179  '/fully_simulated/DOS/' => {
180    'files'   => [ \%dir_dot, \%dir_ddot,
181                   \%file_chmod1, \%file_chmod2, \%file_chmod3, \%file_chmod4, \%file_chmod5,
182                   \%file_empty_file_dat, \%file_file_txt,
183                   \%dir_dot_NeXT, \%file_someothertext_txt, \%dir_weirddir_txt ],
184    'eol'     => "\r\n",
185    'type'    => 'dos'
186  }
187);
188
189sub ftp_createcontent($) {
190  my (%list) = @_;
191
192  $type = $$list{'type'};
193  $eol  = $$list{'eol'};
194  $list_ref = $$list{'files'};
195
196  my @diroutput;
197  my @contentlist;
198  if($type eq "unix") {
199    for(@$list_ref) {
200      my %file = %$_;
201      my $line = "";
202      my $ftype  = $file{'type'}  ? $file{'type'}  : "-";
203      my $fperm  = $file{'perm'}  ? $file{'perm'}  : "rwxr-xr-x";
204      my $fuser  = $file{'user'}  ? sprintf("%15s", $file{'user'})   : "ftp-default";
205      my $fgroup = $file{'group'} ? sprintf("%15s", $file{'group'})  : "ftp-default";
206      my $fsize = "";
207      if($file{'type'} eq "d") {
208        $fsize = $file{'size'} ? sprintf("%7s", $file{'size'}) : sprintf("%7d", 4096);
209      }
210      else {
211        $fsize = sprintf("%7d", length $file{'content'});
212      }
213      my $fhlink = $file{'hlink'} ? sprintf("%4d",  $file{'hlink'})  : "   1";
214      my $ftime  = $file{'time'}  ? sprintf("%10s", $file{'time'})   : "Jan 9  1933";
215      push(@contentlist, "$ftype$fperm $fhlink $fuser $fgroup $fsize $ftime $file{'name'}$eol");
216    }
217
218    return @contentlist;
219  }
220  elsif($type =~ /^dos$/) {
221    for(@$list_ref) {
222      my %file = %$_;
223      my $line = "";
224      my $time = $file{'dostime'} ? $file{'dostime'} : "06-25-97  09:12AM";
225      my $size_or_dir;
226      if($file{'type'} =~ /^d$/) {
227        $size_or_dir = "      <DIR>         ";
228      }
229      else {
230        $size_or_dir = sprintf("%20d", length $file{'content'});
231      }
232      push(@contentlist, "$time $size_or_dir $file{'name'}$eol");
233    }
234    return @contentlist;
235  }
236}
237
238sub wildcard_filesize($$) {
239  my ($list_type, $file) = @_;
240  $list = $lists{$list_type};
241  if($list) {
242    my $files = $list->{'files'};
243    for(@$files) {
244      my %f = %$_;
245      if ($f{'name'} eq $file) {
246        if($f{'content'}) {
247          return length $f{'content'};
248        }
249        elsif ($f{'type'} ne "d"){
250          return 0;
251        }
252        else {
253          return -1;
254        }
255      }
256    }
257  }
258  return -1;
259}
260sub wildcard_getfile($$) {
261  my ($list_type, $file) = @_;
262  $list = $lists{$list_type};
263  if($list) {
264    my $files = $list->{'files'};
265    for(@$files) {
266      my %f = %$_;
267      if ($f{'name'} eq $file) {
268        if($f{'content'}) {
269          return (length $f{'content'}, $f{'content'});
270        }
271        elsif ($f{'type'} ne "d"){
272          return (0, "");
273        }
274        else {
275          return (-1, 0);
276        }
277      }
278    }
279  }
280  return (-1, 0);
281}
282
283sub ftp_contentlist {
284  my $listname = $_[0];
285  $list = $lists{$listname};
286  return ftp_createcontent(\$list);
287}
288