diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2000-11-20 14:26:09 +0000 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2000-11-20 14:26:09 +0000 | 
| commit | 05ec503eac2f22eff42e9da43f52e46e5cf140cf (patch) | |
| tree | 14a5bd3282dbfa165d828eeea23305d9d44f8f5f | |
| parent | 4b8fd86f0412b3e526ca832da8ac2c9395e020a3 (diff) | |
QUIT works, and now I can run a unix ftp client against the server and it
runs pretty good
| -rw-r--r-- | tests/ftpserver.pl | 41 | 
1 files changed, 28 insertions, 13 deletions
| diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl index b74a71f93..41f1df72e 100644 --- a/tests/ftpserver.pl +++ b/tests/ftpserver.pl @@ -1,4 +1,15 @@  #!/usr/bin/perl +# +# $Id$ +# This is the FTP server designed for the curl test suite. +# +# It is meant to excersive curl, it is not meant to become a fully working +# or even very standard compliant server. +# +# You may optionally specify port on the command line, otherwise it'll +# default to port 8921. +# +  use Socket;  use Carp;  use FileHandle; @@ -12,6 +23,8 @@ open(FTPLOG, ">log/ftpd.log") ||  sub logmsg { print FTPLOG @_; } +sub ftpmsg { print INPUT @_; } +  my $verbose=0; # set to 1 for debugging  my $port = 8921; # just a default @@ -46,7 +59,7 @@ my $paddr;  sub REAPER {      $waitedpid = wait;      $SIG{CHLD} = \&REAPER;  # loathe sysV -  #  logmsg "reaped $waitedpid" . ($? ? " with exit $?" : ''); +    logmsg "reaped $waitedpid" . ($? ? " with exit $?\n" : "\n");  }  # USER is ok in fresh state @@ -58,6 +71,7 @@ my %commandok = ( "USER" => "fresh",                    "LIST" => "twosock",                    "RETR" => "twosock",                    "CWD"  => "loggedin", +                  "QUIT"  => "loggedin|twosock",                    );  # initially, we're in 'fresh' state @@ -74,7 +88,7 @@ my %displaytext = ('USER' => '331 We are happy you popped in!', # output FTP lin                     'TYPE' => '200 I modify TYPE as you wanted',                     'LIST' => '150 here comes a directory',                     'CWD'  => '250 CWD command successful.', - +                   'QUIT' => '221 bye bye baby',                     );  # callback functions for certain commands @@ -182,6 +196,10 @@ sub PASV_command {          }          $port++; # try next port please      } +    if(11000 == $port) { +        print "500 no free ports!\r\n"; +        exit; +    }      listen(Server2,SOMAXCONN) || die "listen: $!";      printf("227 Entering Passive Mode (127,0,0,1,%d,%d)\n", @@ -194,7 +212,7 @@ sub PASV_command {      my($port,$iaddr) = sockaddr_in($paddr);      my $name = gethostbyaddr($iaddr,AF_INET); -    logmsg "connection from $name [", inet_ntoa($iaddr), "] at port $port\n"; +    logmsg "data connection from $name [", inet_ntoa($iaddr), "] at port $port\n";      open(STDOUT, ">&Client2")   || die "can't dup client to stdout"; @@ -232,8 +250,8 @@ sub PORT_command {      if($arg !~ /(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)/) {          logmsg "bad PORT-line: $arg\n"; -        print "314 silly you, go away\r\n"; -        return 1; +        print "500 silly you, go away\r\n"; +        exit;      }      my $iaddr = inet_aton("$1.$2.$3.$4");      my $paddr = sockaddr_in(($5<<8)+$6, $iaddr); @@ -307,26 +325,25 @@ for ( $waitedpid = 0;              last unless defined ($_ = <STDIN>); +            ftpmsg $_;              # Remove trailing CRLF.              s/[\n\r]+$//;              unless (m/^([A-Z]{3,4})\s?(.*)/i) { -                print STDERR -                    "badly formed command received: ".$_; -                exit 0; +                print "500 '$_': command not understood.\r\n"; +                next;              }              my $FTPCMD=$1;              my $FTPARG=$2;              my $full=$_;              logmsg "GOT: ($1) $_\n"; -            print INPUT "$$: $full\n";              my $ok = $commandok{$FTPCMD};              if($ok !~ /$state/) { -                print "314 $FTPCMD not OK ($ok) in state: $state!\r\n"; -                exit; +                print "500 $FTPCMD not OK in state: $state!\r\n"; +                next;              }              my $newstate=$statechange{$FTPCMD}; @@ -363,12 +380,10 @@ for ( $waitedpid = 0;  sub spawn {      my $coderef = shift; -      unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') {          confess "usage: spawn CODEREF";      } -      my $pid;      if (!defined($pid = fork)) {          logmsg "cannot fork: $!\n"; | 
