[tor-commits] [tor/master] Add API for creating an owning controller FD and passing it to tor_main

nickm at torproject.org nickm at torproject.org
Tue Sep 4 15:05:03 UTC 2018


commit c77fe82155c7ed862358f9869e0dcb1ba8772f83
Author: Nick Mathewson <nickm at torproject.org>
Date:   Wed Aug 1 10:36:10 2018 -0400

    Add API for creating an owning controller FD and passing it to tor_main
---
 src/feature/api/tor_api.c          | 49 ++++++++++++++++++++++++++++++++++++--
 src/feature/api/tor_api.h          | 12 ++++++++++
 src/feature/api/tor_api_internal.h |  3 +++
 3 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/src/feature/api/tor_api.c b/src/feature/api/tor_api.c
index 755d28aad..664a3a0d8 100644
--- a/src/feature/api/tor_api.c
+++ b/src/feature/api/tor_api.c
@@ -8,12 +8,19 @@
  * \file tor_api.c
  **/
 
+#ifdef _WIN32
+#include <winsock2.h>
+#include <windows.h>
+#endif
+
 #include "feature/api/tor_api.h"
-#include "feature/api/tor_api_internal.h"
 
 // Include this after the above headers, to insure that they don't
 // depend on anything else.
 #include "orconfig.h"
+#include "feature/api/tor_api_internal.h"
+#include "lib/cc/torint.h"
+#include "lib/cc/compat_compiler.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -28,6 +35,20 @@
 #define raw_realloc realloc
 #define raw_strdup strdup
 
+#ifdef _WIN32
+#include "lib/net/socketpair.h"
+#define raw_socketpair tor_ersatz_socketpair
+#define raw_closesocket closesocket
+#define snprintf _snprintf
+#else
+#define raw_socketpair socketpair
+#define raw_closesocket close
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 /**
  * Helper: Add a copy of <b>arg</b> to the owned arguments of <b>cfg</b>.
  * Return 0 on success, -1 on failure.
@@ -61,6 +82,8 @@ tor_main_configuration_new(void)
   cfg->argc = 1;
   cfg->argv = (char **) fake_argv;
 
+  cfg->owning_controller_socket = TOR_INVALID_SOCKET;
+
   return cfg;
 }
 
@@ -75,12 +98,31 @@ tor_main_configuration_set_command_line(tor_main_configuration_t *cfg,
   return 0;
 }
 
+tor_control_socket_t
+tor_main_configuration_setup_control_socket(tor_main_configuration_t *cfg)
+{
+  if (SOCKET_OK(cfg->owning_controller_socket))
+    return INVALID_TOR_CONTROL_SOCKET;
+
+  tor_socket_t fds[2];
+  if (raw_socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) {
+    return INVALID_TOR_CONTROL_SOCKET;
+  }
+  char buf[32];
+  snprintf(buf, sizeof(buf), "%"PRIu64, (uint64_t)fds[1]);
+
+  cfg_add_owned_arg(cfg, "__OwningControllerFD");
+  cfg_add_owned_arg(cfg, buf);
+
+  cfg->owning_controller_socket = fds[1];
+  return fds[0];
+}
+
 void
 tor_main_configuration_free(tor_main_configuration_t *cfg)
 {
   if (cfg == NULL)
     return;
-  cfg_add_owned_arg(cfg, "bye");//XXXX
   if (cfg->argv_owned) {
     int i;
     for (i = 0; i < cfg->argc_owned; ++i) {
@@ -88,6 +130,9 @@ tor_main_configuration_free(tor_main_configuration_t *cfg)
     }
     raw_free(cfg->argv_owned);
   }
+  if (SOCKET_OK(cfg->owning_controller_socket)) {
+    raw_closesocket(cfg->owning_controller_socket);
+  }
   raw_free(cfg);
 }
 
diff --git a/src/feature/api/tor_api.h b/src/feature/api/tor_api.h
index 5133e3cec..0e22ced2d 100644
--- a/src/feature/api/tor_api.h
+++ b/src/feature/api/tor_api.h
@@ -49,6 +49,18 @@ tor_main_configuration_t *tor_main_configuration_new(void);
 int tor_main_configuration_set_command_line(tor_main_configuration_t *cfg,
                                             int argc, char *argv[]);
 
+#ifdef _WIN32
+typedef SOCKET tor_control_socket_t;
+#define INVALID_TOR_CONTROL_SOCKET INVALID_SOCKET
+#else
+typedef int tor_control_socket_t;
+#define INVALID_TOR_CONTROL_SOCKET (-1)
+#endif
+
+/** DOCDOC */
+tor_control_socket_t tor_main_configuration_setup_control_socket(
+                                          tor_main_configuration_t *cfg);
+
 /**
  * Release all storage held in <b>cfg</b>.
  *
diff --git a/src/feature/api/tor_api_internal.h b/src/feature/api/tor_api_internal.h
index 30924b8b0..1e32012d0 100644
--- a/src/feature/api/tor_api_internal.h
+++ b/src/feature/api/tor_api_internal.h
@@ -21,6 +21,9 @@ struct tor_main_configuration_t {
   int argc_owned;
   /** As argv, but is owned by the tor_main_configuration_t object. */
   char **argv_owned;
+
+  /** Socket that Tor will use as an owning control socket. Owned. */
+  tor_socket_t owning_controller_socket;
 };
 
 #endif /* !defined(TOR_API_INTERNAL_H) */





More information about the tor-commits mailing list