#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
+#include <arpa/nameser.h>
+#include <ares.h>
typedef struct AsyncIO AsyncIO;
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;
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 */
IO_CallBack CustomDNS,
IO_LineReaderCallback LineReader,
int ReadFirst);
+
+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;
return 0;
}
ares_query(IO->DNSChannel, name, ns_c_in, Type, QueryCb, IO);
+ ares_fds(IO->DNSChannel, &rfd, &wfd);
return 1;
}
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,
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);
+
+
}