aboutsummaryrefslogtreecommitdiff
path: root/contrib/scripts/terminate.py.in
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/scripts/terminate.py.in')
-rw-r--r--contrib/scripts/terminate.py.in37
1 files changed, 4 insertions, 33 deletions
diff --git a/contrib/scripts/terminate.py.in b/contrib/scripts/terminate.py.in
index 161b4db61..f57ac6167 100644
--- a/contrib/scripts/terminate.py.in
+++ b/contrib/scripts/terminate.py.in
@@ -11,7 +11,7 @@
11# WITHOUT ANY WARRANTY; without even the implied warranty of 11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# Affero General Public License for more details. 13# Affero General Public License for more details.
14# 14#
15# You should have received a copy of the GNU Affero General Public License 15# You should have received a copy of the GNU Affero General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>. 16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# 17#
@@ -24,9 +24,6 @@
24import sys 24import sys
25import subprocess 25import subprocess
26import os 26import os
27if os.name == 'nt':
28 import win32api
29 import win32process
30 27
31 28
32class dummyobj (object): 29class dummyobj (object):
@@ -34,35 +31,9 @@ class dummyobj (object):
34 31
35 32
36def safe_terminate_process_by_pid(pid, code): 33def safe_terminate_process_by_pid(pid, code):
37 if os.name == 'nt': 34 # XXX (F821): Undefined name 'SIGKILL'
38 p = dummyobj() 35 return os.kill(int(pid), SIGKILL)
39 p._handle = win32api.OpenProcess(2 | 1024 | 8 | 32 | 16, 0, pid)
40 result = safe_terminate_process(p, code)
41 win32api.CloseHandle(p._handle)
42 return result
43 else:
44 # XXX (F821): Undefined name 'SIGKILL'
45 return os.kill(int(pid), SIGKILL)
46 36
47 37
48def safe_terminate_process(proc, code): 38def safe_terminate_process(proc, code):
49 if os.name == 'nt': 39 return proc.kill()
50 cp = win32api.GetCurrentProcess()
51 result = False
52 dupproc = win32api.DuplicateHandle(cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0)
53 try:
54 exitcode = win32process.GetExitCodeProcess(dupproc)
55 if exitcode == 0x103:
56 kernel32 = win32api.GetModuleHandle("kernel32")
57 exitprocess = win32api.GetProcAddress(kernel32, "ExitProcess")
58 th, tid = win32process.CreateRemoteThread(dupproc, None, 0, exitprocess, code, 0)
59 win32api.CloseHandle(th)
60 result = True
61 else:
62 result = True
63 # except failed to get exit code? failed to get module handle?
64 finally:
65 win32api.CloseHandle(dupproc)
66 return result
67 else:
68 return proc.kill()