From: Vlad S. <ser...@us...> - 2005-06-24 00:37:55
|
Update of /cvsroot/naviserver/modules/nsdns In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8679 Modified Files: dns.c dns.h nsdns.c Log Message: naptr wildcards regexp Index: nsdns.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/nsdns.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** nsdns.c 23 Jun 2005 02:06:02 -0000 1.14 --- nsdns.c 24 Jun 2005 00:37:39 -0000 1.15 *************** *** 134,137 **** --- 134,138 ---- address = Ns_ConfigGet(path,"address"); + if(!Ns_ConfigGetInt(path,"flags",&dnsFlags)) dnsFlags = 0; if(!Ns_ConfigGetInt(path,"debug",&dnsDebug)) dnsDebug = 0; if(!Ns_ConfigGetInt(path,"port",&dnsPort)) dnsPort = 5353; *************** *** 334,337 **** --- 335,339 ---- return TCL_ERROR; } + dnsRecordUpdate(drec); dnsRecordCache(client, &drec); break; *************** *** 864,872 **** dnsRequestHandle(dnsRequest *req) { - char *ptr; int nsize; ! Tcl_HashEntry *hrec = 0; ! dnsRecord *qrec,*qcache,*qstart,*qend; unsigned long now = time(0); dnsPacketLog(req->req,1,"Received request from client=%s",req->client->ipaddr); --- 866,874 ---- dnsRequestHandle(dnsRequest *req) { int nsize; ! char *ptr,*str; unsigned long now = time(0); + Tcl_HashEntry *nrec, *hrec = 0; + dnsRecord *qrec,*qcache,*ncache,*qstart,*qend; dnsPacketLog(req->req,1,"Received request from client=%s",req->client->ipaddr); *************** *** 877,885 **** for(qrec = req->req->qdlist;qrec;qrec = qrec->next) { if(!qrec->name) continue; switch(qrec->type) { case DNS_TYPE_NAPTR: // Calc how many dots we have in the name ptr = qrec->name; - nsize = qrec->nsize; while(*ptr) { // Search only those names that we have in cache --- 879,887 ---- for(qrec = req->req->qdlist;qrec;qrec = qrec->next) { if(!qrec->name) continue; + nsize = qrec->nsize; switch(qrec->type) { case DNS_TYPE_NAPTR: // Calc how many dots we have in the name ptr = qrec->name; while(*ptr) { // Search only those names that we have in cache *************** *** 933,939 **** } switch(qcache->type) { ! case DNS_TYPE_NS: { ! dnsRecord *ncache; ! Tcl_HashEntry *nrec; if(qrec->type == DNS_TYPE_NS) dnsPacketAddRecord(req->reply,&req->reply->anlist,&req->reply->ancount,dnsRecordCreate(qcache)); --- 935,939 ---- } switch(qcache->type) { ! case DNS_TYPE_NS: if(qrec->type == DNS_TYPE_NS) dnsPacketAddRecord(req->reply,&req->reply->anlist,&req->reply->ancount,dnsRecordCreate(qcache)); *************** *** 947,951 **** } break; ! } default: dnsPacketAddRecord(req->reply,&req->reply->anlist,&req->reply->ancount,dnsRecordCreate(qcache)); --- 947,977 ---- } break; ! ! case DNS_TYPE_NAPTR: ! // If we found record using wildcard, we have to replace ! // shorter phone in the regexp with requested from the query ! if(dnsFlags & DNS_NAPTR_REGEXP && ! nsize < qrec->nsize && ! qcache->data.naptr->regexp_p1) { ! // Create record without regexp, we will build it manually ! ptr = qcache->data.naptr->regexp; ! qcache->data.naptr->regexp = 0; ! ncache = dnsRecordCreate(qcache); ! qcache->data.naptr->regexp = ptr; ! // Build regexp from 3 parts ! ncache->data.naptr->regexp = str = ns_malloc(qrec->nsize+strlen(ptr)+1); ! // Before phone ! for(ptr = qcache->data.naptr->regexp;ptr <= qcache->data.naptr->regexp_p1;) *str++ = *ptr++; ! // Phone itself ! for(ptr = &qrec->name[qrec->nsize-1];ptr >= qrec->name;ptr--) { ! if(isdigit(*ptr) && (ptr == qrec->name || *(ptr-1) == '.')) *str++ = *ptr; ! } ! // After phone ! for(ptr = qcache->data.naptr->regexp_p2;*ptr;) *str++ = *ptr++; ! *str = 0; ! dnsPacketAddRecord(req->reply,&req->reply->anlist,&req->reply->ancount,ncache); ! break; ! } ! default: dnsPacketAddRecord(req->reply,&req->reply->anlist,&req->reply->ancount,dnsRecordCreate(qcache)); Index: dns.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/dns.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** dns.c 23 Jun 2005 02:06:02 -0000 1.9 --- dns.c 24 Jun 2005 00:37:39 -0000 1.10 *************** *** 40,43 **** --- 40,44 ---- int dnsDebug = 0; int dnsTTL = 86400; + int dnsFlags = 0; static Ns_Mutex dnsMutex; *************** *** 390,393 **** --- 391,395 ---- break; } + dnsRecordUpdate(rec); } return rec; *************** *** 567,570 **** --- 569,590 ---- } + void + dnsRecordUpdate(dnsRecord *rec) + { + switch(rec->type) { + case DNS_TYPE_NAPTR: + // Save pointer in the regexp where phone number should be + // placed for quick replace later + if(!(dnsFlags & DNS_NAPTR_REGEXP && rec->data.naptr->regexp)) break; + if((rec->data.naptr->regexp_p2 = strchr(rec->data.naptr->regexp,'@'))) { + for(rec->data.naptr->regexp_p1 = rec->data.naptr->regexp_p2; + rec->data.naptr->regexp_p1 > rec->data.naptr->regexp && + *rec->data.naptr->regexp_p1 != ':'; + rec->data.naptr->regexp_p1--); + } + break; + } + } + dnsRecord * dnsRecordAppend(dnsRecord **list,dnsRecord *pkt) Index: dns.h =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/dns.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** dns.h 23 Jun 2005 02:06:02 -0000 1.8 --- dns.h 24 Jun 2005 00:37:39 -0000 1.9 *************** *** 29,32 **** --- 29,33 ---- #define DNS_TCP 0x0001 #define DNS_PROXY 0x0002 + #define DNS_NAPTR_REGEXP 0x0004 // DNS record types *************** *** 114,117 **** --- 115,120 ---- char *service; char *regexp; + char *regexp_p1; + char *regexp_p2; char *replace; } dnsNAPTR; *************** *** 158,161 **** --- 161,165 ---- extern int dnsDebug; + extern int dnsFlags; extern int dnsTTL; *************** *** 179,182 **** --- 183,187 ---- char *service,char *regexp,char *replace); Tcl_Obj *dnsRecordCreateTclObj(Tcl_Interp *interp,dnsRecord *drec); + void dnsRecordUpdate(dnsRecord *rec); dnsRecord *dnsRecordAppend(dnsRecord **list,dnsRecord *pkt); dnsRecord *dnsRecordRemove(dnsRecord **list,dnsRecord *link); |