diff --git a/tests/ftp.pm b/tests/ftp.pm index 421fee1a6afaaa715c3ac91f651a59dd335a4a5a..eed64903e36743907d58f4994ba072e255883a35 100644 --- a/tests/ftp.pm +++ b/tests/ftp.pm @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms @@ -22,30 +22,48 @@ ########################################################################### ####################################################################### -# Return the pid of the server as found in the given pid file +# pidfromfile returns the pid stored in the given pidfile. The value +# of the returned pid will never be a negative value. It will be zero +# on any file related error or if a pid can not be extracted from the +# given file. # -sub serverpid { - my $PIDFILE = $_[0]; - open(PFILE, "<$PIDFILE"); - my $PID=0+; - close(PFILE); - return $PID; +sub pidfromfile { + my $pidfile = $_[0]; + my $pid = 0; + + if(-f $pidfile && -s $pidfile && open(PIDFH, "<$pidfile")) { + $pid = 0 + ; + close(PIDFH); + $pid = 0 unless($pid > 0); + } + return $pid; } ####################################################################### -# Check the given test server if it is still alive. +# processexists checks if a process with the pid stored in the given +# pidfile exists and is alive. This will return 0 on any file related +# error or if a pid can not be extracted from the given file. When a +# process with the same pid as the one extracted from the given file +# is currently alive this returns that positive pid. Otherwise, when +# the process is not alive, will return the negative value of the pid. # -sub checkserver { - my ($pidfile)=@_; - my $pid=0; - - # check for pidfile - if ( -f $pidfile ) { - $pid=serverpid($pidfile); - if ($pid ne "" && kill(0, $pid)) { +sub processexists { +# use POSIX ":sys_wait_h"; + my $pidfile = $_[0]; + + # fetch pid from pidfile + my $pid = pidfromfile($pidfile); + + if($pid > 0) { + # verify if currently alive + if(kill(0, $pid)) { return $pid; } else { + # reap it if this has not already been done + # waitpid($pid, &WNOHANG); + # get rid of the certainly invalid pidfile + unlink($pidfile) if($pid == pidfromfile($pidfile)); return -$pid; # negative means dead process } } @@ -60,7 +78,7 @@ sub ftpkillslave { my $base; for $base (('filt', 'data')) { my $f = ".sock$base$id$ext.pid"; - my $pid = checkserver($f); + my $pid = processexists($f); if($pid > 0) { printf ("* kill pid for %s => %d\n", "ftp-$base$id$ext", $pid) if($verbose); kill (9, $pid); # die! diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl index ddbc57430d89eb638135a5b32ffb5944109a23a0..c1b53cdfcdebf21ea1fef2d144bbb9e7833a856d 100644 --- a/tests/ftpserver.pl +++ b/tests/ftpserver.pl @@ -577,7 +577,7 @@ sub PASV_command { my $pasvport; my $pidf=".sockdata$ftpdnum$ext.pid"; - my $prev = checkserver($pidf); + my $prev = processexists($pidf); if($prev > 0) { print "kill existing server: $prev\n" if($verbose); kill(9, $prev); diff --git a/tests/runtests.pl b/tests/runtests.pl index be20a63abe75ffccef43eb9cc9e12bf847f796d1..834c86652cf3eca3dcaccda883986e749f563781 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -828,7 +828,7 @@ sub runhttpserver { return (0,0); } - my $pid = checkserver($pidfile); + my $pid = processexists($pidfile); if($pid > 0) { stopserver($pid); } @@ -898,7 +898,7 @@ sub runhttpsserver { return (0,0); } - my $pid = checkserver($pidfile); + my $pid = processexists($pidfile); if($pid > 0) { # kill previous stunnel! stopserver($pid); @@ -968,7 +968,7 @@ sub runftpserver { return (0,0); } - my $pid = checkserver($pidfile); + my $pid = processexists($pidfile); if($pid > 0) { stopserver($pid); } @@ -1045,7 +1045,7 @@ sub runftpsserver { return (0,0); } - my $pid = checkserver($pidfile); + my $pid = processexists($pidfile); if($pid > 0) { # kill previous stunnel! stopserver($pid); @@ -1114,7 +1114,7 @@ sub runtftpserver { return (0,0); } - my $pid = checkserver($pidfile); + my $pid = processexists($pidfile); if($pid > 0) { stopserver($pid); } @@ -1179,7 +1179,7 @@ sub runsshserver { return (0,0); } - my $pid = checkserver($pidfile); + my $pid = processexists($pidfile); if($pid > 0) { stopserver($pid); } @@ -1254,7 +1254,7 @@ sub runsocksserver { return (0,0); } - my $pid = checkserver($pidfile); + my $pid = processexists($pidfile); if($pid > 0) { stopserver($pid); }