]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Add bufferevent support for outgoing connections; exits are now supported.
authorNick Mathewson <nickm@torproject.org>
Tue, 11 Aug 2009 19:03:43 +0000 (15:03 -0400)
committerNick Mathewson <nickm@torproject.org>
Mon, 27 Sep 2010 16:31:13 +0000 (12:31 -0400)
src/or/connection.c
src/or/main.c
src/or/main.h

index e6b4bc3d182e528dce45808683f8e7df6d7f36d4..394aa3b8361b84dadfe33cfdea5cffbe34dd14c3 100644 (file)
@@ -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;
 }
index 18473c3b506d288bb4acf6f8ebbe995f7dbef53e..976d805e133382b0fa91c77df404df1cb9829e6c 100644 (file)
@@ -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)) {
index 6175c28a95b27e0cefbdd8e2e3f636464420ae71..10b8aad0fb1c2d2044134cb7f474f724e3a5ff94 100644 (file)
@@ -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);