| 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)
{
_hzfunc("hzDNS::SelectMX") ;
hzList<hzResServer> smx ;
hzList<hzResServer>::Iter I ;
hzList<DnsRec>::Iter ri ;
hzList<DnsRec>::Iter si ;
hzDNS dq ;
hzDNS dq2 ;
hzResServer S ;
hzResServer X ;
DnsRec dr ;
DnsRec dr2 ;
hzEcode rc = E_OK ;
m_Error.Clear() ;
if (!dom || !dom[0])
return hzerr(E_ARGUMENT, "No domain name supplied") ;
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()) ;
for (ri = dq.m_arAns ; ri.Valid() ; ri++)
{
dr = ri.Element() ;
if (dr.m_Ipa == IPADDR_NULL || dr.m_Ipa == IPADDR_LOCAL)
{
if (_hzGlobal_Debug & HZ_DEBUG_DNS)
m_Error.Printf("Domain %s Server %s - NULL IP (case 1)\n", *dr.m_Domain, *dr.m_Server) ;
}
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 ;
}