- change URL struct to contain sockaddr_in6
- change URL-Parsing to add that indirection
- change all pointer indirections so the new way fits
IO->rw_timeout.data = IO;
if (IO->IP6)
IO->rw_timeout.data = IO;
if (IO->IP6)
- rc = connect(IO->sock, &IO->Addr, sizeof(struct sockaddr_in6));
+ rc = connect(IO->sock, IO->Addr, sizeof(struct sockaddr_in6));
- rc = connect(IO->sock, (struct sockaddr_in *)&IO->Addr, sizeof(struct sockaddr_in));
+ rc = connect(IO->sock, (struct sockaddr_in *)IO->Addr, sizeof(struct sockaddr_in));
if (rc >= 0){
//// freeaddrinfo(res);
if (rc >= 0){
//// freeaddrinfo(res);
/* connection related */
int IP6;
/* connection related */
int IP6;
- struct sockaddr_in6 Addr;
+ struct sockaddr_in6 *Addr;
int sock;
unsigned short dport;
int sock;
unsigned short dport;
buf[0] = '\0';
if (IO->IP6) {
buf[0] = '\0';
if (IO->IP6) {
- src = &IO->Addr.sin6_addr;
+ src = &IO->Addr->sin6_addr;
- struct sockaddr_in *addr = (struct sockaddr_in *)&IO->Addr;
+ struct sockaddr_in *addr = (struct sockaddr_in *)IO->Addr;
src = &addr->sin_addr.s_addr;
}
src = &addr->sin_addr.s_addr;
}
*****************************************************************************/
eNextState mx_connect_relay_ip(AsyncIO *IO)
{
*****************************************************************************/
eNextState mx_connect_relay_ip(AsyncIO *IO)
{
SmtpOutMsg *SendMsg = IO->Data;
CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
SmtpOutMsg *SendMsg = IO->Data;
CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
}
else {
struct sockaddr_in *addr = (struct sockaddr_in*) &IO->Addr;
}
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"); */
+ /* 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));
memcpy(&addr->sin_addr,///.s_addr,
&SendMsg->pCurrRelay->Addr,
sizeof(struct in_addr));
SMTP_C_ConnTimeout,
SMTP_C_ReadTimeouts[0],
1);
SMTP_C_ConnTimeout,
SMTP_C_ReadTimeouts[0],
1);
}
eNextState get_one_mx_host_ip_done(AsyncIO *IO)
}
eNextState get_one_mx_host_ip_done(AsyncIO *IO)
if ((SendMsg->HostLookup.DNSStatus == ARES_SUCCESS) &&
(hostent != NULL) ) {
if ((SendMsg->HostLookup.DNSStatus == ARES_SUCCESS) &&
(hostent != NULL) ) {
- IO->IP6 = hostent->h_addrtype == AF_INET6;
+/// IO->IP6 = hostent->h_addrtype == AF_INET6;
+
+/// SendMsg->pCurrRelay->Addr
+
+
- memset(&IO->Addr, 0, sizeof(struct in6_addr));
+ memset(&SendMsg->pCurrRelay->Addr, 0, sizeof(struct in6_addr));
- memcpy(&IO->Addr.sin6_addr.s6_addr,
+ memcpy(&SendMsg->pCurrRelay->Addr.sin6_addr.s6_addr,
&hostent->h_addr_list[0],
sizeof(struct in6_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(IO->dport);
- 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,
/* 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,
}
////SendMsg->IO.HEnt = hostent;
}
////SendMsg->IO.HEnt = hostent;
+ SendMsg->IO.Addr = &SendMsg->pCurrRelay->Addr;
SetConnectStatus(IO);
return InitEventIO(IO,
SendMsg,
SetConnectStatus(IO);
return InitEventIO(IO,
SendMsg,
- 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,
CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
CtdlLogPrintf(CTDL_DEBUG,
"SMTP client[%ld]: looking up %s : %d ...\n",
SendMsg->n,
+ SendMsg->pCurrRelay->Host,
-// TODO: ns_t_aaaa
- if (!QueueQuery(ns_t_a,
- Hostname,
+
+ if (!QueueQuery((SendMsg->pCurrRelay->IPv6)? ns_t_aaaa : ns_t_a,
+ SendMsg->pCurrRelay->Host,
&SendMsg->IO,
&SendMsg->HostLookup,
get_one_mx_host_ip_done))
&SendMsg->IO,
&SendMsg->HostLookup,
get_one_mx_host_ip_done))
QueryCbDone(IO);
CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
QueryCbDone(IO);
CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+ SendMsg->pCurrRelay = SendMsg->Relay;
pp = &SendMsg->Relay;
while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))
pp = &(*pp)->Next;
pp = &SendMsg->Relay;
while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))
pp = &(*pp)->Next;
{ /* ok, we found mx records. */
SendMsg->IO.ErrMsg = SendMsg->MyQEntry->StatusMessage;
{ /* ok, we found mx records. */
SendMsg->IO.ErrMsg = SendMsg->MyQEntry->StatusMessage;
SendMsg->CurrMX = SendMsg->AllMX
= IO->DNSQuery->VParsedDNSReply;
while (SendMsg->CurrMX) {
SendMsg->CurrMX = SendMsg->AllMX
= IO->DNSQuery->VParsedDNSReply;
while (SendMsg->CurrMX) {
StrBufExtract_NextToken(One, All, &Pos, '|');
if (!ParseURL(Url, One, 25))
CtdlLogPrintf(CTDL_DEBUG, "Failed to parse: %s\n", ChrPtr(One));
StrBufExtract_NextToken(One, All, &Pos, '|');
if (!ParseURL(Url, One, 25))
CtdlLogPrintf(CTDL_DEBUG, "Failed to parse: %s\n", ChrPtr(One));
+ else {
+ ///if (!Url->IsIP)) /// todo dupe me fork ipv6
}
FreeStrBuf(&All);
FreeStrBuf(&One);
}
FreeStrBuf(&All);
FreeStrBuf(&One);
int IPv6;
int af;
struct hostent *HEnt;
int IPv6;
int af;
struct hostent *HEnt;
+ struct sockaddr_in6 Addr;
}
if (pPort != NULL)
url->Port = atol(pPort);
}
if (pPort != NULL)
url->Port = atol(pPort);
- url->IsIP = inet_pton(url->af, url->Host, &url->Addr);
+ url->IsIP = inet_pton(url->af, url->Host, &url->Addr.sin6_addr);