Date: Wed, 8 Aug 2001 13:27:31 -0700 From: Jim Pirzyk <Jim.Pirzyk@disney.com> To: Hajimu UMEMOTO <ume@mahoroba.org>, 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: <01080813273100.00624@snoopy> In-Reply-To: <20010809.043555.104064272.ume@mahoroba.org> References: <55998.997269012@axl.seasidesoftware.co.za> <20010808191242.C10516@sunbay.com> <20010809.043555.104064272.ume@mahoroba.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Testing it out it does solve my problems. Thanks. So how does this patch work in that getaddrinfo came from the KAME project. Do we have to wait for the vendor branch to be upgraded with a new version of KAME that has this fix or should we patch getaddrinfo ourselves? Also in the future, how would we support sorting IPv6 addresses (we are currently not running IPv6, but eventually I would think we may have to move there). - JimP On Wednesday 08 August 2001 12:35 pm, Hajimu UMEMOTO wrote: > >>>>> 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/ -- --- @(#) $Id: dot.signature,v 1.10 2001/05/17 23:38:49 Jim.Pirzyk Exp $ __o Jim.Pirzyk@disney.com ------------- pirzyk@freebsd.org _'\<,_ Senior Systems Engineer, Walt Disney Feature Animation (*)/ (*) 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?01080813273100.00624>