From 053af97c9e729ab485609e4202f5195fdc8aeeb5 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Wed, 6 Feb 2013 15:12:53 +0100 Subject: [PATCH] Check for writability when waiting for a socket to finish connecting. We were checking only for readability, which is not a problem for normal connections, since the server side of a connection will always send an ID request. But when using a proxy, the proxy server doesn't send anything before the client, so tinc would not see that its connection to the proxy had already been established. --- src/net.c | 17 ----------------- src/net_socket.c | 24 +++++++++++++++++++++--- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/net.c b/src/net.c index 3d17d3cf..97b1e5df 100644 --- a/src/net.c +++ b/src/net.c @@ -281,23 +281,6 @@ static void periodic_handler(void *data) { } void handle_meta_connection_data(connection_t *c) { - int result; - socklen_t len = sizeof result; - - if(c->status.connecting) { - c->status.connecting = false; - - getsockopt(c->socket, SOL_SOCKET, SO_ERROR, &result, &len); - - if(!result) - finish_connecting(c); - else { - logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Error while connecting to %s (%s): %s", c->name, c->hostname, sockstrerror(result)); - terminate_connection(c, false); - return; - } - } - if (!receive_meta(c)) { terminate_connection(c, c->status.active); return; diff --git a/src/net_socket.c b/src/net_socket.c index d5f85d5a..0ba2bf31 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -373,10 +373,28 @@ static void handle_meta_write(connection_t *c) { } static void handle_meta_io(void *data, int flags) { + connection_t *c = data; + + if(c->status.connecting) { + c->status.connecting = false; + + int result; + socklen_t len = sizeof result; + getsockopt(c->socket, SOL_SOCKET, SO_ERROR, &result, &len); + + if(!result) + finish_connecting(c); + else { + logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Error while connecting to %s (%s): %s", c->name, c->hostname, sockstrerror(result)); + terminate_connection(c, false); + return; + } + } + if(flags & IO_WRITE) - handle_meta_write(data); + handle_meta_write(c); else - handle_meta_connection_data(data); + handle_meta_connection_data(c); } bool do_outgoing_connection(outgoing_t *outgoing) { @@ -493,7 +511,7 @@ begin: connection_add(c); - io_add(&c->io, handle_meta_io, c, c->socket, IO_READ); + io_add(&c->io, handle_meta_io, c, c->socket, IO_READ|IO_WRITE); return true; }