Skip site navigation (1)Skip section navigation (2)
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>