From: Vlad S. <ser...@us...> - 2005-06-21 18:37:24
|
Update of /cvsroot/naviserver/modules/nsdns In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24860 Modified Files: nsdns.c Log Message: Index: nsdns.c =================================================================== RCS file: /cvsroot/naviserver/modules/nsdns/nsdns.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** nsdns.c 21 Jun 2005 17:47:16 -0000 1.10 --- nsdns.c 21 Jun 2005 18:37:00 -0000 1.11 *************** *** 128,131 **** --- 128,132 ---- Ns_RWLockInit(&dnsClientDflt.lock); Tcl_InitHashTable(&dnsClientDflt.list,TCL_STRING_KEYS); + memset(&dnsQueues,0,sizeof(dnsQueues)); path = Ns_ConfigGetPath(server,module,NULL); *************** *** 517,615 **** static void - DnsProxyThread(void *arg) - { - int len; - time_t now; - fd_set rfd; - dnsRequest *req; - unsigned short *ptr; - char buf[DNS_BUF_SIZE+1]; - struct timeval timeout; - struct sockaddr_in addr; - - Ns_Log(Notice,"nsdns: proxy thread started, proxy %s(%s):%d FD %d", - dnsProxyHost,ns_inet_ntoa(dnsProxyAddr.sin_addr),dnsProxyPort,dnsProxySock); - - while(1) { - Ns_MutexLock(&dnsProxyMutex); - while(!dnsProxyQueue) { - Ns_CondWait(&dnsProxyCond,&dnsProxyMutex); - } - now = time(0); - for(req = dnsProxyQueue;req;) { - if(now - req->proxy_time > dnsProxyTimeout) { - /* First time, prepare for proxying, use our own id sequence to - * keep track of forwarded requests */ - if(!req->proxy_count) { - req->proxy_id = req->req->id; - req->req->id = ++dnsID; - ptr = (unsigned short*)(req->req->buf.data+2); - *ptr = htons(req->req->id); - } - /* Reached max request limit, reply with not found code */ - if(req->proxy_count >= dnsProxyRetries) { - dnsRequest *next = req->next; - if(!req->prev) dnsProxyQueue = req->next; else req->prev->next = req->next; - if(req->next) req->next->prev = req->prev; - DNS_SET_RCODE(req->reply->u,RCODE_SRVFAIL); - req->req->qdlist->rcode = RCODE_SRVFAIL; - dnsRecordCache(req->client,&req->req->qdlist); - dnsRequestSend(req); - dnsRequestFree(req); - req = next; - continue; - } - /* Repeat forwarding request */ - sendto(dnsProxySock, - req->req->buf.data+2, - req->req->buf.size, - 0, - (struct sockaddr*)&dnsProxyAddr, - sizeof(struct sockaddr_in)); - req->proxy_count++; - req->proxy_time = now; - dnsPacketLog(req->req,4,"Sending to proxy:"); - } - req = req->next; - } - Ns_MutexUnlock(&dnsProxyMutex); - timeout.tv_usec = 0; - timeout.tv_sec = 1; - FD_ZERO(&rfd); - FD_SET(dnsProxySock,&rfd); - if(select(dnsProxySock+1,&rfd,0,0,&timeout) <= 0) continue; - len = sizeof(struct sockaddr_in); - if((len = recvfrom(dnsProxySock,buf,DNS_BUF_SIZE,0,(struct sockaddr*)&addr,&len)) <= 0 || - addr.sin_addr.s_addr != dnsProxyAddr.sin_addr.s_addr) { - if(errno && errno != EAGAIN && errno != EINTR) - Ns_Log(Error,"nsdns: recvfrom error %s: %s",ns_inet_ntoa(addr.sin_addr),strerror(errno)); - 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) { - /* Find request with received ID and forward reply back to the client */ - if(req->req->id != ntohs(*((unsigned short*)buf))) continue; - *((unsigned short*)buf) = htons(req->proxy_id); - 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->client,&req->reply->anlist); - dnsRecordCache(req->client,&req->reply->nslist); - dnsRecordCache(req->client,&req->reply->arlist); - } - /* Remove form the queue */ - if(!req->prev) dnsProxyQueue = req->next; else req->prev->next = req->next; - if(req->next) req->next->prev = req->prev; - dnsRequestFree(req); - break; - } - Ns_MutexUnlock(&dnsProxyMutex); - } - } - - static void DnsQueueListenThread(void *arg) { --- 518,521 ---- *************** *** 642,648 **** dnsQueues[id].tail = req; if(!dnsQueues[id].head) dnsQueues[id].head = req; ! dnsQueues[id].size++; dnsQueues[id].requests++; ! Ns_CondBroadcast(&dnsQueues[id].cond); Ns_MutexUnlock(&dnsQueues[id].lock); if(++id >= dnsThreads) id = 0; --- 548,555 ---- dnsQueues[id].tail = req; if(!dnsQueues[id].head) dnsQueues[id].head = req; ! if(++dnsQueues[id].size > dnsQueues[id].maxsize) ! dnsQueues[id].maxsize = dnsQueues[id].size; dnsQueues[id].requests++; ! Ns_CondSignal(&dnsQueues[id].cond); Ns_MutexUnlock(&dnsQueues[id].lock); if(++id >= dnsThreads) id = 0; *************** *** 677,681 **** queue->head = req->next; if(queue->tail == req) queue->tail = 0; - if(queue->size > queue->maxsize) queue->maxsize = queue->size; queue->size--; Ns_MutexUnlock(&queue->lock); --- 584,587 ---- *************** *** 705,709 **** queue->freelist = req; } ! Ns_CondBroadcast(&queue->cond); gettimeofday(&end_time,0); // Update statistics, in milliseconds --- 611,615 ---- queue->freelist = req; } ! Ns_CondSignal(&queue->cond); gettimeofday(&end_time,0); // Update statistics, in milliseconds *************** *** 773,776 **** --- 679,777 ---- } + static void + DnsProxyThread(void *arg) + { + int len; + time_t now; + fd_set rfd; + dnsRequest *req; + unsigned short *ptr; + char buf[DNS_BUF_SIZE+1]; + struct timeval timeout; + struct sockaddr_in addr; + + Ns_Log(Notice,"nsdns: proxy thread started, proxy %s(%s):%d FD %d", + dnsProxyHost,ns_inet_ntoa(dnsProxyAddr.sin_addr),dnsProxyPort,dnsProxySock); + + while(1) { + Ns_MutexLock(&dnsProxyMutex); + while(!dnsProxyQueue) { + Ns_CondWait(&dnsProxyCond,&dnsProxyMutex); + } + now = time(0); + for(req = dnsProxyQueue;req;) { + if(now - req->proxy_time > dnsProxyTimeout) { + /* First time, prepare for proxying, use our own id sequence to + * keep track of forwarded requests */ + if(!req->proxy_count) { + req->proxy_id = req->req->id; + req->req->id = ++dnsID; + ptr = (unsigned short*)(req->req->buf.data+2); + *ptr = htons(req->req->id); + } + /* Reached max request limit, reply with not found code */ + if(req->proxy_count >= dnsProxyRetries) { + dnsRequest *next = req->next; + if(!req->prev) dnsProxyQueue = req->next; else req->prev->next = req->next; + if(req->next) req->next->prev = req->prev; + DNS_SET_RCODE(req->reply->u,RCODE_SRVFAIL); + req->req->qdlist->rcode = RCODE_SRVFAIL; + dnsRecordCache(req->client,&req->req->qdlist); + dnsRequestSend(req); + dnsRequestFree(req); + req = next; + continue; + } + /* Repeat forwarding request */ + sendto(dnsProxySock, + req->req->buf.data+2, + req->req->buf.size, + 0, + (struct sockaddr*)&dnsProxyAddr, + sizeof(struct sockaddr_in)); + req->proxy_count++; + req->proxy_time = now; + dnsPacketLog(req->req,4,"Sending to proxy:"); + } + req = req->next; + } + Ns_MutexUnlock(&dnsProxyMutex); + timeout.tv_usec = 0; + timeout.tv_sec = 1; + FD_ZERO(&rfd); + FD_SET(dnsProxySock,&rfd); + if(select(dnsProxySock+1,&rfd,0,0,&timeout) <= 0) continue; + len = sizeof(struct sockaddr_in); + if((len = recvfrom(dnsProxySock,buf,DNS_BUF_SIZE,0,(struct sockaddr*)&addr,&len)) <= 0 || + addr.sin_addr.s_addr != dnsProxyAddr.sin_addr.s_addr) { + if(errno && errno != EAGAIN && errno != EINTR) + Ns_Log(Error,"nsdns: recvfrom error %s: %s",ns_inet_ntoa(addr.sin_addr),strerror(errno)); + 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) { + /* Find request with received ID and forward reply back to the client */ + if(req->req->id != ntohs(*((unsigned short*)buf))) continue; + *((unsigned short*)buf) = htons(req->proxy_id); + 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->client,&req->reply->anlist); + dnsRecordCache(req->client,&req->reply->nslist); + dnsRecordCache(req->client,&req->reply->arlist); + } + /* Remove form the queue */ + if(!req->prev) dnsProxyQueue = req->next; else req->prev->next = req->next; + if(req->next) req->next->prev = req->prev; + dnsRequestFree(req); + break; + } + Ns_MutexUnlock(&dnsProxyMutex); + } + } + static int dnsRead(int sock, void *vbuf, int len) |