PERFORCE change 99518 for review

Michael Bushkov bushman at FreeBSD.org
Sun Jun 18 13:55:59 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=99518

Change 99518 by bushman at bushman_nss_ldap_cached on 2006/06/18 13:55:09

	Support for "passwd" and "group" databases added to the nss-modules. IPv4 to IPv6 mapping was tested in ghby_emul test.

Affected files ...

.. //depot/projects/soc2006/nss_ldap_cached/src/lib/Makefile#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/libc/net/Makefile.inc#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/Makefile#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_group.c#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_group.h#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_hosts_addrinfo.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_hosts_namadr.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_net.c#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_net.h#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_passwd.c#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_passwd.h#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/nss_dns.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/res_config.h#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/Makefile#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_group.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_hosts_namadr.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/nss_files.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/Makefile#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_group.c#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_group.h#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_hosts_namadr.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_net.c#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_net.h#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_passwd.c#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_passwd.h#1 add
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nss_nis.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/tests/ghby_emul/Makefile#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/tests/ghby_emul/ghby_emul_test.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/tests/ghby_emul/hosts_list#2 edit

Differences ...

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/Makefile#3 (text+ko) ====

@@ -25,7 +25,7 @@
 # Otherwise, the SUBDIR list should be in alphabetical order.
 
 SUBDIR=	${_csu} libbsm libcom_err libcrypt libkvm msun libmd libncurses \
-	nss_files nss_dns\
+	nss_files nss_dns nss_icmp ${_nss_nis}\
 	libnetgraph libradius librpcsvc libsbuf libtacplus libutil \
 	${_libypclnt} libalias libarchive ${_libatm} \
 	libbegemot ${_libbluetooth} libbsnmp libbz2 libc ${_libc_r} \

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/libc/net/Makefile.inc#2 (text+ko) ====

@@ -5,8 +5,7 @@
 .PATH: ${.CURDIR}/${MACHINE_ARCH}/net ${.CURDIR}/net
 
 SRCS+=	addr2ascii.c ascii2addr.c base64.c ether_addr.c eui64.c \
-	gai_strerror.c getaddrinfo.c \
-	gethostbydns.c gethostbyht.c gethostbynis.c gethostnamadr.c \
+	gai_strerror.c getaddrinfo.c gethostnamadr.c \
 	getifaddrs.c getifmaddrs.c getnameinfo.c \
 	getnetbydns.c getnetbyht.c getnetbynis.c getnetnamadr.c \
 	getproto.c getprotoent.c getprotoname.c getservent.c \
@@ -120,4 +119,3 @@
 SRCS+=	hesiod.c 
 MAN+=	hesiod.3
 .endif
-

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/Makefile#2 (text+ko) ====

@@ -3,14 +3,10 @@
 LIB=	nss_dns
 SHLIB_MAJOR= 1
 SHLIBDIR?= /lib
-#PROG= nss_dns
+PROG= nss_dns
 CFLAGS+=-I${.CURDIR} -I${.CURDIR}/../libc/gen -I${.CURDIR}/../libc/include\
-	-I${.CURDIR}/../libc/net -I${.CURDIR}/../libnssutil
-SRCS=	nss_dns.c dns_hosts_namadr.c dns_hosts_name6.c\
-	dns_hosts_addrinfo.c ${.CURDIR}/../libc/net/map_v4v6.c
-DPADD+= nssutil
-LDADD+=	-lnssutil
-LDFLAGS+= -L${.CURDIR}/../libnssutil
+	-I${.CURDIR}/../libc/net
+SRCS=	nss_dns.c dns_hosts_namadr.c dns_hosts_addrinfo.c dns_passwd.c
 INCS=	
 
 MAN=	

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_hosts_addrinfo.c#4 (text+ko) ====

@@ -182,6 +182,9 @@
 static int res_querydomainN(const char *, const char *,
 	struct res_target *, res_state);
 
+static int str2number(const char *p);
+
+	
 static int
 get_canonname(const struct addrinfo *pai, struct addrinfo *ai, const char *str)
 {
@@ -992,6 +995,22 @@
 }
 #endif /*RESOLVSORT*/
 
+static int
+str2number(const char *p)
+{
+	char *ep;
+	unsigned long v;
+
+	if (*p == '\0')
+		return -1;
+	ep = NULL;
+	errno = 0;
+	v = strtoul(p, &ep, 10);
+	if (errno == 0 && ep && *ep == '\0' && v <= UINT_MAX)
+		return v;
+	else
+		return -1;
+}
 
 /*ARGSUSED*/
 int

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_hosts_namadr.c#4 (text+ko) ====

@@ -77,7 +77,6 @@
 #include "reentrant.h"
 #include "netdb_private.h"
 #include "nss_dns.h"
-#include "hosts_namadr.h"
 
 NETDB_THREAD_ALLOC(hostent)
 NETDB_THREAD_ALLOC(dns_hostent_data)
@@ -99,6 +98,68 @@
 	free(hed);	
 }
 
+static int
+__copy_hostent(struct hostent *he, struct hostent *hptr, char *buf,
+    size_t buflen)
+{
+	char *cp;
+	char **ptr;
+	int i, n;
+	int nptr, len;
+
+	/* Find out the amount of space required to store the answer. */
+	nptr = 2; /* NULL ptrs */
+	len = (char *)ALIGN(buf) - buf;
+	for (i = 0; he->h_addr_list[i]; i++, nptr++) {
+		len += he->h_length;
+	}
+	for (i = 0; he->h_aliases[i]; i++, nptr++) {
+		len += strlen(he->h_aliases[i]) + 1;
+	}
+	len += strlen(he->h_name) + 1;
+	len += nptr * sizeof(char*);
+
+	if (len > buflen) {
+		errno = ERANGE;
+		return (-1);
+	}
+
+	/* copy address size and type */
+	hptr->h_addrtype = he->h_addrtype;
+	n = hptr->h_length = he->h_length;
+
+	ptr = (char **)ALIGN(buf);
+	cp = (char *)ALIGN(buf) + nptr * sizeof(char *);
+
+	/* copy address list */
+	hptr->h_addr_list = ptr;
+	for (i = 0; he->h_addr_list[i]; i++ , ptr++) {
+		memcpy(cp, he->h_addr_list[i], n);
+		hptr->h_addr_list[i] = cp;
+		cp += n;
+	}
+	hptr->h_addr_list[i] = NULL;
+	ptr++;
+
+	/* copy official name */
+	n = strlen(he->h_name) + 1;
+	strcpy(cp, he->h_name);
+	hptr->h_name = cp;
+	cp += n;
+
+	/* copy aliases */
+	hptr->h_aliases = ptr;
+	for (i = 0 ; he->h_aliases[i]; i++) {
+		n = strlen(he->h_aliases[i]) + 1;
+		strcpy(cp, he->h_aliases[i]);
+		hptr->h_aliases[i] = cp;
+		cp += n;
+	}
+	hptr->h_aliases[i] = NULL;
+
+	return (0);
+}
+
 #define SPRINTF(x) ((size_t)sprintf x)
 
 static const char AskedForGot[] =
@@ -163,7 +224,7 @@
 
 static int
 gethostanswer(const querybuf *answer, int anslen, const char *qname, int qtype,
-    struct hostent *he, struct hostent_data *hed, res_state statp)
+    struct hostent *he, struct dns_hostent_data *hed, res_state statp)
 {
 	const HEADER *hp;
 	const u_char *cp;
@@ -359,15 +420,15 @@
 			break;
 #else
 			he->h_name = bp;
-			if (statp->options & RES_USE_INET6) {
-				n = strlen(bp) + 1;	/* for the \0 */
-				if (n >= MAXHOSTNAMELEN) {
-					had_error++;
-					break;
-				}
-				bp += n;
-				_map_v4v6_hostent(he, &bp, ep);
-			}
+//			if (statp->options & RES_USE_INET6) {
+//				n = strlen(bp) + 1;	/* for the \0 */
+//				if (n >= MAXHOSTNAMELEN) {
+//					had_error++;
+//					break;
+//				}
+//				bp += n;
+//				_map_v4v6_hostent(he, &bp, ep);
+//			}
 			RES_SET_H_ERRNO(statp, NETDB_SUCCESS);
 			return (0);
 #endif
@@ -443,8 +504,8 @@
 			he->h_name = bp;
 			bp += n;
 		}
-		if (statp->options & RES_USE_INET6)
-			_map_v4v6_hostent(he, &bp, ep);
+//		if (statp->options & RES_USE_INET6)
+//			_map_v4v6_hostent(he, &bp, ep);
 		RES_SET_H_ERRNO(statp, NETDB_SUCCESS);
 		return (0);
 	}
@@ -458,13 +519,13 @@
 __dns_getanswer(const char *answer, int anslen, const char *qname, int qtype)
 {
 	struct hostent *he;
-	struct hostent_data *hed;
+	struct dns_hostent_data *hed;
 	int error;
 	res_state statp;
 
 	statp = __res_state();
 	if ((he = __hostent_init()) == NULL ||
-	    (hed = __hostent_data_init()) == NULL) {
+	    (hed = __dns_hostent_data_init()) == NULL) {
 		RES_SET_H_ERRNO(statp, NETDB_INTERNAL);
 		return (NULL);
 	}
@@ -699,11 +760,11 @@
 	memcpy(hed->host_addr, uaddr, len);
 	hed->h_addr_ptrs[0] = (char *)hed->host_addr;
 	hed->h_addr_ptrs[1] = NULL;
-	if (af == AF_INET && (statp->options & RES_USE_INET6)) {
-		_map_v4v6_address((char*)hed->host_addr, (char*)hed->host_addr);
-		he.h_addrtype = AF_INET6;
-		he.h_length = NS_IN6ADDRSZ;
-	}
+//	if (af == AF_INET && (statp->options & RES_USE_INET6)) {
+//		_map_v4v6_address((char*)hed->host_addr, (char*)hed->host_addr);
+//		he.h_addrtype = AF_INET6;
+//		he.h_length = NS_IN6ADDRSZ;
+//	}
 	RES_SET_H_ERRNO(statp, NETDB_SUCCESS);
 	if (__copy_hostent(&he, hptr, buffer, buflen) != 0) {
 		*h_errnop = statp->res_h_errno;

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/nss_dns.c#3 (text+ko) ====

@@ -32,14 +32,43 @@
 #include <netdb.h>
 #include <stdlib.h>
 #include "dns_hosts_namadr.h"
-#include "dns_hosts_name6.h"
 #include "dns_hosts_addrinfo.h"
+#include "dns_passwd.h"
+#include "dns_group.h"
+
+/* TODO: for testing purposes only */
+/*#ifdef NSDB_HOSTS
+#undef NSDB_HOSTS
+#endif
+#define NSDB_HOSTS "hosts_"*/
 
 static ns_mtab methods[] = {
+        {NSDB_GROUP, "getgrnam_r", __dns_group, (void *)nss_lt_name},
+        {NSDB_GROUP, "getgrgid_r", __dns_group, (void *)nss_lt_id},
+        {NSDB_GROUP, "getgrent_r", __dns_group, (void *)nss_lt_all},
+        {NSDB_GROUP, "endgrent", __dns_setgrent, NULL},
+        {NSDB_GROUP, "setgrent", __dns_setgrent, NULL},
+
+        {NSDB_PASSWD, "getpwnam_r", __dns_passwd, (void *)nss_lt_name},
+        {NSDB_PASSWD, "getpwuid_r", __dns_passwd, (void *)nss_lt_id},
+        {NSDB_PASSWD, "getpwent_r", __dns_passwd, (void *)nss_lt_all},
+        {NSDB_PASSWD, "endpwent", __dns_setpwent, NULL},
+        {NSDB_PASSWD, "setpwent", __dns_setpwent, NULL},
+
+        {NSDB_GROUP_COMPAT, "getgrnam_r", __dns_group, (void *)nss_lt_name},
+        {NSDB_GROUP_COMPAT, "getgrgid_r", __dns_group, (void *)nss_lt_id},
+        {NSDB_GROUP_COMPAT, "getgrent_r", __dns_group, (void *)nss_lt_all},
+        {NSDB_GROUP_COMPAT, "endgrent", __dns_setgrent, NULL},
+        {NSDB_GROUP_COMPAT, "setgrent", __dns_setgrent, NULL},
+
+        {NSDB_PASSWD_COMPAT, "getpwnam_r", __dns_passwd, (void *)nss_lt_name},
+        {NSDB_PASSWD_COMPAT, "getpwuid_r", __dns_passwd, (void *)nss_lt_id},
+        {NSDB_PASSWD_COMPAT, "getpwent_r", __dns_passwd, (void *)nss_lt_all},
+        {NSDB_PASSWD_COMPAT, "endpwent", __dns_setpwent, NULL},
+        {NSDB_PASSWD_COMPAT, "setpwent", __dns_setpwent, NULL},
+
 	{NSDB_HOSTS, "gethostbyname2_r", __dns_gethostbyname2_r, NULL},
 	{NSDB_HOSTS, "gethostbyaddr_r", __dns_gethostbyaddr_r, NULL},
-	{NSDB_HOSTS, "ghbyname", __dns_ghbyname, NULL},
-	{NSDB_HOSTS, "ghbyaddr", __dns_ghbyaddr, NULL},	
 	{NSDB_HOSTS, "getaddrinfo", __dns_getaddrinfo, NULL}	
 };
 

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/Makefile#2 (text+ko) ====

@@ -3,14 +3,14 @@
 LIB=	nss_files
 SHLIB_MAJOR= 1
 SHLIBDIR?= /lib
-#PROG= nss_files
+
 CFLAGS+=-I${.CURDIR} -I${.CURDIR}/../libc/gen -I${.CURDIR}/../libc/include\
 	-I${.CURDIR}/../libc/net -I${.CURDIR}/../libnssutil
 SRCS=	nss_files.c files_passwd.c files_group.c files_hosts_namadr.c\
-	files_hosts_name6.c files_hosts_addrinfo.c files_serv.c files_proto.c\
+	files_hosts_addrinfo.c files_serv.c files_proto.c\
 	files_net.c files_rpc.c
 DPADD+= nssutil
-LDADD+=	-lnssutil
+LDADD+= -lnssutil
 LDFLAGS+= -L${.CURDIR}/../libnssutil
 INCS=	
 

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_group.c#2 (text+ko) ====

@@ -48,6 +48,7 @@
 #include <unistd.h>
 #include "nss_files.h"
 #include "nss_tls.h"
+#include "gr_scan.h"
 
 struct files_state {
 	FILE	*fp;
@@ -69,107 +70,6 @@
 	free(p);
 }
 
-static int
-is_comment_line(const char *s, size_t n)
-{
-	const char	*eom;
-
-	eom = &s[n];
-
-	for (; s < eom; s++)
-		if (*s == '#' || !isspace((unsigned char)*s))
-			break;
-	return (*s == '#' || s == eom);
-}
-
-/*
- * common group line matching and parsing
- */
-int
-__gr_match_entry(const char *line, size_t linesize, enum nss_lookup_type how,
-    const char *name, gid_t gid)
-{
-	size_t		 namesize;
-	const char	*p, *eol;
-	char		*q;
-	unsigned long	 n;
-	int		 i, needed;
-
-	if (linesize == 0 || is_comment_line(line, linesize))
-		return (NS_NOTFOUND);
-	switch (how) {
-	case nss_lt_name:	needed = 1; break;
-	case nss_lt_id:		needed = 2; break;
-	default:		needed = 2; break;
-	}
-	eol = &line[linesize];
-	for (p = line, i = 0; i < needed && p < eol; p++)
-		if (*p == ':')
-			i++;
-	if (i < needed)
-		return (NS_NOTFOUND);
-	switch (how) {
-	case nss_lt_name:
-		namesize = strlen(name);
-		if (namesize + 1 == (size_t)(p - line) &&
-		    memcmp(line, name, namesize) == 0)
-			return (NS_SUCCESS);
-		break;
-	case nss_lt_id:
-		n = strtoul(p, &q, 10);
-		if (q < eol && *q == ':' && gid == (gid_t)n)
-			return (NS_SUCCESS);
-		break;
-	case nss_lt_all:
-		return (NS_SUCCESS);
-	default:
-		break;
-	}
-	return (NS_NOTFOUND);
-}
-
-
-int
-__gr_parse_entry(char *line, size_t linesize, struct group *grp, char *membuf,
-    size_t membufsize, int *errnop)
-{
-	char	       *s_gid, *s_mem, *p, **members;
-	unsigned long	n;
-	int		maxmembers;
-
-	memset(grp, 0, sizeof(*grp));
-	members = (char **)ALIGN(membuf);
-	membufsize -= (char *)members - membuf;
-	maxmembers = membufsize / sizeof(*members);
-	if (maxmembers <= 0 ||
-	    (grp->gr_name = strsep(&line, ":")) == NULL ||
-	    grp->gr_name[0] == '\0' ||
-	    (grp->gr_passwd = strsep(&line, ":")) == NULL ||
-	    (s_gid = strsep(&line, ":")) == NULL ||
-	    s_gid[0] == '\0')
-		return (NS_NOTFOUND);
-	s_mem = line;
-	n = strtoul(s_gid, &s_gid, 10);
-	if (s_gid[0] != '\0')
-		return (NS_NOTFOUND);
-	grp->gr_gid = (gid_t)n;
-	grp->gr_mem = members;
-	while (maxmembers > 1 && s_mem != NULL) {
-		p = strsep(&s_mem, ",");
-		if (p != NULL && *p != '\0') {
-			*members++ = p;
-			maxmembers--;
-		}
-	}
-	*members = NULL;
-	if (s_mem == NULL)
-		return (NS_SUCCESS);
-	else {
-		*errnop = ERANGE;
-		return (NS_RETURN);
-	}
-}
-
 int
 __files_setgrent(void *retval, void *mdata, va_list ap)
 {

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_hosts_namadr.c#3 (text+ko) ====

@@ -58,6 +58,7 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <errno.h>
 #include <netdb.h>
 #include <stdio.h>
 #include <ctype.h>
@@ -69,7 +70,6 @@
 #include "reentrant.h"
 #include "netdb_private.h"
 #include "nss_files.h"
-#include "hosts_namadr.h"
 
 NETDB_THREAD_ALLOC(hostent)
 NETDB_THREAD_ALLOC(files_hostent_data)
@@ -83,7 +83,7 @@
 static void
 files_hostent_data_free(void *ptr)
 {
-	struct hostent_data *hed = ptr;
+	struct files_hostent_data *hed = ptr;
 
 	if (hed == NULL)
 		return;
@@ -95,6 +95,68 @@
 	free(hed);	
 }
 
+static int
+__copy_hostent(struct hostent *he, struct hostent *hptr, char *buf,
+    size_t buflen)
+{
+	char *cp;
+	char **ptr;
+	int i, n;
+	int nptr, len;
+
+	/* Find out the amount of space required to store the answer. */
+	nptr = 2; /* NULL ptrs */
+	len = (char *)ALIGN(buf) - buf;
+	for (i = 0; he->h_addr_list[i]; i++, nptr++) {
+		len += he->h_length;
+	}
+	for (i = 0; he->h_aliases[i]; i++, nptr++) {
+		len += strlen(he->h_aliases[i]) + 1;
+	}
+	len += strlen(he->h_name) + 1;
+	len += nptr * sizeof(char*);
+
+	if (len > buflen) {
+		errno = ERANGE;
+		return (-1);
+	}
+
+	/* copy address size and type */
+	hptr->h_addrtype = he->h_addrtype;
+	n = hptr->h_length = he->h_length;
+
+	ptr = (char **)ALIGN(buf);
+	cp = (char *)ALIGN(buf) + nptr * sizeof(char *);
+
+	/* copy address list */
+	hptr->h_addr_list = ptr;
+	for (i = 0; he->h_addr_list[i]; i++ , ptr++) {
+		memcpy(cp, he->h_addr_list[i], n);
+		hptr->h_addr_list[i] = cp;
+		cp += n;
+	}
+	hptr->h_addr_list[i] = NULL;
+	ptr++;
+
+	/* copy official name */
+	n = strlen(he->h_name) + 1;
+	strcpy(cp, he->h_name);
+	hptr->h_name = cp;
+	cp += n;
+
+	/* copy aliases */
+	hptr->h_aliases = ptr;
+	for (i = 0 ; he->h_aliases[i]; i++) {
+		n = strlen(he->h_aliases[i]) + 1;
+		strcpy(cp, he->h_aliases[i]);
+		hptr->h_aliases[i] = cp;
+		cp += n;
+	}
+	hptr->h_aliases[i] = NULL;
+
+	return (0);
+}
+
 static void
 sethosthtent(int f, struct files_hostent_data *hed)
 {
@@ -115,7 +177,7 @@
 }
 
 static int
-gethostent_p(struct hostent *he, struct files_hostent_data *hed, int mapped,
+gethostent_p(struct hostent *he, struct files_hostent_data *hed,
     res_state statp)
 {
 	char *p, *bp, *ep;
@@ -144,15 +206,15 @@
 		af = AF_INET6;
 		len = IN6ADDRSZ;
 	} else if (inet_pton(AF_INET, p, hed->host_addr) > 0) {
-		if (mapped) {
+/*		if (mapped) {
 			_map_v4v6_address((char *)hed->host_addr,
 			    (char *)hed->host_addr);
 			af = AF_INET6;
 			len = IN6ADDRSZ;
-		} else {
+		} else {*/
 			af = AF_INET;
 			len = INADDRSZ;
-		}
+/*		}*/
 	} else {
 		goto again;
 	}
@@ -231,15 +293,15 @@
 	}
 
 	sethosthtent(0, hed);
-	while ((error = gethostent_p(&he, hed, 0, statp)) == 0) {
+	while ((error = gethostent_p(&he, hed, statp)) == 0) {
 		if (he.h_addrtype != af)
 			continue;
-		if (he.h_addrtype == AF_INET &&
+/*		if (he.h_addrtype == AF_INET &&
 		    statp->options & RES_USE_INET6) {
 			_map_v4v6_address(he.h_addr, he.h_addr);
 			he.h_length = IN6ADDRSZ;
 			he.h_addrtype = AF_INET6;
-		}
+		}*/
 		if (strcasecmp(he.h_name, name) == 0)
 			break;
 		for (cp = he.h_aliases; *cp != 0; cp++)
@@ -294,14 +356,14 @@
 	}
 
 	sethosthtent(0, hed);
-	while ((error = gethostent_p(&he, hed, 0, statp)) == 0)
+	while ((error = gethostent_p(&he, hed, statp)) == 0)
 		if (he.h_addrtype == af && !bcmp(he.h_addr, addr, len)) {
-			if (he.h_addrtype == AF_INET &&
+/*			if (he.h_addrtype == AF_INET &&
 			    statp->options & RES_USE_INET6) {
 				_map_v4v6_address(he.h_addr, he.h_addr);
 				he.h_length = IN6ADDRSZ;
 				he.h_addrtype = AF_INET6;
-			}
+			}*/
 			break;
 		}
 	endhosthtent(hed);
@@ -345,7 +407,7 @@
 		*h_errnop = statp->res_h_errno;
 		return (NS_NOTFOUND);
 	}
-	if (gethostent_p(&he, hed, statp->options & RES_USE_INET6, statp) != 0)
+	if (gethostent_p(&he, hed, statp) != 0)
 		return (NS_NOTFOUND);
 	if (__copy_hostent(&he, hptr, buffer, buflen) != 0)
 		return (NS_NOTFOUND);

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/nss_files.c#4 (text+ko) ====

@@ -36,7 +36,6 @@
 #include "files_passwd.h"
 #include "files_group.h"
 #include "files_hosts_namadr.h"
-#include "files_hosts_name6.h"
 #include "files_hosts_addrinfo.h"
 #include "files_net.h"
 #include "files_proto.h"
@@ -45,6 +44,12 @@
 #include "netdb_private.h"
 #include "nss_files.h"
 
+/* TODO: for testing purposes only */
+/*#ifdef NSDB_HOSTS
+#undef NSDB_HOSTS
+#endif
+#define NSDB_HOSTS "hosts_"*/
+
 static struct servent_mdata getservbyname_mdata = { nss_lt_name, 0 };
 static struct servent_mdata getservbyport_mdata = { nss_lt_id, 0 };
 static struct servent_mdata getservent_mdata = { nss_lt_all, 0 };
@@ -76,8 +81,6 @@
 	
 	{NSDB_HOSTS, "gethostbyname2_r", __files_gethostbyname2_r, NULL},
 	{NSDB_HOSTS, "gethostbyaddr_r", __files_gethostbyaddr_r, NULL},
-	{NSDB_HOSTS, "ghbyname", __files_ghbyname, NULL},
-	{NSDB_HOSTS, "ghbyaddr", __files_ghbyaddr, NULL},
 	{NSDB_HOSTS, "getaddrinfo", __files_getaddrinfo, NULL},
 	{NSDB_HOSTS_INTERNAL, "gethostent_r", __files_gethostent_r, NULL},
 	{NSDB_HOSTS_INTERNAL, "sethostent", __files_sethostent, NULL},

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/Makefile#2 (text+ko) ====

@@ -3,15 +3,14 @@
 LIB=	nss_nis
 SHLIB_MAJOR= 1
 SHLIBDIR?= /lib
-PROG= nss_nis
 CFLAGS+=-I${.CURDIR} -I${.CURDIR}/../libc/gen -I${.CURDIR}/../libc/include\
 	-I${.CURDIR}/../libc/net -I${.CURDIR}/../libnssutil
-SRCS=	nss_nis.c nis_hosts_namadr.c nis_hosts_name6.c\
-	nis_hosts_addrinfo.c
+SRCS=	nss_nis.c nis_hosts_namadr.c nis_hosts_addrinfo.c nis_passwd.c\
+	nis_group.c
 DPADD+= nssutil
-LDADD+=	-lnssutil
+LDADD+= -lnssutil
 LDFLAGS+= -L${.CURDIR}/../libnssutil
-INCS=	
+INCS=   
 
 MAN=	
 

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_hosts_namadr.c#3 (text+ko) ====

@@ -50,7 +50,6 @@
 #include "reentrant.h"
 #include "netdb_private.h"
 #include "nss_nis.h"
-#include "hosts_namadr.h"
 
 NETDB_THREAD_ALLOC(hostent)
 NETDB_THREAD_ALLOC(nis_hostent_data)
@@ -71,6 +70,68 @@
 	free(hed);	
 }
 
+static int
+__copy_hostent(struct hostent *he, struct hostent *hptr, char *buf,
+    size_t buflen)
+{
+	char *cp;
+	char **ptr;
+	int i, n;
+	int nptr, len;
+
+	/* Find out the amount of space required to store the answer. */
+	nptr = 2; /* NULL ptrs */
+	len = (char *)ALIGN(buf) - buf;
+	for (i = 0; he->h_addr_list[i]; i++, nptr++) {
+		len += he->h_length;
+	}
+	for (i = 0; he->h_aliases[i]; i++, nptr++) {
+		len += strlen(he->h_aliases[i]) + 1;
+	}
+	len += strlen(he->h_name) + 1;
+	len += nptr * sizeof(char*);
+
+	if (len > buflen) {
+		errno = ERANGE;
+		return (-1);
+	}
+
+	/* copy address size and type */
+	hptr->h_addrtype = he->h_addrtype;
+	n = hptr->h_length = he->h_length;
+
+	ptr = (char **)ALIGN(buf);
+	cp = (char *)ALIGN(buf) + nptr * sizeof(char *);
+
+	/* copy address list */
+	hptr->h_addr_list = ptr;
+	for (i = 0; he->h_addr_list[i]; i++ , ptr++) {
+		memcpy(cp, he->h_addr_list[i], n);
+		hptr->h_addr_list[i] = cp;
+		cp += n;
+	}
+	hptr->h_addr_list[i] = NULL;
+	ptr++;
+
+	/* copy official name */
+	n = strlen(he->h_name) + 1;
+	strcpy(cp, he->h_name);
+	hptr->h_name = cp;
+	cp += n;
+
+	/* copy aliases */
+	hptr->h_aliases = ptr;
+	for (i = 0 ; he->h_aliases[i]; i++) {
+		n = strlen(he->h_aliases[i]) + 1;
+		strcpy(cp, he->h_aliases[i]);
+		hptr->h_aliases[i] = cp;
+		cp += n;
+	}
+	hptr->h_aliases[i] = NULL;
+
+	return (0);
+}
+
 //#ifdef YP
 static int
 _gethostbynis(const char *name, char *map, int af, struct hostent *he,
@@ -127,12 +188,12 @@
 		addrok = inet_aton(result, (struct in_addr *)hed->host_addr);
 		if (addrok != 1)
 			break;
-		if (statp->options & RES_USE_INET6) {
+/*		if (statp->options & RES_USE_INET6) {
 			_map_v4v6_address((char *)hed->host_addr,
 			    (char *)hed->host_addr);
 			af = AF_INET6;
 			size = NS_IN6ADDRSZ;
-		}
+		}*/
 		break;
 	case AF_INET6:
 		addrok = inet_pton(af, result, hed->host_addr);

==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nss_nis.c#2 (text+ko) ====

@@ -32,14 +32,37 @@
 #include <netdb.h>
 #include <stdlib.h>
 #include "nis_hosts_namadr.h"
-#include "nis_hosts_name6.h"
 #include "nis_hosts_addrinfo.h"
+#include "nis_passwd.h"
+#include "nis_group.h"
 
 static ns_mtab methods[] = {
+        {NSDB_GROUP, "getgrnam_r", __nis_group, (void *)nss_lt_name},
+        {NSDB_GROUP, "getgrgid_r", __nis_group, (void *)nss_lt_id},
+        {NSDB_GROUP, "getgrent_r", __nis_group, (void *)nss_lt_all},
+        {NSDB_GROUP, "endgrent", __nis_setgrent, NULL},
+        {NSDB_GROUP, "setgrent", __nis_setgrent, NULL},
+
+        {NSDB_PASSWD, "getpwnam_r", __nis_passwd, (void *)nss_lt_name},
+        {NSDB_PASSWD, "getpwuid_r", __nis_passwd, (void *)nss_lt_id},
+        {NSDB_PASSWD, "getpwent_r", __nis_passwd, (void *)nss_lt_all},
+        {NSDB_PASSWD, "endpwent", __nis_setpwent, NULL},
+        {NSDB_PASSWD, "setpwent", __nis_setpwent, NULL},
+
+        {NSDB_GROUP_COMPAT, "getgrnam_r", __nis_group, (void *)nss_lt_name},
+        {NSDB_GROUP_COMPAT, "getgrgid_r", __nis_group, (void *)nss_lt_id},
+        {NSDB_GROUP_COMPAT, "getgrent_r", __nis_group, (void *)nss_lt_all},
+        {NSDB_GROUP_COMPAT, "endgrent", __nis_setgrent, NULL},
+        {NSDB_GROUP_COMPAT, "setgrent", __nis_setgrent, NULL},
+
+        {NSDB_PASSWD_COMPAT, "getpwnam_r", __nis_passwd, (void *)nss_lt_name},
+        {NSDB_PASSWD_COMPAT, "getpwuid_r", __nis_passwd, (void *)nss_lt_id},
+        {NSDB_PASSWD_COMPAT, "getpwent_r", __nis_passwd, (void *)nss_lt_all},
+        {NSDB_PASSWD_COMPAT, "endpwent", __nis_setpwent, NULL},
+        {NSDB_PASSWD_COMPAT, "setpwent", __nis_setpwent, NULL},
+	
 	{NSDB_HOSTS, "gethostbyname2_r", __nis_gethostbyname2_r, NULL},
 	{NSDB_HOSTS, "gethostbyaddr_r", __nis_gethostbyaddr_r, NULL},
-	{NSDB_HOSTS, "ghbyname", __nis_ghbyname, NULL},
-	{NSDB_HOSTS, "ghbyaddr", __nis_ghbyaddr, NULL},	
 	{NSDB_HOSTS, "getaddrinfo", __nis_getaddrinfo, NULL}		
 };
 

==== //depot/projects/soc2006/nss_ldap_cached/tests/ghby_emul/Makefile#2 (text+ko) ====


==== //depot/projects/soc2006/nss_ldap_cached/tests/ghby_emul/ghby_emul_test.c#2 (text+ko) ====

@@ -52,8 +52,7 @@
 
 	if (hed == NULL)
 		return;
-	hed->stayopen = 0;
-	_endhosthtent(hed);
+
 	free(hed);
 }
 
@@ -68,7 +67,7 @@
     size_t buflen)
 {
 	char *oldbuf, *cp;
-	char **ptr;
+	char **ptr, **list;
 	int i, n;
 	int nptr, len;
 
@@ -84,10 +83,7 @@
 	for (i = 0; he->h_addr_list[i]; i++, nptr++) {
 		len += IN6ADDRSZ;
 	}
-	for (i = 0; he->h_aliases[i]; i++, nptr++) {
-		printf("2alias: %s\n", he->h_aliases[i]);
-		len += strlen(he->h_aliases[i]) + 1;
-	}
+
 	len += strlen(he->h_name) + 1;
 	len += nptr * sizeof(char*);
 
@@ -97,10 +93,13 @@
 	}
 	
 	oldbuf = buf;
-	/* TODO: len + ALIGNBYTES? */
-	buf = (char *)malloc(len);
-	assert(buf != NULL);
-	memset(buf, 0, len);
+	/* NOTE: we add ALIGNBYTES in case if newly allocated memory segment
+	 * wouldn't be properly aligned, whereas buf is aligned correctly */
+	buf = (char *)malloc(len + ALIGNBYTES);
+	if (buf == NULL) {
+		errno = ENOMEM;
+		return (-1);
+	}
 	
 	/* copy address size and type */
 	hptr->h_addrtype = he->h_addrtype;
@@ -109,17 +108,7 @@
 	ptr = (char **)ALIGN(buf);
 	cp = (char *)ALIGN(buf) + nptr * sizeof(char *);
 
-	/* copy address list */
-/*	hptr->h_addr_list = ptr;
-	for (i = 0; he->h_addr_list[i]; i++ , ptr++) {
-		memcpy(cp, he->h_addr_list[i], n);
-		hptr->h_addr_list[i] = cp;
-		cp += n;
-	}
-	hptr->h_addr_list[i] = NULL;*/
-	/* TODO: use 1 memcpy here */
-
-	char **list = hptr->h_addr_list;
+	list = hptr->h_addr_list;
 	hptr->h_addr_list = ptr;
 	for (i = 0; list[i]; i++ , ptr++) {
 		_map_v4v6_address(list[i], cp);
@@ -129,8 +118,6 @@
 	hptr->h_addr_list[i] = NULL;
 	ptr++;
 	
-//	_map_v4v6_hostent(hptr, &cp, buf + len);
-
 	/* copy official name */
 	n = strlen(he->h_name) + 1;
 	strcpy(cp, he->h_name);
@@ -144,25 +131,26 @@
 		n = strlen(list[i]) + 1;
 		strcpy(cp, list[i]);
 		hptr->h_aliases[i] = cp;
-		printf("4alias %s\n", list[i]);
 		cp += n;
 	}
 	hptr->h_aliases[i] = NULL;
-	
-	memcpy((char *)ALIGN(oldbuf), (char *)ALIGN(buf), len - (size_t)((char *)ALIGN(buf) - buf));
+
+	/* copying temporary buffer to the provided buffer and fixing
+	 * hostent's pointers */	
+	oldbuf = (char *)ALIGN(oldbuf);
+	memcpy(oldbuf, (char *)ALIGN(buf), 
+		len - (size_t)((char *)ALIGN(buf) - buf));
 	free(buf);
 	buf = (char *)ALIGN(buf);
-	oldbuf = (char *)ALIGN(oldbuf);
 	he->h_name = oldbuf + (size_t)(he->h_name - buf);
-	printf("name %s\n", he->h_name);
-	he->h_aliases = (char **)(oldbuf + (size_t)((char *)he->h_aliases - buf));
-	he->h_addr_list = (char **)(oldbuf + (size_t)((char *)he->h_addr_list - buf));
+	he->h_aliases = (char **)(oldbuf +
+		(size_t)((char *)he->h_aliases - buf));
+	he->h_addr_list = (char **)(oldbuf +
+		(size_t)((char *)he->h_addr_list - buf));
 	
 	char **p;
-	for (p = he->h_aliases; *p; ++p) {
+	for (p = he->h_aliases; *p; ++p)
 		*p = oldbuf + (size_t)(*p - buf);
-		printf("alias %s\n", *p);
-	}
 	
 	for (p = he->h_addr_list; *p; ++p)
 		*p = oldbuf + (size_t)(*p - buf);
@@ -323,8 +311,8 @@
 	
 	printf("rval: %d\n", rval);
 	if ((*result != NULL) && (statp->options & RES_USE_INET6)) {
-		printf("yo\n");
-//		__map_v4v6_hostent(hp, buf, buflen);		
+		printf("mapping %p %p %ld\n", (void *)hp, (void *)buf, buflen);
+		__map_v4v6_hostent(hp, buf, buflen);		
 	}
 
 	return ((rval == NS_SUCCESS) ? 0 : -1);
@@ -390,6 +378,12 @@
 	    "gethostbyaddr_r", default_src, uaddr, len, af, hp, buf, buflen,
 	    &ret_errno, h_errnop);
 
+	printf("rval: %d %p %d\n", rval, (void *)*result, statp->options & RES_USE_INET6);
+	if ((*result != NULL) && (statp->options & RES_USE_INET6)) {
+		printf("mapping %p %p %ld\n", (void *)hp, (void *)buf, buflen);
+		__map_v4v6_hostent(hp, buf, buflen);		
+	}
+
 	return ((rval == NS_SUCCESS) ? 0 : -1);
 }
 
@@ -515,7 +509,7 @@
 	assert(he1->h_name != NULL);
 	assert(he2->h_name != NULL);
 	if (strcmp(he1->h_name, he2->h_name) != 0) {
-		printf("ne %d\n", __LINE__);
+		printf("ne %d %s %s\n", __LINE__, he1->h_name, he2->h_name);
 		return (-1);
 	}
 	
@@ -523,6 +517,7 @@
 		char **p1, **p2;
 		for (p1 = he1->h_aliases, p2 = he2->h_aliases;
 			*p1 && *p2; ++p1, ++p2) {
+			printf("%s %s\n", *p1, *p2);
 			if (strcmp(*p1, *p2) != 0) {
 				printf("ne %d\n", __LINE__);
 				return (-1);
@@ -592,7 +587,7 @@

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list