From 2d90a8994245b3611a508fed4ddcf0bd4ad978d9 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 25 Apr 2011 18:47:42 +0200 Subject: s3: Make name_resolve_bcast do parallel lookups to all interfaces --- source3/libsmb/namequery.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) (limited to 'source3') diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index d561049a73..7bb8cafc3c 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -1748,8 +1748,8 @@ NTSTATUS name_resolve_bcast(const char *name, struct sockaddr_storage **return_iplist, int *return_count) { - int i; - int num_interfaces = iface_count(); + struct sockaddr_storage *bcast_addrs; + int i, num_addrs, num_bcast_addrs; struct sockaddr_storage *ss_list; NTSTATUS status = NT_STATUS_NOT_FOUND; @@ -1759,9 +1759,6 @@ NTSTATUS name_resolve_bcast(const char *name, return NT_STATUS_INVALID_PARAMETER; } - *return_iplist = NULL; - *return_count = 0; - /* * "bcast" means do a broadcast lookup on all the local interfaces. */ @@ -1769,32 +1766,33 @@ NTSTATUS name_resolve_bcast(const char *name, DEBUG(3,("name_resolve_bcast: Attempting broadcast lookup " "for name %s<0x%x>\n", name, name_type)); + num_addrs = iface_count(); + bcast_addrs = talloc_array(talloc_tos(), struct sockaddr_storage, + num_addrs); + if (bcast_addrs == NULL) { + return NT_STATUS_NO_MEMORY; + } + /* * Lookup the name on all the interfaces, return on * the first successful match. */ - for( i = num_interfaces-1; i >= 0; i--) { + num_bcast_addrs = 0; + + for (i=0; iss_family != AF_INET) { continue; } - status = name_query(name, name_type, true, true, pss, - talloc_tos(), &ss_list, return_count, - NULL); - if (NT_STATUS_IS_OK(status)) { - goto success; - } + bcast_addrs[num_bcast_addrs] = *pss; + num_bcast_addrs += 1; } - /* failed - no response */ - - return status; - -success: - *return_iplist = ss_list; - return status; + return name_queries(name, name_type, true, true, + bcast_addrs, num_bcast_addrs, 0, 1000, + mem_ctx, return_iplist, return_count, + NULL, NULL); } /******************************************************** -- cgit