From b63f6518cbdc4c80b09399bc17d3bec3cac76ad9 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 11 Aug 2009 15:03:43 -0400 Subject: [PATCH] Add bufferevent support for outgoing connections; exits are now supported. --- src/or/connection.c | 4 +++- src/or/main.c | 11 +++++++++-- src/or/main.h | 4 +++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/or/connection.c b/src/or/connection.c index e6b4bc3d18..394aa3b836 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -192,6 +192,8 @@ connection_type_uses_bufferevent(connection_t *conn) switch (conn->type) { case CONN_TYPE_AP: return 1; + case CONN_TYPE_EXIT: + return 1; default: return 0; } @@ -1342,7 +1344,7 @@ connection_connect(connection_t *conn, const char *address, escaped_safe_str_client(address), port, inprogress?"in progress":"established", s); conn->s = s; - if (connection_add(conn) < 0) /* no space, forget it */ + if (connection_add_connecting(conn) < 0) /* no space, forget it */ return -1; return inprogress ? 0 : 1; } diff --git a/src/or/main.c b/src/or/main.c index 18473c3b50..976d805e13 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -160,7 +160,7 @@ int can_complete_circuit=0; * non-reading and non-writing. */ int -connection_add(connection_t *conn) +connection_add_impl(connection_t *conn, int is_connecting) { tor_assert(conn); tor_assert(conn->s >= 0 || @@ -179,7 +179,7 @@ connection_add(connection_t *conn) tor_libevent_get_base(), conn->s, BEV_OPT_DEFER_CALLBACKS); - if (conn->inbuf) { + if (conn->inbuf) { /* XXX Instead we should assert that there is no inbuf, once we * have linked connections using bufferevents. */ tor_assert(conn->outbuf); @@ -189,8 +189,15 @@ connection_add(connection_t *conn) buf_free(conn->outbuf); conn->inbuf = conn->outbuf = NULL; } + if (is_connecting) { + /* Put the bufferevent into a "connecting" state so that we'll get + * a "connected" event callback on successful write. */ + bufferevent_socket_connect(conn->bufev, NULL, 0); + } connection_configure_bufferevent_callbacks(conn); } +#else + (void) is_connecting; #endif if (!HAS_BUFFEREVENT(conn) && (conn->s >= 0 || conn->linked)) { diff --git a/src/or/main.h b/src/or/main.h index 6175c28a95..10b8aad0fb 100644 --- a/src/or/main.h +++ b/src/or/main.h @@ -14,7 +14,9 @@ extern int can_complete_circuit; -int connection_add(connection_t *conn); +int connection_add_impl(connection_t *conn, int is_connecting); +#define connection_add(conn) connection_add_impl((conn), 0) +#define connection_add_connecting(conn) connection_add_impl((conn), 1) int connection_remove(connection_t *conn); void connection_unregister_events(connection_t *conn); int connection_in_array(connection_t *conn);