Update of /cvsroot/aolserver/nsdns
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23813
Modified Files:
ChangeLog README dns.c dns.h nsdns.c
Log Message:
name compression per RFC1035
Index: ChangeLog
===================================================================
RCS file: /cvsroot/aolserver/nsdns/ChangeLog,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** ChangeLog 22 Mar 2004 22:18:24 -0000 1.9
--- ChangeLog 23 Mar 2004 22:40:23 -0000 1.10
***************
*** 1,2 ****
--- 1,6 ----
+ 2004-03-23 Vlad Seryakov vlad@...
+
+ * full name compression implemented
+
2004-03-22 Vlad Seryakov vlad@...
Index: README
===================================================================
RCS file: /cvsroot/aolserver/nsdns/README,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** README 22 Mar 2004 22:18:24 -0000 1.12
--- README 23 Mar 2004 22:40:23 -0000 1.13
***************
*** 1,4 ****
DNS Module for AOLserver 3.x/4.x
! Release 0.7.6
vlad@...
--- 1,4 ----
DNS Module for AOLserver 3.x/4.x
! Release 0.7.7
vlad@...
Index: dns.c
===================================================================
RCS file: /cvsroot/aolserver/nsdns/dns.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** dns.c 22 Mar 2004 22:18:24 -0000 1.2
--- dns.c 23 Mar 2004 22:40:23 -0000 1.3
***************
*** 158,162 ****
continue;
}
! if((len = recvfrom(sock,buf,DNS_BUFSIZE,0,(struct sockaddr*)&saddr,&len)) <= 0) {
if(dnsDebug > 3) Ns_Log(Error,"dnsLookup: %s: recvfrom: %s",server->name,strerror(errno));
continue;
--- 158,162 ----
continue;
}
! if((len = recv(sock,buf,DNS_BUFSIZE,0)) <= 0) {
if(dnsDebug > 3) Ns_Log(Error,"dnsLookup: %s: recvfrom: %s",server->name,strerror(errno));
continue;
***************
*** 217,225 ****
continue;
}
! if((len = recvfrom(sock,buf,DNS_BUFSIZE,0,(struct sockaddr*)&saddr,&len)) <= 0) {
if(dnsDebug > 3) Ns_Log(Error,"dnsResolve: %s: recvfrom: %s",name,strerror(errno));
continue;
}
! if(dnsDebug > 3) Ns_Log(Error,"dnsResolve: %s: received %d bytes from to %s",name,len,server);
if(!(reply = dnsParsePacket(buf,len))) continue;
// DNS packet id should be the same
--- 217,225 ----
continue;
}
! if((len = recv(sock,buf,DNS_BUFSIZE,0)) <= 0) {
if(dnsDebug > 3) Ns_Log(Error,"dnsResolve: %s: recvfrom: %s",name,strerror(errno));
continue;
}
! if(dnsDebug > 3) Ns_Log(Error,"dnsResolve: %s: received %d bytes from %s",name,len,server);
if(!(reply = dnsParsePacket(buf,len))) continue;
// DNS packet id should be the same
***************
*** 650,658 ****
dnsParseRecord(dnsPacket *pkt,int query)
{
! int rc;
char name[256] = "";
dnsRecord *y;
y = ns_calloc(1,sizeof(dnsRecord));
// The name of the resource
if((rc = dnsParseName(pkt,&pkt->buf.ptr,name,255,0,0)) < 0) {
--- 650,659 ----
dnsParseRecord(dnsPacket *pkt,int query)
{
! int rc, offset;
char name[256] = "";
dnsRecord *y;
y = ns_calloc(1,sizeof(dnsRecord));
+ offset = (pkt->buf.ptr - pkt->buf.data)-2;
// The name of the resource
if((rc = dnsParseName(pkt,&pkt->buf.ptr,name,255,0,0)) < 0) {
***************
*** 713,716 ****
--- 714,718 ----
case DNS_TYPE_CNAME:
case DNS_TYPE_PTR:
+ offset = (pkt->buf.ptr - pkt->buf.data)-2;
if(dnsParseName(pkt,&pkt->buf.ptr,name,255,0,0) < 0) goto err;
y->data.name = ns_strdup(name);
***************
*** 784,807 ****
}
! int
dnsEncodeName(dnsPacket *pkt,char *name)
{
unsigned int c;
! int i, k = 0, n, offset;
- offset = (pkt->buf.ptr - pkt->buf.data) - 2;
dnsEncodeGrow(pkt,(name ? strlen(name)+1 : 1),"name");
if(name) {
! while((c = name[k])) {
! n = 0;
! while ((c = name[k+n]) != 0 && c != '.') n++;
! if(!n) break;
! *pkt->buf.ptr++ = (u_char)(n & 0x3F);
! for(i = 0; i < n; i++) *pkt->buf.ptr++ = name[k++];
if(name[k] == '.') k++;
}
}
*pkt->buf.ptr++ = 0;
- return offset;
}
--- 786,821 ----
}
! void
dnsEncodeName(dnsPacket *pkt,char *name)
{
+ dnsName *nm;
unsigned int c;
! int i, k = 0, len;
dnsEncodeGrow(pkt,(name ? strlen(name)+1 : 1),"name");
if(name) {
! while(name[k]) {
! for(len = 0;(c = name[k+len]) != 0 && c != '.';len++);
! if(!len || len > 63) break;
! // Find already saved domain name
! for(nm = pkt->nmlist;nm;nm = nm->next) {
! if(!strcasecmp(nm->name,&name[k])) {
! dnsEncodePtr(pkt,nm->offset);
! return;
! }
! }
! // Save name part for future reference
! nm = (dnsName*)ns_calloc(1,sizeof(dnsName));
! nm->next = pkt->nmlist;
! pkt->nmlist = nm;
! nm->name = ns_strdup(&name[k]);
! nm->offset = (pkt->buf.ptr - pkt->buf.data) - 2;
! // Encode name part inline
! *pkt->buf.ptr++ = (u_char)(len & 0x3F);
! for(i = 0;i < len; i++) *pkt->buf.ptr++ = name[k++];
if(name[k] == '.') k++;
}
}
*pkt->buf.ptr++ = 0;
}
***************
*** 824,829 ****
dnsEncodePtr(dnsPacket *pkt,int offset)
{
! *pkt->buf.ptr++ = 0xC0;
! *pkt->buf.ptr++ = (unsigned int)(offset & 0x3F);
}
--- 838,843 ----
dnsEncodePtr(dnsPacket *pkt,int offset)
{
! *pkt->buf.ptr++ = 0xC0 | (offset >> 8);
! *pkt->buf.ptr++ = (offset & 0xFF);
}
***************
*** 850,860 ****
void
- dnsEncodeObj(dnsPacket *pkt)
- {
- *pkt->buf.ptr++ = 0xC0;
- *pkt->buf.ptr++ = 0x0C;
- }
-
- void
dnsEncodeBegin(dnsPacket *pkt)
{
--- 864,867 ----
***************
*** 874,891 ****
dnsEncodeRecord(dnsPacket *pkt,dnsRecord *list)
{
- int pos = 0;
- char *name = 0;
-
dnsEncodeGrow(pkt,12,"pkt:hdr");
for(;list;list = list->next) {
! if(!strcmp(list->name,pkt->qdlist->name)) {
! dnsEncodeObj(pkt);
! } else
! if(pos && (0 && name && !strcmp(name,list->name))) {
! dnsEncodePtr(pkt,pos);
! } else {
! pos = dnsEncodeName(pkt,list->name);
! name = list->name;
! }
dnsEncodeGrow(pkt,16,"pkt:data");
dnsEncodeShort(pkt,list->type);
--- 881,887 ----
dnsEncodeRecord(dnsPacket *pkt,dnsRecord *list)
{
dnsEncodeGrow(pkt,12,"pkt:hdr");
for(;list;list = list->next) {
! dnsEncodeName(pkt,list->name);
dnsEncodeGrow(pkt,16,"pkt:data");
dnsEncodeShort(pkt,list->type);
***************
*** 1038,1041 ****
--- 1034,1043 ----
dnsRecordDestroy(&pkt->arlist);
dnsRecordDestroy(&pkt->anlist);
+ while(pkt->nmlist) {
+ dnsName *next = pkt->nmlist->next;
+ ns_free(pkt->nmlist->name);
+ ns_free(pkt->nmlist);
+ pkt->nmlist = next;
+ }
//Ns_Log(Debug,"free[%d]: %d: %x: %x",getpid(),type,pkt,pkt->buf.data);
ns_free(pkt->buf.data);
Index: dns.h
===================================================================
RCS file: /cvsroot/aolserver/nsdns/dns.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** dns.h 23 Feb 2004 20:58:24 -0000 1.3
--- dns.h 23 Mar 2004 22:40:23 -0000 1.4
***************
*** 29,33 ****
*/
! #define VERSION "0.7.6"
// DNS flags
--- 29,33 ----
*/
! #define VERSION "0.7.7"
// DNS flags
***************
*** 86,90 ****
#define DNS_SET_QR(x,y) ((x) = ((x) & ~0x8000) | (((y) << 15) & 0x8000))
! #define DNS_BUF_SIZE 1024
#define DNS_REPLY_SIZE 514
--- 86,90 ----
#define DNS_SET_QR(x,y) ((x) = ((x) & ~0x8000) | (((y) << 15) & 0x8000))
! #define DNS_BUF_SIZE 1524
#define DNS_REPLY_SIZE 514
***************
*** 104,107 ****
--- 104,113 ----
} dnsMX;
+ typedef struct _dnsName {
+ struct _dnsName *next;
+ char *name;
+ short offset;
+ } dnsName;
+
typedef struct _dnsRecord {
struct _dnsRecord *next,*prev;
***************
*** 128,131 ****
--- 134,138 ----
short nscount;
short arcount;
+ dnsName *nmlist;
dnsRecord *qdlist;
dnsRecord *anlist;
***************
*** 167,171 ****
dnsPacket *dnsParsePacket(unsigned char *packet,int size);
int dnsParseName(dnsPacket *pkt,char **ptr,char *buf,int len,int pos,int level);
! int dnsEncodeName(dnsPacket *pkt,char *name);
void dnsEncodeGrow(dnsPacket *pkt,unsigned int size,char *proc);
void dnsEncodeHeader(dnsPacket *pkt);
--- 174,178 ----
dnsPacket *dnsParsePacket(unsigned char *packet,int size);
int dnsParseName(dnsPacket *pkt,char **ptr,char *buf,int len,int pos,int level);
! void dnsEncodeName(dnsPacket *pkt,char *name);
void dnsEncodeGrow(dnsPacket *pkt,unsigned int size,char *proc);
void dnsEncodeHeader(dnsPacket *pkt);
Index: nsdns.c
===================================================================
RCS file: /cvsroot/aolserver/nsdns/nsdns.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -C2 -d -r1.18 -r1.19
*** nsdns.c 22 Mar 2004 22:18:24 -0000 1.18
--- nsdns.c 23 Mar 2004 22:40:23 -0000 1.19
***************
*** 59,62 ****
--- 59,63 ----
static void DnsTcpThread(void *arg);
static void DnsProxyThread(void *arg);
+
static void dnsRecordCache(dnsRecord **list);
***************
*** 371,374 ****
--- 372,376 ----
return NS_TRUE;
}
+ if(dnsDebug > 3) Ns_Log(Error,"DnsUdpListen: received %d bytes from %s",len,ns_inet_ntoa(saddr.sin_addr));
if(!(req = dnsRequestCreate(sock,buf,len))) return NS_TRUE;
memcpy(&req->addr,&saddr,sizeof(struct sockaddr_in));
***************
*** 392,401 ****
{
SOCKET new;
switch(when) {
case NS_SOCK_READ:
! if((new = Ns_SockAccept(sock,0,0)) == INVALID_SOCKET) break;
if(Ns_BeginDetachedThread(DnsTcpThread,(void *)new) != NS_OK) {
! Ns_Log(Error,"nssmtp: Ns_BeginThread() failed with %s.",strerror(errno));
close(new);
}
--- 394,406 ----
{
SOCKET new;
+ struct sockaddr_in saddr;
+ int saddr_len = sizeof(struct sockaddr_in);
switch(when) {
case NS_SOCK_READ:
! if((new = Ns_SockAccept(sock,(struct sockaddr*)&saddr,&saddr_len)) == INVALID_SOCKET) break;
! if(dnsDebug > 3) Ns_Log(Error,"DnsTcpListen: connection from %s",ns_inet_ntoa(saddr.sin_addr));
if(Ns_BeginDetachedThread(DnsTcpThread,(void *)new) != NS_OK) {
! Ns_Log(Error,"nsdns: Ns_BeginThread() failed with %s.",strerror(errno));
close(new);
}
***************
*** 505,508 ****
--- 510,514 ----
continue;
}
+ if(dnsDebug > 3) Ns_Log(Error,"DnsProxyThread: received %d bytes from %s",len,ns_inet_ntoa(dnsProxyAddr.sin_addr));
Ns_MutexLock(&dnsProxyMutex);
for(req = dnsProxyQueue;req;req = req->next) {
***************
*** 512,517 ****
dnsPacketFree(req->reply,1);
if((req->reply = dnsParsePacket(buf,len))) {
dnsRequestSend(req);
- dnsPacketLog(req->reply,6,"Proxy reply:");
/* Save reply in our cache */
dnsRecordCache(&req->reply->anlist);
--- 518,523 ----
dnsPacketFree(req->reply,1);
if((req->reply = dnsParsePacket(buf,len))) {
+ dnsPacketLog(req->reply,6,"Proxy reply received:");
dnsRequestSend(req);
/* Save reply in our cache */
dnsRecordCache(&req->reply->anlist);
***************
*** 598,602 ****
unsigned long now = time(0);
! dnsPacketLog(req->req,1,"Received request:");
switch(DNS_GET_OPCODE(req->req->u)) {
--- 604,608 ----
unsigned long now = time(0);
! dnsPacketLog(req->req,1,"Received request");
switch(DNS_GET_OPCODE(req->req->u)) {
***************
*** 716,719 ****
--- 722,726 ----
if(req->flags & DNS_TCP) {
rc = dnsWrite(req->sock,req->reply->buf.data,req->reply->buf.size+2);
+ dnsPacketLog(req->reply,5,"Send TCP:");
} else {
rc = sendto(req->sock,
***************
*** 723,728 ****
(struct sockaddr*)&req->addr,
sizeof(struct sockaddr_in));
}
- dnsPacketLog(req->reply,5,"Send:");
return rc;
}
--- 730,735 ----
(struct sockaddr*)&req->addr,
sizeof(struct sockaddr_in));
+ dnsPacketLog(req->reply,5,"Send UDP:");
}
return rc;
}
|