From: <ser...@us...> - 2004-03-23 22:50:54
|
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 vl...@cr... + + * full name compression implemented + 2004-03-22 Vlad Seryakov vl...@cr... 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 vl...@cr... --- 1,4 ---- DNS Module for AOLserver 3.x/4.x ! Release 0.7.7 vl...@cr... 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; } |