EV: check the connectionstate on deferred connecting; else we can't detect connection...
authorWilfried Goesgens <dothebart@citadel.org>
Sun, 20 May 2012 18:02:10 +0000 (20:02 +0200)
committerWilfried Goesgens <dothebart@citadel.org>
Sun, 20 May 2012 18:02:10 +0000 (20:02 +0200)
citadel/event_client.c

index 7b409fcf4a49404e85607402f5947faa046d642f..2f6f0856d6d66dc5ba084677105e99aa2e4788dc 100644 (file)
@@ -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)
 {