Select mail servers for a domain
| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | hzDNS::SelectMX | (hzList<hzResServer>&,const char*,) |
Declared in file: hzDNS.h
Defined in file : hzDNS.cpp
Function Logic:
Function body:
hzEcode hzDNS::SelectMX (hzList<hzResServer>& ServersMX)const char* dom,
{
// Select mail servers for a domain
//
// Arguments: 1) ServersMX The list of mail servers
// 2) dom Domain name
//
// Returns: E_ARGUMENT If the domain name is not supplied
// E_INITFAIL If res_init() has not been called before and now returns an error
// E_OVERFLOW If the res_search function owverfills the buffer
// E_DNS_NOHOST If the host does not exist
// E_DNS_NODATA If the domain exists but there is no host for the applicable service
// E_DNS_RETRY If the DNS could not provide data at this time
// E_DNS_FAILED If the DNS failed
// E_OK If the DNS query was successful
_hzfunc("hzDNS::SelectMX") ;
hzList<hzResServer> smx ; // Server names from MX query
hzList<hzResServer>::Iter I ; // Server interator
hzList<DnsRec>::Iter ri ; // DNS record iterator (primary)
hzList<DnsRec>::Iter si ; // DNS record iterator (secondary)
hzDNS dq ; // DNS query primary
hzDNS dq2 ; // DNS query secondary
hzResServer S ; // Server instance
hzResServer X ; // Server instance
DnsRec dr ; // DNS record
DnsRec dr2 ; // DNS record
hzEcode rc = E_OK ; // Return code from DNS lookup functions
// Clear m_Error
m_Error.Clear() ;
// Check args
if (!dom || !dom[0])
return hzerr(E_ARGUMENT, "No domain name supplied") ;
// Lookup MX records in DNS
rc = dq.QueryMX(dom) ;
if (rc != E_OK)
return rc ;
if (_hzGlobal_Debug & HZ_DEBUG_DNS)
m_Error.Printf("DNS found %d answers, %d auth and %d additional\n", dq.NoAnswers(), dq.NoAuth(), dq.NoAdditional()) ;
// Now have MX records for the domain. Sometimes mail servers listed here will have multiple IP addresses.
for (ri = dq.m_arAns ; ri.Valid() ; ri++)
{
dr = ri.Element() ;
if (dr.m_Ipa == IPADDR_NULL || dr.m_Ipa == IPADDR_LOCAL)
{
// Providing the server has a server name, its IP address can be found by a type A query
if (_hzGlobal_Debug & HZ_DEBUG_DNS)
m_Error.Printf("Domain %s Server %s - NULL IP (case 1)\n", *dr.m_Domain, *dr.m_Server) ;
// continue ;
}
S.m_Servername = dr.m_Server ;
S.m_nValue = dr.m_nValue ;
S.m_Ipa = dr.m_Ipa ;
ServersMX.Add(S) ;
}
/*
** if (!ServersMX.Count())
** {
** // This is where the initial answer did not for whatever reason, provide an IP address along with the servername.
**
** if (_hzGlobal_Debug & HZ_DEBUG_DNS)
** m_Error.Printf("Initial pass did not produce IP addresses for the mail servers\n") ;
**
** for (ri = dq.m_arAns ; ri.Valid() ; ri++)
** {
** dr = ri.Element() ;
**
** // Do a direct (type A) query on the mail server's name
** rc = dq2.QueryA(*dr.m_Domain) ;
** if (rc != E_OK)
** {
** if (_hzGlobal_Debug & HZ_DEBUG_DNS)
** m_Error.Printf("DNS Unavailable (case 2)\n") ;
** return rc ;
** }
**
** if (!dq2.NoAnswers())
** {
** if (_hzGlobal_Debug & HZ_DEBUG_DNS)
** m_Error.Printf("Type A query on mail-server <%s> produced no answers\n", *dr.m_Server) ;
** return E_DNS_FAILED ;
** }
**
** for (si = dq2.m_arAns ; si.Valid() ; si++)
** {
** dr2 = si.Element() ;
**
** if (dr2.m_Ipa == IPADDR_NULL || dr2.m_Ipa == IPADDR_LOCAL)
** {
** if (_hzGlobal_Debug & HZ_DEBUG_DNS)
** m_Error.Printf("Domain %s Server %s - NULL IP (case 2)\n", *dr2.m_Domain, *dr2.m_Server) ;
** continue ;
** }
**
** S.m_Servername = dr2.m_Server ;
** S.m_nValue = dr2.m_nValue ;
** S.m_Ipa = dr2.m_Ipa ;
** ServersMX.Add(S) ;
** }
** }
** }
**
** if (!ServersMX.Count())
** {
** // This is where the initial answer did not for whatever reason, provide an IP address along with the servername.
**
** if (_hzGlobal_Debug & HZ_DEBUG_DNS)
** m_Error.Printf("Initial pass did not produce IP addresses for the mail servers\n") ;
**
** for (ri = dq.m_arAns ; ri.Valid() ; ri++)
** {
** dr = ri.Element() ;
**
** // Do a direct (type A) query on the mail server's name
** rc = dq2.QueryA(*dr.m_Server) ;
** if (rc != E_OK)
** {
** if (_hzGlobal_Debug & HZ_DEBUG_DNS)
** m_Error.Printf("DNS Unavailable (case 3)\n") ;
** return rc ;
** }
**
** if (!dq2.NoAnswers())
** {
** if (_hzGlobal_Debug & HZ_DEBUG_DNS)
** m_Error.Printf("Type A query on mail-server <%s> produced no answers\n", *dr.m_Server) ;
** return E_DNS_FAILED ;
** }
**
** for (si = dq2.m_arAns ; si.Valid() ; si++)
** {
** dr2 = si.Element() ;
**
** if (dr2.m_Ipa == IPADDR_NULL || dr2.m_Ipa == IPADDR_LOCAL)
** {
** if (_hzGlobal_Debug & HZ_DEBUG_DNS)
** m_Error.Printf("Domain %s Server %s - NULL IP (case 3)\n", *dr2.m_Domain, *dr2.m_Server) ;
** continue ;
** }
**
** S.m_Servername = dr2.m_Server ;
** S.m_nValue = dr2.m_nValue ;
** S.m_Ipa = dr2.m_Ipa ;
** ServersMX.Add(S) ;
** }
** }
** }
** */
return rc ;
}