From 23732bea244cba2efa4373f12fd31c52e09e0697 Mon Sep 17 00:00:00 2001 From: LRN Date: Thu, 12 Jul 2012 21:08:44 +0000 Subject: Missing file --- contrib/terminate.py.in | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 contrib/terminate.py.in (limited to 'contrib') diff --git a/contrib/terminate.py.in b/contrib/terminate.py.in new file mode 100644 index 000000000..14c79c10d --- /dev/null +++ b/contrib/terminate.py.in @@ -0,0 +1,64 @@ +#!@PYTHON@ +# This file is part of GNUnet. +# (C) 2011 Christian Grothoff (and other contributing authors) +# +# GNUnet is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation; either version 2, or (at your +# option) any later version. +# +# GNUnet is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNUnet; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. +# +# Utility module that implements safe process termination for W32. +# For other platforms it's equivalent to Popen.kill () +# Requires pywin32 on W32. + +import sys +import os +import subprocess +if os.name == 'nt': + import win32api + import win32process + +class dummyobj (object): + pass + +def safe_terminate_process_by_pid (pid, code): + if os.name == 'nt': + p = dummyobj () + p._handle = win32api.OpenProcess (2 | 1024 | 8 | 32 | 16, 0, pid) + result = safe_terminate_process (p, code) + win32api.CloseHandle (p._handle) + return result + else: + return os.kill (int (pid), SIGKILL) + +def safe_terminate_process (proc, code): + if os.name == 'nt': + cp = win32api.GetCurrentProcess () + result = False + dupproc = win32api.DuplicateHandle (cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0) + try: + exitcode = win32process.GetExitCodeProcess (dupproc) + if exitcode == 0x103: + kernel32 = win32api.GetModuleHandle ("kernel32") + exitprocess = win32api.GetProcAddress (kernel32, "ExitProcess") + th, tid = win32process.CreateRemoteThread (dupproc, None, 0, exitprocess, code, 0) + win32api.CloseHandle (th) + result = True + else: + result = True + # except failed to get exit code? failed to get module handle? + finally: + win32api.CloseHandle (dupproc) + return result + else: + return proc.kill () -- cgit v1.2.3