root/libcli/nbt/libnbt.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 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 */
  95 struct 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 */
 129 struct 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 */
 148 struct 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 */
 164 struct 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 */
 187 struct 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 */
 201 struct 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 */
 219 struct 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 */
 241 struct 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 */
 258 struct 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 
 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);
 295 
 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,
 308                                 TALLOC_CTX *mem_ctx,
 309                                 struct nbt_name_register_wins *io);
 310 NTSTATUS nbt_name_refresh_wins(struct nbt_name_socket *nbtsock,
 311                                 TALLOC_CTX *mem_ctx,
 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);
 319 
 320 struct nbt_name_request *nbt_name_release_send(struct nbt_name_socket *nbtsock,
 321                                                struct nbt_name_release *io);
 322 
 323 NTSTATUS nbt_name_refresh_recv(struct nbt_name_request *req,
 324                                TALLOC_CTX *mem_ctx, struct nbt_name_refresh *io);
 325 
 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 *),
 329                                   void *private_data);
 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 *),
 333                                     void *private_data);
 334 NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
 335                              struct socket_address *dest,
 336                              struct nbt_name_packet *request);
 337 
 338 
 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);
 343 
 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);
 356 
 357 
 358 #endif /* __LIBNBT_H__ */

/* [<][>][^][v][top][bottom][index][help] */