- libev doesn't care whether a watcher is already registered or not, we don't need to remember which to stop and which not.
- cast to the right structure while aborting
- put timeout callback in
- register timeout callback
- close our socket in the right place.
extern HashList *InboundEventQueue;
extern struct ev_loop *event_base;
extern HashList *InboundEventQueue;
extern struct ev_loop *event_base;
-#define SEND_EVENT 1
-#define RECV_EVENT 2
int QueueEventContext(void *Ctx, AsyncIO *IO, EventContextAttach CB)
{
int QueueEventContext(void *Ctx, AsyncIO *IO, EventContextAttach CB)
{
void ShutDownCLient(AsyncIO *IO)
{
CtdlLogPrintf(CTDL_DEBUG, "EVENT x %d\n", IO->sock);
void ShutDownCLient(AsyncIO *IO)
{
CtdlLogPrintf(CTDL_DEBUG, "EVENT x %d\n", IO->sock);
- switch (IO->active_event) {
- case SEND_EVENT:
+
+ if (IO->sock != 0)
+ {
ev_io_stop(event_base, &IO->send_event);
ev_io_stop(event_base, &IO->send_event);
- break;
- case RECV_EVENT:
ev_io_stop(event_base, &IO->recv_event);
ev_io_stop(event_base, &IO->recv_event);
- break;
- case 0:
- // no event active here; just bail out.
- break;
+ close(IO->sock);
+ IO->sock = 0;
+ IO->SendBuf.fd = 0;
+ IO->RecvBuf.fd = 0;
IO->Terminate(IO->Data);
}
IO->Terminate(IO->Data);
}
if (Finished != eMustReadMore) {
ev_io_stop(event_base, &IO->recv_event);
if (Finished != eMustReadMore) {
ev_io_stop(event_base, &IO->recv_event);
IO->NextState = IO->ReadDone(IO->Data);
Finished = StrBufCheckBuffer(&IO->RecvBuf);
}
IO->NextState = IO->ReadDone(IO->Data);
Finished = StrBufCheckBuffer(&IO->RecvBuf);
}
{
IO->NextState = IO->SendDone(IO->Data);
ev_io_start(event_base, &IO->send_event);
{
IO->NextState = IO->SendDone(IO->Data);
ev_io_start(event_base, &IO->send_event);
-
- IO->active_event = SEND_EVENT;
-
}
else if ((IO->NextState == eTerminateConnection) ||
(IO->NextState == eAbort) )
}
else if ((IO->NextState == eTerminateConnection) ||
(IO->NextState == eAbort) )
}
#endif
ev_io_stop(event_base, &IO->send_event);
}
#endif
ev_io_stop(event_base, &IO->send_event);
switch (IO->NextState) {
case eSendReply:
break;
switch (IO->NextState) {
case eSendReply:
break;
ShutDownCLient(IO);
else {
ev_io_start(event_base, &IO->send_event);
ShutDownCLient(IO);
else {
ev_io_start(event_base, &IO->send_event);
-
- IO->active_event = SEND_EVENT;
}
break;
case eReadMessage:
}
break;
case eReadMessage:
}
else {
ev_io_start(event_base, &IO->recv_event);
}
else {
ev_io_start(event_base, &IO->recv_event);
-
- IO->active_event = RECV_EVENT;
switch(IO->NextState) {
case eReadMessage:
ev_io_start(event_base, &IO->recv_event);
switch(IO->NextState) {
case eReadMessage:
ev_io_start(event_base, &IO->recv_event);
- IO->active_event = RECV_EVENT;
break;
case eSendReply:
case eSendMore:
break;
case eSendReply:
case eSendMore:
IO_connfail_callback,
conn_timeout, 0);
IO->conn_fail.data = IO;
IO_connfail_callback,
conn_timeout, 0);
IO->conn_fail.data = IO;
+ ev_timer_start(event_base, &IO->conn_fail);
IO->ReadDone = ReadDone;
IO->Terminate = Terminate;
IO->LineReader = LineReader;
IO->ReadDone = ReadDone;
IO->Terminate = Terminate;
IO->LineReader = LineReader;
+ IO->ConnFail = ConnFail;
if (ReadFirst) {
IO->NextState = eReadMessage;
if (ReadFirst) {
IO->NextState = eReadMessage;
struct hostent *HEnt;
int sock;
unsigned short dport;
struct hostent *HEnt;
int sock;
unsigned short dport;
eNextState NextState;
ev_timer conn_fail,
eNextState NextState;
ev_timer conn_fail,
int ReadFirst);
int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS);
int ReadFirst);
int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS);
+
+void StopClient(AsyncIO *IO);
eMaxSMTPC
} eSMTP_C_States;
eMaxSMTPC
} eSMTP_C_States;
-const long SMTP_C_ConnTimeout = 300; /* wail 5 minutes for connections... */
+const long SMTP_C_ConnTimeout = 60; /* wail 1 minute for connections... */
const long SMTP_C_ReadTimeouts[eMaxSMTPC] = {
90, /* Greeting... */
30, /* EHLO */
const long SMTP_C_ReadTimeouts[eMaxSMTPC] = {
90, /* Greeting... */
30, /* EHLO */
RemoveQItem(Msg->MyQItem);
}
RemoveQItem(Msg->MyQItem);
}
void get_one_mx_host_ip_done(void *Ctx,
void get_one_mx_host_ip_done(void *Ctx,
- int status,
- int timeouts,
- struct hostent *hostent)
+ int status,
+ int timeouts,
+ struct hostent *hostent)
{
AsyncIO *IO = Ctx;
SmtpOutMsg *SendMsg = IO->Data;
{
AsyncIO *IO = Ctx;
SmtpOutMsg *SendMsg = IO->Data;
/*****************************************************************************/
eNextState SMTP_C_Terminate(void *Data)
{
/*****************************************************************************/
eNextState SMTP_C_Terminate(void *Data)
{
- SmtpOutMsg *pMsg = Data;
+ AsyncIO *IO = Data;
+ SmtpOutMsg *pMsg = IO->Data;
FinalizeMessageSend(pMsg);
return 0;
}
eNextState SMTP_C_Timeout(void *Data)
{
FinalizeMessageSend(pMsg);
return 0;
}
eNextState SMTP_C_Timeout(void *Data)
{
- SmtpOutMsg *pMsg = Data;
+ AsyncIO *IO = Data;
+ SmtpOutMsg *pMsg = IO->Data;
FinalizeMessageSend(pMsg);
return 0;
}
eNextState SMTP_C_ConnFail(void *Data)
{
FinalizeMessageSend(pMsg);
return 0;
}
eNextState SMTP_C_ConnFail(void *Data)
{
- SmtpOutMsg *pMsg = Data;
+ AsyncIO *IO = Data;
+ SmtpOutMsg *pMsg = IO->Data;
FinalizeMessageSend(pMsg);
return 0;
}
FinalizeMessageSend(pMsg);
return 0;
}