+ if (!QueueQuery((Msg->pCurrRelay->IPv6)? ns_t_aaaa : ns_t_a,
+ Msg->pCurrRelay->Host,
+ &Msg->IO,
+ &Msg->HostLookup,
+ get_one_mx_host_ip_done))
+ {
+ Msg->MyQEntry->Status = 5;
+ StrBufPrintf(Msg->MyQEntry->StatusMessage,
+ "No MX hosts found for <%s>", Msg->node);
+ Msg->IO.NextState = eTerminateConnection;
+ return IO->NextState;
+ }
+ IO->NextState = eReadDNSReply;
+ return IO->NextState;
+}
+
+
+/*****************************************************************************
+ * here we try to find out about the MX records for our recipients. *
+ *****************************************************************************/
+eNextState smtp_resolve_mx_record_done(AsyncIO *IO)
+{
+ SmtpOutMsg * Msg = IO->Data;
+ ParsedURL **pp;
+
+ QueryCbDone(IO);
+
+ EVS_syslog(LOG_DEBUG, "%s Time[%fs]\n",
+ __FUNCTION__,
+ IO->Now - IO->DNS.Start);
+
+ pp = &Msg->Relay;
+ while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))
+ pp = &(*pp)->Next;
+
+ if ((IO->DNS.Query->DNSStatus == ARES_SUCCESS) &&
+ (IO->DNS.Query->VParsedDNSReply != NULL))
+ { /* ok, we found mx records. */
+
+ Msg->CurrMX
+ = Msg->AllMX
+ = IO->DNS.Query->VParsedDNSReply;
+ while (Msg->CurrMX) {
+ int i;
+ for (i = 0; i < 2; i++) {
+ ParsedURL *p;
+
+ p = (ParsedURL*) malloc(sizeof(ParsedURL));
+ memset(p, 0, sizeof(ParsedURL));
+ p->Priority = Msg->CurrMX->priority;
+ p->IsIP = 0;
+ p->Port = DefaultMXPort;
+ p->IPv6 = i == 1;
+ p->Host = Msg->CurrMX->host;
+ if (*pp == NULL)
+ *pp = p;
+ else {
+ ParsedURL *ppp = *pp;
+
+ while ((ppp->Next != NULL) &&
+ (ppp->Next->Priority <= p->Priority))
+ ppp = ppp->Next;
+ if ((ppp == *pp) &&
+ (ppp->Priority > p->Priority)) {
+ p->Next = *pp;
+ *pp = p;
+ }
+ else {
+ p->Next = ppp->Next;
+ ppp->Next = p;
+ }
+ }
+ }
+ Msg->CurrMX = Msg->CurrMX->next;
+ }
+ Msg->CXFlags = Msg->CXFlags & F_HAVE_MX;
+ }
+ else { /* else fall back to the plain hostname */
+ int i;
+ for (i = 0; i < 2; i++) {
+ ParsedURL *p;
+
+ p = (ParsedURL*) malloc(sizeof(ParsedURL));
+ memset(p, 0, sizeof(ParsedURL));
+ p->IsIP = 0;
+ p->Port = DefaultMXPort;
+ p->IPv6 = i == 1;
+ p->Host = Msg->node;
+
+ *pp = p;
+ pp = &p->Next;
+ }
+ Msg->CXFlags = Msg->CXFlags & F_DIRECT;
+ }
+ if (Msg->MyQItem->FallBackHost != NULL)
+ {
+ Msg->MyQItem->FallBackHost->Next = *pp;
+ *pp = Msg->MyQItem->FallBackHost;
+ }
+ Msg->pCurrRelay = Msg->Relay;
+ return get_one_mx_host_ip(IO);