r26401: Don't cache interfaces context in libnetif.
[samba.git] / source4 / libcli / resolve / nbtlist.c
index e8ea22a0dce80378cee68533c0b5d06b9141a9f8..6c12fe706b432095d4bfc3fad2c30a9148a63102 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,
@@ -16,8 +16,7 @@
    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/>.
 */
 
 /*
@@ -30,6 +29,7 @@
 #include "lib/socket/netif.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
 #include "libcli/nbt/libnbt.h"
+#include "param/param.h"
 
 struct nbtlist_state {
        struct nbt_name name;
@@ -49,6 +49,7 @@ static void nbtlist_handler(struct nbt_name_request *req)
                                                      struct composite_context);
        struct nbtlist_state *state = talloc_get_type(c->private_data, struct nbtlist_state);
        struct nbt_name_query *q;
+       struct interface *ifaces;
        int i;
 
        for (i=0;i<state->num_queries;i++) {
@@ -75,9 +76,10 @@ static void nbtlist_handler(struct nbt_name_request *req)
        }
 
        /* favor a local address if possible */
+       load_interfaces(lp_interfaces(global_loadparm), &ifaces);
        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(ifaces, q->out.reply_addrs[i])) {
                        state->reply_addr = talloc_steal(state, 
                                                         q->out.reply_addrs[i]);
                        break;
@@ -99,8 +101,8 @@ 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)
+                                                   bool broadcast,
+                                                   bool wins_lookup)
 {
        struct composite_context *c;
        struct nbtlist_state *state;
@@ -151,11 +153,12 @@ 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   = lp_nbt_port(global_loadparm);
                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     = lp_parm_int(global_loadparm, NULL, "nbt", "timeout", 1);
                state->io_queries[i].in.retries     = 2;
 
                state->queries[i] = nbt_name_query_send(state->nbtsock, &state->io_queries[i]);
@@ -193,7 +196,7 @@ 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,
+                             bool broadcast, bool wins_lookup,
                              const char **reply_addr)
 {
        struct composite_context *c = resolve_name_nbtlist_send(mem_ctx, NULL, name, address_list,