Merge branch 'v4-0-trivial' into v4-0-test
[kai/samba.git] / source / libcli / nbt / libnbt.h
index a7788f791bf593de1b7ea8c7e18e6d4afba1ee5e..bc85d87b895fa6926e301cc9ce15ca38738590bf 100644 (file)
@@ -7,7 +7,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include "librpc/gen_ndr/ndr_nbt.h"
+#ifndef __LIBNBT_H__
+#define __LIBNBT_H__
+
+#include "librpc/gen_ndr/nbt.h"
 
 /*
   possible states for pending requests
@@ -45,22 +47,36 @@ struct nbt_name_request {
        struct nbt_name_socket *nbtsock;
 
        /* where to send the request */
-       const char *dest_addr;
-       int dest_port;
+       struct socket_address *dest;
+
+       /* timeout between retries */
+       int timeout;
+
+       /* how many retries to send on timeout */
+       int num_retries;
+
+       /* whether we have received a WACK */
+       bool received_wack;
 
        /* the timeout event */
        struct timed_event *te;
 
-       struct nbt_name_packet *request;
+       /* the name transaction id */
+       uint16_t name_trn_id;
+
+       /* is it a reply? */
+       bool is_reply;
+       
+       /* the encoded request */
+       DATA_BLOB encoded;
 
        /* shall we allow multiple replies? */
-       BOOL allow_multiple_replies;
+       bool allow_multiple_replies;
 
-       uint_t num_replies;
+       unsigned int num_replies;
        struct nbt_name_reply {
                struct nbt_name_packet *packet;
-               const char *reply_addr;
-               int reply_port;
+               struct socket_address *dest;
        } *replies;
 
        /* information on what to do on completion */
@@ -78,6 +94,7 @@ struct nbt_name_request {
 struct nbt_name_socket {
        struct socket_context *sock;
        struct event_context *event_ctx;
+       struct smb_iconv_convenience *iconv_convenience;
 
        /* a queue of requests pending to be sent */
        struct nbt_name_request *send_queue;
@@ -90,6 +107,20 @@ struct nbt_name_socket {
 
        /* how many requests are waiting for a reply */
        uint16_t num_pending;
+
+       /* what to do with incoming request packets */
+       struct {
+               void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 
+                               struct socket_address *);
+               void *private;
+       } incoming;
+
+       /* what to do with unexpected replies */
+       struct {
+               void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 
+                               struct socket_address *);
+               void *private;
+       } unexpected;
 };
 
 
@@ -98,14 +129,17 @@ struct nbt_name_query {
        struct {
                struct nbt_name name;
                const char *dest_addr;
-               BOOL broadcast;
-               BOOL wins_lookup;
+               uint16_t dest_port;
+               bool broadcast;
+               bool wins_lookup;
                int timeout; /* in seconds */
+               int retries;
        } in;
        struct {
                const char *reply_from;
                struct nbt_name name;
-               const char *reply_addr;
+               int16_t num_addrs;
+               const char **reply_addrs;
        } out;
 };
 
@@ -114,7 +148,9 @@ struct nbt_name_status {
        struct {
                struct nbt_name name;
                const char *dest_addr;
+               uint16_t dest_port;
                int timeout; /* in seconds */
+               int retries;
        } in;
        struct {
                const char *reply_from;
@@ -122,3 +158,121 @@ struct nbt_name_status {
                struct nbt_rdata_status status;
        } out;
 };
+
+/* a name registration request */
+struct nbt_name_register {
+       struct {
+               struct nbt_name name;
+               const char *dest_addr;
+               uint16_t dest_port;
+               const char *address;
+               uint16_t nb_flags;
+               bool register_demand;
+               bool broadcast;
+               bool multi_homed;
+               uint32_t ttl;
+               int timeout; /* in seconds */
+               int retries;
+       } in;
+       struct {
+               const char *reply_from;
+               struct nbt_name name;
+               const char *reply_addr;
+               uint8_t rcode;
+       } out;
+};
+
+/* a send 3 times then demand name broadcast name registration */
+struct nbt_name_register_bcast {
+       struct {
+               struct nbt_name name;
+               const char *dest_addr;
+               uint16_t dest_port;
+               const char *address;
+               uint16_t nb_flags;
+               uint32_t ttl;
+       } in;
+};
+
+
+/* wins name register with multiple wins servers to try and multiple
+   addresses to register */
+struct nbt_name_register_wins {
+       struct {
+               struct nbt_name name;
+               const char **wins_servers;
+               uint16_t wins_port;
+               const char **addresses;
+               uint16_t nb_flags;
+               uint32_t ttl;
+       } in;
+       struct {
+               const char *wins_server;
+               uint8_t rcode;
+       } out;
+};
+
+
+
+/* a name refresh request */
+struct nbt_name_refresh {
+       struct {
+               struct nbt_name name;
+               const char *dest_addr;
+               uint16_t dest_port;
+               const char *address;
+               uint16_t nb_flags;
+               bool broadcast;
+               uint32_t ttl;
+               int timeout; /* in seconds */
+               int retries;
+       } in;
+       struct {
+               const char *reply_from;
+               struct nbt_name name;
+               const char *reply_addr;
+               uint8_t rcode;
+       } out;
+};
+
+/* wins name refresh with multiple wins servers to try and multiple
+   addresses to register */
+struct nbt_name_refresh_wins {
+       struct {
+               struct nbt_name name;
+               const char **wins_servers;
+               uint16_t wins_port;
+               const char **addresses;
+               uint16_t nb_flags;
+               uint32_t ttl;
+       } in;
+       struct {
+               const char *wins_server;
+               uint8_t rcode;
+       } out;
+};
+
+
+/* a name release request */
+struct nbt_name_release {
+       struct {
+               struct nbt_name name;
+               const char *dest_addr;
+               uint16_t dest_port;
+               const char *address;
+               uint16_t nb_flags;
+               bool broadcast;
+               int timeout; /* in seconds */
+               int retries;
+       } in;
+       struct {
+               const char *reply_from;
+               struct nbt_name name;
+               const char *reply_addr;
+               uint8_t rcode;
+       } out;
+};
+
+#include "libcli/nbt/nbt_proto.h"
+
+#endif /* __LIBNBT_H__ */