Missing file
authorLRN <lrn1986@gmail.com>
Thu, 12 Jul 2012 21:08:44 +0000 (21:08 +0000)
committerLRN <lrn1986@gmail.com>
Thu, 12 Jul 2012 21:08:44 +0000 (21:08 +0000)
contrib/terminate.py.in [new file with mode: 0644]

diff --git a/contrib/terminate.py.in b/contrib/terminate.py.in
new file mode 100644 (file)
index 0000000..14c79c1
--- /dev/null
@@ -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.
+\r
+import sys\r
+import os\r
+import subprocess\r
+if os.name == 'nt':\r
+  import win32api\r
+  import win32process\r
+\r
+class dummyobj (object):\r
+  pass\r
+\r
+def safe_terminate_process_by_pid (pid, code):\r
+  if os.name == 'nt':\r
+    p = dummyobj ()\r
+    p._handle = win32api.OpenProcess (2 | 1024 | 8 | 32 | 16, 0, pid)\r
+    result = safe_terminate_process (p, code)\r
+    win32api.CloseHandle (p._handle)\r
+    return result\r
+  else:\r
+    return os.kill (int (pid), SIGKILL)\r
+\r
+def safe_terminate_process (proc, code):\r
+  if os.name == 'nt':\r
+    cp = win32api.GetCurrentProcess ()\r
+    result = False\r
+    dupproc = win32api.DuplicateHandle (cp, proc._handle, cp, 2 | 1024 | 8 | 32 | 16, 0, 0)\r
+    try:\r
+      exitcode = win32process.GetExitCodeProcess (dupproc)\r
+      if exitcode == 0x103:\r
+        kernel32 = win32api.GetModuleHandle ("kernel32")\r
+        exitprocess = win32api.GetProcAddress (kernel32, "ExitProcess")\r
+        th, tid = win32process.CreateRemoteThread (dupproc, None, 0, exitprocess, code, 0)\r
+        win32api.CloseHandle (th)\r
+        result = True\r
+      else:\r
+        result = True\r
+    # except failed to get exit code? failed to get module handle?\r
+    finally:\r
+      win32api.CloseHandle (dupproc)\r
+    return result\r
+  else:\r
+    return proc.kill ()\r