Return TypeFunction nameArguments
hzEcodehzDNS::Query(const char*,DnsType,)

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

Function Logic:

0:START 1:hzChain::Clear 2:!dom||!dom[0] 3:Return hzerr(E_ARGUMENT,No domain name supplied) 4:!m_cpDns 5:m_cpDns 6:ix 7:!ix 8:hzexit 9:!s_bInitResolver 10:res_init()==-1 11:Return hzerr(E_INITFAIL,Could not init DNS resolver) 12:s_bInitResolver 13:hzDNS::_clear GetThreadLogger pLog res_search nSize 14:nSize>=2000 15:Return hzerr(E_OVERFLOW,DNS buffer overflow for %s,dom) 16:nSize==-1 17:h_errno 18:HOST_NOT_FOUND 19:Return E_DNS_NOHOST 20:NO_DATA 21:Return E_DNS_NODATA 22:NO_RECOVERY 23:Return E_DNS_FAILED 24:TRY_AGAIN 25:Return E_DNS_RETRY 26:Return hzerr(E_DNS_FAILED,Unspecified error (%s) for domain %s,hstrerror(h_errno),dom) 27:m_cpDns 28:_hzGlobal_Debug&HZ_DEBUG_DNS 29:hzChain::Printf nCount 30:nCount<(uint32_t)nSize; 31:nCount<240&&m_cpDns[nCount]>32&&m_cpDns[nCount]<128 32:hzChain::Printf 33:hzChain::Printf 34:items 35:!(nCount%40) 36:hzChain::AddByte 37:hzChain::AddByte 38:nCount%40 39:hzChain::AddByte 40:hzChain::Printf 41:m_qID m_DNA nQus nAns nAut nAdd 42:_hzGlobal_Debug&HZ_DEBUG_DNS 43:hzChain::Printf hzChain::Printf hzChain::Printf hzChain::Printf hzChain::Printf hzChain::Printf 44:*ix; 45:ix nCount 46:nCount 47:DnsRec::Clear hzDNS::_procraw dr 48:!dr.m_Domain 49:hzLogger::Out 50:Return hzerr(E_DNS_FAILED,Answer record without domain) 51:_hzGlobal_Debug&HZ_DEBUG_DNS 52:hzChain::Printf 53:dr dr dr dr dr ix jx 54:_hzGlobal_Debug&HZ_DEBUG_DNS 55:hzChain::Printf 56:dr.m_nType==DNSTYPE_MX 57:dr ix 58:_hzGlobal_Debug&HZ_DEBUG_DNS 59:hzChain::Printf 60:dr.m_nType==DNSTYPE_A 61:hzIpaddr::SetValue 62:_hzGlobal_Debug&HZ_DEBUG_DNS 63:hzChain::Printf 64:dr.m_nType==DNSTYPE_AAAA 65:dr dr dr dr 66:_hzGlobal_Debug&HZ_DEBUG_DNS 67:hzChain::Printf 68:_hzGlobal_Debug&HZ_DEBUG_DNS 69:hzChain::AddByte 70:hzDNS::_procraw dr 71:!dr.m_Server 72:hzLogger::Out 73:Return hzerr(E_DNS_FAILED,Answer record without server) 74:hzList::Add ix nCount 75:nCount 76:DnsRec::Clear hzDNS::_procraw dr 77:!dr.m_Domain 78:hzLogger::Out 79:Return hzerr(E_DNS_FAILED,Authority record without domain) 80:_hzGlobal_Debug&HZ_DEBUG_DNS 81:hzChain::Printf 82:dr dr dr dr dr ix jx 83:_hzGlobal_Debug&HZ_DEBUG_DNS 84:hzChain::Printf 85:dr.m_nType==DNSTYPE_MX 86:dr ix 87:dr.m_nType==DNSTYPE_A 88:hzIpaddr::SetValue 89:dr.m_nType==DNSTYPE_AAAA 90:dr dr dr dr ix 91:hzDNS::_procraw dr 92:!dr.m_Server 93:hzLogger::Out 94:Return hzerr(E_DNS_FAILED,Authority record without server) 95:hzList::Add ix 96:Return E_OK

Function body:

hzEcode hzDNS::Query (const char* dom, DnsType eType)
{
   _hzfunc("hzDNS::Query") ;
   hzChain     errCh ;
   DnsRec      dr ;
   hzLogger*   pLog ;
   uchar*      ix ;
   uchar*      jx ;
   uint32_t    nQus ;
   uint32_t    nAns ;
   uint32_t    nAut ;
   uint32_t    nAdd ;
   uint32_t    nCount ;
   int32_t     nSize ;
   m_Error.Clear() ;
   if (!dom || !dom[0])
       return hzerr(E_ARGUMENT, "No domain name supplied") ;
   if (!m_cpDns)
       m_cpDns = new uchar[2048];
   ix = m_cpDns ;
   if (!ix)
       hzexit(E_MEMORY, "Could not allocate buffers for DNS query") ;
   if (!s_bInitResolver)
   {
       if (res_init() == -1)
           return hzerr(E_INITFAIL, "Could not init DNS resolver") ;
       s_bInitResolver = true ;
   }
   _clear() ;
   pLog = GetThreadLogger() ;
   /*
   **  ** Query the DNS
   **      */
   nSize = res_search(dom, C_IN, eType, m_cpDns, 2047);
   if (nSize >&eq; 2000)
       return hzerr(E_OVERFLOW, "DNS buffer overflow for %s", dom) ;
   if (nSize == -1)
   {
       switch (h_errno)
       {
       case HOST_NOT_FOUND:    return E_DNS_NOHOST ;
       case NO_DATA:           return E_DNS_NODATA ;
       case NO_RECOVERY:       return E_DNS_FAILED ;
       case TRY_AGAIN:         return E_DNS_RETRY ;
       }
       return hzerr(E_DNS_FAILED, "Unspecified error (%s) for domain %s", hstrerror(h_errno), dom) ;
   }
   m_cpDns[nSize] = 0;
   if (_hzGlobal_Debug & HZ_DEBUG_DNS)
   {
       errCh.Printf("DNS BUFFER (%d bytes) =\n[\n", nSize) ;
       for (nCount = 0; nCount < (uint32_t) nSize ;)
       {
           if (nCount < 240&&m_cpDns[nCount]> 32&&m_cpDns[nCount] < 128)
               errCh.Printf("  %c", m_cpDns[nCount]) ;
           else
               errCh.Printf(" %02x", m_cpDns[nCount]) ;
           nCount++ ;
           if (!(nCount % 40))
               errCh.AddByte(CHAR_NL) ;
           else
               errCh.AddByte(CHAR_SPACE) ;
       }
       if (nCount % 40)
           errCh.AddByte(CHAR_NL) ;
       errCh.Printf("]\n") ;
   }
   m_qID =  (m_cpDns[0] << 8)+ m_cpDns[1];
   m_DNA =  (m_cpDns[2] << 8)+ m_cpDns[3];
   nQus = (m_cpDns[4] << 8)+ m_cpDns[5];
   nAns = (m_cpDns[6] << 8)+ m_cpDns[7];
   nAut = (m_cpDns[8] << 8)+ m_cpDns[9];
   nAdd = (m_cpDns[10]<<8)+ m_cpDns[11];
   if (_hzGlobal_Debug & HZ_DEBUG_DNS)
   {
       errCh.Printf("Query id:      %d\n", m_qID) ;
       errCh.Printf("DNA code:      %d\n", m_DNA) ;
       errCh.Printf("No questions:  %d\n", nQus) ;
       errCh.Printf("No answers:    %d\n", nAns) ;
       errCh.Printf("No authority:  %d\n", nAut) ;
       errCh.Printf("No additional: %d\n", nAdd) ;
   }
   /*
   **  ** Bypass the 'pre-defined' strings to get the answers
   **      */
   for (ix = m_cpDns + 12;*ix ; ix++) ;
   ix += 5;
   for (nCount = 0; nCount < nAns ; nCount++)
   {
       dr.Clear() ;
       dr.m_Domain = _procraw(&ix) ;
       if (!dr.m_Domain)
       {
           pLog->Out(errCh) ;
           return hzerr(E_DNS_FAILED, "Answer record without domain") ;
       }
       if (_hzGlobal_Debug & HZ_DEBUG_DNS)
           errCh.Printf("Answ: %s:", *dr.m_Domain) ;
       dr.m_nType =  (ix[0]<<  8)+ ix[1];
       dr.m_nClass = (ix[2]<<  8)+ ix[3];
       dr.m_nTTL =   (ix[4]<< 24)+(ix[5]<< 16)+(ix[6]<< 8)+ ix[7];
       dr.m_nLen =   (ix[8]<<  8)+ ix[9];
       dr.m_nValue = 0;
       ix += 10;
       jx = ix + dr.m_nLen ;
       if (_hzGlobal_Debug & HZ_DEBUG_DNS)
           errCh.Printf(" -> Type %u Class %u TTL %u Len %u", dr.m_nType, dr.m_nClass, dr.m_nTTL, dr.m_nLen) ;
       if (dr.m_nType == DNSTYPE_MX)
       {
           dr.m_nValue = (ix[0]<< 8)+ ix[1];
           ix += 2;
           if (_hzGlobal_Debug & HZ_DEBUG_DNS)
               errCh.Printf(" Val %u", dr.m_nValue) ;
       }
       if (dr.m_nType == DNSTYPE_A)
       {
           dr.m_Ipa.SetValue(ix[0],ix[1],ix[2],ix[3]);
           if (_hzGlobal_Debug & HZ_DEBUG_DNS)
               errCh.Printf(" IPv4 (%u.%u.%u.%u)\n", ix[0],ix[1],ix[2],ix[3]);
       }
       else if (dr.m_nType == DNSTYPE_AAAA)
       {
           dr.m_anorakA = (ix[0] << 24)+(ix[1] << 16)+(ix[2] << 8)+ (ix[3]);
           dr.m_anorakB = (ix[4] << 24)+(ix[5] << 16)+(ix[6] << 8)+ (ix[7]);
           dr.m_anorakC = (ix[8] << 24)+(ix[9] << 16)+(ix[10]<<8)+ (ix[11]);
           dr.m_anorakD = (ix[12]<<24)+(ix[13]<<16)+(ix[14]<<8)+ (ix[15]);
           if (_hzGlobal_Debug & HZ_DEBUG_DNS)
               errCh.Printf(" IPv6 (%u.%u.%u.%u)\n", dr.m_anorakA, dr.m_anorakB, dr.m_anorakC, dr.m_anorakD) ;
       }
       else
       {
           if (_hzGlobal_Debug & HZ_DEBUG_DNS)
               errCh.AddByte(CHAR_NL) ;
           dr.m_Server = _procraw(&ix) ;
           if (!dr.m_Server)
           {
               pLog->Out(errCh) ;
               return hzerr(E_DNS_FAILED, "Answer record without server") ;
           }
       }
       m_arAns.Add(dr) ;
       ix = jx ;
   }
   for (nCount = 0; nCount < nAut ; nCount++)
   {
       dr.Clear() ;
       dr.m_Domain = _procraw(&ix) ;
       if (!dr.m_Domain)
       {
           pLog->Out(errCh) ;
           return hzerr(E_DNS_FAILED, "Authority record without domain") ;
       }
       if (_hzGlobal_Debug & HZ_DEBUG_DNS)
           errCh.Printf("Auth: %s:", *dr.m_Domain) ;
       dr.m_nType =  (ix[0]<<  8)+ ix[1];
       dr.m_nClass = (ix[2]<<  8)+ ix[3];
       dr.m_nTTL =   (ix[4]<< 24)+(ix[5]<< 16)+(ix[6]<< 8)+ ix[7];
       dr.m_nLen =   (ix[8]<<  8)+ ix[9];
       dr.m_nValue = 0;
       ix += 10;
       jx = ix + dr.m_nLen ;
       if (_hzGlobal_Debug & HZ_DEBUG_DNS)
           errCh.Printf(" -> Type %u Class %u TTL %u Len %u\n", dr.m_nType, dr.m_nClass, dr.m_nTTL, dr.m_nLen) ;
       if (dr.m_nType == DNSTYPE_MX)
           { dr.m_nValue = (ix[0]<< 8)+ ix[1]; ix += 2; }
       if (dr.m_nType == DNSTYPE_A)
           dr.m_Ipa.SetValue(ix[0],ix[1],ix[2],ix[3]);
       else if (dr.m_nType == DNSTYPE_AAAA)
       {
           dr.m_anorakA = (ix[0] << 24)+(ix[1] << 16)+(ix[2] << 8)+ (ix[3]);
           dr.m_anorakA = (ix[4] << 24)+(ix[5] << 16)+(ix[6] << 8)+ (ix[7]);
           dr.m_anorakA = (ix[8] << 24)+(ix[9] << 16)+(ix[10]<<8)+ (ix[11]);
           dr.m_anorakA = (ix[12]<<24)+(ix[13]<<16)+(ix[14]<<8)+ (ix[15]);
           ix += 16;
       }
       else
       {
           dr.m_Server = _procraw(&ix) ;
           if (!dr.m_Server)
           {
               pLog->Out(errCh) ;
               return hzerr(E_DNS_FAILED, "Authority record without server") ;
           }
       }
       m_arAut.Add(dr) ;
       ix = jx ;
   }
   return E_OK ;
}