]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tests: fix conflict between Cygwin/msys and Windows PIDs
authorMarc Hoersken <info@marc-hoersken.de>
Sun, 5 Apr 2020 17:18:09 +0000 (19:18 +0200)
committerMarc Hoersken <info@marc-hoersken.de>
Sat, 11 Apr 2020 21:44:52 +0000 (23:44 +0200)
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

tests/dictserver.py
tests/ftp.pm
tests/negtelnetserver.py
tests/server/util.c
tests/smbserver.py

index 3211318c58bbbf3c6563c4969c3dd92de6937be6..5641692d9874759dea266e59633da55d31c4ac0e 100755 (executable)
@@ -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"
index 5e92ce7f94b0324088edde6de0124cf194631b68..a29fad14f79dda308e085d04eb54915f543c1ed3 100644 (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);
     }
 }
 
index 1efc64b56400e08e27e1877a99a29f94f8062eff..7171092af79e5459245e7f22c245893f196e4c37 100755 (executable)
@@ -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")
index 263f0cece322744061337e55ce0d7d9df053fb28..fa3d45118d3de1b143b58e40d15805792e2f0490 100644 (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);
index d320fb21e2fa463c12755427124fe84c33dc2752..30caa04b713a8826f03bcf6581a5eec9b39ca393 100755 (executable)
@@ -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