StrBufPlain(IO->ErrMsg, errmsg, -1);
break;
default:
- rc = StrBuf_write_one_chunk_callback(watcher->fd,
- 0/*TODO*/,
+ rc = StrBuf_write_one_chunk_callback(IO->SendBuf.fd,
+ 0,
&IO->SendBuf);
}
}
}
else if (rc < 0) {
- IO_Timeout_callback(loop, &IO->rw_timeout, revents);
+ if (errno != EAGAIN) {
+ EV_syslog(LOG_DEBUG,
+ "EVENT: Socket Invalid! [%d] [%s] [%d]\n",
+ errno, strerror(errno), IO->SendBuf.fd);
+ IO_Timeout_callback(loop, &IO->rw_timeout, revents);
+ }
}
/* else : must write more. */
}
static void
set_start_callback(struct ev_loop *loop, AsyncIO *IO, int revents)
{
+ ev_timer_stop(event_base, &IO->conn_fail);
+ ev_timer_start(event_base, &IO->rw_timeout);
+
switch(IO->NextState) {
case eReadMore:
case eReadMessage:
case eReadFile:
+ StrBufAppendBufPlain(IO->ErrMsg, HKEY("[while waiting for greeting]"), 0);
ev_io_start(event_base, &IO->recv_event);
break;
case eSendReply:
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 != 0))
+ {
+ 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)
{
}
break;
default:
- nbytes = StrBuf_read_one_chunk_callback(watcher->fd,
- 0 /*TODO */,
+ nbytes = StrBuf_read_one_chunk_callback(IO->RecvBuf.fd,
+ 0,
&IO->RecvBuf);
break;
}
IO_Timeout_callback(loop, &IO->rw_timeout, revents);
return;
} else if (nbytes == -1) {
- // FD is gone. kick it.
- StopClientWatchers(IO);
- EV_syslog(LOG_DEBUG,
- "EVENT: Socket Invalid! %s \n",
- strerror(errno));
- ShutDownCLient(IO);
+ if (errno != EAGAIN) {
+ // FD is gone. kick it.
+ StopClientWatchers(IO);
+ EV_syslog(LOG_DEBUG,
+ "EVENT: Socket Invalid! [%d] [%s] [%d]\n",
+ errno, strerror(errno), IO->SendBuf.fd);
+ ShutDownCLient(IO);
+ }
return;
}
}
if (rc >= 0){
EVM_syslog(LOG_DEBUG, "connect() immediate success.\n");
set_start_callback(event_base, IO, 0);
- ev_timer_start(event_base, &IO->rw_timeout);
return IO->NextState;
}
else if (errno == EINPROGRESS) {