Module Name:    src
Committed By:   tsarna
Date:           Fri Oct  2 02:45:30 UTC 2009

Modified Files:
        src/distrib/sets/lists/base: md.amd64 md.sparc64 shl.mi
        src/distrib/sets/lists/comp: mi
        src/include: netdb.h
        src/lib/libc: shlib_version
        src/lib/libc/net: Makefile.inc getaddrinfo.3 getaddrinfo.c

Log Message:
Introduce allocaddrinfo(3) to make writing getaddrinfo() nss plugins easier.
Discussed on tech-net.


To generate a diff of this commit:
cvs rdiff -u -r1.68 -r1.69 src/distrib/sets/lists/base/md.amd64
cvs rdiff -u -r1.61 -r1.62 src/distrib/sets/lists/base/md.sparc64
cvs rdiff -u -r1.493 -r1.494 src/distrib/sets/lists/base/shl.mi
cvs rdiff -u -r1.1314 -r1.1315 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.61 -r1.62 src/include/netdb.h
cvs rdiff -u -r1.214 -r1.215 src/lib/libc/shlib_version
cvs rdiff -u -r1.77 -r1.78 src/lib/libc/net/Makefile.inc
cvs rdiff -u -r1.46 -r1.47 src/lib/libc/net/getaddrinfo.3
cvs rdiff -u -r1.92 -r1.93 src/lib/libc/net/getaddrinfo.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/base/md.amd64
diff -u src/distrib/sets/lists/base/md.amd64:1.68 src/distrib/sets/lists/base/md.amd64:1.69
--- src/distrib/sets/lists/base/md.amd64:1.68	Fri Sep 11 16:01:59 2009
+++ src/distrib/sets/lists/base/md.amd64	Fri Oct  2 02:45:28 2009
@@ -1,4 +1,4 @@
-# $NetBSD: md.amd64,v 1.68 2009/09/11 16:01:59 mrg Exp $
+# $NetBSD: md.amd64,v 1.69 2009/10/02 02:45:28 tsarna Exp $
 ./dev/lms0					base-obsolete		obsolete
 ./dev/mms0					base-obsolete		obsolete
 ./libexec/ld.elf_so-i386			base-sys-shlib		compat,pic
@@ -67,7 +67,7 @@
 ./usr/lib/i386/libbz2.so.1			base-compat-shlib	compat,pic
 ./usr/lib/i386/libbz2.so.1.1			base-compat-shlib	compat,pic
 ./usr/lib/i386/libc.so.12			base-compat-shlib	compat,pic
-./usr/lib/i386/libc.so.12.170			base-compat-shlib	compat,pic
+./usr/lib/i386/libc.so.12.171			base-compat-shlib	compat,pic
 ./usr/lib/i386/libcom_err.so.6			base-compat-shlib	compat,pic,kerberos
 ./usr/lib/i386/libcom_err.so.6.0		base-compat-shlib	compat,pic,kerberos
 ./usr/lib/i386/libcrypt.so.1			base-compat-shlib	compat,pic

Index: src/distrib/sets/lists/base/md.sparc64
diff -u src/distrib/sets/lists/base/md.sparc64:1.61 src/distrib/sets/lists/base/md.sparc64:1.62
--- src/distrib/sets/lists/base/md.sparc64:1.61	Fri Sep 11 22:36:53 2009
+++ src/distrib/sets/lists/base/md.sparc64	Fri Oct  2 02:45:28 2009
@@ -1,4 +1,4 @@
-# $NetBSD: md.sparc64,v 1.61 2009/09/11 22:36:53 mrg Exp $
+# $NetBSD: md.sparc64,v 1.62 2009/10/02 02:45:28 tsarna Exp $
 ./libexec/ld.elf_so-sparc			base-sysutil-bin	compat,pic
 ./sbin/edlabel					base-sysutil-root
 ./usr/bin/fdformat				base-util-bin
@@ -65,7 +65,7 @@
 ./usr/lib/sparc/libbz2.so.1			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libbz2.so.1.1			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libc.so.12			base-compat-shlib	compat,pic
-./usr/lib/sparc/libc.so.12.170			base-compat-shlib	compat,pic
+./usr/lib/sparc/libc.so.12.171			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcom_err.so.6			base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcom_err.so.6.0		base-compat-shlib	compat,pic
 ./usr/lib/sparc/libcrypt.so.1			base-compat-shlib	compat,pic

Index: src/distrib/sets/lists/base/shl.mi
diff -u src/distrib/sets/lists/base/shl.mi:1.493 src/distrib/sets/lists/base/shl.mi:1.494
--- src/distrib/sets/lists/base/shl.mi:1.493	Wed Sep 30 03:41:12 2009
+++ src/distrib/sets/lists/base/shl.mi	Fri Oct  2 02:45:28 2009
@@ -1,4 +1,4 @@
-# $NetBSD: shl.mi,v 1.493 2009/09/30 03:41:12 tsarna Exp $
+# $NetBSD: shl.mi,v 1.494 2009/10/02 02:45:28 tsarna Exp $
 #
 # Note:	Don't delete entries from here - mark them as "obsolete" instead,
 #	unless otherwise stated below.
@@ -13,7 +13,7 @@
 #
 # Note:	libtermcap and libtermlib are hardlinked and share the same version.
 #
-./lib/libc.so.12.170				base-sys-shlib		dynamicroot
+./lib/libc.so.12.171				base-sys-shlib		dynamicroot
 ./lib/libcrypt.so.1.0				base-sys-shlib		dynamicroot
 ./lib/libcrypto.so.6.0				base-crypto-shlib	crypto,dynamicroot
 ./lib/libdevmapper.so.1.0			base-lvm-shlib		lvm,dynamicroot
@@ -61,7 +61,7 @@
 ./usr/lib/libbluetooth.so.4.2			base-sys-shlib
 ./usr/lib/libbsdmalloc.so.0.0			base-sys-shlib
 ./usr/lib/libbz2.so.1.1				base-sys-shlib
-./usr/lib/libc.so.12.170			base-sys-shlib
+./usr/lib/libc.so.12.171			base-sys-shlib
 ./usr/lib/libcom_err.so.6.0			base-krb5-shlib		kerberos
 ./usr/lib/libcrypt.so.1.0			base-sys-shlib
 ./usr/lib/libcrypto.so.6.0			base-crypto-shlib	crypto

Index: src/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.1314 src/distrib/sets/lists/comp/mi:1.1315
--- src/distrib/sets/lists/comp/mi:1.1314	Tue Sep 29 23:56:26 2009
+++ src/distrib/sets/lists/comp/mi	Fri Oct  2 02:45:29 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: mi,v 1.1314 2009/09/29 23:56:26 tsarna Exp $
+#	$NetBSD: mi,v 1.1315 2009/10/02 02:45:29 tsarna Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -4636,6 +4636,7 @@
 ./usr/share/man/cat3/aio_write.0		comp-c-catman		.cat
 ./usr/share/man/cat3/alarm.0			comp-c-catman		.cat
 ./usr/share/man/cat3/alloca.0			comp-c-catman		.cat
+./usr/share/man/cat3/allocaddrinfo.0		comp-c-catman		.cat
 ./usr/share/man/cat3/alphasort.0		comp-c-catman		.cat
 ./usr/share/man/cat3/arc4random.0		comp-c-catman		.cat
 ./usr/share/man/cat3/archive.0			comp-c-catman		.cat
@@ -10215,6 +10216,7 @@
 ./usr/share/man/html3/aio_write.html		comp-c-htmlman		html
 ./usr/share/man/html3/alarm.html		comp-c-htmlman		html
 ./usr/share/man/html3/alloca.html		comp-c-htmlman		html
+./usr/share/man/html3/allocaddrinfo.html	comp-c-htmlman		html
 ./usr/share/man/html3/alphasort.html		comp-c-htmlman		html
 ./usr/share/man/html3/arc4random.html		comp-c-htmlman		html
 ./usr/share/man/html3/archive.html		comp-c-htmlman		html
@@ -15594,6 +15596,7 @@
 ./usr/share/man/man3/aio_write.3		comp-c-man		.man
 ./usr/share/man/man3/alarm.3			comp-c-man		.man
 ./usr/share/man/man3/alloca.3			comp-c-man		.man
+./usr/share/man/man3/allocaddrinfo.3		comp-c-man		.man
 ./usr/share/man/man3/alphasort.3		comp-c-man		.man
 ./usr/share/man/man3/arc4random.3		comp-c-man		.man
 ./usr/share/man/man3/archive.3			comp-c-man		.man

Index: src/include/netdb.h
diff -u src/include/netdb.h:1.61 src/include/netdb.h:1.62
--- src/include/netdb.h:1.61	Sun Apr 12 17:07:33 2009
+++ src/include/netdb.h	Fri Oct  2 02:45:29 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: netdb.h,v 1.61 2009/04/12 17:07:33 christos Exp $	*/
+/*	$NetBSD: netdb.h,v 1.62 2009/10/02 02:45:29 tsarna Exp $	*/
 
 /*
  * ++Copyright++ 1980, 1983, 1988, 1993
@@ -343,6 +343,7 @@
 int		getnameinfo(const struct sockaddr * __restrict, socklen_t,
 				 char * __restrict, socklen_t,
 				 char * __restrict, socklen_t, int);
+struct addrinfo *allocaddrinfo(socklen_t);
 void		freeaddrinfo(struct addrinfo *);
 const char	*gai_strerror(int);
 #endif

Index: src/lib/libc/shlib_version
diff -u src/lib/libc/shlib_version:1.214 src/lib/libc/shlib_version:1.215
--- src/lib/libc/shlib_version:1.214	Sun Aug 16 19:33:38 2009
+++ src/lib/libc/shlib_version	Fri Oct  2 02:45:29 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: shlib_version,v 1.214 2009/08/16 19:33:38 christos Exp $
+#	$NetBSD: shlib_version,v 1.215 2009/10/02 02:45:29 tsarna Exp $
 #	Remember to update distrib/sets/lists/base/shl.* when changing
 #
 # things we wish to do on next major version bump:
@@ -35,4 +35,4 @@
 #   it's insufficient bitwidth to implement all ctype class.
 #   see isblank's comment in ctype.h.
 major=12
-minor=170
+minor=171

Index: src/lib/libc/net/Makefile.inc
diff -u src/lib/libc/net/Makefile.inc:1.77 src/lib/libc/net/Makefile.inc:1.78
--- src/lib/libc/net/Makefile.inc:1.77	Mon Jun  8 17:18:11 2009
+++ src/lib/libc/net/Makefile.inc	Fri Oct  2 02:45:29 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.77 2009/06/08 17:18:11 christos Exp $
+#	$NetBSD: Makefile.inc,v 1.78 2009/10/02 02:45:29 tsarna Exp $
 #	@(#)Makefile.inc	8.2 (Berkeley) 9/5/93
 
 # net sources
@@ -114,6 +114,7 @@
 	inet6_option_space.3 inet6_rthdr_space.3 \
 	inet6_opt_init.3 inet6_rth_space.3
 MLINKS+=getaddrinfo.3 freeaddrinfo.3 \
+	getaddrinfo.3 allocaddrinfo.3 \
 	getifaddrs.3 freeifaddrs.3 \
 	if_indextoname.3 if_nametoindex.3 if_indextoname.3 if_nameindex.3 \
 	if_indextoname.3 if_freenameindex.3 \

Index: src/lib/libc/net/getaddrinfo.3
diff -u src/lib/libc/net/getaddrinfo.3:1.46 src/lib/libc/net/getaddrinfo.3:1.47
--- src/lib/libc/net/getaddrinfo.3:1.46	Sat Dec 23 07:42:30 2006
+++ src/lib/libc/net/getaddrinfo.3	Fri Oct  2 02:45:29 2009
@@ -1,4 +1,4 @@
-.\"	$NetBSD: getaddrinfo.3,v 1.46 2006/12/23 07:42:30 wiz Exp $
+.\"	$NetBSD: getaddrinfo.3,v 1.47 2009/10/02 02:45:29 tsarna Exp $
 .\"	$KAME: getaddrinfo.3,v 1.36 2005/01/05 03:23:05 itojun Exp $
 .\"	$OpenBSD: getaddrinfo.3,v 1.35 2004/12/21 03:40:31 jaredy Exp $
 .\"
@@ -22,7 +22,8 @@
 .Os
 .Sh NAME
 .Nm getaddrinfo ,
-.Nm freeaddrinfo
+.Nm freeaddrinfo ,
+.Nm allocaddrinfo
 .Nd host and service name to socket address structure
 .Sh SYNOPSIS
 .In netdb.h
@@ -32,6 +33,8 @@
     "const struct addrinfo * restrict hints" "struct addrinfo ** restrict res"
 .Ft void
 .Fn freeaddrinfo "struct addrinfo *ai"
+.Ft struct addrinfo *
+.Fn allocaddrinfo "socklen_t len"
 .Sh DESCRIPTION
 The
 .Fn getaddrinfo
@@ -280,7 +283,35 @@
 pointer should be a
 .Li addrinfo
 structure created by a call to
-.Fn getaddrinfo .
+.Fn getaddrinfo
+or
+.Fn allocaddrinfo .
+The
+.Fn allocaddrinfo
+function is intended primarily for authors of
+.Xr nsdispatch 3
+plugins implementing
+.Fn getaddrinfo
+backends.
+.Fn allocaddrinfo
+allocates a
+.Li struct addrinfo
+in a way that is compatible with being returned from
+.Fn getaddrinfo
+and being ultimately freed by
+.Fn freeaddrinfo .
+The returned structure is zeroed, except for the
+.Fa ai_addr
+field, which
+will point to
+.Fa len
+bytes of memory for storage of a socket address.
+It is safe to allocate memory separately for
+.Fa ai_canonname
+with
+.Xr malloc 3 ,
+or in any other way that is compatible with deallocation by
+.Xr free 3 .
 .Sh RETURN VALUES
 .Fn getaddrinfo
 returns zero on success or one of the error codes listed in

Index: src/lib/libc/net/getaddrinfo.c
diff -u src/lib/libc/net/getaddrinfo.c:1.92 src/lib/libc/net/getaddrinfo.c:1.93
--- src/lib/libc/net/getaddrinfo.c:1.92	Fri Jan 23 00:48:57 2009
+++ src/lib/libc/net/getaddrinfo.c	Fri Oct  2 02:45:29 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: getaddrinfo.c,v 1.92 2009/01/23 00:48:57 tls Exp $	*/
+/*	$NetBSD: getaddrinfo.c,v 1.93 2009/10/02 02:45:29 tsarna Exp $	*/
 /*	$KAME: getaddrinfo.c,v 1.29 2000/08/31 17:26:57 itojun Exp $	*/
 
 /*
@@ -55,7 +55,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: getaddrinfo.c,v 1.92 2009/01/23 00:48:57 tls Exp $");
+__RCSID("$NetBSD: getaddrinfo.c,v 1.93 2009/10/02 02:45:29 tsarna Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "namespace.h"
@@ -847,26 +847,43 @@
 	return 0;
 }
 
+struct addrinfo *
+allocaddrinfo(socklen_t addrlen)
+{
+	struct addrinfo *ai;
+
+	ai = calloc(sizeof(struct addrinfo) + addrlen, 1);
+	if (ai) {
+		ai->ai_addr = (void *)(ai+1);
+		ai->ai_addrlen = ai->ai_addr->sa_len = addrlen;
+	}
+
+	return ai;
+}
+
 static struct addrinfo *
 get_ai(const struct addrinfo *pai, const struct afd *afd, const char *addr)
 {
 	char *p;
 	struct addrinfo *ai;
+	struct sockaddr *save;
 
 	_DIAGASSERT(pai != NULL);
 	_DIAGASSERT(afd != NULL);
 	_DIAGASSERT(addr != NULL);
 
-	ai = (struct addrinfo *)malloc(sizeof(struct addrinfo)
-		+ (afd->a_socklen));
+	ai = allocaddrinfo((socklen_t)afd->a_socklen);
 	if (ai == NULL)
 		return NULL;
 
+        save = ai->ai_addr;
 	memcpy(ai, pai, sizeof(struct addrinfo));
-	ai->ai_addr = (struct sockaddr *)(void *)(ai + 1);
-	memset(ai->ai_addr, 0, (size_t)afd->a_socklen);
-	ai->ai_addr->sa_len = afd->a_socklen;
-	ai->ai_addrlen = afd->a_socklen;
+
+        /* since we just overwrote all of ai, we have
+           to restore ai_addr and ai_addrlen */
+        ai->ai_addr = save;
+        ai->ai_addrlen = (socklen_t)afd->a_socklen;
+        
 	ai->ai_addr->sa_family = ai->ai_family = afd->a_af;
 	p = (char *)(void *)(ai->ai_addr);
 	memcpy(p + afd->a_off, addr, (size_t)afd->a_addrlen);

Reply via email to