diff options
-rw-r--r-- | source4/lib/netif/interface.c | 13 | ||||
-rw-r--r-- | source4/libcli/resolve/nbtlist.c | 15 |
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]); + } } } |