From 09e2fca2273038a0f651287306f19b0a3cf44bb8 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Sun, 20 May 2012 20:02:10 +0200 Subject: [PATCH] EV: check the connectionstate on deferred connecting; else we can't detect connections failed by non-existing hosts. --- citadel/event_client.c | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/citadel/event_client.c b/citadel/event_client.c index 7b409fcf4..2f6f0856d 100644 --- a/citadel/event_client.c +++ b/citadel/event_client.c @@ -705,15 +705,38 @@ IO_connfailimmediate_callback(struct ev_loop *loop, static void IO_connestd_callback(struct ev_loop *loop, ev_io *watcher, int revents) { - AsyncIO *IO = watcher->data; - - IO->Now = ev_now(event_base); - EVM_syslog(LOG_DEBUG, "connect() succeeded.\n"); - - ev_io_stop(loop, &IO->conn_event); - ev_timer_stop (event_base, &IO->conn_fail); - set_start_callback(loop, IO, revents); + AsyncIO *IO = watcher->data; + int so_err = 0; + socklen_t lon = sizeof(so_err); + int err; + + IO->Now = ev_now(event_base); + EVM_syslog(LOG_DEBUG, "connect() succeeded.\n"); + + ev_io_stop(loop, &IO->conn_event); + ev_timer_stop(event_base, &IO->conn_fail); + + err = getsockopt(IO->SendBuf.fd, + SOL_SOCKET, + SO_ERROR, + (void*)&so_err, + &lon); + + if ((err == 0) && (so_err == 111)) + { + EV_syslog(LOG_DEBUG, "connect() failed [%d][%s]\n", + so_err, + strerror(so_err)); + IO_connfail_callback(loop, &IO->conn_fail, revents); + + } + else + { + EVM_syslog(LOG_DEBUG, "connect() succeeded\n"); + set_start_callback(loop, IO, revents); + } } + static void IO_recv_callback(struct ev_loop *loop, ev_io *watcher, int revents) { -- 2.30.2