Date: Thu, 09 Aug 2001 04:35:55 +0900 (JST) From: Hajimu UMEMOTO <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 Message-ID: <20010809.043555.104064272.ume@mahoroba.org> In-Reply-To: <20010808191242.C10516@sunbay.com> References: <55998.997269012@axl.seasidesoftware.co.za> <01080808322800.22597@snoopy> <20010808191242.C10516@sunbay.com>
next in thread | previous in thread | raw e-mail | index | archive | help
>>>>> On Wed, 8 Aug 2001 19:12:42 +0300
>>>>> Ruslan Ermilov <ru@FreeBSD.org> 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 <unistd.h>
#include <stdio.h>
#include <errno.h>
+
+#include "res_config.h"
+
#ifdef DEBUG
#include <syslog.h>
#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/
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010809.043555.104064272.ume>
