| #*************************************************************************** |
| # _ _ ____ _ |
| # Project ___| | | | _ \| | |
| # / __| | | | |_) | | |
| # | (__| |_| | _ <| |___ |
| # \___|\___/|_| \_\_____| |
| # |
| # Copyright (C) 1998 - 2020, Daniel Stenberg, <[email protected]>, et al. |
| # |
| # This software is licensed as described in the file COPYING, which |
| # you should have received as part of this distribution. The terms |
| # are also available at https://curl.se/docs/copyright.html. |
| # |
| # You may opt to use, copy, modify, merge, publish, distribute and/or sell |
| # copies of the Software, and permit persons to whom the Software is |
| # furnished to do so, under the terms of the COPYING file. |
| # |
| # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| # KIND, either express or implied. |
| # |
| ########################################################################### |
| %file_chmod1 = ( |
| 'name' => 'chmod1', |
| 'content' => "This file should have permissions 444\n", |
| 'perm' => 'r--r--r--', |
| 'time' => 'Jan 11 10:00', |
| 'dostime' => '01-11-10 10:00AM', |
| ); |
| |
| %file_chmod2 = ( |
| 'name' => 'chmod2', |
| 'content' => "This file should have permissions 666\n", |
| 'perm' => 'rw-rw-rw-', |
| 'time' => 'Feb 1 8:00', |
| 'dostime' => '02-01-10 08:00AM', |
| ); |
| |
| %file_chmod3 = ( |
| 'name' => 'chmod3', |
| 'content' => "This file should have permissions 777\n", |
| 'perm' => 'rwxrwxrwx', |
| 'time' => 'Feb 1 8:00', |
| 'dostime' => '02-01-10 08:00AM', |
| ); |
| |
| %file_chmod4 = ( |
| 'type' => 'd', |
| 'name' => 'chmod4', |
| 'content' => "This file should have permissions 001\n", |
| 'perm' => '--S--S--t', |
| 'time' => 'May 4 4:31', |
| 'dostime' => '05-04-10 04:31AM' |
| ); |
| |
| %file_chmod5 = ( |
| 'type' => 'd', |
| 'name' => 'chmod5', |
| 'content' => "This file should have permissions 110\n", |
| 'perm' => '--s--s--T', |
| 'time' => 'May 4 4:31', |
| 'dostime' => '05-04-10 04:31AM' |
| ); |
| |
| %link_link = ( |
| 'type' => 'l', |
| 'name' => 'link -> file.txt', |
| 'size' => '8', |
| 'perm' => 'rwxrwxrwx', |
| 'time' => 'Jan 6 4:42' |
| ); |
| |
| %link_link_absolute = ( |
| 'type' => 'l', |
| 'name' => 'link_absolute -> /data/ftp/file.txt', |
| 'size' => '15', |
| 'perm' => 'rwxrwxrwx', |
| 'time' => 'Jan 6 4:45' |
| ); |
| |
| %dir_dot = ( |
| 'type' => "d", |
| 'name' => ".", |
| 'hlink' => "4", |
| 'time' => "Apr 27 5:12", |
| 'size' => "20480", |
| 'dostime' => "04-27-10 05:12AM", |
| 'perm' => "rwxrwxrwx" |
| ); |
| |
| %dir_ddot = ( |
| 'type' => "d", |
| 'name' => "..", |
| 'hlink' => "4", |
| 'size' => "20480", |
| 'time' => "Apr 23 3:12", |
| 'dostime' => "04-23-10 03:12AM", |
| 'perm' => "rwxrwxrwx" |
| ); |
| |
| %dir_weirddir_txt = ( |
| 'type' => "d", |
| 'name' => "weirddir.txt", |
| 'hlink' => "2", |
| 'size' => "4096", |
| 'time' => "Apr 23 3:12", |
| 'dostime' => "04-23-10 03:12AM", |
| 'perm' => "rwxr-xrwx" |
| ); |
| |
| %dir_UNIX = ( |
| 'type' => "d", |
| 'name' => "UNIX", |
| 'hlink' => "11", |
| 'size' => "4096", |
| 'time' => "Nov 01 2008", |
| 'dostime' => "11-01-08 11:11AM", |
| 'perm' => "rwx--x--x" |
| ); |
| |
| %dir_DOS = ( |
| 'type' => "d", |
| 'name' => "DOS", |
| 'hlink' => "11", |
| 'size' => "4096", |
| 'time' => "Nov 01 2008", |
| 'dostime' => "11-01-08 11:11AM", |
| 'perm' => "rwx--x--x" |
| ); |
| |
| %dir_dot_NeXT = ( |
| 'type' => "d", |
| 'name' => ".NeXT", |
| 'hlink' => "4", |
| 'size' => "4096", |
| 'time' => "Jan 23 2:05", |
| 'dostime' => "01-23-05 02:05AM", |
| 'perm' => "rwxrwxrwx" |
| ); |
| |
| %file_empty_file_dat = ( |
| 'name' => "empty_file.dat", |
| 'content' => "", |
| 'perm' => "rw-r--r--", |
| 'time' => "Apr 27 11:01", |
| 'dostime' => "04-27-10 11:01AM" |
| ); |
| |
| %file_file_txt = ( |
| 'name' => "file.txt", |
| 'content' => "This is content of file \"file.txt\"\n", |
| 'time' => "Apr 27 11:01", |
| 'dostime' => "04-27-10 11:01AM", |
| 'perm' => "rw-r--r--" |
| ); |
| |
| %file_someothertext_txt = ( |
| 'name' => "someothertext.txt", |
| 'content' => "Some junk ;-) This file does not really exist.\n", |
| 'time' => "Apr 27 11:01", |
| 'dostime' => "04-27-10 11:01AM", |
| 'perm' => "rw-r--r--" |
| ); |
| |
| %lists = ( |
| '/fully_simulated/' => { |
| 'files' => [ \%dir_dot, \%dir_ddot, \%dir_DOS, \%dir_UNIX ], |
| 'eol' => "\r\n", |
| 'type' => "unix" |
| }, |
| '/fully_simulated/UNIX/' => { |
| 'files' => [ \%dir_dot, \%dir_ddot, |
| \%file_chmod1, \%file_chmod2, \%file_chmod3, \%file_chmod4, \%file_chmod5, |
| \%file_empty_file_dat, \%file_file_txt, |
| \%link_link, \%link_link_absolute, \%dir_dot_NeXT, |
| \%file_someothertext_txt, \%dir_weirddir_txt ], |
| 'eol' => "\r\n", |
| 'type' => 'unix' |
| }, |
| '/fully_simulated/DOS/' => { |
| 'files' => [ \%dir_dot, \%dir_ddot, |
| \%file_chmod1, \%file_chmod2, \%file_chmod3, \%file_chmod4, \%file_chmod5, |
| \%file_empty_file_dat, \%file_file_txt, |
| \%dir_dot_NeXT, \%file_someothertext_txt, \%dir_weirddir_txt ], |
| 'eol' => "\r\n", |
| 'type' => 'dos' |
| } |
| ); |
| |
| sub ftp_createcontent($) { |
| my (%list) = @_; |
| |
| $type = $$list{'type'}; |
| $eol = $$list{'eol'}; |
| $list_ref = $$list{'files'}; |
| |
| my @diroutput; |
| my @contentlist; |
| if($type eq "unix") { |
| for(@$list_ref) { |
| my %file = %$_; |
| my $line = ""; |
| my $ftype = $file{'type'} ? $file{'type'} : "-"; |
| my $fperm = $file{'perm'} ? $file{'perm'} : "rwxr-xr-x"; |
| my $fuser = $file{'user'} ? sprintf("%15s", $file{'user'}) : "ftp-default"; |
| my $fgroup = $file{'group'} ? sprintf("%15s", $file{'group'}) : "ftp-default"; |
| my $fsize = ""; |
| if($file{'type'} eq "d") { |
| $fsize = $file{'size'} ? sprintf("%7s", $file{'size'}) : sprintf("%7d", 4096); |
| } |
| else { |
| $fsize = sprintf("%7d", length $file{'content'}); |
| } |
| my $fhlink = $file{'hlink'} ? sprintf("%4d", $file{'hlink'}) : " 1"; |
| my $ftime = $file{'time'} ? sprintf("%10s", $file{'time'}) : "Jan 9 1933"; |
| push(@contentlist, "$ftype$fperm $fhlink $fuser $fgroup $fsize $ftime $file{'name'}$eol"); |
| } |
| |
| return @contentlist; |
| } |
| elsif($type =~ /^dos$/) { |
| for(@$list_ref) { |
| my %file = %$_; |
| my $line = ""; |
| my $time = $file{'dostime'} ? $file{'dostime'} : "06-25-97 09:12AM"; |
| my $size_or_dir; |
| if($file{'type'} =~ /^d$/) { |
| $size_or_dir = " <DIR> "; |
| } |
| else { |
| $size_or_dir = sprintf("%20d", length $file{'content'}); |
| } |
| push(@contentlist, "$time $size_or_dir $file{'name'}$eol"); |
| } |
| return @contentlist; |
| } |
| } |
| |
| sub wildcard_filesize($$) { |
| my ($list_type, $file) = @_; |
| $list = $lists{$list_type}; |
| if($list) { |
| my $files = $list->{'files'}; |
| for(@$files) { |
| my %f = %$_; |
| if ($f{'name'} eq $file) { |
| if($f{'content'}) { |
| return length $f{'content'}; |
| } |
| elsif ($f{'type'} ne "d"){ |
| return 0; |
| } |
| else { |
| return -1; |
| } |
| } |
| } |
| } |
| return -1; |
| } |
| sub wildcard_getfile($$) { |
| my ($list_type, $file) = @_; |
| $list = $lists{$list_type}; |
| if($list) { |
| my $files = $list->{'files'}; |
| for(@$files) { |
| my %f = %$_; |
| if ($f{'name'} eq $file) { |
| if($f{'content'}) { |
| return (length $f{'content'}, $f{'content'}); |
| } |
| elsif ($f{'type'} ne "d"){ |
| return (0, ""); |
| } |
| else { |
| return (-1, 0); |
| } |
| } |
| } |
| } |
| return (-1, 0); |
| } |
| |
| sub ftp_contentlist { |
| my $listname = $_[0]; |
| $list = $lists{$listname}; |
| return ftp_createcontent(\$list); |
| } |