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 }