summaryrefslogtreecommitdiff
path: root/source3/namepacket.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1997-10-22 11:02:00 +0000
committerAndrew Tridgell <tridge@samba.org>1997-10-22 11:02:00 +0000
commite5c319186d079eeef55a7ee62fac2a993e932938 (patch)
treec8f01f398f801ecfa5a3a97ff5ca45ece501f459 /source3/namepacket.c
parentbda8cac802414eb15122cc7ad2f0082bcca177d5 (diff)
downloadsamba-e5c319186d079eeef55a7ee62fac2a993e932938.tar.gz
samba-e5c319186d079eeef55a7ee62fac2a993e932938.tar.bz2
samba-e5c319186d079eeef55a7ee62fac2a993e932938.zip
Implemented asynchronous DNS lookups in nmbd.
I realised this afternoon just how easy it is to add this, so I thought I'd implement it while the idea was fresh. nmbd forks at startup and uses a pipe to talk to its child. The child does the DNS lookups and the file descriptor of the child is added to the main select loop. While I was doing this I discovered a bug in nmbd that explains why the dns proxy option has been so expensive. The DNS cache entries in the WINS list were never being checked, which means we always did a DNS lookup even if we have done it before and it is in cache. I'm sure this used to work (I tested the DNS cache when I added it) so someone broke it :-( Anyway, the async DNS gets rid of the problem completely. I'll commit just the fix to the DNS cache bug to the 1.9.17 tree. You can disable async DNS by adding -DSYNC_DNS to the compile flags. (This used to be commit 178e27de0791c1ff3268cb456ed5c5efc9ac2a01)
Diffstat (limited to 'source3/namepacket.c')
-rw-r--r--source3/namepacket.c55
1 files changed, 36 insertions, 19 deletions
diff --git a/source3/namepacket.c b/source3/namepacket.c
index 3a23806a9c..c510c21169 100644
--- a/source3/namepacket.c
+++ b/source3/namepacket.c
@@ -171,6 +171,7 @@ void initiate_netbios_packet(uint16 *id,
p.fd = fd;
p.timestamp = time(NULL);
p.packet_type = NMB_PACKET;
+ p.locked = False;
debug_nmb_packet(&p);
@@ -482,32 +483,31 @@ static void process_nmb(struct packet_struct *p)
******************************************************************/
void run_packet_queue()
{
- struct packet_struct *p;
-
- while ((p=packet_queue))
- {
- switch (p->packet_type)
- {
- case NMB_PACKET:
- process_nmb(p);
- break;
-
- case DGRAM_PACKET:
- process_dgram(p);
- break;
+ struct packet_struct *p, *nextp;
+
+ while ((p=packet_queue)) {
+ packet_queue = p->next;
+ if (packet_queue) packet_queue->prev = NULL;
+ p->next = p->prev = NULL;
+
+ switch (p->packet_type) {
+ case NMB_PACKET:
+ process_nmb(p);
+ break;
+
+ case DGRAM_PACKET:
+ process_dgram(p);
+ break;
+ }
+ free_packet(p);
}
-
- packet_queue = packet_queue->next;
- if (packet_queue) packet_queue->prev = NULL;
- free_packet(p);
- }
}
+
/****************************************************************************
Create an fd_set containing all the sockets in the subnet structures,
plus the broadcast sockets.
***************************************************************************/
-
static BOOL create_listen_fdset(fd_set **ppset, int **psock_array, int *listen_number)
{
int *sock_array = NULL;
@@ -582,6 +582,9 @@ BOOL listen_for_packets(BOOL run_election)
fd_set fds;
int selrtn;
struct timeval timeout;
+#ifndef SYNC_DNS
+ int dns_fd;
+#endif
if(listen_set == NULL)
{
@@ -594,6 +597,14 @@ BOOL listen_for_packets(BOOL run_election)
memcpy((char *)&fds, (char *)listen_set, sizeof(fd_set));
+#ifndef SYNC_DNS
+ dns_fd = asyncdns_fd();
+ if (dns_fd != -1) {
+ FD_SET(dns_fd, &fds);
+ }
+#endif
+
+
/* during elections and when expecting a netbios response packet we
need to send election packets at tighter intervals
@@ -612,6 +623,12 @@ BOOL listen_for_packets(BOOL run_election)
{
int i;
+#ifndef SYNC_DNS
+ if (dns_fd != -1 && FD_ISSET(dns_fd,&fds)) {
+ run_dns_queue();
+ }
+#endif
+
for(i = 0; i < listen_number; i++)
{
if(i < (listen_number/2))