Make sure prototypes are always included, make some functions static and
[samba.git] / source4 / libcli / resolve / nbtlist.c
index faa2962d5adcd94e74499eeb056c16525d61fff0..531ce6098fbcdde4d0a8d7667d7ca13a87edc844 100644 (file)
@@ -28,8 +28,9 @@
 #include "system/network.h"
 #include "lib/socket/netif.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
-#include "libcli/nbt/libnbt.h"
+#include "../libcli/nbt/libnbt.h"
 #include "param/param.h"
+#include "libcli/resolve/resolve.h"
 
 struct nbtlist_state {
        struct nbt_name name;
@@ -38,6 +39,7 @@ struct nbtlist_state {
        struct nbt_name_request **queries;
        struct nbt_name_query *io_queries;
        const char *reply_addr;
+       struct interface *ifaces;
 };
 
 /*
@@ -45,7 +47,7 @@ struct nbtlist_state {
 */
 static void nbtlist_handler(struct nbt_name_request *req)
 {
-       struct composite_context *c = talloc_get_type(req->async.private
+       struct composite_context *c = talloc_get_type(req->async.private_data,
                                                      struct composite_context);
        struct nbtlist_state *state = talloc_get_type(c->private_data, struct nbtlist_state);
        struct nbt_name_query *q;
@@ -77,7 +79,7 @@ static void nbtlist_handler(struct nbt_name_request *req)
        /* favor a local address if possible */
        state->reply_addr = NULL;
        for (i=0;i<q->out.num_addrs;i++) {
-               if (iface_is_local(q->out.reply_addrs[i])) {
+               if (iface_is_local(state->ifaces, q->out.reply_addrs[i])) {
                        state->reply_addr = talloc_steal(state, 
                                                         q->out.reply_addrs[i]);
                        break;
@@ -99,17 +101,19 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
                                                    struct event_context *event_ctx,
                                                    struct nbt_name *name, 
                                                    const char **address_list,
-                                                   BOOL broadcast,
-                                                   BOOL wins_lookup)
+                                                   struct interface *ifaces,
+                                                   uint16_t nbt_port,
+                                                   int nbt_timeout,
+                                                   bool broadcast,
+                                                   bool wins_lookup)
 {
        struct composite_context *c;
        struct nbtlist_state *state;
        int i;
 
-       c = composite_create(event_ctx, event_ctx);
+       c = composite_create(mem_ctx, event_ctx);
        if (c == NULL) return NULL;
 
-       c->event_ctx = talloc_reference(c, event_ctx);
        if (composite_nomem(c->event_ctx, c)) return c;
 
        state = talloc(c, struct nbtlist_state);
@@ -126,6 +130,8 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
                if (composite_nomem(state->name.scope, c)) return c;
        }
 
+       state->ifaces = talloc_reference(state, ifaces);
+
        /*
         * we can't push long names on the wire,
         * so bail out here to give a useful error message
@@ -135,7 +141,8 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
                return c;
        }
 
-       state->nbtsock = nbt_name_socket_init(state, event_ctx);
+       state->nbtsock = nbt_name_socket_init(state, event_ctx, 
+                                             lp_iconv_convenience(global_loadparm));
        if (composite_nomem(state->nbtsock, c)) return c;
 
        /* count the address_list size */
@@ -151,18 +158,19 @@ struct composite_context *resolve_name_nbtlist_send(TALLOC_CTX *mem_ctx,
        for (i=0;i<state->num_queries;i++) {
                state->io_queries[i].in.name        = state->name;
                state->io_queries[i].in.dest_addr   = talloc_strdup(state->io_queries, address_list[i]);
+               state->io_queries[i].in.dest_port   = nbt_port;
                if (composite_nomem(state->io_queries[i].in.dest_addr, c)) return c;
 
                state->io_queries[i].in.broadcast   = broadcast;
                state->io_queries[i].in.wins_lookup = wins_lookup;
-               state->io_queries[i].in.timeout     = lp_parm_int(-1, "nbt", "timeout", 1);
+               state->io_queries[i].in.timeout     = nbt_timeout;
                state->io_queries[i].in.retries     = 2;
 
                state->queries[i] = nbt_name_query_send(state->nbtsock, &state->io_queries[i]);
                if (composite_nomem(state->queries[i], c)) return c;
 
                state->queries[i]->async.fn      = nbtlist_handler;
-               state->queries[i]->async.private = c;
+               state->queries[i]->async.private_data = c;
        }
 
        return c;
@@ -193,10 +201,16 @@ NTSTATUS resolve_name_nbtlist_recv(struct composite_context *c,
 NTSTATUS resolve_name_nbtlist(struct nbt_name *name, 
                              TALLOC_CTX *mem_ctx,
                              const char **address_list,
-                             BOOL broadcast, BOOL wins_lookup,
+                             struct interface *ifaces, 
+                             uint16_t nbt_port,
+                             int nbt_timeout,
+                             bool broadcast, bool wins_lookup,
                              const char **reply_addr)
 {
-       struct composite_context *c = resolve_name_nbtlist_send(mem_ctx, NULL, name, address_list, 
+       struct composite_context *c = resolve_name_nbtlist_send(mem_ctx, NULL, 
+                                                               name, address_list, 
+                                                               ifaces, nbt_port,
+                                                               nbt_timeout,
                                                                broadcast, wins_lookup);
        return resolve_name_nbtlist_recv(c, mem_ctx, reply_addr);
 }