]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Introduce tor_terminate_process() function.
authorGeorge Kadianakis <desnacked@gmail.com>
Sun, 11 Sep 2011 18:26:01 +0000 (20:26 +0200)
committerGeorge Kadianakis <desnacked@gmail.com>
Sun, 11 Sep 2011 18:26:01 +0000 (20:26 +0200)
src/common/util.c
src/common/util.h

index 0632c674e9d4df452b471e49821b3f96e0efe780..63172c36a3d5a5682d98c59a0c8240103285b332 100644 (file)
@@ -28,6 +28,7 @@
 #include <direct.h>
 #include <process.h>
 #include <tchar.h>
+#include <Winbase.h>
 #else
 #include <dirent.h>
 #include <pwd.h>
@@ -43,6 +44,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
+#include <signal.h>
 
 #ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
@@ -2930,6 +2932,30 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
 /* Maximum number of file descriptors, if we cannot get it via sysconf() */
 #define DEFAULT_MAX_FD 256
 
+/** Terminate process running at PID <b>pid</b>.
+ *  Code borrowed from Python's os.kill. */
+int
+tor_terminate_process(pid_t pid)
+{
+#ifdef MS_WINDOWS
+  DWORD pid_win = pid;
+  DWORD err;
+  HANDLE handle;
+  /* If the signal is outside of what GenerateConsoleCtrlEvent can use,
+     attempt to open and terminate the process. */
+  handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
+  if (handle == NULL)
+    return -1;
+
+  if (TerminateProcess(handle, sig) == 0)
+    return -1;
+  else
+    return 0;
+#else /* *nix */
+  return kill(pid, SIGTERM);
+#endif
+}
+
 #define CHILD_STATE_INIT 0
 #define CHILD_STATE_PIPE 1
 #define CHILD_STATE_MAXFD 2
index 8bf4f7b13780d789a7ce275a334bc23899372a0f..7e889b10c7bd62ddc187a0f222840dc08947147f 100644 (file)
@@ -350,6 +350,7 @@ void write_pidfile(char *filename);
 void tor_check_port_forwarding(const char *filename,
                                int dir_port, int or_port, time_t now);
 
+int tor_terminate_process(pid_t pid);
 int tor_spawn_background(const char *const filename, int *stdout_read,
                          int *stderr_read, const char **argv,
                          const char **envp);