a9abc5d9b5415f0473cd6c7d1605e26693bf73ef
[samba.git] / source / namedbresp.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    NBT netbios library routines
5    Copyright (C) Andrew Tridgell 1994-1996
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21    Module name: namedbresp.c
22
23 */
24
25 #include "includes.h"
26
27 extern int ClientNMB;
28 extern int ClientDGRAM;
29
30 extern struct subnet_record *subnetlist;
31
32 extern int DEBUGLEVEL;
33
34 extern pstring scope;
35 extern pstring myname;
36 extern struct in_addr ipzero;
37 extern struct in_addr ipgrp;
38
39 int num_response_packets = 0;
40
41 /***************************************************************************
42   add an expected response record into the list
43   **************************************************************************/
44 void add_response_record(struct subnet_record *d,
45                                 struct response_record *n)
46 {
47   struct response_record *n2;
48
49   if (!d) return;
50
51   num_response_packets++; /* count of total number of packets still around */
52
53   if (!d->responselist)
54     {
55       d->responselist = n;
56       n->prev = NULL;
57       n->next = NULL;
58       return;
59     }
60   
61   for (n2 = d->responselist; n2->next; n2 = n2->next) ;
62   
63   n2->next = n;
64   n->next = NULL;
65   n->prev = n2;
66 }
67
68
69 /***************************************************************************
70   remove an expected response record from the list
71   **************************************************************************/
72 void remove_response_record(struct subnet_record *d,
73                                 struct response_record *n)
74 {
75         if (!d) return;
76
77         if (n->prev) n->prev->next = n->next;
78         if (n->next) n->next->prev = n->prev;
79
80         if (d->responselist == n) d->responselist = n->next; 
81
82         free(n);
83
84         num_response_packets--; /* count of total number of packets still around */
85 }
86
87
88 /****************************************************************************
89   create a name query response record
90   **************************************************************************/
91 struct response_record *make_response_queue_record(enum state_type state,
92                                 int id,int fd,
93                                 int quest_type, char *name,int type, int nb_flags, time_t ttl,
94                                 BOOL bcast,BOOL recurse,
95                                 struct in_addr send_ip, struct in_addr reply_to_ip)
96 {
97   struct response_record *n;
98         
99   if (!name || !name[0]) return NULL;
100         
101   if (!(n = (struct response_record *)malloc(sizeof(*n)))) 
102     return(NULL);
103
104   n->response_id = id;
105   n->state = state;
106   n->fd = fd;
107   n->quest_type = quest_type;
108   make_nmb_name(&n->name, name, type, scope);
109   n->nb_flags = nb_flags;
110   n->ttl = ttl;
111   n->bcast = bcast;
112   n->recurse = recurse;
113   n->send_ip = send_ip;
114   n->reply_to_ip = reply_to_ip;
115
116   n->repeat_interval = 1; /* XXXX should be in ms */
117   n->repeat_count = 4;
118   n->repeat_time = time(NULL) + n->repeat_interval;
119
120   n->num_msgs = 0;
121
122   return n;
123 }
124
125
126 /****************************************************************************
127   find a response in a subnet's name query response list. 
128   **************************************************************************/
129 struct response_record *find_response_record(struct subnet_record **d,
130                                 uint16 id)
131 {  
132   struct response_record *n;
133
134   if (!d) return NULL;
135
136   for ((*d) = subnetlist; (*d); (*d) = (*d)->next)
137   {
138     for (n = (*d)->responselist; n; n = n->next)
139     {
140       if (n->response_id == id) {
141          return n;
142       }
143     }
144   }
145
146   *d = NULL;
147
148   return NULL;
149 }
150
151