Ejemplo n.º 1
0
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);
	}
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
/*****************************************************************************
 * 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);
}