From 52e51d278e7c3c1385b8ab87e5783115d9ddb7ca Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 15 Jan 2009 19:40:21 +0000 Subject: [PATCH] Implement virKill for Win32 platform --- ChangeLog | 4 ++++ src/util.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/ChangeLog b/ChangeLog index f244064d7f..80f4be0359 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Thu Jan 15 19:39:19 GMT 2009 Daniel P. Berrange + + * src/util.c: Implement virKill() for Win32 platform + Thu Jan 15 17:29:19 GMT 2009 John Levon * src/internal.h: diff --git a/src/util.c b/src/util.c index 2a9ea6481f..6a8d4d36c2 100644 --- a/src/util.c +++ b/src/util.c @@ -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 }