eNextState get_one_mx_host_ip_done(AsyncIO *IO) { SmtpOutMsg *Msg = IO->Data; struct hostent *hostent; IO->ConnectMe = Msg->pCurrRelay; QueryCbDone(IO); EVS_syslog(LOG_DEBUG, "%s Time[%fs]\n", __FUNCTION__, IO->Now - IO->DNS.Start); hostent = Msg->HostLookup.VParsedDNSReply; if ((Msg->HostLookup.DNSStatus == ARES_SUCCESS) && (hostent != NULL) ) { memset(&Msg->pCurrRelay->Addr, 0, sizeof(struct in6_addr)); if (Msg->pCurrRelay->IPv6) { memcpy(&Msg->pCurrRelay->Addr.sin6_addr.s6_addr, &hostent->h_addr_list[0], sizeof(struct in6_addr)); Msg->pCurrRelay->Addr.sin6_family = hostent->h_addrtype; Msg->pCurrRelay->Addr.sin6_port = htons(Msg->IO.ConnectMe->Port); } else { struct sockaddr_in *addr; /* * Bypass the ns lookup result like this: * IO->Addr.sin_addr.s_addr = inet_addr("127.0.0.1"); * addr->sin_addr.s_addr = * htonl((uint32_t)&hostent->h_addr_list[0]); */ addr = (struct sockaddr_in*) &Msg->pCurrRelay->Addr; memcpy(&addr->sin_addr.s_addr, hostent->h_addr_list[0], sizeof(uint32_t)); addr->sin_family = hostent->h_addrtype; addr->sin_port = htons(Msg->IO.ConnectMe->Port); } Msg->mx_host = Msg->pCurrRelay->Host; if (Msg->HostLookup.VParsedDNSReply != NULL) { Msg->HostLookup.DNSReplyFree(Msg->HostLookup.VParsedDNSReply); Msg->HostLookup.VParsedDNSReply = NULL; } return mx_connect_ip(IO); } else { SetSMTPState(IO, eSTMPfailOne); if (Msg->HostLookup.VParsedDNSReply != NULL) { Msg->HostLookup.DNSReplyFree(Msg->HostLookup.VParsedDNSReply); Msg->HostLookup.VParsedDNSReply = NULL; } return FailOneAttempt(IO); } }
eNextState pop3_get_one_host_ip_done(AsyncIO *IO) { pop3aggr *cpptr = IO->Data; struct hostent *hostent; QueryCbDone(IO); hostent = cpptr->HostLookup.VParsedDNSReply; if ((cpptr->HostLookup.DNSStatus == ARES_SUCCESS) && (hostent != NULL) ) { memset(&cpptr->IO.ConnectMe->Addr, 0, sizeof(struct in6_addr)); if (cpptr->IO.ConnectMe->IPv6) { memcpy(&cpptr->IO.ConnectMe->Addr.sin6_addr.s6_addr, &hostent->h_addr_list[0], sizeof(struct in6_addr)); cpptr->IO.ConnectMe->Addr.sin6_family = hostent->h_addrtype; cpptr->IO.ConnectMe->Addr.sin6_port = htons(DefaultPOP3Port); } else { struct sockaddr_in *addr = (struct sockaddr_in*) &cpptr->IO.ConnectMe->Addr; memcpy(&addr->sin_addr.s_addr, hostent->h_addr_list[0], sizeof(uint32_t)); addr->sin_family = hostent->h_addrtype; addr->sin_port = htons(DefaultPOP3Port); } return pop3_connect_ip(IO); } else return eAbort; }
/***************************************************************************** * 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); }