eNextState SMTP_C_Terminate(AsyncIO *IO);
eReadState SMTP_C_ReadServerStatus(AsyncIO *IO);
+eNextState mx_connect_ip(AsyncIO *IO);
+eNextState get_one_mx_host_ip(AsyncIO *IO);
+
/******************************************************************************
* So, we're finished with sending (regardless of success or failure) *
* This Message might be referenced by several Queue-Items, if we're the last,*
eNextState FailOneAttempt(AsyncIO *IO)
{
+ SmtpOutMsg *SendMsg = IO->Data;
/*
* possible ways here:
* - connection timeout
* -
*/
+ SendMsg->pCurrRelay = SendMsg->pCurrRelay->Next;
+
+ if (SendMsg->pCurrRelay == NULL)
+ return eAbort;
+ if (SendMsg->pCurrRelay->IsIP)
+ return mx_connect_ip(IO);
+ else
+ return get_one_mx_host_ip(IO);
}
-////TODO
-
void SetConnectStatus(AsyncIO *IO)
{
buf[0] = '\0';
- if (IO->IP6) {
- src = &IO->Addr.sin6_addr;
+ if (IO->ConnectMe->IPv6) {
+ src = &IO->ConnectMe->Addr.sin6_addr;
}
else {
- struct sockaddr_in *addr = (struct sockaddr_in *)&IO->Addr;
+ struct sockaddr_in *addr = (struct sockaddr_in *)&IO->ConnectMe->Addr;
src = &addr->sin_addr.s_addr;
}
- inet_ntop((IO->IP6)?AF_INET6:AF_INET,
+ inet_ntop((IO->ConnectMe->IPv6)?AF_INET6:AF_INET,
src,
- buf, sizeof(buf));
+ buf,
+ sizeof(buf));
+
if (SendMsg->mx_host == NULL)
SendMsg->mx_host = "<no name>";
SendMsg->n,
SendMsg->mx_host,
buf,
- SendMsg->IO.dport);
+ SendMsg->IO.ConnectMe->Port);
SendMsg->MyQEntry->Status = 5;
StrBufPrintf(SendMsg->MyQEntry->StatusMessage,
"Timeout while connecting %s [%s]:%d ",
SendMsg->mx_host,
buf,
- SendMsg->IO.dport);
+ SendMsg->IO.ConnectMe->Port);
}
/*****************************************************************************
* So we connect our Relay IP here. *
*****************************************************************************/
-eNextState mx_connect_relay_ip(AsyncIO *IO)
+eNextState mx_connect_ip(AsyncIO *IO)
{
-
SmtpOutMsg *SendMsg = IO->Data;
CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
-
- IO->IP6 = SendMsg->pCurrRelay->af == AF_INET6;
- if (SendMsg->pCurrRelay->Port != 0)
- IO->dport = SendMsg->pCurrRelay->Port;
-
- memset(&IO->Addr, 0, sizeof(struct sockaddr_in6));
- if (IO->IP6) {
- memcpy(&IO->Addr.sin6_addr.s6_addr,
- &SendMsg->pCurrRelay->Addr,
- sizeof(struct in6_addr));
-
- IO->Addr.sin6_family = AF_INET6;
- IO->Addr.sin6_port = htons(IO->dport);
- }
- else {
- struct sockaddr_in *addr = (struct sockaddr_in*) &IO->Addr;
- /* Bypass the ns lookup result like this: IO->Addr.sin_addr.s_addr = inet_addr("127.0.0.1"); */
- memcpy(&addr->sin_addr,///.s_addr,
- &SendMsg->pCurrRelay->Addr,
- sizeof(struct in_addr));
-
- addr->sin_family = AF_INET;
- addr->sin_port = htons(IO->dport);
- }
+ IO->ConnectMe = SendMsg->pCurrRelay;
+ /* Bypass the ns lookup result like this: IO->Addr.sin_addr.s_addr = inet_addr("127.0.0.1"); */
SetConnectStatus(IO);
hostent = SendMsg->HostLookup.VParsedDNSReply;
if ((SendMsg->HostLookup.DNSStatus == ARES_SUCCESS) &&
(hostent != NULL) ) {
-
- IO->IP6 = hostent->h_addrtype == AF_INET6;
- ////IO->HEnt = hostent;
-
- memset(&IO->Addr, 0, sizeof(struct in6_addr));
- if (IO->IP6) {
- memcpy(&IO->Addr.sin6_addr.s6_addr,
+ memset(&SendMsg->pCurrRelay->Addr, 0, sizeof(struct in6_addr));
+ if (SendMsg->pCurrRelay->IPv6) {
+ memcpy(&SendMsg->pCurrRelay->Addr.sin6_addr.s6_addr,
&hostent->h_addr_list[0],
sizeof(struct in6_addr));
- IO->Addr.sin6_family = hostent->h_addrtype;
- IO->Addr.sin6_port = htons(IO->dport);
+ SendMsg->pCurrRelay->Addr.sin6_family = hostent->h_addrtype;
+ SendMsg->pCurrRelay->Addr.sin6_port = htons(DefaultMXPort);
}
else {
- struct sockaddr_in *addr = (struct sockaddr_in*) &IO->Addr;
+ struct sockaddr_in *addr = (struct sockaddr_in*) &SendMsg->pCurrRelay->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]);
memcpy(&addr->sin_addr.s_addr,
sizeof(uint32_t));
addr->sin_family = hostent->h_addrtype;
- addr->sin_port = htons(IO->dport);
+ addr->sin_port = htons(DefaultMXPort);
}
- ////SendMsg->IO.HEnt = hostent;
- SetConnectStatus(IO);
- return InitEventIO(IO,
- SendMsg,
- SMTP_C_ConnTimeout,
- SMTP_C_ReadTimeouts[0],
- 1);
+ return mx_connect_ip(IO);
}
else // TODO: here we need to find out whether there are more mx'es, backup relay, and so on
- return SMTP_C_Terminate(IO);
+ return FailOneAttempt(IO);
}
-/*
-
- if (SendMsg->pCurrRelay != NULL) {
- SendMsg->mx_host = Hostname = SendMsg->pCurrRelay->Host;
- if (SendMsg->pCurrRelay->Port != 0)
- SendMsg->IO.dport = SendMsg->pCurrRelay->Port;
- }
- else
-*/
eNextState get_one_mx_host_ip(AsyncIO *IO)
{
SmtpOutMsg * SendMsg = IO->Data;
- const char *Hostname;
- //char *endpart;
- //char buf[SIZ];
-
/*
* here we start with the lookup of one host. it might be...
* - the relay host *sigh*
InitC_ares_dns(IO);
- if (SendMsg->mx_host != NULL) Hostname = SendMsg->mx_host;
- else Hostname = SendMsg->node;
-
CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
CtdlLogPrintf(CTDL_DEBUG,
"SMTP client[%ld]: looking up %s : %d ...\n",
SendMsg->n,
- Hostname,
- SendMsg->IO.dport);
-// TODO: ns_t_aaaa
- if (!QueueQuery(ns_t_a,
- Hostname,
+ SendMsg->pCurrRelay->Host,
+ SendMsg->pCurrRelay->Port);
+
+ if (!QueueQuery((SendMsg->pCurrRelay->IPv6)? ns_t_aaaa : ns_t_a,
+ SendMsg->pCurrRelay->Host,
&SendMsg->IO,
&SendMsg->HostLookup,
get_one_mx_host_ip_done))
{ /* ok, we found mx records. */
SendMsg->IO.ErrMsg = SendMsg->MyQEntry->StatusMessage;
-
SendMsg->CurrMX = SendMsg->AllMX
= IO->DNSQuery->VParsedDNSReply;
while (SendMsg->CurrMX) {
p = (ParsedURL*) malloc(sizeof(ParsedURL));
memset(p, 0, sizeof(ParsedURL));
p->IsIP = 0;
- p->Port = 25; //// TODO define.
+ p->Port = DefaultMXPort;
p->IPv6 = i == 1;
p->Host = SendMsg->CurrMX->host;
*pp = p;
- pp = &p;
+ pp = &p->Next;
}
SendMsg->CurrMX = SendMsg->CurrMX->next;
}
-// SendMsg->mx_host = SendMsg->CurrMX->host;
-// SendMsg->CurrMX = SendMsg->CurrMX->next;
SendMsg->CXFlags = SendMsg->CXFlags & F_HAVE_MX;
}
else { /* else fall back to the plain hostname */
p = (ParsedURL*) malloc(sizeof(ParsedURL));
memset(p, 0, sizeof(ParsedURL));
p->IsIP = 0;
- p->Port = 25; //// TODO define.
+ p->Port = DefaultMXPort;
p->IPv6 = i == 1;
p->Host = SendMsg->node;
*pp = p;
pp = &p;
}
- /// SendMsg->mx_host = SendMsg->node;
SendMsg->CXFlags = SendMsg->CXFlags & F_DIRECT;
}
- (*pp)->Next = SendMsg->MyQItem->FallBackHost;
+ *pp = SendMsg->MyQItem->FallBackHost;
+ SendMsg->pCurrRelay = SendMsg->Relay;
return get_one_mx_host_ip(IO);
}
SendMsg->IO.RecvBuf.Buf = NewStrBufPlain(NULL, 1024);
SendMsg->IO.IOBuf = NewStrBuf();
- SendMsg->IO.sock = (-1);
SendMsg->IO.NextState = eReadMessage;
- SendMsg->IO.dport = DefaultMXPort;
-
+
return SendMsg;
}
else SendMsg->msgtext = NewStrBufDup(MsgText);
if (smtp_resolve_recipients(SendMsg)) {
+
+
+
+
if (SendMsg->pCurrRelay == NULL)
QueueEventContext(&SendMsg->IO,
resolve_mx_records);
else { /* oh... via relay host */
if (SendMsg->pCurrRelay->IsIP) {
QueueEventContext(&SendMsg->IO,
- mx_connect_relay_ip);
+ mx_connect_ip);
}
else { /* uneducated admin has chosen to add DNS to the equation... */
QueueEventContext(&SendMsg->IO,