X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=source3%2Flibsmb%2Fnamequery.c;h=1a641ac79133334fe300ab861c863da633bc3d3e;hb=5d05d2299983b5d34615cd269b04806bba173c0d;hp=05143270b9fd8ce2a9f9f8b35740092a1e6ca6d7;hpb=571f20cd4db48c8d510e10b7188678d585abb2d1;p=ira%2Fwip.git diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 05143270b9f..1a641ac7913 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -439,12 +439,12 @@ static int addr_compare(const struct sockaddr *ss1, int num_interfaces = iface_count(); int i; - /* Sort IPv6 addresses first. */ + /* Sort IPv4 addresses first. */ if (ss1->sa_family != ss2->sa_family) { if (ss2->sa_family == AF_INET) { - return -1; - } else { return 1; + } else { + return -1; } } @@ -601,6 +601,38 @@ static int remove_duplicate_addrs2(struct ip_service *iplist, int count ) return count; } +static bool prioritize_ipv4_list(struct ip_service *iplist, int count) +{ + TALLOC_CTX *frame = talloc_stackframe(); + struct ip_service *iplist_new = TALLOC_ARRAY(frame, struct ip_service, count); + int i, j; + + if (iplist_new == NULL) { + TALLOC_FREE(frame); + return false; + } + + j = 0; + + /* Copy IPv4 first. */ + for (i = 0; i < count; i++) { + if (iplist[i].ss.ss_family == AF_INET) { + iplist_new[j++] = iplist[i]; + } + } + + /* Copy IPv6. */ + for (i = 0; i < count; i++) { + if (iplist[i].ss.ss_family != AF_INET) { + iplist_new[j++] = iplist[i]; + } + } + + memcpy(iplist, iplist_new, sizeof(struct ip_service)*count); + TALLOC_FREE(frame); + return true; +} + /**************************************************************************** Do a netbios name query to find someones IP. Returns an array of IP addresses or NULL if none. @@ -1664,7 +1696,8 @@ NTSTATUS internal_resolve_name(const char *name, bool resolve_name(const char *name, struct sockaddr_storage *return_ss, - int name_type) + int name_type, + bool prefer_ipv4) { struct ip_service *ss_list = NULL; char *sitename = NULL; @@ -1681,6 +1714,19 @@ bool resolve_name(const char *name, lp_name_resolve_order()))) { int i; + if (prefer_ipv4) { + for (i=0; i= 4 ) { DEBUG(4,("get_dc_list: returning %d ip addresses " "in an %sordered list\n",