2 Unix SMB/CIFS implementation.
4 a raw async NBT library
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 3 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, see <http://www.gnu.org/licenses/>.
25 #include "librpc/gen_ndr/nbt.h"
26 #include "librpc/ndr/libndr.h"
27 #include "system/network.h"
29 possible states for pending requests
31 enum nbt_request_state
{NBT_REQUEST_SEND
,
40 struct nbt_name_request
{
41 struct nbt_name_request
*next
, *prev
;
43 enum nbt_request_state state
;
47 /* the socket this was on */
48 struct nbt_name_socket
*nbtsock
;
50 /* where to send the request */
51 struct socket_address
*dest
;
53 /* timeout between retries */
56 /* how many retries to send on timeout */
59 /* whether we have received a WACK */
62 /* the timeout event */
63 struct tevent_timer
*te
;
65 /* the name transaction id */
71 /* the encoded request */
74 /* shall we allow multiple replies? */
75 bool allow_multiple_replies
;
77 unsigned int num_replies
;
78 struct nbt_name_reply
{
79 struct nbt_name_packet
*packet
;
80 struct socket_address
*dest
;
83 /* information on what to do on completion */
85 void (*fn
)(struct nbt_name_request
*);
93 context structure for operations on name queries
95 struct nbt_name_socket
{
96 struct socket_context
*sock
;
97 struct tevent_context
*event_ctx
;
98 struct smb_iconv_convenience
*iconv_convenience
;
100 /* a queue of requests pending to be sent */
101 struct nbt_name_request
*send_queue
;
104 struct tevent_fd
*fde
;
106 /* mapping from name_trn_id to pending event */
107 struct idr_context
*idr
;
109 /* how many requests are waiting for a reply */
110 uint16_t num_pending
;
112 /* what to do with incoming request packets */
114 void (*handler
)(struct nbt_name_socket
*, struct nbt_name_packet
*,
115 struct socket_address
*);
119 /* what to do with unexpected replies */
121 void (*handler
)(struct nbt_name_socket
*, struct nbt_name_packet
*,
122 struct socket_address
*);
128 /* a simple name query */
129 struct nbt_name_query
{
131 struct nbt_name name
;
132 const char *dest_addr
;
136 int timeout
; /* in seconds */
140 const char *reply_from
;
141 struct nbt_name name
;
143 const char **reply_addrs
;
147 /* a simple name status query */
148 struct nbt_name_status
{
150 struct nbt_name name
;
151 const char *dest_addr
;
153 int timeout
; /* in seconds */
157 const char *reply_from
;
158 struct nbt_name name
;
159 struct nbt_rdata_status status
;
163 /* a name registration request */
164 struct nbt_name_register
{
166 struct nbt_name name
;
167 const char *dest_addr
;
171 bool register_demand
;
175 int timeout
; /* in seconds */
179 const char *reply_from
;
180 struct nbt_name name
;
181 const char *reply_addr
;
186 /* a send 3 times then demand name broadcast name registration */
187 struct nbt_name_register_bcast
{
189 struct nbt_name name
;
190 const char *dest_addr
;
199 /* wins name register with multiple wins servers to try and multiple
200 addresses to register */
201 struct nbt_name_register_wins
{
203 struct nbt_name name
;
204 const char **wins_servers
;
206 const char **addresses
;
211 const char *wins_server
;
218 /* a name refresh request */
219 struct nbt_name_refresh
{
221 struct nbt_name name
;
222 const char *dest_addr
;
228 int timeout
; /* in seconds */
232 const char *reply_from
;
233 struct nbt_name name
;
234 const char *reply_addr
;
239 /* wins name refresh with multiple wins servers to try and multiple
240 addresses to register */
241 struct nbt_name_refresh_wins
{
243 struct nbt_name name
;
244 const char **wins_servers
;
246 const char **addresses
;
251 const char *wins_server
;
257 /* a name release request */
258 struct nbt_name_release
{
260 struct nbt_name name
;
261 const char *dest_addr
;
266 int timeout
; /* in seconds */
270 const char *reply_from
;
271 struct nbt_name name
;
272 const char *reply_addr
;
277 struct nbt_name_socket
*nbt_name_socket_init(TALLOC_CTX
*mem_ctx
,
278 struct tevent_context
*event_ctx
,
279 struct smb_iconv_convenience
*iconv_convenience
);
280 void nbt_name_socket_handle_response_packet(struct nbt_name_request
*req
,
281 struct nbt_name_packet
*packet
,
282 struct socket_address
*src
);
283 struct nbt_name_request
*nbt_name_query_send(struct nbt_name_socket
*nbtsock
,
284 struct nbt_name_query
*io
);
285 NTSTATUS
nbt_name_query_recv(struct nbt_name_request
*req
,
286 TALLOC_CTX
*mem_ctx
, struct nbt_name_query
*io
);
287 NTSTATUS
nbt_name_query(struct nbt_name_socket
*nbtsock
,
288 TALLOC_CTX
*mem_ctx
, struct nbt_name_query
*io
);
289 struct nbt_name_request
*nbt_name_status_send(struct nbt_name_socket
*nbtsock
,
290 struct nbt_name_status
*io
);
291 NTSTATUS
nbt_name_status_recv(struct nbt_name_request
*req
,
292 TALLOC_CTX
*mem_ctx
, struct nbt_name_status
*io
);
293 NTSTATUS
nbt_name_status(struct nbt_name_socket
*nbtsock
,
294 TALLOC_CTX
*mem_ctx
, struct nbt_name_status
*io
);
296 NTSTATUS
nbt_name_dup(TALLOC_CTX
*mem_ctx
, struct nbt_name
*name
, struct nbt_name
*newname
);
297 NTSTATUS
nbt_name_to_blob(TALLOC_CTX
*mem_ctx
, struct smb_iconv_convenience
*iconv_convenience
, DATA_BLOB
*blob
, struct nbt_name
*name
);
298 NTSTATUS
nbt_name_from_blob(TALLOC_CTX
*mem_ctx
, const DATA_BLOB
*blob
, struct nbt_name
*name
);
299 void nbt_choose_called_name(TALLOC_CTX
*mem_ctx
, struct nbt_name
*n
, const char *name
, int type
);
300 char *nbt_name_string(TALLOC_CTX
*mem_ctx
, const struct nbt_name
*name
);
301 NTSTATUS
nbt_name_register(struct nbt_name_socket
*nbtsock
,
302 TALLOC_CTX
*mem_ctx
, struct nbt_name_register
*io
);
303 NTSTATUS
nbt_name_refresh(struct nbt_name_socket
*nbtsock
,
304 TALLOC_CTX
*mem_ctx
, struct nbt_name_refresh
*io
);
305 NTSTATUS
nbt_name_release(struct nbt_name_socket
*nbtsock
,
306 TALLOC_CTX
*mem_ctx
, struct nbt_name_release
*io
);
307 NTSTATUS
nbt_name_register_wins(struct nbt_name_socket
*nbtsock
,
309 struct nbt_name_register_wins
*io
);
310 NTSTATUS
nbt_name_refresh_wins(struct nbt_name_socket
*nbtsock
,
312 struct nbt_name_refresh_wins
*io
);
313 NTSTATUS
nbt_name_register_recv(struct nbt_name_request
*req
,
314 TALLOC_CTX
*mem_ctx
, struct nbt_name_register
*io
);
315 struct nbt_name_request
*nbt_name_register_send(struct nbt_name_socket
*nbtsock
,
316 struct nbt_name_register
*io
);
317 NTSTATUS
nbt_name_release_recv(struct nbt_name_request
*req
,
318 TALLOC_CTX
*mem_ctx
, struct nbt_name_release
*io
);
320 struct nbt_name_request
*nbt_name_release_send(struct nbt_name_socket
*nbtsock
,
321 struct nbt_name_release
*io
);
323 NTSTATUS
nbt_name_refresh_recv(struct nbt_name_request
*req
,
324 TALLOC_CTX
*mem_ctx
, struct nbt_name_refresh
*io
);
326 NTSTATUS
nbt_set_incoming_handler(struct nbt_name_socket
*nbtsock
,
327 void (*handler
)(struct nbt_name_socket
*, struct nbt_name_packet
*,
328 struct socket_address
*),
330 NTSTATUS
nbt_set_unexpected_handler(struct nbt_name_socket
*nbtsock
,
331 void (*handler
)(struct nbt_name_socket
*, struct nbt_name_packet
*,
332 struct socket_address
*),
334 NTSTATUS
nbt_name_reply_send(struct nbt_name_socket
*nbtsock
,
335 struct socket_address
*dest
,
336 struct nbt_name_packet
*request
);
339 NDR_SCALAR_PROTO(wrepl_nbt_name
, const struct nbt_name
*)
340 NDR_SCALAR_PROTO(nbt_string
, const char *)
341 NDR_BUFFER_PROTO(nbt_name
, struct nbt_name
)
342 NTSTATUS
nbt_rcode_to_ntstatus(uint8_t rcode
);
344 struct composite_context
;
345 struct composite_context
*nbt_name_register_bcast_send(struct nbt_name_socket
*nbtsock
,
346 struct nbt_name_register_bcast
*io
);
347 NTSTATUS
nbt_name_register_bcast_recv(struct composite_context
*c
);
348 struct composite_context
*nbt_name_register_wins_send(struct nbt_name_socket
*nbtsock
,
349 struct nbt_name_register_wins
*io
);
350 NTSTATUS
nbt_name_refresh_wins_recv(struct composite_context
*c
, TALLOC_CTX
*mem_ctx
,
351 struct nbt_name_refresh_wins
*io
);
352 struct composite_context
*nbt_name_refresh_wins_send(struct nbt_name_socket
*nbtsock
,
353 struct nbt_name_refresh_wins
*io
);
354 NTSTATUS
nbt_name_register_wins_recv(struct composite_context
*c
, TALLOC_CTX
*mem_ctx
,
355 struct nbt_name_register_wins
*io
);
358 XFILE
*startlmhosts(const char *fname
);
359 bool getlmhostsent(TALLOC_CTX
*ctx
, XFILE
*fp
, char **pp_name
, int *name_type
,
360 struct sockaddr_storage
*pss
);
361 void endlmhosts(XFILE
*fp
);
363 NTSTATUS
resolve_lmhosts_file_as_sockaddr(const char *lmhosts_file
,
364 const char *name
, int name_type
,
366 struct sockaddr_storage
**return_iplist
,
369 NTSTATUS
resolve_dns_hosts_file_as_sockaddr(const char *dns_hosts_file
,
370 const char *name
, bool srv_lookup
,
372 struct sockaddr_storage
**return_iplist
,
375 #endif /* __LIBNBT_H__ */