diff options
| author | Marc Hoersken <info@marc-hoersken.de> | 2013-04-06 12:45:05 +0200 | 
|---|---|---|
| committer | Marc Hoersken <info@marc-hoersken.de> | 2013-04-06 12:45:05 +0200 | 
| commit | a03d0c5b8804cd6d6ce91a167ad3c2b85eac1f85 (patch) | |
| tree | 42b99684ef902b6366fe37cd8f9da75b78ddfed0 /tests/ftp.pm | |
| parent | ac09b5a92bec0da6109b58856094229a77df5eb8 (diff) | |
runtests.pl: Modularization of MinGW/Msys compatibility functions
Diffstat (limited to 'tests/ftp.pm')
| -rw-r--r-- | tests/ftp.pm | 133 | 
1 files changed, 77 insertions, 56 deletions
diff --git a/tests/ftp.pm b/tests/ftp.pm index b38745120..76c6d5746 100644 --- a/tests/ftp.pm +++ b/tests/ftp.pm @@ -48,6 +48,76 @@ sub pidfromfile {  }  ####################################################################### +# pidexists checks if a process with a given pid exists and is alive. +# This will return the positive pid if the process exists and is alive. +# This will return the negative pid if the process exists differently. +# This will return 0 if the process could not be found. +# +sub pidexists { +    my $pid = $_[0]; + +    if($pid > 0) { +        # verify if currently existing and alive +        if(kill(0, $pid)) { +            return $pid; +        } + +        # verify if currently existing Windows process +        if($^O eq "msys") { +            my $filter = "PID eq $pid"; +            my $result = `tasklist -fi \"$filter\" 2>nul`; +            if(index($result, "$pid") != -1) { +                return -$pid; +            } +        } +    } + +    return 0; +} + +####################################################################### +# pidterm asks the process with a given pid to terminate gracefully. +# +sub pidterm { +    my $pid = $_[0]; + +    if($pid > 0) { +        # signal the process to terminate +        kill("TERM", $pid); + +        # request the process to quit +        if($^O eq "msys") { +            my $filter = "PID eq $pid"; +            my $result = `tasklist -fi \"$filter\" 2>nul`; +            if(index($result, "$pid") != -1) { +                system("taskkill -fi \"$filter\" >nul 2>&1"); +            } +        } +    } +} + +####################################################################### +# pidkill kills the process with a given pid mercilessly andforcefully. +# +sub pidkill { +    my $pid = $_[0]; + +    if($pid > 0) { +        # signal the process to terminate +        kill("KILL", $pid); + +        # request the process to quit +        if($^O eq "msys") { +            my $filter = "PID eq $pid"; +            my $result = `tasklist -fi \"$filter\" 2>nul`; +            if(index($result, "$pid") != -1) { +                system("taskkill -f -fi \"$filter\" >nul 2>&1"); +            } +        } +    } +} + +#######################################################################  # 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 @@ -63,16 +133,8 @@ sub processexists {      my $pid = pidfromfile($pidfile);      if($pid > 0) { -        # verify if currently existing Windows process -        if($^O eq "msys") { -            my $filter = "-fi \"PID eq $pid\""; -            my $result = `tasklist $filter 2>nul`; -            if(index($result, "$pid") != -1) { -                return $pid; -            } -        }          # verify if currently alive -        if(kill(0, $pid)) { +        if(pidexists($pid)) {              return $pid;          }          else { @@ -119,21 +181,10 @@ sub killpid {          if($tmp =~ /^(\d+)$/) {              my $pid = $1;              if($pid > 0) { -                if($^O eq "msys") { -                    my $filter = "-fi \"PID eq $pid\""; -                    my $result = `tasklist $filter 2>nul`; -                    if(index($result, "$pid") != -1) { -                        print("RUN: Process with pid $pid requested to quit\n") -                            if($verbose); -                        system("taskkill $filter >nul 2>&1"); -                        push @signalled, $pid; -                        next; # it is a Windows PID -                    } -                } -                if(kill(0, $pid)) { +                if(pidexists($pid)) {                      print("RUN: Process with pid $pid signalled to die\n")                          if($verbose); -                    kill("TERM", $pid); +                    pidterm($pid);                      push @signalled, $pid;                  }                  else { @@ -153,14 +204,7 @@ sub killpid {          while($twentieths--) {              for(my $i = scalar(@signalled) - 1; $i >= 0; $i--) {                  my $pid = $signalled[$i]; -                if($^O eq "msys") { -                    my $filter = "-fi \"PID eq $pid\""; -                    my $result = `tasklist $filter 2>nul`; -                    if(index($result, "$pid") != -1) { -                        next; # the Windows PID still exists -                    } -                } -                if(!kill(0, $pid)) { +                if(!pidexists($pid)) {                      print("RUN: Process with pid $pid gracefully died\n")                          if($verbose);                      splice @signalled, $i, 1; @@ -180,16 +224,7 @@ sub killpid {              if($pid > 0) {                  print("RUN: Process with pid $pid forced to die with SIGKILL\n")                      if($verbose); -                kill("KILL", $pid); -                if($^O eq "msys") { -                    my $filter = "-fi \"PID eq $pid\""; -                    my $result = `tasklist $filter 2>nul`; -                    if(index($result, "$pid") != -1) { -                        print("RUN: Process with pid $pid forced to quit\n") -                            if($verbose); -                        system("taskkill -f $filter >nul 2>&1"); -                    } -                } +                pidkill($pid);                  # if possible reap its dead children                  waitpid($pid, &WNOHANG);                  push @reapchild, $pid; @@ -229,14 +264,7 @@ sub killsockfilters {          if($pid > 0) {              printf("* kill pid for %s-%s => %d\n", $server,                  ($proto eq 'ftp')?'ctrl':'filt', $pid) if($verbose); -            kill("KILL", $pid); -            if($^O eq "msys") { -                my $filter = "-fi \"PID eq $pid\""; -                my $result = `tasklist $filter 2>nul`; -                if(index($result, "$pid") != -1) { -                    system("taskkill -f $filter >nul 2>&1"); -                } -            } +            pidkill($pid);              waitpid($pid, 0);          }          unlink($pidfile) if(-f $pidfile); @@ -250,14 +278,7 @@ sub killsockfilters {          if($pid > 0) {              printf("* kill pid for %s-data => %d\n", $server,                  $pid) if($verbose); -            kill("KILL", $pid); -            if($^O eq "msys") { -                my $filter = "-fi \"PID eq $pid\""; -                my $result = `tasklist $filter 2>nul`; -                if(index($result, "$pid") != -1) { -                    system("taskkill -f $filter >nul 2>&1"); -                } -            } +            pidkill($pid);              waitpid($pid, 0);          }          unlink($pidfile) if(-f $pidfile);  | 
