]> granicus.if.org Git - curl/commitdiff
Improve delay command interruptability
authorYang Tse <yangsita@gmail.com>
Sun, 20 Dec 2009 22:09:53 +0000 (22:09 +0000)
committerYang Tse <yangsita@gmail.com>
Sun, 20 Dec 2009 22:09:53 +0000 (22:09 +0000)
tests/ftpserver.pl

index ff1703419e95d5eaf2b2d82107adce8b30a1ab09..4c25845d6f374d335d36978abd1af2adefdb69bf 100644 (file)
@@ -49,11 +49,67 @@ require "ftp.pm";
 #    }
 #}
 
+#**********************************************************************
+# global vars...
+#
+my $verbose = 0; # set to 1 for debugging
 my $ftpdnum="";
-
 my $logfilename = 'log/logfile.log'; # Override this for each test server
 
-#######################################################################
+my $pasvbadip=0;
+my $retrweirdo=0;
+my $retrnosize=0;
+my $srcdir=".";
+my $nosave=0;
+my $controldelay=0; # set to 1 to delay the control connect data sending to
+ # test that curl deals with that nicely
+my $slavepid; # for the DATA connection sockfilt slave process
+my $ipv6;
+my $ext; # append to log/pid file names
+my $grok_eprt;
+my $port = 8921; # just a default
+my $listenaddr = "127.0.0.1"; # just a default
+my $pidfile = ".ftpd.pid"; # a default, use --pidfile
+
+my $SERVERLOGS_LOCK="log/serverlogs.lock"; # server logs advisor read lock
+my $serverlogslocked=0;
+
+my $proto="ftp";
+
+my $sfpid;
+
+local(*SFREAD, *SFWRITE);
+
+#**********************************************************************
+# global vars used for signal handling
+#
+my $got_exit_signal = 0; # set if program should finish execution ASAP
+my $exit_signal;         # first signal handled in exit_signal_handler
+
+#**********************************************************************
+# exit_signal_handler will be triggered to indicate that the program
+# should finish its execution in a controlled way as soon as possible.
+# For now, program will also terminate from within this handler.
+#
+sub exit_signal_handler {
+    my $signame = shift;
+    local $!; # preserve errno
+    if($got_exit_signal == 0) {
+        $got_exit_signal = 1;
+        $exit_signal = $signame;
+    }
+    $SIG{$signame} = \&exit_signal_handler;
+    # For now, simply mimic old behavior.
+    ftpkillslaves($verbose);
+    unlink($pidfile);
+    if($serverlogslocked) {
+        $serverlogslocked = 0;
+        clear_advisor_read_lock($SERVERLOGS_LOCK);
+    }
+    exit;
+}
+
+#**********************************************************************
 # getlogfilename returns a log file name depending on given arguments.
 #
 sub getlogfilename {
@@ -66,7 +122,7 @@ sub getlogfilename {
     return $filename;
 }
 
-#######################################################################
+#**********************************************************************
 # logmsg is general message logging subroutine for our test servers.
 #
 sub logmsg {
@@ -103,27 +159,6 @@ sub ftpmsg {
   # better on windows/cygwin
 }
 
-my $verbose=0; # set to 1 for debugging
-my $pasvbadip=0;
-my $retrweirdo=0;
-my $retrnosize=0;
-my $srcdir=".";
-my $nosave=0;
-my $controldelay=0; # set to 1 to delay the control connect data sending to
- # test that curl deals with that nicely
-my $slavepid; # for the DATA connection sockfilt slave process
-my $ipv6;
-my $ext; # append to log/pid file names
-my $grok_eprt;
-my $port = 8921; # just a default
-my $listenaddr = "127.0.0.1"; # just a default
-my $pidfile = ".ftpd.pid"; # a default, use --pidfile
-
-my $SERVERLOGS_LOCK="log/serverlogs.lock"; # server logs advisor read lock
-my $serverlogslocked=0;
-
-my $proto="ftp";
-
 do {
     if($ARGV[0] eq "-v") {
         $verbose=1;
@@ -166,22 +201,8 @@ if($proto !~ /^(ftp|imap|pop3|smtp)\z/) {
     die "unsupported protocol selected";
 }
 
-sub catch_zap {
-    my $signame = shift;
-    ftpkillslaves($verbose);
-    unlink($pidfile);
-    if($serverlogslocked) {
-        $serverlogslocked = 0;
-        clear_advisor_read_lock($SERVERLOGS_LOCK);
-    }
-    exit;
-}
-$SIG{INT} = \&catch_zap;
-$SIG{TERM} = \&catch_zap;
-
-my $sfpid;
-
-local(*SFREAD, *SFWRITE);
+$SIG{INT} = \&exit_signal_handler;
+$SIG{TERM} = \&exit_signal_handler;
 
 sub sysread_or_die {
     my $FH     = shift;
@@ -1120,7 +1141,10 @@ while(1) {
         if($delay) {
             # just go sleep this many seconds!
             logmsg("Sleep for $delay seconds\n");
-            sleep($delay);
+            my $twentieths = $delay * 20;
+            while($twentieths--) {
+                select(undef, undef, undef, 0.05) unless($got_exit_signal);
+            }
         }
 
         my $text;