From 9985db24464855946b7b2647d0dc5f94609a2ee0 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 4 Jan 2011 00:00:47 +0100 Subject: [PATCH] libev/libc-ares migration - move c-ares query into the eventqueue context - queueing of the new context via the pipe doesn't work anymore with libev --- citadel/event_client.h | 14 ++++++++++ citadel/modules/c-ares-dns/serv_c-ares-dns.c | 2 ++ citadel/modules/smtp/serv_smtpeventclient.c | 29 ++++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/citadel/event_client.h b/citadel/event_client.h index 0e6cae953..39a9c11be 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -2,6 +2,8 @@ #include #include #include +#include +#include typedef struct AsyncIO AsyncIO; @@ -16,6 +18,8 @@ typedef enum _eNextState { typedef int (*EventContextAttach)(void *Data); typedef eNextState (*IO_CallBack)(void *Data); typedef eReadState (*IO_LineReaderCallback)(AsyncIO *IO); +typedef void (*ParseDNSAnswerCb)(AsyncIO*, unsigned char*, int); +typedef void (*FreeDNSReply)(void *DNSData); struct AsyncIO { StrBuf *Host; @@ -49,6 +53,14 @@ struct AsyncIO { IO_LineReaderCallback LineReader; /* if we have linereaders, maybe we want to read more lines before the real application logic is called? */ + struct ares_options DNSOptions; + ares_channel DNSChannel; + ParseDNSAnswerCb DNS_CB; + IO_CallBack PostDNS; + int DNSStatus; + void *VParsedDNSReply; + FreeDNSReply DNSReplyFree; + /* Custom data; its expected to contain AsyncIO so we can save malloc()s... */ DeleteHashDataFunc DeleteData; /* so if we have to destroy you, what to do... */ void *Data; /* application specific data */ @@ -74,3 +86,5 @@ void InitEventIO(AsyncIO *IO, IO_CallBack CustomDNS, IO_LineReaderCallback LineReader, int ReadFirst); + +int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS); diff --git a/citadel/modules/c-ares-dns/serv_c-ares-dns.c b/citadel/modules/c-ares-dns/serv_c-ares-dns.c index 737f40452..2de80574d 100644 --- a/citadel/modules/c-ares-dns/serv_c-ares-dns.c +++ b/citadel/modules/c-ares-dns/serv_c-ares-dns.c @@ -465,6 +465,7 @@ int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS) int length, family; char address_b[sizeof(struct in6_addr)]; int optmask = 0; + int rfd, wfd; optmask |= ARES_OPT_SOCK_STATE_CB; IO->DNSOptions.sock_state_cb = SockStateCb; @@ -522,6 +523,7 @@ int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS) return 0; } ares_query(IO->DNSChannel, name, ns_c_in, Type, QueryCb, IO); + ares_fds(IO->DNSChannel, &rfd, &wfd); return 1; } diff --git a/citadel/modules/smtp/serv_smtpeventclient.c b/citadel/modules/smtp/serv_smtpeventclient.c index 5a4a51439..ffc18bc87 100644 --- a/citadel/modules/smtp/serv_smtpeventclient.c +++ b/citadel/modules/smtp/serv_smtpeventclient.c @@ -924,6 +924,28 @@ eNextState SMTPC_send_dummy(SmtpOutMsg *SendMsg) return eReadMessage; } +eNextState smtp_resolve_one_smtpsrv_start(void *data) +{ + AsyncIO *IO = data; + SmtpOutMsg * SendMsg = IO->Data; +/// resolve_mx_hosts(SendMsg); + //// connect_one_smtpsrv_xamine_result + + connect_one_smtpsrv(SendMsg); +} + +int resolve_mx_records(void *Ctx) +{ + SmtpOutMsg * SendMsg; + if (!QueueQuery(ns_t_mx, + SendMsg->node, + &SendMsg->IO, + smtp_resolve_one_smtpsrv_start)) + { + /// TODO: abort + } +} + void smtp_try(OneQueItem *MyQItem, MailQEntry *MyQEntry, StrBuf *MsgText, @@ -943,11 +965,12 @@ void smtp_try(OneQueItem *MyQItem, SendMsg->msgtext = NewStrBufDup(MsgText); smtp_resolve_recipients(SendMsg); - resolve_mx_hosts(SendMsg); - connect_one_smtpsrv(SendMsg); + QueueEventContext(SendMsg, &SendMsg->IO, - connect_one_smtpsrv_xamine_result); + resolve_mx_records); + + } -- 2.30.2