2 Unix SMB/CIFS implementation.
6 Copyright (C) Andrew Tridgell 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "dlinklist.h"
25 #include "system/network.h"
26 #include "nbt_server/nbt_server.h"
29 send a name query reply
31 static void nbtd_name_query_reply(struct nbt_name_socket
*nbtsock
,
32 struct nbt_name_packet
*request_packet
,
33 const char *src_address
, int src_port
,
34 struct nbt_name
*name
, uint32_t ttl
,
35 uint16_t nb_flags
, const char *address
)
37 struct nbt_name_packet
*packet
;
39 packet
= talloc_zero(nbtsock
, struct nbt_name_packet
);
40 if (packet
== NULL
) return;
42 packet
->name_trn_id
= request_packet
->name_trn_id
;
47 NBT_FLAG_AUTHORITIVE
|
48 NBT_FLAG_RECURSION_DESIRED
|
49 NBT_FLAG_RECURSION_AVAIL
;
51 packet
->answers
= talloc_array(packet
, struct nbt_res_rec
, 1);
52 if (packet
->answers
== NULL
) goto failed
;
54 packet
->answers
[0].name
= *name
;
55 packet
->answers
[0].rr_type
= NBT_QTYPE_NETBIOS
;
56 packet
->answers
[0].rr_class
= NBT_QCLASS_IP
;
57 packet
->answers
[0].ttl
= ttl
;
58 packet
->answers
[0].rdata
.netbios
.length
= 6;
59 packet
->answers
[0].rdata
.netbios
.addresses
= talloc_array(packet
->answers
,
60 struct nbt_rdata_address
, 1);
61 if (packet
->answers
[0].rdata
.netbios
.addresses
== NULL
) goto failed
;
62 packet
->answers
[0].rdata
.netbios
.addresses
[0].nb_flags
= nb_flags
;
63 packet
->answers
[0].rdata
.netbios
.addresses
[0].ipaddr
=
64 talloc_strdup(packet
->answers
, address
);
65 if (packet
->answers
[0].rdata
.netbios
.addresses
[0].ipaddr
== NULL
) goto failed
;
67 DEBUG(7,("Sending name query reply for %s<%02x> at %s to %s:%d\n",
68 name
->name
, name
->type
, src_address
, address
, src_port
));
70 nbt_name_reply_send(nbtsock
, src_address
, src_port
, packet
);
80 void nbtd_request_query(struct nbt_name_socket
*nbtsock
,
81 struct nbt_name_packet
*packet
,
82 const char *src_address
, int src_port
)
84 struct nbt_iface_name
*iname
;
85 struct nbt_name
*name
;
86 struct nbt_interface
*iface
= talloc_get_type(nbtsock
->incoming
.private,
87 struct nbt_interface
);
89 /* see if its a node status query */
90 if (packet
->qdcount
== 1 &&
91 packet
->questions
[0].question_type
== NBT_QTYPE_STATUS
) {
92 nbtd_query_status(nbtsock
, packet
, src_address
, src_port
);
96 /* if its a WINS query then direct to our WINS server */
97 if ((packet
->operation
& NBT_FLAG_RECURSION_DESIRED
) &&
98 !(packet
->operation
& NBT_FLAG_BROADCAST
)) {
99 nbtd_query_wins(nbtsock
, packet
, src_address
, src_port
);
103 NBT_ASSERT_PACKET(packet
, src_address
, packet
->qdcount
== 1);
104 NBT_ASSERT_PACKET(packet
, src_address
, packet
->questions
[0].question_type
== NBT_QTYPE_NETBIOS
);
105 NBT_ASSERT_PACKET(packet
, src_address
, packet
->questions
[0].question_class
== NBT_QCLASS_IP
);
107 /* see if we have the requested name on this interface */
108 name
= &packet
->questions
[0].name
;
110 iname
= nbtd_find_iname(iface
, name
, NBT_NM_ACTIVE
);
112 DEBUG(7,("Query for %s<%02x> from %s - not found on %s\n",
113 name
->name
, name
->type
, src_address
, iface
->ip_address
));
117 nbtd_name_query_reply(nbtsock
, packet
, src_address
, src_port
,
118 &iname
->name
, iname
->ttl
, iname
->nb_flags
,