summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/lib/netif/interface.c13
-rw-r--r--source4/libcli/resolve/nbtlist.c15
2 files changed, 27 insertions, 1 deletions
diff --git a/source4/lib/netif/interface.c b/source4/lib/netif/interface.c
index 80041d5350..670913ab6f 100644
--- a/source4/lib/netif/interface.c
+++ b/source4/lib/netif/interface.c
@@ -353,3 +353,16 @@ const char *iface_best_ip(const char *dest)
}
return iface_n_ip(0);
}
+
+/*
+ return True if an IP is one one of our local networks
+*/
+BOOL iface_is_local(const char *dest)
+{
+ struct in_addr ip;
+ ip.s_addr = interpret_addr(dest);
+ if (iface_find(ip, True)) {
+ return True;
+ }
+ return False;
+}
diff --git a/source4/libcli/resolve/nbtlist.c b/source4/libcli/resolve/nbtlist.c
index d5b01e06d9..0026c6fceb 100644
--- a/source4/libcli/resolve/nbtlist.c
+++ b/source4/libcli/resolve/nbtlist.c
@@ -66,8 +66,21 @@ static void nbtlist_handler(struct nbt_name_request *req)
c->state = SMBCLI_REQUEST_ERROR;
c->status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
} else {
+ struct nbt_name_query *q = &state->io_queries[i];
c->state = SMBCLI_REQUEST_DONE;
- state->reply_addr = talloc_steal(state, state->io_queries[i].out.reply_addrs[0]);
+ /* 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])) {
+ state->reply_addr = talloc_steal(state,
+ q->out.reply_addrs[i]);
+ break;
+ }
+ }
+ if (state->reply_addr == NULL) {
+ state->reply_addr = talloc_steal(state,
+ q->out.reply_addrs[0]);
+ }
}
}