]> xenbits.xensource.com Git - libvirt.git/commitdiff
Implement virKill for Win32 platform
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 15 Jan 2009 19:40:21 +0000 (19:40 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 15 Jan 2009 19:40:21 +0000 (19:40 +0000)
ChangeLog
src/util.c

index f244064d7f3976b65ed3a9bbed0198e0618f266b..80f4be03597777eda3c77bfaa581ba40304319b2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Thu Jan 15 19:39:19 GMT 2009  Daniel P. Berrange <berrange@redhat.com>
+
+       * src/util.c: Implement virKill() for Win32 platform
+
 Thu Jan 15 17:29:19 GMT 2009  John Levon  <levon@movementarian.org>
 
        * src/internal.h:
index 2a9ea6481f038ecef657dc3e2410e8164e016b68..6a8d4d36c21ecdcffa0fa7c38395e955b3feec84 100644 (file)
@@ -1379,5 +1379,50 @@ int virKillProcess(pid_t pid, int sig)
         return -1;
     }
 
+#ifdef WIN32
+    /* Mingw / Windows don't have many signals (AFAIK) */
+    switch (sig) {
+    case SIGINT:
+        /* This does a Ctrl+C equiv */
+        if (!GenerateConsoleCtrlEvent(CTRL_C_EVENT, pid)) {
+            errno = ESRCH;
+            return -1;
+        }
+        break;
+
+    case SIGTERM:
+        /* Since TerminateProcess is closer to SIG_KILL, we do
+         * a Ctrl+Break equiv which is more pleasant like the
+         * good old unix SIGTERM/HUP
+         */
+        if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid)) {
+            errno = ESRCH;
+            return -1;
+        }
+        break;
+
+    default:
+    {
+        HANDLE proc;
+        proc = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
+        if (!proc) {
+            errno = ESRCH; /* Not entirely accurate, but close enough */
+            return -1;
+        }
+
+        /*
+         * TerminateProcess is more or less equiv to SIG_KILL, in that
+         * a process can't trap / block it
+         */
+        if (!TerminateProcess(proc, sig)) {
+            errno = ESRCH;
+            return -1;
+        }
+        CloseHandle(proc);
+    }
+    }
+    return 0;
+#else
     return kill(pid, sig);
+#endif
 }