IDL: Add autogenerated nbt files.
[Samba/gebeck_regimport.git] / source3 / libcli / nbt / libnbt.h
blobd37a17c19211450a1716d56143ae7d0efde75079
1 /*
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/>.
22 #ifndef __LIBNBT_H__
23 #define __LIBNBT_H__
25 #include "librpc/gen_ndr/nbt.h"
26 #include "librpc/ndr/libndr.h"
29 possible states for pending requests
31 enum nbt_request_state {NBT_REQUEST_SEND,
32 NBT_REQUEST_WAIT,
33 NBT_REQUEST_DONE,
34 NBT_REQUEST_TIMEOUT,
35 NBT_REQUEST_ERROR};
38 a nbt name request
40 struct nbt_name_request {
41 struct nbt_name_request *next, *prev;
43 enum nbt_request_state state;
45 NTSTATUS status;
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 */
54 int timeout;
56 /* how many retries to send on timeout */
57 int num_retries;
59 /* whether we have received a WACK */
60 bool received_wack;
62 /* the timeout event */
63 struct timed_event *te;
65 /* the name transaction id */
66 uint16_t name_trn_id;
68 /* is it a reply? */
69 bool is_reply;
71 /* the encoded request */
72 DATA_BLOB encoded;
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;
81 } *replies;
83 /* information on what to do on completion */
84 struct {
85 void (*fn)(struct nbt_name_request *);
86 void *_private;
87 } async;
93 context structure for operations on name queries
95 struct nbt_name_socket {
96 struct socket_context *sock;
97 struct event_context *event_ctx;
99 struct smb_iconv_convenience *iconv_convenience;
101 /* a queue of requests pending to be sent */
102 struct nbt_name_request *send_queue;
104 /* the fd event */
105 struct fd_event *fde;
107 /* mapping from name_trn_id to pending event */
108 struct idr_context *idr;
110 /* how many requests are waiting for a reply */
111 uint16_t num_pending;
113 /* what to do with incoming request packets */
114 struct {
115 void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *,
116 struct socket_address *);
117 void *_private;
118 } incoming;
120 /* what to do with unexpected replies */
121 struct {
122 void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *,
123 struct socket_address *);
124 void *_private;
125 } unexpected;
129 /* a simple name query */
130 struct nbt_name_query {
131 struct {
132 struct nbt_name name;
133 const char *dest_addr;
134 uint16_t dest_port;
135 bool broadcast;
136 bool wins_lookup;
137 int timeout; /* in seconds */
138 int retries;
139 } in;
140 struct {
141 const char *reply_from;
142 struct nbt_name name;
143 int16_t num_addrs;
144 const char **reply_addrs;
145 } out;
148 /* a simple name status query */
149 struct nbt_name_status {
150 struct {
151 struct nbt_name name;
152 const char *dest_addr;
153 uint16_t dest_port;
154 int timeout; /* in seconds */
155 int retries;
156 } in;
157 struct {
158 const char *reply_from;
159 struct nbt_name name;
160 struct nbt_rdata_status status;
161 } out;
164 /* a name registration request */
165 struct nbt_name_register {
166 struct {
167 struct nbt_name name;
168 const char *dest_addr;
169 uint16_t dest_port;
170 const char *address;
171 uint16_t nb_flags;
172 bool register_demand;
173 bool broadcast;
174 bool multi_homed;
175 uint32_t ttl;
176 int timeout; /* in seconds */
177 int retries;
178 } in;
179 struct {
180 const char *reply_from;
181 struct nbt_name name;
182 const char *reply_addr;
183 uint8_t rcode;
184 } out;
187 /* a send 3 times then demand name broadcast name registration */
188 struct nbt_name_register_bcast {
189 struct {
190 struct nbt_name name;
191 const char *dest_addr;
192 uint16_t dest_port;
193 const char *address;
194 uint16_t nb_flags;
195 uint32_t ttl;
196 } in;
200 /* wins name register with multiple wins servers to try and multiple
201 addresses to register */
202 struct nbt_name_register_wins {
203 struct {
204 struct nbt_name name;
205 const char **wins_servers;
206 uint16_t wins_port;
207 const char **addresses;
208 uint16_t nb_flags;
209 uint32_t ttl;
210 } in;
211 struct {
212 const char *wins_server;
213 uint8_t rcode;
214 } out;
219 /* a name refresh request */
220 struct nbt_name_refresh {
221 struct {
222 struct nbt_name name;
223 const char *dest_addr;
224 uint16_t dest_port;
225 const char *address;
226 uint16_t nb_flags;
227 bool broadcast;
228 uint32_t ttl;
229 int timeout; /* in seconds */
230 int retries;
231 } in;
232 struct {
233 const char *reply_from;
234 struct nbt_name name;
235 const char *reply_addr;
236 uint8_t rcode;
237 } out;
240 /* wins name refresh with multiple wins servers to try and multiple
241 addresses to register */
242 struct nbt_name_refresh_wins {
243 struct {
244 struct nbt_name name;
245 const char **wins_servers;
246 uint16_t wins_port;
247 const char **addresses;
248 uint16_t nb_flags;
249 uint32_t ttl;
250 } in;
251 struct {
252 const char *wins_server;
253 uint8_t rcode;
254 } out;
258 /* a name release request */
259 struct nbt_name_release {
260 struct {
261 struct nbt_name name;
262 const char *dest_addr;
263 uint16_t dest_port;
264 const char *address;
265 uint16_t nb_flags;
266 bool broadcast;
267 int timeout; /* in seconds */
268 int retries;
269 } in;
270 struct {
271 const char *reply_from;
272 struct nbt_name name;
273 const char *reply_addr;
274 uint8_t rcode;
275 } out;
278 struct nbt_name_socket *nbt_name_socket_init(TALLOC_CTX *mem_ctx,
279 struct event_context *event_ctx);
281 struct smb_iconv_convenience *iconv_convenience);*/
282 struct nbt_name_request *nbt_name_query_send(struct nbt_name_socket *nbtsock,
283 struct nbt_name_query *io);
284 NTSTATUS nbt_name_query_recv(struct nbt_name_request *req,
285 TALLOC_CTX *mem_ctx, struct nbt_name_query *io);
286 NTSTATUS nbt_name_query(struct nbt_name_socket *nbtsock,
287 TALLOC_CTX *mem_ctx, struct nbt_name_query *io);
288 struct nbt_name_request *nbt_name_status_send(struct nbt_name_socket *nbtsock,
289 struct nbt_name_status *io);
290 NTSTATUS nbt_name_status_recv(struct nbt_name_request *req,
291 TALLOC_CTX *mem_ctx, struct nbt_name_status *io);
292 NTSTATUS nbt_name_status(struct nbt_name_socket *nbtsock,
293 TALLOC_CTX *mem_ctx, struct nbt_name_status *io);
295 NTSTATUS nbt_name_dup(TALLOC_CTX *mem_ctx, struct nbt_name *name, struct nbt_name *newname);
296 NTSTATUS nbt_name_to_blob(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct nbt_name *name);
297 NTSTATUS nbt_name_from_blob(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, struct nbt_name *name);
298 void nbt_choose_called_name(TALLOC_CTX *mem_ctx, struct nbt_name *n, const char *name, int type);
299 char *nbt_name_string(TALLOC_CTX *mem_ctx, const struct nbt_name *name);
300 NTSTATUS nbt_name_register(struct nbt_name_socket *nbtsock,
301 TALLOC_CTX *mem_ctx, struct nbt_name_register *io);
302 NTSTATUS nbt_name_refresh(struct nbt_name_socket *nbtsock,
303 TALLOC_CTX *mem_ctx, struct nbt_name_refresh *io);
304 NTSTATUS nbt_name_release(struct nbt_name_socket *nbtsock,
305 TALLOC_CTX *mem_ctx, struct nbt_name_release *io);
306 NTSTATUS nbt_name_register_wins(struct nbt_name_socket *nbtsock,
307 TALLOC_CTX *mem_ctx,
308 struct nbt_name_register_wins *io);
309 NTSTATUS nbt_name_refresh_wins(struct nbt_name_socket *nbtsock,
310 TALLOC_CTX *mem_ctx,
311 struct nbt_name_refresh_wins *io);
312 NTSTATUS nbt_name_register_recv(struct nbt_name_request *req,
313 TALLOC_CTX *mem_ctx, struct nbt_name_register *io);
314 struct nbt_name_request *nbt_name_register_send(struct nbt_name_socket *nbtsock,
315 struct nbt_name_register *io);
316 NTSTATUS nbt_name_release_recv(struct nbt_name_request *req,
317 TALLOC_CTX *mem_ctx, struct nbt_name_release *io);
319 struct nbt_name_request *nbt_name_release_send(struct nbt_name_socket *nbtsock,
320 struct nbt_name_release *io);
322 NTSTATUS nbt_name_refresh_recv(struct nbt_name_request *req,
323 TALLOC_CTX *mem_ctx, struct nbt_name_refresh *io);
325 NTSTATUS nbt_set_incoming_handler(struct nbt_name_socket *nbtsock,
326 void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *,
327 struct socket_address *),
328 void *_private);
329 NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
330 struct socket_address *dest,
331 struct nbt_name_packet *request);
334 NDR_SCALAR_PROTO(wrepl_nbt_name, const struct nbt_name *);
335 NDR_SCALAR_PROTO(nbt_string, const char *);
336 NDR_BUFFER_PROTO(nbt_name, struct nbt_name);
337 NTSTATUS nbt_rcode_to_ntstatus(uint8_t rcode);
339 struct composite_context;
340 struct composite_context *nbt_name_register_bcast_send(struct nbt_name_socket *nbtsock,
341 struct nbt_name_register_bcast *io);
342 NTSTATUS nbt_name_register_bcast_recv(struct composite_context *c);
343 struct composite_context *nbt_name_register_wins_send(struct nbt_name_socket *nbtsock,
344 struct nbt_name_register_wins *io);
345 NTSTATUS nbt_name_refresh_wins_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
346 struct nbt_name_refresh_wins *io);
347 struct composite_context *nbt_name_refresh_wins_send(struct nbt_name_socket *nbtsock,
348 struct nbt_name_refresh_wins *io);
349 NTSTATUS nbt_name_register_wins_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
350 struct nbt_name_register_wins *io);
353 #endif /* __LIBNBT_H__ */