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