Fix a bogus uninitialized variable warning in IDL-based nbt code
[kai/samba.git] / source / libcli / nbt / libnbt.h
1 /*
2    Unix SMB/CIFS implementation.
3
4    a raw async NBT library
5
6    Copyright (C) Andrew Tridgell 2005
7
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.
12
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.
17
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/>.
20 */
21
22 #ifndef __LIBNBT_H__
23 #define __LIBNBT_H__
24
25 #include "librpc/gen_ndr/nbt.h"
26 #include "librpc/ndr/libndr.h"
27
28 /*
29   possible states for pending requests
30 */
31 enum nbt_request_state {NBT_REQUEST_SEND,
32                         NBT_REQUEST_WAIT,
33                         NBT_REQUEST_DONE,
34                         NBT_REQUEST_TIMEOUT,
35                         NBT_REQUEST_ERROR};
36
37 /*
38   a nbt name request
39 */
40 struct nbt_name_request {
41         struct nbt_name_request *next, *prev;
42
43         enum nbt_request_state state;
44
45         NTSTATUS status;
46
47         /* the socket this was on */
48         struct nbt_name_socket *nbtsock;
49
50         /* where to send the request */
51         struct socket_address *dest;
52
53         /* timeout between retries */
54         int timeout;
55
56         /* how many retries to send on timeout */
57         int num_retries;
58
59         /* whether we have received a WACK */
60         bool received_wack;
61
62         /* the timeout event */
63         struct timed_event *te;
64
65         /* the name transaction id */
66         uint16_t name_trn_id;
67
68         /* is it a reply? */
69         bool is_reply;
70
71         /* the encoded request */
72         DATA_BLOB encoded;
73
74         /* shall we allow multiple replies? */
75         bool allow_multiple_replies;
76
77         unsigned int num_replies;
78         struct nbt_name_reply {
79                 struct nbt_name_packet *packet;
80                 struct socket_address *dest;
81         } *replies;
82
83         /* information on what to do on completion */
84         struct {
85                 void (*fn)(struct nbt_name_request *);
86                 void *_private;
87         } async;
88 };
89
90
91
92 /*
93   context structure for operations on name queries
94 */
95 struct nbt_name_socket {
96         struct socket_context *sock;
97         struct event_context *event_ctx;
98 /*
99         struct smb_iconv_convenience *iconv_convenience;
100 */
101         /* a queue of requests pending to be sent */
102         struct nbt_name_request *send_queue;
103
104         /* the fd event */
105         struct fd_event *fde;
106
107         /* mapping from name_trn_id to pending event */
108         struct idr_context *idr;
109
110         /* how many requests are waiting for a reply */
111         uint16_t num_pending;
112
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;
119
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;
126 };
127
128
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;
146 };
147
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;
162 };
163
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;
185 };
186
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;
197 };
198
199
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;
215 };
216
217
218
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;
238 };
239
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;
255 };
256
257
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;
276 };
277
278 struct nbt_name_socket *nbt_name_socket_init(TALLOC_CTX *mem_ctx,
279                                              struct event_context *event_ctx);
280                                              /*,
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);
294
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);
318
319 struct nbt_name_request *nbt_name_release_send(struct nbt_name_socket *nbtsock,
320                                                struct nbt_name_release *io);
321
322 NTSTATUS nbt_name_refresh_recv(struct nbt_name_request *req,
323                                TALLOC_CTX *mem_ctx, struct nbt_name_refresh *io);
324
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);
332
333
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);
338
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);
351
352
353 #endif /* __LIBNBT_H__ */