diff options
-rw-r--r-- | tests/ftpserver.pl | 68 |
1 files changed, 51 insertions, 17 deletions
diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl index 08b204ffd..e603f8275 100644 --- a/tests/ftpserver.pl +++ b/tests/ftpserver.pl @@ -60,18 +60,22 @@ sub REAPER { # USER is ok in fresh state my %commandok = ( - "USER" => "fresh", - "PASS" => "passwd", - "PASV" => "loggedin|twosock", - "PORT" => "loggedin|twosock", - "TYPE" => "loggedin|twosock", - "LIST" => "twosock", - "NLST" => "twosock", - "RETR" => "twosock", - "STOR" => "twosock", - "CWD" => "loggedin", - "SIZE" => "loggedin|twosock", - "QUIT" => "loggedin|twosock", + 'USER' => 'fresh', + 'PASS' => 'passwd', + 'PASV' => 'loggedin|twosock', + 'PORT' => 'loggedin|twosock', + 'TYPE' => 'loggedin|twosock', + 'LIST' => 'twosock', + 'NLST' => 'twosock', + 'RETR' => 'twosock', + 'STOR' => 'twosock', + 'APPE' => 'twosock', + 'REST' => 'twosock', + 'CWD' => 'loggedin|twosock', + 'SYST' => 'loggedin', + 'SIZE' => 'loggedin|twosock', + 'PWD' => 'loggedin|twosock', + 'QUIT' => 'loggedin|twosock', ); # initially, we're in 'fresh' state @@ -82,24 +86,29 @@ my %statechange = ( 'USER' => 'passwd', # USER goes to passwd state ); # this text is shown before the function specified below is run -my %displaytext = ('USER' => '331 We are happy you popped in!', # output FTP line +my %displaytext = ('USER' => '331 We are happy you popped in!', 'PASS' => '230 Welcome you silly person', 'PORT' => '200 You said PORT - I say FINE', 'TYPE' => '200 I modify TYPE as you wanted', 'LIST' => '150 here comes a directory', 'NLST' => '150 here comes a directory', 'CWD' => '250 CWD command successful.', - 'QUIT' => '221 bye bye baby', + 'SYST' => '215 UNIX Type: L8', # just fake something + 'QUIT' => '221 bye bye baby', # just reply something + 'PWD' => '257 "/nowhere/anywhere" is current directory', + 'REST' => '350 Yeah yeah we set it there for you', ); # callback functions for certain commands my %commandfunc = ( 'PORT' => \&PORT_command, 'LIST' => \&LIST_command, - 'NLST' => \&LIST_command, # use LIST for now + 'NLST' => \&NLST_command, 'PASV' => \&PASV_command, 'RETR' => \&RETR_command, 'SIZE' => \&SIZE_command, + 'REST' => \&REST_command, 'STOR' => \&STOR_command, + 'APPE' => \&STOR_command, # append looks like upload ); # this is a built-in fake-dir ;-) @@ -115,6 +124,11 @@ my @ftpdir=("total 20\r\n", "drwxrwxrwx 2 98 1 512 Oct 30 14:33 pub\r\n", "dr-xr-xr-x 5 0 1 512 Oct 1 1997 usr\r\n"); +my $rest=0; +sub REST_command { + $rest = $_[0]; +} + sub LIST_command { # print "150 ASCII data connection for /bin/ls (193.15.23.1,59196) (0 bytes)\r\n"; @@ -129,6 +143,16 @@ sub LIST_command { return 0; } +sub NLST_command { + my @ftpdir=("file", "with space", "fake", "..", " ..", "funny", "README"); + for(@ftpdir) { + print SOCK "$_\r\n"; + } + close(SOCK); + print "226 ASCII transfer complete\r\n"; + return 0; +} + sub SIZE_command { my $testno = $_[0]; @@ -172,9 +196,15 @@ sub RETR_command { if($size) { + open(FILE, "<$filename"); + if($rest) { + # move read pointer forward + seek(FILE, $rest, 1); + $size -= $rest; + } print "150 Binary data connection for $testno () ($size bytes).\r\n"; + $rest=0; # reset rest again - open(FILE, "<$filename"); while(<FILE>) { print SOCK $_; } @@ -194,7 +224,7 @@ sub STOR_command { logmsg "STOR test number $testno\n"; - my $filename = "log/ftpout.$testno"; + my $filename = "log/upload.$testno"; print "125 Gimme gimme gimme!\r\n"; @@ -319,6 +349,10 @@ for ( $waitedpid = 0; logmsg "GOT: ($1) $_\n"; + if($verbose) { + print STDERR "IN: $full\n"; + } + my $ok = $commandok{$FTPCMD}; if($ok !~ /$state/) { print "500 $FTPCMD not OK in state: $state!\r\n"; |