From owner-freebsd-bugs Wed Aug 8 12:50:21 2001 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 346AE37B406 for ; Wed, 8 Aug 2001 12:50:04 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.4/8.11.4) id f78Jo4T51311; Wed, 8 Aug 2001 12:50:04 -0700 (PDT) (envelope-from gnats) Date: Wed, 8 Aug 2001 12:50:04 -0700 (PDT) Message-Id: <200108081950.f78Jo4T51311@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Sheldon Hearn Subject: bin/27939: Patch from ume@FreeBSD.org Reply-To: Sheldon Hearn Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org The following reply was made to PR bin/27939; it has been noted by GNATS. From: Sheldon Hearn To: freebsd-gnats-submit@FreeBSD.org Cc: Subject: bin/27939: Patch from ume@FreeBSD.org Date: Wed, 08 Aug 2001 21:44:53 +0200 ------- Forwarded Message Return-path: Envelope-to: sheldonh@starjuice.net Delivery-date: Wed, 08 Aug 2001 15:36:55 -0400 Received: from mail.gambling.com [216.123.44.10] by localhost with POP3 (fetchmail-5.8.11) for sheldonh@localhost (single-drop); Wed, 08 Aug 2001 21:39:33 +0200 (SAST) Received: from [202.227.26.34] (helo=peace.mahoroba.org) by mail.gambling.com with esmtp (Exim 3.31 #1) id 15UZ8P-000LFa-00 for sheldonh@starjuice.net; Wed, 08 Aug 2001 15:36:54 -0400 Received: from localhost (IDENT:3xW4eK4qA1PHHtbsWVNBUur33jE35NdkIuKbIjyeoy2AA8GYoPKM/wBMCyoR0m+a@localhost [::1]) (authenticated as ume with CRAM-MD5) by peace.mahoroba.org (8.11.5/8.11.5/peace) with ESMTP/inet6 id f78JZwU68669; Thu, 9 Aug 2001 04:35:58 +0900 (JST) (envelope-from ume@mahoroba.org) Date: Thu, 09 Aug 2001 04:35:55 +0900 (JST) Message-Id: <20010809.043555.104064272.ume@mahoroba.org> To: ru@FreeBSD.org Cc: Jim.Pirzyk@disney.com, sheldonh@starjuice.net, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/lib/libc/net gethostbyname.3 From: Hajimu UMEMOTO In-Reply-To: <20010808191242.C10516@sunbay.com> References: <55998.997269012@axl.seasidesoftware.co.za> <01080808322800.22597@snoopy> <20010808191242.C10516@sunbay.com> X-Mailer: xcite1.38> Mew version 1.95b119 on Emacs 20.7 / Mule 4.0 =?iso-2022-jp?B?KBskQjJWMWMbKEIp?= X-PGP-Public-Key: http://www.imasy.org/~ume/publickey.asc X-PGP-Fingerprint: 6B 0C 53 FC 5D D0 37 91 05 D0 B3 EF 36 9B 6A BC X-URL: http://www.imasy.org/~ume/ X-Operating-System: FreeBSD 5.0-CURRENT Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit >>>>> On Wed, 8 Aug 2001 19:12:42 +0300 >>>>> Ruslan Ermilov said: ru> On Wed, Aug 08, 2001 at 08:32:28AM -0700, Jim Pirzyk wrote: > On Wednesday 08 August 2001 04:10 am, Sheldon Hearn wrote: > > On Wed, 08 Aug 2001 04:05:47 MST, Ruslan Ermilov wrote: > > > Modified files: > > > lib/libc/net gethostbyname.3 > > > Log: > > > Urge the reader to start using getaddrinfo(3) and getnameinfo(3) > > > protocol-independant functions that don't use static memory area. > > > > And which _rock_! > > Err, not quite. They do not use the DNS sortlist functionallity, > nor do they check to see what subnet the host and remote host > has in common to use that address first. > This would be the #1 reason I would not use them. See PR bin/27939. > ru> This is the implementation bug that should ideally be fixed. But ru> this does not mean that this interface is bad, because DNS is one ru> of the possible back ends, and the latest POSIX draft says: Okay, how about this patch? It supports sortlist. It affects only IPv4 address. Index: lib/libc/net/getaddrinfo.c diff -u lib/libc/net/getaddrinfo.c.orig lib/libc/net/getaddrinfo.c --- lib/libc/net/getaddrinfo.c.orig Sat Jun 16 07:08:28 2001 +++ lib/libc/net/getaddrinfo.c Thu Aug 9 04:32:56 2001 @@ -99,6 +99,9 @@ #include #include #include + +#include "res_config.h" + #ifdef DEBUG #include #endif @@ -1194,6 +1197,72 @@ } #endif +#ifdef RESOLVSORT +struct addr_ptr { + struct addrinfo *ai; + int aval; +}; + +static int +addr4sort(struct addrinfo *sentinel) +{ + struct addrinfo *ai; + struct addr_ptr *addrs, addr; + struct sockaddr_in *sin; + int naddrs, i, j; + int needsort = 0; + + if (!sentinel) + return -1; + naddrs = 0; + for (ai = sentinel->ai_next; ai; ai = ai->ai_next) + naddrs++; + if (naddrs < 2) + return 0; /* We don't need sorting. */ + if ((addrs = malloc(sizeof(struct addr_ptr) * naddrs)) == NULL) + return -1; + i = 0; + for (ai = sentinel->ai_next; ai; ai = ai->ai_next) { + sin = (struct sockaddr_in *)ai->ai_addr; + for (j = 0; (unsigned)j < _res.nsort; j++) { + if (_res.sort_list[j].addr.s_addr == + (sin->sin_addr.s_addr & _res.sort_list[j].mask)) + break; + } + addrs[i].ai = ai; + addrs[i].aval = j; + if (needsort == 0 && i > 0 && j < addrs[i - 1].aval) + needsort = i; + i++; + } + if (!needsort) { + free(addrs); + return 0; + } + + while (needsort < naddrs) { + for (j = needsort - 1; j >= 0; j--) { + if (addrs[j].aval > addrs[j+1].aval) { + addr = addrs[j]; + addrs[j] = addrs[j + 1]; + addrs[j + 1] = addr; + } else + break; + } + needsort++; + } + + ai = sentinel; + for (i = 0; i < naddrs; ++i) { + ai->ai_next = addrs[i].ai; + ai = ai->ai_next; + } + ai->ai_next = NULL; + free(addrs); + return 0; +} +#endif /*RESOLVSORT*/ + #ifdef DEBUG static const char AskedForGot[] = "gethostby*.getanswer: asked for \"%s\", got \"%s\""; @@ -1387,6 +1456,19 @@ haveanswer++; } if (haveanswer) { +#if defined(RESOLVSORT) + /* + * We support only IPv4 address for backward + * compatibility against gethostbyname(3). + */ + if (_res.nsort && qtype == T_A) { + if (addr4sort(&sentinel) < 0) { + freeaddrinfo(sentinel.ai_next); + h_errno = NO_RECOVERY; + return NULL; + } + } +#endif /*RESOLVSORT*/ if (!canonname) (void)get_canonname(pai, sentinel.ai_next, qname); else -- Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan ume@mahoroba.org ume@bisd.hitachi.co.jp ume@{,jp.}FreeBSD.org http://www.imasy.org/~ume/ ------- End of Forwarded Message To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message