2 Unix SMB/Netbios implementation.
4 NBT netbios library routines
5 Copyright (C) Andrew Tridgell 1994-1997
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.
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.
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.
21 Module name: namedbresp.c
28 extern int ClientDGRAM
;
30 extern struct subnet_record
*subnetlist
;
32 extern int DEBUGLEVEL
;
35 extern pstring myname
;
36 extern struct in_addr ipzero
;
38 int num_response_packets
= 0;
40 /***************************************************************************
41 add an expected response record into the list
42 **************************************************************************/
43 void add_response_record(struct subnet_record
*d
,
44 struct response_record
*n
)
46 struct response_record
*n2
;
50 num_response_packets
++; /* count of total number of packets still around */
52 DEBUG(4,("adding response record id:%d num_records:%d\n",
53 n
->response_id
, num_response_packets
));
63 for (n2
= d
->responselist
; n2
->next
; n2
= n2
->next
) ;
71 /***************************************************************************
72 remove an expected response record from the list
73 **************************************************************************/
74 void remove_response_record(struct subnet_record
*d
,
75 struct response_record
*n
)
79 if (n
->prev
) n
->prev
->next
= n
->next
;
80 if (n
->next
) n
->next
->prev
= n
->prev
;
82 if (d
->responselist
== n
) d
->responselist
= n
->next
;
86 num_response_packets
--; /* count of total number of packets still around */
90 /****************************************************************************
91 create a name query response record
92 **************************************************************************/
93 struct response_record
*make_response_queue_record(enum state_type state
,
95 int quest_type
, char *name
,int type
, int nb_flags
, time_t ttl
,
96 int server_type
, char *my_name
, char *my_comment
,
97 BOOL bcast
,BOOL recurse
,
98 struct in_addr send_ip
, struct in_addr reply_to_ip
)
100 struct response_record
*n
;
102 if (!name
|| !name
[0]) return NULL
;
104 if (!(n
= (struct response_record
*)malloc(sizeof(*n
))))
110 n
->quest_type
= quest_type
;
111 make_nmb_name(&n
->name
, name
, type
, scope
);
112 n
->nb_flags
= nb_flags
;
114 n
->server_type
= server_type
;
116 n
->recurse
= recurse
;
117 n
->send_ip
= send_ip
;
118 n
->reply_to_ip
= reply_to_ip
;
120 StrnCpy(n
->my_name
, my_name
, sizeof(n
->my_name
)-1);
124 StrnCpy(n
->my_comment
, my_comment
, sizeof(n
->my_comment
)-1);
127 n
->repeat_interval
= 1; /* XXXX should be in ms */
128 n
->repeat_count
= 3; /* 3 retries */
129 n
->repeat_time
= time(NULL
) + n
->repeat_interval
; /* initial retry time */
137 /****************************************************************************
138 find a response in a subnet's name query response list.
139 **************************************************************************/
140 struct response_record
*find_response_record(struct subnet_record
**d
,
143 struct response_record
*n
;
147 for ((*d
) = FIRST_SUBNET
; (*d
); (*d
) = NEXT_SUBNET_INCLUDING_WINS(*d
))
149 for (n
= (*d
)->responselist
; n
; n
= n
->next
)
151 if (n
->response_id
== id
) {
152 DEBUG(4, ("found response record on %s: %d\n",
153 inet_ntoa((*d
)->bcast_ip
), id
));