?? dualserver.cpp
字號:
BYTE *xname = (BYTE*)query;
BYTE *xraw = (BYTE*)raw;
WORD retvalue = 0;
while (true)
{
WORD size = *xraw;
xraw++;
if (!size)
{
break;
}
memcpy(xname, xraw, size);
xname += size;
xraw += size;
retvalue += size;
if (!*xraw)
break;
*xname = '.';
retvalue++;
xname++;
}
*xname = 0;
retvalue += 2;
//printf("%u\n",retvalue);
return retvalue;
}
WORD qLen(char *query)
{
WORD fullsize = 1;
while (true)
{
char *i = strchr(query, '.');
if (i != NULL)
{
int size = (DWORD)i - (DWORD)query;
query += (size + 1);
fullsize += (size + 1);
}
else
{
int size = strlen(query);
if (size)
fullsize += (size + 1);
break;
}
}
//printf("%i\n",fullsize);
return fullsize;
}
WORD pQu(char *raw, char *query)
{
WORD fullsize = 1;
while (true)
{
char *i = strchr(query, '.');
if (i != NULL)
{
int size = (DWORD)i - (DWORD)query;
*raw = size;
raw++;
memcpy(raw, query, size);
raw += size;
query += (size + 1);
fullsize += (size + 1);
}
else
{
int size = strlen(query);
if (size)
{
*raw = size;
raw++;
strcpy(raw, query);
fullsize += (size + 1);
}
break;
}
}
//printf("%i\n",fullsize);
return fullsize;
}
WORD fShort(char *raw)
{
return ntohs(*(WORD*)raw);
}
DWORD fLong(char *raw)
{
return ntohl(*(DWORD*)raw);
}
DWORD fIP(char *raw)
{
return (*(DWORD*)raw);
}
BYTE pShort(char *raw, WORD data)
{
*((WORD*)raw) = htons(data);
return 2;
}
BYTE pLong(char *raw, DWORD data)
{
*((DWORD*)raw) = htonl(data);
return 4;
}
BYTE pIP(char *raw, DWORD data)
{
*((DWORD*)raw) = data;
return 4;
}
WORD fShort(BYTE *raw)
{
return ntohs(*(WORD*)raw);
}
DWORD fLong(BYTE *raw)
{
return ntohl(*(DWORD*)raw);
}
DWORD fIP(BYTE *raw)
{
return (*(DWORD*)raw);
}
BYTE pShort(BYTE *raw, WORD data)
{
*((WORD*)raw) = htons(data);
return 2;
}
BYTE pLong(BYTE *raw, DWORD data)
{
*((DWORD*)raw) = htonl(data);
return 4;
}
BYTE pIP(BYTE *raw, DWORD data)
{
*((DWORD*)raw) = data;
return 4;
}
void addRRExt(data5 *req)
{
WORD xid = req->dnsp->header.xid;
if (strcasecmp(req->cname, req->query))
{
dnsPacket *packet;
if (req->cache.response)
packet = (dnsPacket*)req->cache.response;
else
{
packet = (dnsPacket*)malloc(req->bytes);
memcpy(packet, req->dnsp, req->bytes);
}
req->dnsp->header.aa = 0;
req->dnsp->header.at = 0;
req->dnsp->header.qdcount = htons(1);
req->dnsp->header.ancount = htons(1);
//manuplate the response
req->data = &req->dnsp->data;
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_A);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_CNAME);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pLong(req->data, cfig.lease);
req->data += pShort(req->data, qLen(req->cname));
req->data += pQu(req->data, req->cname);
char *dp = &packet->data;
for (int i = 1; i <= ntohs(packet->header.qdcount); i++)
{
dp += fQu(req->cname, packet, dp);
dp += 4;
}
WORD dl = 0;
for (int i = 1; i <= ntohs(packet->header.ancount); i++)
{
dp += fQu(req->cname, packet, dp);
req->data += pQu(req->data, req->cname);
memcpy(req->data, dp, 8);
req->data += 8;
int type = fShort(dp);
dp += 2; //type
dp += 2; //class
dp += 4; //ttl
WORD zLen = fShort(dp);
dp += 2; //datalength
switch (type)
{
case DNS_TYPE_A:
req->data += pShort(req->data, zLen);
req->data += pLong(req->data, fLong(dp));
break;
case DNS_TYPE_CNAME:
fQu(req->cname, packet, dp);
dl = pQu(req->data + 2, req->cname);
req->data += pShort(req->data, dl);
req->data += dl;
break;
}
dp += zLen;
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
}
if (!req->cache.response)
free(packet);
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
else if (req->cache.response)
{
memcpy(req->dnsp, req->cache.response, req->cache.bytes);
req->dnsp->header.xid = xid;
req->bytes = req->cache.bytes;
}
};
void addRRA(data5 *req)
{
if (strcasecmp(req->query, req->cname))
{
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_CNAME);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pLong(req->data, cfig.lease);
req->data += pShort(req->data, qLen(req->cname));
req->data += pQu(req->data, req->cname);
}
for (;req->iterBegin != dnsCache[cacheInd].end(); req->iterBegin++)
{
data7 *cache = req->iterBegin->second;
if (strcasecmp(cache->mapname, req->mapname))
break;
if (cache->ip)
{
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, req->cname);
req->data += pShort(req->data, DNS_TYPE_A);
req->data += pShort(req->data, DNS_CLASS_IN);
if (cache->expiry == LONG_MAX)
req->data += pLong(req->data, cfig.lease);
else
req->data += pLong(req->data, (cache->expiry - time(NULL)));
req->data += pShort(req->data, 4);
req->data += pIP(req->data, cache->ip);
}
}
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
void addRRPtr(data5 *req)
{
for (;req->iterBegin != dnsCache[cacheInd].end(); req->iterBegin++)
{
data7 *cache = req->iterBegin->second;
if (strcasecmp(cache->mapname, req->mapname))
break;
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_PTR);
req->data += pShort(req->data, DNS_CLASS_IN);
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
if (cache->expiry == LONG_MAX)
req->data += pLong(req->data, cfig.lease);
else
req->data += pLong(req->data, (cache->expiry - time(NULL)));
if (!strchr(cache->hostname, '.'))
sprintf(req->cname, "%s.%s", cache->hostname, cfig.zone);
else
strcpy(req->cname, cache->hostname);
req->data += pShort(req->data, qLen(req->cname));
req->data += pQu(req->data, req->cname);
}
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
void addRRServerA(data5 *req)
{
if (strcasecmp(req->query, req->cname))
{
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_CNAME);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pLong(req->data, cfig.lease);
req->data += pShort(req->data, qLen(req->cname));
req->data += pQu(req->data, req->cname);
}
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, req->cname);
req->data += pShort(req->data, DNS_TYPE_A);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pLong(req->data, cfig.lease);
req->data += pShort(req->data, 4);
req->data += pIP(req->data, cfig.dnsUdpConn[req->sockInd].server);
for (;req->iterBegin != dnsCache[cacheInd].end(); req->iterBegin++)
{
data7 *cache = req->iterBegin->second;
if (strcasecmp(cache->mapname, req->mapname))
break;
if (cache->ip && cache->ip != cfig.dnsUdpConn[req->sockInd].server)
{
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, req->cname);
req->data += pShort(req->data, DNS_TYPE_A);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pLong(req->data, cfig.lease);
req->data += pShort(req->data, 4);
req->data += pIP(req->data, cache->ip);
}
}
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
void addRRLocalhostA(data5 *req)
{
if (strcasecmp(req->query, req->mapname))
{
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_CNAME);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pLong(req->data, cfig.lease);
req->data += pShort(req->data, qLen(req->mapname));
req->data += pQu(req->data, req->mapname);
}
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, req->mapname);
req->data += pShort(req->data, DNS_TYPE_A);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pLong(req->data, cfig.lease);
req->data += pShort(req->data, 4);
req->data += pIP(req->data, req->cache.ip);
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
void addRRLocalhostPtr(data5 *req)
{
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_PTR);
req->data += pShort(req->data, DNS_CLASS_IN);
req->dnsp->header.ancount = htons(1);
req->data += pLong(req->data, cfig.lease);
req->data += pShort(req->data, qLen(req->cache.hostname));
req->data += pQu(req->data, req->cache.hostname);
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
void addRRMX(data5 *req)
{
for (;req->iterBegin != dnsCache[cacheInd].end(); req->iterBegin++)
{
data7 *cache = req->iterBegin->second;
if (strcasecmp(cache->mapname, req->mapname))
break;
if (cache->dataType == MX)
{
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_MX);
req->data += pShort(req->data, DNS_CLASS_IN);
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pLong(req->data, cfig.lease);
if (!strchr(cache->hostname, '.'))
sprintf(req->cname, "%s.%s", cache->hostname, cfig.zone);
else
strcpy(req->cname, cache->hostname);
req->data += pShort(req->data, qLen(req->cname) + 2);
req->data += pShort(req->data, cache->mailPref);
req->data += pQu(req->data, req->cname);
}
}
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
void addRRNSA(data5 *req)
{
if (cfig.authorized && cfig.expireTime > time(NULL))
{
req->dnsp->header.at = 1;
req->dnsp->header.aa = 1;
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, cfig.zone);
req->data += pShort(req->data, DNS_TYPE_NS);
req->data += pShort(req->data, DNS_CLASS_IN);
if (cfig.expire >= LONG_MAX)
req->data += pLong(req->data, LONG_MAX);
else
req->data += pLong(req->data, cfig.expire);
req->data += pShort(req->data, qLen(cfig.servername_fqn));
req->data += pQu(req->data, cfig.servername_fqn);
req->data += pQu(req->data, cfig.servername_fqn);
req->data += pShort(req->data, DNS_TYPE_A);
req->data += pShort(req->data, DNS_CLASS_IN);
if (cfig.expire >= LONG_MAX)
req->data += pLong(req->data, LONG_MAX);
else
req->data += pLong(req->data, cfig.expire);
req->data += pShort(req->data, 4);
req->data += pIP(req->data, cfig.dnsUdpConn[req->sockInd].server);
}
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
void addRRNSPtr(data5 *req)
{
if (cfig.authorized && cfig.expireTime > time(NULL))
{
req->dnsp->header.at = 1;
req->dnsp->header.aa = 1;
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, cfig.authority);
req->data += pShort(req->data, DNS_TYPE_NS);
req->data += pShort(req->data, DNS_CLASS_IN);
if (cfig.expire >= LONG_MAX)
req->data += pLong(req->data, LONG_MAX);
else
req->data += pLong(req->data, cfig.expire);
req->data += pShort(req->data, qLen(cfig.servername_fqn));
req->data += pQu(req->data, cfig.servername_fqn);
req->data += pQu(req->data, cfig.servername_fqn);
req->data += pShort(req->data, DNS_TYPE_A);
req->data += pShort(req->data, DNS_CLASS_IN);
if (cfig.expire >= LONG_MAX)
req->data += pLong(req->data, LONG_MAX);
else
req->data += pLong(req->data, cfig.expire);
req->data += pShort(req->data, 4);
req->data += pIP(req->data, cfig.dnsUdpConn[req->sockInd].server);
}
req->bytes = (DWORD)req->data - (DWORD)req->raw;
}
void addRRSOA(data5 *req)
{
if (cfig.authorized)
{
req->dnsp->header.at = 1;
req->dnsp->header.aa = 1;
req->dnsp->header.ancount = htons(htons(req->dnsp->header.ancount) + 1);
req->data += pQu(req->data, req->query);
req->data += pShort(req->data, DNS_TYPE_SOA);
req->data += pShort(req->data, DNS_CLASS_IN);
req->data += pLong(req->data, cfig.lease);
char *data = req->data;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -