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 ; }