Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 Aug 2001 12:50:04 -0700 (PDT)
From:      Sheldon Hearn <sheldonh@starjuice.net>
To:        freebsd-bugs@FreeBSD.org
Subject:   bin/27939: Patch from ume@FreeBSD.org
Message-ID:  <200108081950.f78Jo4T51311@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/27939; it has been noted by GNATS.

From: Sheldon Hearn <sheldonh@starjuice.net>
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: <ume@mahoroba.org>
 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 <ume@mahoroba.org>
 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 <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/
 
 ------- End of Forwarded Message
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200108081950.f78Jo4T51311>