]> granicus.if.org Git - curl/commitdiff
no more time/re-start of sockfilt, no more redirect of stdin/stdout when
authorDaniel Stenberg <daniel@haxx.se>
Wed, 25 May 2005 12:27:19 +0000 (12:27 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 25 May 2005 12:27:19 +0000 (12:27 +0000)
talking to sockfilt

tests/ftpserver.pl

index 1334e90681c31da98040f45915033adc5f3cd008..e721bec2aaf39d021ed9d7c200a43833f6e632b7 100644 (file)
 
 use strict;
 use IPC::Open2;
+#use Time::HiRes qw( gettimeofday ); # not available in perl 5.6
 
 require "getpart.pm";
 require "ftp.pm";
 
+
 my $ftpdnum="";
 
 # open and close each time to allow removal at any time
 sub logmsg {
+ # if later than perl 5.6 is used
+ #   my ($seconds, $microseconds) = gettimeofday;
+    my $seconds = time();
     my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
-        localtime(time);
+        localtime($seconds);
     open(FTPLOG, ">>log/ftpd$ftpdnum.log");
     printf FTPLOG ("%02d:%02d:%02d ", $hour, $min, $sec);
     print FTPLOG @_;
@@ -116,9 +121,12 @@ $SIG{KILL} = \&catch_zap;
 
 my $sfpid;
 
+local(*SFREAD, *SFWRITE);
+
+
 sub startsf {
     my $cmd="./server/sockfilt --port $port --logfile log/sockctrl$ftpdnum$ext.log --pidfile .sockfilt$ftpdnum$ext.pid $ipv6";
-    $sfpid = open2(\*SFREAD, \*SFWRITE, $cmd);
+    $sfpid = open2(*SFREAD, *SFWRITE, $cmd);
 
     print STDERR "$cmd\n" if($verbose);
 
@@ -131,8 +139,6 @@ sub startsf {
         kill(9, $sfpid);
         die "Failed to start sockfilt!";
     }
-    open(STDIN,  "<&SFREAD")   || die "can't dup client to stdin";
-    open(STDOUT, ">&SFWRITE")   || die "can't dup client to stdout";
 }
 
 # remove the file here so that if startsf() fails, it is very noticable 
@@ -150,8 +156,8 @@ logmsg("logged pid $$ in $pidfile\n");
 sub sockfilt {
     my $l;
     foreach $l (@_) {
-        printf "DATA\n%04x\n", length($l);
-        print $l;
+        printf SFWRITE "DATA\n%04x\n", length($l);
+        print SFWRITE $l;
     }
 }
 
@@ -720,29 +726,13 @@ while(1) {
     # We read 'sockfilt' commands.
     # 
     my $input;
-    eval {
-        local $SIG{ALRM} = sub { die "alarm\n" };
-        alarm 360; # just in case things go REALLY bad
-        $input = <STDIN>;
-        alarm 0;
-    };
-    if ($@) {
-        # timed out
-        logmsg "reading stdin timed out\n";
-    }
+
+    logmsg "Awaiting input\n";
+    sysread(SFREAD, $input, 5) || die "ftp$ftpdnum$ext read zero";
 
     if($input !~ /^CNCT/) {
         # we wait for a connected client
-        if(!length($input)) {
-            # it probably died, restart it
-            kill(9, $sfpid);
-            waitpid $sfpid, 0;
-            startsf();
-            logmsg "restarted sockfilt\n";
-        }
-        else {
-            logmsg "sockfilt said: $input";
-        }
+        logmsg "sockfilt said: $input";
         next;
     }
     logmsg "====> Client connect\n";
@@ -770,7 +760,7 @@ while(1) {
         # part only is FTP lingo.
 
         # COMMAND
-        sysread(STDIN, $i, 5) || die;
+        sysread(SFREAD, $i, 5) || die "ftp$ftpdnum$ext read zero";
 
         if($i !~ /^DATA/) {
             logmsg "sockfilt said $i";
@@ -782,11 +772,11 @@ while(1) {
         }
 
         # SIZE of data
-        sysread(STDIN, $i, 5) || die;
+        sysread(SFREAD, $i, 5) || die;
         my $size = hex($i);
 
         # data
-        sysread STDIN, $_, $size;
+        sysread SFREAD, $_, $size;
         
         ftpmsg $_;