diff options
author | Nick Mathewson <nickm@torproject.org> | 2017-10-18 13:36:53 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2017-10-18 13:36:53 -0400 |
commit | f1bf9bf8198fcfaf078fdc12eb2ad5adf1901d29 (patch) | |
tree | f6847f99adba9f8caa216cf42ab6c3e54cf2af50 /src/or/control.c | |
parent | f0daaf8d60be8bfcfaa99e3a878cd90967a84bb0 (diff) | |
download | tor-f1bf9bf8198fcfaf078fdc12eb2ad5adf1901d29.tar.gz tor-f1bf9bf8198fcfaf078fdc12eb2ad5adf1901d29.zip |
Add __OwningControllerFD to allow controllers without controlports
This feature should help programs that want to launch and manage a
Tor process, as well as programs that want to launch and manage a
Tor instance in a separate thread. Right now, they have to open a
controlport, and then connect to it, with attendant authentication
issues. This feature allows them to just start with an
authenticated connection.
Bug 23900.
Diffstat (limited to 'src/or/control.c')
-rw-r--r-- | src/or/control.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/or/control.c b/src/or/control.c index 8173cb1e56..2e4bae2dbf 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -549,6 +549,49 @@ decode_escaped_string(const char *start, size_t in_len_max, return end+1; } +/** Create and add a new controller connection on <b>sock</b>. If + * <b>CC_LOCAL_FD_IS_OWNER</b> is set in <b>flags</b>, this Tor process should + * exit when the connection closes. If <b>CC_LOCAL_FD_IS_AUTHENTICATED</b> + * is set, then the connection does not need to authenticate. + */ +int +control_connection_add_local_fd(tor_socket_t sock, unsigned flags) +{ + if (BUG(! SOCKET_OK(sock))) + return -1; + const int is_owner = !!(flags & CC_LOCAL_FD_IS_OWNER); + const int is_authenticated = !!(flags & CC_LOCAL_FD_IS_AUTHENTICATED); + control_connection_t *control_conn = control_connection_new(AF_UNSPEC); + connection_t *conn = TO_CONN(control_conn); + conn->s = sock; + tor_addr_make_unspec(&conn->addr); + conn->port = 1; + conn->address = tor_strdup("<local socket>"); + + /* We take ownership of this socket so that later, when we close it, + * we don't freak out. */ + tor_take_socket_ownership(sock); + + if (set_socket_nonblocking(sock) < 0 || + connection_add(conn) < 0) { + connection_free(conn); + return -1; + } + + control_conn->is_owning_control_connection = is_owner; + + if (connection_init_accepted_conn(conn, NULL) < 0) { + connection_mark_for_close(conn); + return -1; + } + + if (is_authenticated) { + conn->state = CONTROL_CONN_STATE_OPEN; + } + + return 0; +} + /** Acts like sprintf, but writes its formatted string to the end of * <b>conn</b>-\>outbuf. */ static void |