#define SEND_EVENT 1
#define RECV_EVENT 2
-#define CONN_EVENT 3
int QueueEventContext(void *Ctx, AsyncIO *IO, EventContextAttach CB)
{
FreeStrBuf(&IO->IOBuf);
FreeStrBuf(&IO->SendBuf.Buf);
FreeStrBuf(&IO->RecvBuf.Buf);
+ FreeStrBuf(&IO->ErrMsg);
+ ares_destroy(IO->DNSChannel);
}
case RECV_EVENT:
ev_io_stop(event_base, &IO->recv_event);
break;
- case CONN_EVENT:
- ev_io_stop(event_base, &IO->conn_event);
- break;
case 0:
// no event active here; just bail out.
break;
static void
-set_start_callback(struct ev_loop *loop, ev_io *watcher, int revents)
+set_start_callback(struct ev_loop *loop, AsyncIO *IO, int revents)
{
- AsyncIO *IO = watcher->data;
-
switch(IO->NextState) {
case eReadMessage:
ev_io_start(event_base, &IO->recv_event);
break;
case eSendReply:
case eSendMore:
- IO_send_callback(loop, watcher, revents);
+ IO_send_callback(loop, &IO->send_event, revents);
break;
case eTerminateConnection:
case eAbort:
}
}
-static void
-IO_connect_callback(struct ev_loop *loop, ev_io *watcher, int revents)
-{
- AsyncIO *IO = watcher->data;
-
- ev_io_stop(event_base, &IO->conn_event);
- IO->active_event = 0;
- set_start_callback(loop, watcher, revents);
-}
-
int event_connect_socket(AsyncIO *IO)
{
+ struct sockaddr_in saddr;
int fdflags;
int rc = -1;
- IO->SendBuf.fd =
- IO->RecvBuf.fd =
+ IO->SendBuf.fd = IO->RecvBuf.fd =
IO->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
/*
IO->curr_ai->ai_family,
ev_io_init(&IO->send_event, IO_send_callback, IO->sock, EV_WRITE);
IO->send_event.data = IO;
- unsigned short dport = atoi("25"); ///todo
- struct sockaddr_in saddr;
memset( (struct sockaddr_in *)&saddr, '\0', sizeof( saddr ) );
memcpy(&saddr.sin_addr,
IO->HEnt->h_addr_list[0],
sizeof(struct in_addr));
+
+// saddr.sin_addr.s_addr = inet_addr("85.88.5.80");
saddr.sin_family = AF_INET;
- saddr.sin_port = htons(dport);/// TODO
+ saddr.sin_port = htons(IO->dport);
rc = connect(IO->sock,
(struct sockaddr *) &saddr,
/// TODO: ipv6?? (IO->HEnt->h_addrtype == AF_INET6)?
/* sizeof(in6_addr):*/
sizeof(struct sockaddr_in));
- if (rc >= 0) {
+ if ((rc >= 0) || (errno == EINPROGRESS)){
//// freeaddrinfo(res);
- ev_io_init(&IO->conn_event, IO_send_callback, IO->sock, EV_WRITE);
- IO->conn_event.data = IO;
- set_start_callback(event_base, &IO->conn_event, 0);
+ set_start_callback(event_base, IO, 0);
return 0;
}
- else if (errno == EINPROGRESS) {
- ev_io_init(&IO->conn_event, IO_connect_callback, IO->sock, EV_READ|EV_WRITE);
- IO->conn_event.data = IO;
-/* TODO
-
- event_set(&IO->conn_event,
- IO->sock,
- EV_READ|EV_WRITE|EV_PERSIST,
- IO_connect_callback,
- IO);
-*/
- ev_io_start(event_base, &IO->conn_event);
-
- IO->active_event = CONN_EVENT;
- return 1;
- }
else {
CtdlLogPrintf(CTDL_ERR, "connect() failed: %s\n", strerror(errno));
StrBufPrintf(IO->ErrMsg, "Failed to connect: %s", strerror(errno));
IO->ReadDone = ReadDone;
IO->Terminate = Terminate;
IO->LineReader = LineReader;
-
+
if (ReadFirst) {
IO->NextState = eReadMessage;
}