X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fevent_client.c;h=37a943a45e90cd909b40e5099291c7ac1770a3a2;hb=026154a393c12630ade4ff2f301049b376dccaf5;hp=3791e6d2db7a1b45a0153f88d7a0064f6f53a583;hpb=7ed238dbbcd600038309afb183d3c31fd8283325;p=citadel.git diff --git a/citadel/event_client.c b/citadel/event_client.c index 3791e6d2d..37a943a45 100644 --- a/citadel/event_client.c +++ b/citadel/event_client.c @@ -337,6 +337,7 @@ IO_Timeout_callback(struct ev_loop *loop, ev_timer *watcher, int revents) break; } } + static void IO_connfail_callback(struct ev_loop *loop, ev_timer *watcher, int revents) { @@ -365,6 +366,32 @@ IO_connfail_callback(struct ev_loop *loop, ev_timer *watcher, int revents) } } + +static void +IO_connfailimmediate_callback(struct ev_loop *loop, ev_idle *watcher, int revents) +{ + AsyncIO *IO = watcher->data; + + ev_idle_stop (event_base, &IO->conn_fail_immediate); + + if (IO->SendBuf.fd != 0) + { + close(IO->SendBuf.fd); + IO->SendBuf.fd = IO->RecvBuf.fd = 0; + } + become_session(IO->CitContext); + + assert(IO->ConnFail); + switch (IO->ConnFail(IO)) + { + case eAbort: + ShutDownCLient(IO); + default: + break; + + } +} + static void IO_connestd_callback(struct ev_loop *loop, ev_io *watcher, int revents) { @@ -487,11 +514,14 @@ eNextState event_connect_socket(AsyncIO *IO, double conn_timeout, double first_r return IO->NextState; } else { + ev_idle_init(&IO->conn_fail_immediate, + IO_connfailimmediate_callback); + IO->conn_fail_immediate.data = IO; + ev_idle_start(event_base, &IO->conn_fail_immediate); + CtdlLogPrintf(CTDL_ERR, "connect() failed: %s\n", strerror(errno)); StrBufPrintf(IO->ErrMsg, "Failed to connect: %s", strerror(errno)); - assert(IO->ConnFail); - IO->ConnFail(IO); - return eAbort; + return IO->NextState; } return IO->NextState; }