| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | hzDNS::Query | (const char*,DnsType,) |
Declared in file: hzDNS.h
Defined in file : hzDNS.cpp
Function Logic:
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 ;
}