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#include "system/network.h" 28/* 29 possible states for pending requests 30*/ 31enum 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*/ 40struct 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 tevent_timer *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_data; 87 } async; 88}; 89 90 91 92/* 93 context structure for operations on name queries 94*/ 95struct nbt_name_socket { 96 struct socket_context *sock; 97 struct tevent_context *event_ctx; 98 struct smb_iconv_convenience *iconv_convenience; 99 100 /* a queue of requests pending to be sent */ 101 struct nbt_name_request *send_queue; 102 103 /* the fd event */ 104 struct tevent_fd *fde; 105 106 /* mapping from name_trn_id to pending event */ 107 struct idr_context *idr; 108 109 /* how many requests are waiting for a reply */ 110 uint16_t num_pending; 111 112 /* what to do with incoming request packets */ 113 struct { 114 void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 115 struct socket_address *); 116 void *private_data; 117 } incoming; 118 119 /* what to do with unexpected replies */ 120 struct { 121 void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 122 struct socket_address *); 123 void *private_data; 124 } unexpected; 125}; 126 127 128/* a simple name query */ 129struct nbt_name_query { 130 struct { 131 struct nbt_name name; 132 const char *dest_addr; 133 uint16_t dest_port; 134 bool broadcast; 135 bool wins_lookup; 136 int timeout; /* in seconds */ 137 int retries; 138 } in; 139 struct { 140 const char *reply_from; 141 struct nbt_name name; 142 int16_t num_addrs; 143 const char **reply_addrs; 144 } out; 145}; 146 147/* a simple name status query */ 148struct nbt_name_status { 149 struct { 150 struct nbt_name name; 151 const char *dest_addr; 152 uint16_t dest_port; 153 int timeout; /* in seconds */ 154 int retries; 155 } in; 156 struct { 157 const char *reply_from; 158 struct nbt_name name; 159 struct nbt_rdata_status status; 160 } out; 161}; 162 163/* a name registration request */ 164struct nbt_name_register { 165 struct { 166 struct nbt_name name; 167 const char *dest_addr; 168 uint16_t dest_port; 169 const char *address; 170 uint16_t nb_flags; 171 bool register_demand; 172 bool broadcast; 173 bool multi_homed; 174 uint32_t ttl; 175 int timeout; /* in seconds */ 176 int retries; 177 } in; 178 struct { 179 const char *reply_from; 180 struct nbt_name name; 181 const char *reply_addr; 182 uint8_t rcode; 183 } out; 184}; 185 186/* a send 3 times then demand name broadcast name registration */ 187struct nbt_name_register_bcast { 188 struct { 189 struct nbt_name name; 190 const char *dest_addr; 191 uint16_t dest_port; 192 const char *address; 193 uint16_t nb_flags; 194 uint32_t ttl; 195 } in; 196}; 197 198 199/* wins name register with multiple wins servers to try and multiple 200 addresses to register */ 201struct nbt_name_register_wins { 202 struct { 203 struct nbt_name name; 204 const char **wins_servers; 205 uint16_t wins_port; 206 const char **addresses; 207 uint16_t nb_flags; 208 uint32_t ttl; 209 } in; 210 struct { 211 const char *wins_server; 212 uint8_t rcode; 213 } out; 214}; 215 216 217 218/* a name refresh request */ 219struct nbt_name_refresh { 220 struct { 221 struct nbt_name name; 222 const char *dest_addr; 223 uint16_t dest_port; 224 const char *address; 225 uint16_t nb_flags; 226 bool broadcast; 227 uint32_t ttl; 228 int timeout; /* in seconds */ 229 int retries; 230 } in; 231 struct { 232 const char *reply_from; 233 struct nbt_name name; 234 const char *reply_addr; 235 uint8_t rcode; 236 } out; 237}; 238 239/* wins name refresh with multiple wins servers to try and multiple 240 addresses to register */ 241struct nbt_name_refresh_wins { 242 struct { 243 struct nbt_name name; 244 const char **wins_servers; 245 uint16_t wins_port; 246 const char **addresses; 247 uint16_t nb_flags; 248 uint32_t ttl; 249 } in; 250 struct { 251 const char *wins_server; 252 uint8_t rcode; 253 } out; 254}; 255 256 257/* a name release request */ 258struct nbt_name_release { 259 struct { 260 struct nbt_name name; 261 const char *dest_addr; 262 uint16_t dest_port; 263 const char *address; 264 uint16_t nb_flags; 265 bool broadcast; 266 int timeout; /* in seconds */ 267 int retries; 268 } in; 269 struct { 270 const char *reply_from; 271 struct nbt_name name; 272 const char *reply_addr; 273 uint8_t rcode; 274 } out; 275}; 276 277struct nbt_name_socket *nbt_name_socket_init(TALLOC_CTX *mem_ctx, 278 struct tevent_context *event_ctx, 279 struct smb_iconv_convenience *iconv_convenience); 280void nbt_name_socket_handle_response_packet(struct nbt_name_request *req, 281 struct nbt_name_packet *packet, 282 struct socket_address *src); 283struct nbt_name_request *nbt_name_query_send(struct nbt_name_socket *nbtsock, 284 struct nbt_name_query *io); 285NTSTATUS nbt_name_query_recv(struct nbt_name_request *req, 286 TALLOC_CTX *mem_ctx, struct nbt_name_query *io); 287NTSTATUS nbt_name_query(struct nbt_name_socket *nbtsock, 288 TALLOC_CTX *mem_ctx, struct nbt_name_query *io); 289struct nbt_name_request *nbt_name_status_send(struct nbt_name_socket *nbtsock, 290 struct nbt_name_status *io); 291NTSTATUS nbt_name_status_recv(struct nbt_name_request *req, 292 TALLOC_CTX *mem_ctx, struct nbt_name_status *io); 293NTSTATUS nbt_name_status(struct nbt_name_socket *nbtsock, 294 TALLOC_CTX *mem_ctx, struct nbt_name_status *io); 295 296NTSTATUS nbt_name_dup(TALLOC_CTX *mem_ctx, struct nbt_name *name, struct nbt_name *newname); 297NTSTATUS nbt_name_to_blob(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, DATA_BLOB *blob, struct nbt_name *name); 298NTSTATUS nbt_name_from_blob(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, struct nbt_name *name); 299void nbt_choose_called_name(TALLOC_CTX *mem_ctx, struct nbt_name *n, const char *name, int type); 300char *nbt_name_string(TALLOC_CTX *mem_ctx, const struct nbt_name *name); 301NTSTATUS nbt_name_register(struct nbt_name_socket *nbtsock, 302 TALLOC_CTX *mem_ctx, struct nbt_name_register *io); 303NTSTATUS nbt_name_refresh(struct nbt_name_socket *nbtsock, 304 TALLOC_CTX *mem_ctx, struct nbt_name_refresh *io); 305NTSTATUS nbt_name_release(struct nbt_name_socket *nbtsock, 306 TALLOC_CTX *mem_ctx, struct nbt_name_release *io); 307NTSTATUS nbt_name_register_wins(struct nbt_name_socket *nbtsock, 308 TALLOC_CTX *mem_ctx, 309 struct nbt_name_register_wins *io); 310NTSTATUS nbt_name_refresh_wins(struct nbt_name_socket *nbtsock, 311 TALLOC_CTX *mem_ctx, 312 struct nbt_name_refresh_wins *io); 313NTSTATUS nbt_name_register_recv(struct nbt_name_request *req, 314 TALLOC_CTX *mem_ctx, struct nbt_name_register *io); 315struct nbt_name_request *nbt_name_register_send(struct nbt_name_socket *nbtsock, 316 struct nbt_name_register *io); 317NTSTATUS nbt_name_release_recv(struct nbt_name_request *req, 318 TALLOC_CTX *mem_ctx, struct nbt_name_release *io); 319 320struct nbt_name_request *nbt_name_release_send(struct nbt_name_socket *nbtsock, 321 struct nbt_name_release *io); 322 323NTSTATUS nbt_name_refresh_recv(struct nbt_name_request *req, 324 TALLOC_CTX *mem_ctx, struct nbt_name_refresh *io); 325 326NTSTATUS nbt_set_incoming_handler(struct nbt_name_socket *nbtsock, 327 void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 328 struct socket_address *), 329 void *private_data); 330NTSTATUS nbt_set_unexpected_handler(struct nbt_name_socket *nbtsock, 331 void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 332 struct socket_address *), 333 void *private_data); 334NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock, 335 struct socket_address *dest, 336 struct nbt_name_packet *request); 337 338 339NDR_SCALAR_PROTO(wrepl_nbt_name, const struct nbt_name *) 340NDR_SCALAR_PROTO(nbt_string, const char *) 341NDR_BUFFER_PROTO(nbt_name, struct nbt_name) 342NTSTATUS nbt_rcode_to_ntstatus(uint8_t rcode); 343 344struct composite_context; 345struct composite_context *nbt_name_register_bcast_send(struct nbt_name_socket *nbtsock, 346 struct nbt_name_register_bcast *io); 347NTSTATUS nbt_name_register_bcast_recv(struct composite_context *c); 348struct composite_context *nbt_name_register_wins_send(struct nbt_name_socket *nbtsock, 349 struct nbt_name_register_wins *io); 350NTSTATUS nbt_name_refresh_wins_recv(struct composite_context *c, TALLOC_CTX *mem_ctx, 351 struct nbt_name_refresh_wins *io); 352struct composite_context *nbt_name_refresh_wins_send(struct nbt_name_socket *nbtsock, 353 struct nbt_name_refresh_wins *io); 354NTSTATUS nbt_name_register_wins_recv(struct composite_context *c, TALLOC_CTX *mem_ctx, 355 struct nbt_name_register_wins *io); 356 357 358XFILE *startlmhosts(const char *fname); 359bool getlmhostsent(TALLOC_CTX *ctx, XFILE *fp, char **pp_name, int *name_type, 360 struct sockaddr_storage *pss); 361void endlmhosts(XFILE *fp); 362 363#endif /* __LIBNBT_H__ */ 364