Browse Source

Introduce tor_terminate_process() function.

George Kadianakis 12 years ago
parent
commit
782810a8bf
2 changed files with 27 additions and 0 deletions
  1. 26 0
      src/common/util.c
  2. 1 0
      src/common/util.h

+ 26 - 0
src/common/util.c

@@ -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

+ 1 - 0
src/common/util.h

@@ -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);