gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r22624 - gnunet/contrib


From: gnunet
Subject: [GNUnet-SVN] r22624 - gnunet/contrib
Date: Thu, 12 Jul 2012 23:08:44 +0200

Author: LRN
Date: 2012-07-12 23:08:44 +0200 (Thu, 12 Jul 2012)
New Revision: 22624

Added:
   gnunet/contrib/terminate.py.in
Log:
Missing file

Added: gnunet/contrib/terminate.py.in
===================================================================
--- gnunet/contrib/terminate.py.in                              (rev 0)
+++ gnunet/contrib/terminate.py.in      2012-07-12 21:08:44 UTC (rev 22624)
@@ -0,0 +1,64 @@
address@hidden@
+#    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 ()




reply via email to

[Prev in Thread] Current Thread [Next in Thread]