return eSendReply;
}
+extern eNextState evcurl_handle_start(AsyncIO *IO);
+
+eNextState QueueCurlContext(AsyncIO *IO)
+{
+ IOAddHandler *h;
+ int i;
+
+ h = (IOAddHandler*)malloc(sizeof(IOAddHandler));
+ h->IO = IO;
+ h->EvAttch = evcurl_handle_start;
+
+ pthread_mutex_lock(&EventQueueMutex);
+ syslog(LOG_DEBUG, "EVENT Q\n");
+ i = ++evbase_count;
+ Put(InboundEventQueue, IKEY(i), h, NULL);
+ pthread_mutex_unlock(&EventQueueMutex);
+
+ ev_async_send (event_base, &AddJob);
+ syslog(LOG_DEBUG, "EVENT Q Done.\n");
+ return eSendReply;
+}
+
int ShutDownEventQueue(void)
{
pthread_mutex_lock(&DBEventQueueMutex);
while ((Finished == eBufferNotEmpty) &&
((IO->NextState == eReadMessage)||
(IO->NextState == eReadMore)||
+ (IO->NextState == eReadFile)||
(IO->NextState == eReadPayload)))
{
if (IO->RecvBuf.nBlobBytesWanted != 0) {
}
else { /* Reading lines... */
//// lex line reply in callback, or do it ourselves. as nnn-blabla means continue reading in SMTP
- if (IO->LineReader)
+ if ((IO->NextState == eReadFile) &&
+ (Finished == eBufferNotEmpty))
+ {
+ Finished = WriteIOBAlreadyRead(&IO->IOB, &Err);
+ if (Finished == eReadSuccess)
+ {
+ IO->NextState = eSendReply;
+ }
+ }
+ else if (IO->LineReader)
Finished = IO->LineReader(IO);
else
Finished = StrBufChunkSipLine(IO->IOBuf, &IO->RecvBuf);
ev_io_stop(event_base, &IO->recv_event);
IO->NextState = IO->ReadDone(IO);
Finished = StrBufCheckBuffer(&IO->RecvBuf);
- if ((IO->NextState == eReadFile) &&
- (Finished == eBufferNotEmpty))
- {
- Finished = WriteIOBAlreadyRead(&IO->IOB, &Err);
- if (Finished == eReadSuccess)
- {
- IO->NextState = eSendReply;
- }
- }
}
}
IO_recv_callback(struct ev_loop *loop, ev_io *watcher, int revents)
{
const char *errmsg;
- long rc;
ssize_t nbytes;
AsyncIO *IO = watcher->data;
switch (IO->NextState) {
case eReadFile:
- rc = FileRecvChunked(&IO->IOB, &errmsg);
- if (rc < 0)
+ nbytes = FileRecvChunked(&IO->IOB, &errmsg);
+ if (nbytes < 0)
StrBufPlain(IO->ErrMsg, errmsg, -1);
+ else
+ {
+ if (IO->IOB.ChunkSendRemain == 0)
+ {
+ IO->NextState = eSendReply;
+ }
+ else
+ return;
+ }
break;
default:
nbytes = StrBuf_read_one_chunk_callback(watcher->fd, 0 /*TODO */, &IO->RecvBuf);
break;
}
+
#ifdef BIGBAD_IODBG
{
int rv = 0;
syslog(LOG_DEBUG,
"EVENT: Socket Invalid! %s \n",
strerror(errno));
+ ShutDownCLient(IO);
return;
}
}
syslog(LOG_DEBUG, "event: %s\n", __FUNCTION__);
become_session(IO->CitContext);
assert(IO->DNSFail);
+ assert(IO->DNSQuery->PostDNS);
switch (IO->DNSQuery->PostDNS(IO))
{
case eAbort: