X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_socket.c;h=cb2a6dfea699cc3b1ea487847445fce0d3131fc0;hb=079dcd01794187d2857e1233f6c9930310812593;hp=d5f85d5a0ceac9a3ed59f9f952c4a85136d6ad77;hpb=cc3c69c892b0dad9a6ece0a0f4ccd429a22fcbff;p=tinc diff --git a/src/net_socket.c b/src/net_socket.c index d5f85d5a..cb2a6dfe 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -294,9 +294,6 @@ void retry_outgoing(outgoing_t *outgoing) { void finish_connecting(connection_t *c) { logger(DEBUG_CONNECTIONS, LOG_INFO, "Connected to %s (%s)", c->name, c->hostname); - if(proxytype != PROXY_EXEC) - configure_tcp(c); - c->last_ping_time = time(NULL); c->status.connecting = false; @@ -373,10 +370,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) { @@ -441,6 +456,7 @@ begin: } logger(DEBUG_CONNECTIONS, LOG_INFO, "Using proxy at %s port %s", proxyhost, proxyport); c->socket = socket(proxyai->ai_family, SOCK_STREAM, IPPROTO_TCP); + configure_tcp(c); } if(c->socket == -1) { @@ -493,7 +509,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; }