Select mail servers for a domain

Return TypeFunction nameArguments
hzEcodehzDNS::SelectMX(hzList<hzResServer>&,const char*,)

Declared in file: hzDNS.h
Defined in file : hzDNS.cpp

Function Logic:

0:START 1:items 2:unknown 3:Return hzerr(E_ARGUMENT,No domain name supplied) 4:rc 5:unknown 6:Return rc 7:unknown 8:items 9:unknown 10:dr 11:unknown 12:unknown 13:items 14:S S S items 15:Return rc

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