tests: fix conflict between Cygwin/msys and Windows PIDs

Add 65536 to Windows PIDs to allow Windows specific treatment
by having disjunct ranges for Cygwin/msys and Windows PIDs.

See also:
- https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵
  h=b5e1003722cb14235c4f166be72c09acdffc62ea
- https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵
  h=448cf5aa4b429d5a9cebf92a0da4ab4b5b6d23fe

Replaces #5178
Closes #5188
This commit is contained in:
Marc Hoersken 2020-04-05 19:18:09 +02:00
parent 6d13ef5325
commit 3f60a9e995
No known key found for this signature in database
GPG Key ID: 61E03CBED7BC859E
5 changed files with 79 additions and 33 deletions

View File

@ -51,8 +51,11 @@ def dictserver(options):
"""
if options.pidfile:
pid = os.getpid()
# see tests/server/util.c function write_pidfile
if os.name == "nt":
pid += 65536
with open(options.pidfile, "w") as f:
f.write("{0}".format(pid))
f.write(str(pid))
local_bind = (options.host, options.port)
log.info("[DICT] Listening on %s", local_bind)
@ -85,7 +88,11 @@ class DictHandler(socketserver.BaseRequestHandler):
if VERIFIED_REQ in data:
log.debug("[DICT] Received verification request from test "
"framework")
response_data = VERIFIED_RSP.format(pid=os.getpid())
pid = os.getpid()
# see tests/server/util.c function write_pidfile
if os.name == "nt":
pid += 65536
response_data = VERIFIED_RSP.format(pid=pid)
else:
log.debug("[DICT] Received normal request")
response_data = "No matches"

View File

@ -42,6 +42,10 @@ use serverhelp qw(
datasockf_pidfilename
);
use pathhelp qw(
os_is_win
);
#######################################################################
# portable_sleep uses Time::HiRes::sleep if available and falls back
# to the classic approach of using select(undef, undef, undef, ...).
@ -55,7 +59,7 @@ sub portable_sleep {
if($Time::HiRes::VERSION) {
Time::HiRes::sleep($seconds);
}
elsif ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys') {
elsif (os_is_win()) {
Win32::Sleep($seconds*1000);
}
else {
@ -91,19 +95,23 @@ sub pidexists {
my $pid = $_[0];
if($pid > 0) {
# verify if currently existing Windows process
if ($pid > 65536 && os_is_win()) {
$pid -= 65536;
if($^O ne 'MSWin32') {
my $filter = "PID eq $pid";
my $result = `tasklist -fi \"$filter\" 2>nul`;
if(index($result, "$pid") != -1) {
return -$pid;
}
return 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;
@ -116,17 +124,21 @@ 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");
if ($pid > 65536 && os_is_win()) {
$pid -= 65536;
if($^O ne 'MSWin32') {
my $filter = "PID eq $pid";
my $result = `tasklist -fi \"$filter\" 2>nul`;
if(index($result, "$pid") != -1) {
system("taskkill -fi \"$filter\" >nul 2>&1");
}
return;
}
}
# signal the process to terminate
kill("TERM", $pid);
}
}
@ -137,19 +149,23 @@ 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");
# Windows XP Home compatibility
system("tskill $pid >nul 2>&1");
if ($pid > 65536 && os_is_win()) {
$pid -= 65536;
if($^O ne 'MSWin32') {
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");
# Windows XP Home compatibility
system("tskill $pid >nul 2>&1");
}
return;
}
}
# signal the process to terminate
kill("KILL", $pid);
}
}

View File

@ -49,6 +49,9 @@ def telnetserver(options):
"""
if options.pidfile:
pid = os.getpid()
# see tests/server/util.c function write_pidfile
if os.name == "nt":
pid += 65536
with open(options.pidfile, "w") as f:
f.write(str(pid))
@ -86,7 +89,11 @@ class NegotiatingTelnetHandler(socketserver.BaseRequestHandler):
if VERIFIED_REQ.encode('utf-8') in data:
log.debug("Received verification request from test framework")
response = VERIFIED_RSP.format(pid=os.getpid())
pid = os.getpid()
# see tests/server/util.c function write_pidfile
if os.name == "nt":
pid += 65536
response = VERIFIED_RSP.format(pid=pid)
response_data = response.encode('utf-8')
else:
log.debug("Received normal request - echoing back")

View File

@ -269,6 +269,15 @@ int write_pidfile(const char *filename)
logmsg("Couldn't write pid file: %s %s", filename, strerror(errno));
return 0; /* fail */
}
#if defined(WIN32) || defined(_WIN32)
/* store pid + 65536 to avoid conflict with Cygwin/msys PIDs, see also:
* - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵
* h=b5e1003722cb14235c4f166be72c09acdffc62ea
* - https://cygwin.com/git/?p=newlib-cygwin.git;a=commit; ↵
* h=448cf5aa4b429d5a9cebf92a0da4ab4b5b6d23fe
*/
pid += 65536;
#endif
fprintf(pidfile, "%ld\n", pid);
fclose(pidfile);
logmsg("Wrote pid %ld to %s", pid, filename);

View File

@ -61,8 +61,11 @@ def smbserver(options):
"""
if options.pidfile:
pid = os.getpid()
# see tests/server/util.c function write_pidfile
if os.name == "nt":
pid += 65536
with open(options.pidfile, "w") as f:
f.write("{0}".format(pid))
f.write(str(pid))
# Here we write a mini config for the server
smb_config = configparser.ConfigParser()
@ -267,7 +270,11 @@ class TestSmbServer(imp_smbserver.SMBSERVER):
if requested_filename == VERIFIED_REQ:
log.debug("[SMB] Verifying server is alive")
contents = VERIFIED_RSP.format(pid=os.getpid()).encode('utf-8')
pid = os.getpid()
# see tests/server/util.c function write_pidfile
if os.name == "nt":
pid += 65536
contents = VERIFIED_RSP.format(pid=pid).encode('utf-8')
self.write_to_fid(fid, contents)
return fid, filename