From owner-p4-projects@FreeBSD.ORG Mon Jun 19 17:37:04 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A038816A4CC; Mon, 19 Jun 2006 17:37:04 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7D2C916A4CA for ; Mon, 19 Jun 2006 17:37:04 +0000 (UTC) (envelope-from bushman@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id CF49E43D48 for ; Mon, 19 Jun 2006 17:37:03 +0000 (GMT) (envelope-from bushman@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5JHb3EA092550 for ; Mon, 19 Jun 2006 17:37:03 GMT (envelope-from bushman@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5JHb3vC092546 for perforce@freebsd.org; Mon, 19 Jun 2006 17:37:03 GMT (envelope-from bushman@freebsd.org) Date: Mon, 19 Jun 2006 17:37:03 GMT Message-Id: <200606191737.k5JHb3vC092546@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bushman@freebsd.org using -f From: Michael Bushkov To: Perforce Change Reviews Cc: Subject: PERFORCE change 99627 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Jun 2006 17:37:05 -0000 http://perforce.freebsd.org/chv.cgi?CH=99627 Change 99627 by bushman@bushman_nss_ldap_cached on 2006/06/19 17:36:35 Nss-modules development is almost done. nss_compat module added. It uses dirty hack by including files_serv.c file from the nss_files module to avoid massive code duplication. nss_icmp builds normally - not tested at all, though. libnssutil extended with __copy_netent, __rpcent_unpack and __servent_unpack. __copy_hostent() is also in libnssutil, but gethostby***() functions uses its own local copy at the moment. Affected files ... .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/Makefile#3 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/copyhtent.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/copyhtent.h#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/rpcunpack.c#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/rpcunpack.h#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/servunpack.c#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/servunpack.h#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/Makefile#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/compat_group.c#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/compat_group.h#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/compat_passwd.c#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/compat_passwd.h#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/compat_serv.c#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/compat_serv.h#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/nss_compat.c#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_compat/nss_compat.h#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/Makefile#3 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_group.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_hosts_namadr.c#5 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_hosts_namadr.h#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_net.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_net.h#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_passwd.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/nss_dns.c#4 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/nss_dns.h#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/Makefile#3 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_hosts_namadr.h#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_net.c#3 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_passwd.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_proto.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_rpc.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_rpc.h#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/files_serv.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/nss_files.c#6 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_files/nss_files.h#4 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_icmp/Makefile#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/Makefile#3 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_net.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_net.h#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_rpc.c#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_rpc.h#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_serv.c#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nis_serv.h#1 add .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nss_nis.c#3 edit .. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_nis/nss_nis.h#2 edit Differences ... ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/Makefile#3 (text+ko) ==== @@ -1,7 +1,9 @@ # $FreeBSD$ LIB= nssutil -SRCS= copynetent.c copyhtent.c gr_scan.c pw_scan.c +SRCS= copynetent.c copyhtent.c gr_scan.c pw_scan.c rpcunpack.c\ + servunpack.c +INTERNAL= NO_PIC= .include ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/copyhtent.c#2 (text+ko) ==== @@ -1,26 +1,18 @@ -/*- - * Copyright (c) 1994, Garrett Wollman +/* + * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 1998-1999 by Internet Software Consortium. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. * - * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/libnssutil/copyhtent.h#2 (text+ko) ==== @@ -1,4 +1,3 @@ - /*- * Copyright (c) 2006 Michael Bushkov * All rights reserved. ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/Makefile#3 (text+ko) ==== @@ -1,14 +1,28 @@ # $FreeBSD$ -LIB= nss_dns -SHLIB_MAJOR= 1 -SHLIBDIR?= /lib -PROG= nss_dns +.include + +SHLIB_MAJOR= 1 +SHLIB_NAME= nss_dns.so.${SHLIB_MAJOR} +SHLIBDIR?= /lib + +SRCS= nss_dns.c dns_hosts_namadr.c dns_hosts_addrinfo.c dns_passwd.c\ + dns_group.c dns_net.c CFLAGS+=-I${.CURDIR} -I${.CURDIR}/../libc/gen -I${.CURDIR}/../libc/include\ - -I${.CURDIR}/../libc/net -SRCS= nss_dns.c dns_hosts_namadr.c dns_hosts_addrinfo.c dns_passwd.c + -I${.CURDIR}/../libc/net -I${.CURDIR}/../libnssutil +CFLAGS+=-DINET6 + +.if ${MK_NIS} != "no" +CFLAGS+= -DYP +.endif +.if ${MK_HESIOD} != "no" +CFLAGS+= -DHESIOD +.endif + +LDADD+= -lnssutil +LDFLAGS+= -L${.CURDIR}/../libnssutil + INCS= - MAN= .include ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_group.c#2 (text+ko) ==== @@ -37,7 +37,9 @@ #include #include #include -#include /* we don't need to #ifdef it anymore */ +#ifdef HESIOD +#include +#endif #include #include #include @@ -50,6 +52,9 @@ #include "nss_tls.h" #include "gr_scan.h" +#ifdef HESIOD +#define HESIOD_NAME_MAX 256 + struct dns_state { long counter; }; @@ -62,11 +67,13 @@ free(p); } +#endif int __dns_setgrent(void *retval, void *cb_data, va_list ap) { +#ifdef HESIOD struct dns_state *st; int rv; @@ -74,6 +81,7 @@ if (rv != 0) return (NS_UNAVAIL); st->counter = 0; +#endif return (NS_UNAVAIL); } @@ -81,6 +89,7 @@ int __dns_group(void *retval, void *mdata, va_list ap) { +#ifdef HESIOD char buf[HESIOD_NAME_MAX]; struct dns_state *st; struct group *grp; @@ -181,4 +190,7 @@ if (rv == NS_SUCCESS && retval != NULL) *(struct group **)retval = grp; return (rv); +#else + return (NS_UNAVAIL); +#endif } ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_hosts_namadr.c#5 (text+ko) ==== @@ -78,8 +78,77 @@ #include "netdb_private.h" #include "nss_dns.h" +#define SPRINTF(x) ((size_t)sprintf x) + +static const char AskedForGot[] = + "gethostby*.gethostanswer: asked for \"%s\", got \"%s\""; + +#ifdef RESOLVSORT +static void addrsort(char **, int, res_state); +#endif + +#ifdef DEBUG +static void dprintf(char *, int, res_state) __printflike(1, 0); +#endif + +#define MAXPACKET (64*1024) + +typedef union { + HEADER hdr; + u_char buf[MAXPACKET]; +} querybuf; + +typedef union { + int32_t al; + char ac; +} align; + +int _dns_ttl_; + +#ifdef DEBUG +static void +dprintf(msg, num, res) + char *msg; + int num; + res_state res; +{ + if (res->options & RES_DEBUG) { + int save = errno; + + printf(msg, num); + errno = save; + } +} +#else +# define dprintf(msg, num, res) /*nada*/ +#endif + +#define BOUNDED_INCR(x) \ + do { \ + cp += x; \ + if (cp > eom) { \ + RES_SET_H_ERRNO(statp, NO_RECOVERY); \ + return (-1); \ + } \ + } while (0) + +#define BOUNDS_CHECK(ptr, count) \ + do { \ + if ((ptr) + (count) > eom) { \ + RES_SET_H_ERRNO(statp, NO_RECOVERY); \ + return (-1); \ + } \ + } while (0) + NETDB_THREAD_ALLOC(hostent) NETDB_THREAD_ALLOC(dns_hostent_data) + +static int __copy_hostent(struct hostent *, struct hostent *, char *, + size_t); +static void dns_hostent_data_free(void *); +static int gethostanswer(const querybuf *, int, const char *, int, + struct hostent *, struct dns_hostent_data *, res_state); +static void hostent_free(void *); static void hostent_free(void *ptr) @@ -160,68 +229,6 @@ return (0); } -#define SPRINTF(x) ((size_t)sprintf x) - -static const char AskedForGot[] = - "gethostby*.gethostanswer: asked for \"%s\", got \"%s\""; - -#ifdef RESOLVSORT -static void addrsort(char **, int, res_state); -#endif - -#ifdef DEBUG -static void dprintf(char *, int, res_state) __printflike(1, 0); -#endif - -#define MAXPACKET (64*1024) - -typedef union { - HEADER hdr; - u_char buf[MAXPACKET]; -} querybuf; - -typedef union { - int32_t al; - char ac; -} align; - -int _dns_ttl_; - -#ifdef DEBUG -static void -dprintf(msg, num, res) - char *msg; - int num; - res_state res; -{ - if (res->options & RES_DEBUG) { - int save = errno; - - printf(msg, num); - errno = save; - } -} -#else -# define dprintf(msg, num, res) /*nada*/ -#endif - -#define BOUNDED_INCR(x) \ - do { \ - cp += x; \ - if (cp > eom) { \ - RES_SET_H_ERRNO(statp, NO_RECOVERY); \ - return (-1); \ - } \ - } while (0) - -#define BOUNDS_CHECK(ptr, count) \ - do { \ - if ((ptr) + (count) > eom) { \ - RES_SET_H_ERRNO(statp, NO_RECOVERY); \ - return (-1); \ - } \ - } while (0) - static int gethostanswer(const querybuf *answer, int anslen, const char *qname, int qtype, struct hostent *he, struct dns_hostent_data *hed, res_state statp) @@ -817,24 +824,38 @@ } #endif -void -__dns_sethostent(int stayopen) +/* ARGSUSED */ +int +__dns_gethostent_r(void *rval, void *cb_data, va_list ap) +{ + return (NS_UNAVAIL); +} + +int +__dns_sethostent(void *rval, void *cb_data, va_list ap) { res_state statp; + int f; + + f = va_arg(ap, int); statp = __res_state(); if ((statp->options & RES_INIT) == 0 && res_ninit(statp) == -1) return; - if (stayopen) + if (f) statp->options |= RES_STAYOPEN | RES_USEVC; + + return (NS_UNAVAIL); } -void -__dns_endhostent() +int +__dns_endhostent(void *rval, void *cb_data, va_list ap) { res_state statp; statp = __res_state(); statp->options &= ~(RES_STAYOPEN | RES_USEVC); res_nclose(statp); + + return (NS_UNAVAIL); } ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_hosts_namadr.h#2 (text+ko) ==== @@ -28,5 +28,6 @@ int __dns_gethostbyname2_r(void *rval, void *cb_data, va_list ap); int __dns_gethostbyaddr_r(void *rval, void *cb_data, va_list ap); -void __dns_sethostent(int stayopen); -void __dns_endhostent(); +int __dns_gethostent_r(void *rval, void *cb_data, va_list ap); +int __dns_sethostent(void *rval, void *cb_data, va_list ap); +int __dns_endhostent(void *rval, void *cb_data, va_list ap); ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_net.c#2 (text+ko) ==== @@ -1,0 +1,496 @@ +/*- + * Copyright (c) 1985, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ +/* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro + * Dep. Matematica Universidade de Coimbra, Portugal, Europe + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "netdb_private.h" +#include "nss_dns.h" +#include "reentrant.h" +#include "res_config.h" +#include "copynetent.h" + +#define BYADDR 0 +#define BYNAME 1 + +#define MAXPACKET (64*1024) + +typedef union { + HEADER hdr; + u_char buf[MAXPACKET]; +} querybuf; + +typedef union { + long al; + char ac; +} align; + +NETDB_THREAD_ALLOC(dns_netent_data) + +static void dns_netent_data_free(void *); +static void ipreverse(char *, char *); +static int getnetanswer(querybuf *, int, int, struct netent *, + struct dns_netent_data *, res_state); + +static void +dns_netent_data_free(void *ptr) +{ + struct dns_netent_data *ned = ptr; + + if (ned == NULL) + return; + free(ned); +} + + +/* + * Reverse the order of first four dotted entries of in. + * Out must contain space for at least strlen(in) characters. + * The result does not include any leading 0s of in. + */ +static void +ipreverse(char *in, char *out) +{ + char *pos[4]; + int len[4]; + char *p, *start; + int i = 0; + int leading = 1; + + /* Fill-in element positions and lengths: pos[], len[]. */ + start = p = in; + for (;;) { + if (*p == '.' || *p == '\0') { + /* Leading 0? */ + if (leading && p - start == 1 && *start == '0') + len[i] = 0; + else { + len[i] = p - start; + leading = 0; + } + pos[i] = start; + start = p + 1; + i++; + } + if (i == 4) + break; + if (*p == 0) { + for (; i < 4; i++) { + pos[i] = p; + len[i] = 0; + } + break; + } + p++; + } + + /* Copy the entries in reverse order */ + p = out; + leading = 1; + for (i = 3; i >= 0; i--) { + memcpy(p, pos[i], len[i]); + if (len[i]) + leading = 0; + p += len[i]; + /* Need a . separator? */ + if (!leading && i > 0 && len[i - 1]) + *p++ = '.'; + } + *p = '\0'; +} + +static int +getnetanswer(querybuf *answer, int anslen, int net_i, struct netent *ne, + struct dns_netent_data *ned, res_state statp) +{ + + HEADER *hp; + u_char *cp; + int n; + u_char *eom; + int type, class, ancount, qdcount, haveanswer; + char aux[MAXHOSTNAMELEN]; + char ans[MAXHOSTNAMELEN]; + char *in, *bp, *ep, **ap; + + /* + * find first satisfactory answer + * + * answer --> +------------+ ( MESSAGE ) + * | Header | + * +------------+ + * | Question | the question for the name server + * +------------+ + * | Answer | RRs answering the question + * +------------+ + * | Authority | RRs pointing toward an authority + * | Additional | RRs holding additional information + * +------------+ + */ + eom = answer->buf + anslen; + hp = &answer->hdr; + ancount = ntohs(hp->ancount); /* #/records in the answer section */ + qdcount = ntohs(hp->qdcount); /* #/entries in the question section */ + bp = ned->netbuf; + ep = ned->netbuf + sizeof(ned->netbuf); + cp = answer->buf + HFIXEDSZ; + if (!qdcount) { + if (hp->aa) + RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); + else + RES_SET_H_ERRNO(statp, TRY_AGAIN); + return (-1); + } + while (qdcount-- > 0) + cp += __dn_skipname(cp, eom) + QFIXEDSZ; + ap = ned->net_aliases; + *ap = NULL; + ne->n_aliases = ned->net_aliases; + haveanswer = 0; + while (--ancount >= 0 && cp < eom) { + n = dn_expand(answer->buf, eom, cp, bp, ep - bp); + if ((n < 0) || !res_dnok(bp)) + break; + cp += n; + ans[0] = '\0'; + (void)strncpy(&ans[0], bp, sizeof(ans) - 1); + ans[sizeof(ans) - 1] = '\0'; + GETSHORT(type, cp); + GETSHORT(class, cp); + cp += INT32SZ; /* TTL */ + GETSHORT(n, cp); + if (class == C_IN && type == T_PTR) { + n = dn_expand(answer->buf, eom, cp, bp, ep - bp); + if ((n < 0) || !res_hnok(bp)) { + cp += n; + return (-1); + } + cp += n; + *ap++ = bp; + n = strlen(bp) + 1; + bp += n; + ne->n_addrtype = (class == C_IN) ? AF_INET : AF_UNSPEC; + haveanswer++; + } + } + if (haveanswer) { + *ap = NULL; + switch (net_i) { + case BYADDR: + ne->n_name = *ne->n_aliases; + ne->n_net = 0L; + break; + case BYNAME: + in = *ne->n_aliases; + n = strlen(ans) + 1; + if (ep - bp < n) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + errno = ENOBUFS; + return (-1); + } + strlcpy(bp, ans, ep - bp); + ne->n_name = bp; + if (strlen(in) + 1 > sizeof(aux)) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + errno = ENOBUFS; + return (-1); + } + ipreverse(in, aux); + ne->n_net = inet_network(aux); + break; + } + ne->n_aliases++; + return (0); + } + RES_SET_H_ERRNO(statp, TRY_AGAIN); + return (-1); +} + +int +__dns_getnetbyaddr_r(void *rval, void *cb_data, va_list ap) +{ + uint32_t net; + int net_type; + char *buffer; + size_t buflen; + int *errnop, *h_errnop; + struct netent *nptr, ne; + struct dns_netent_data *ned; + unsigned int netbr[4]; + int nn, anslen, error; + querybuf *buf; + char qbuf[MAXDNAME]; + uint32_t net2; + res_state statp; + + net = va_arg(ap, uint32_t); + net_type = va_arg(ap, int); + nptr = va_arg(ap, struct netent *); + buffer = va_arg(ap, char *); + buflen = va_arg(ap, size_t); + errnop = va_arg(ap, int *); + h_errnop = va_arg(ap, int *); + + statp = __res_state(); + if ((statp->options & RES_INIT) == 0 && res_ninit(statp) == -1) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + *h_errnop = statp->res_h_errno; + return (NS_UNAVAIL); + } + + if ((ned = __dns_netent_data_init()) == NULL) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + *h_errnop = statp->res_h_errno; + return (NS_UNAVAIL); + } + + *((struct netent **)rval) = NULL; + + if (net_type != AF_INET) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + *h_errnop = statp->res_h_errno; + return (NS_UNAVAIL); + } + + for (nn = 4, net2 = net; net2; net2 >>= 8) + netbr[--nn] = net2 & 0xff; + switch (nn) { + case 3: /* Class A */ + sprintf(qbuf, "0.0.0.%u.in-addr.arpa", netbr[3]); + break; + case 2: /* Class B */ + sprintf(qbuf, "0.0.%u.%u.in-addr.arpa", netbr[3], netbr[2]); + break; + case 1: /* Class C */ + sprintf(qbuf, "0.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2], + netbr[1]); + break; + case 0: /* Class D - E */ + sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2], + netbr[1], netbr[0]); + break; + } + if ((buf = malloc(sizeof(*buf))) == NULL) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + *h_errnop = statp->res_h_errno; + return (NS_NOTFOUND); + } + anslen = res_nquery(statp, qbuf, C_IN, T_PTR, (u_char *)buf, + sizeof(*buf)); + if (anslen < 0) { + free(buf); +#ifdef DEBUG + if (statp->options & RES_DEBUG) + printf("res_nsearch failed\n"); +#endif + *h_errnop = statp->res_h_errno; + return (NS_UNAVAIL); + } else if (anslen > sizeof(*buf)) { + free(buf); +#ifdef DEBUG + if (statp->options & RES_DEBUG) + printf("res_nsearch static buffer too small\n"); +#endif + *h_errnop = statp->res_h_errno; + return (NS_UNAVAIL); + } + error = getnetanswer(buf, anslen, BYADDR, &ne, ned, statp); + free(buf); + if (error == 0) { + /* Strip trailing zeros */ + while ((net & 0xff) == 0 && net != 0) + net >>= 8; + ne.n_net = net; + if (__copy_netent(&ne, nptr, buffer, buflen) != 0) { + *h_errnop = statp->res_h_errno; + return (NS_NOTFOUND); + } + *((struct netent **)rval) = nptr; + return (NS_SUCCESS); + } + *h_errnop = statp->res_h_errno; + return (NS_NOTFOUND); +} + +int +__dns_getnetbyname_r(void *rval, void *cb_data, va_list ap) +{ + const char *net; + char *buffer; + size_t buflen; + int *errnop, *h_errnop; + struct netent *nptr, ne; + struct dns_netent_data *ned; + int anslen, error; + querybuf *buf; + char qbuf[MAXDNAME]; + res_state statp; + + net = va_arg(ap, const char *); + nptr = va_arg(ap, struct netent *); + buffer = va_arg(ap, char *); + buflen = va_arg(ap, size_t); + errnop = va_arg(ap, int *); + h_errnop = va_arg(ap, int *); + + statp = __res_state(); + if ((statp->options & RES_INIT) == 0 && res_ninit(statp) == -1) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + *h_errnop = statp->res_h_errno; + return (NS_UNAVAIL); + } + if ((ned = __dns_netent_data_init()) == NULL) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + *h_errnop = statp->res_h_errno; + return (NS_UNAVAIL); + } + if ((buf = malloc(sizeof(*buf))) == NULL) { + RES_SET_H_ERRNO(statp, NETDB_INTERNAL); + *h_errnop = statp->res_h_errno; + return (NS_NOTFOUND); + } + + *((struct netent **)rval) = NULL; + + strncpy(qbuf, net, sizeof(qbuf) - 1); + qbuf[sizeof(qbuf) - 1] = '\0'; + anslen = res_nsearch(statp, qbuf, C_IN, T_PTR, (u_char *)buf, + sizeof(*buf)); + if (anslen < 0) { + free(buf); +#ifdef DEBUG + if (statp->options & RES_DEBUG) + printf("res_nsearch failed\n"); +#endif + return (NS_UNAVAIL); + } else if (anslen > sizeof(*buf)) { + free(buf); +#ifdef DEBUG + if (statp->options & RES_DEBUG) + printf("res_search static buffer too small\n"); +#endif + return (NS_UNAVAIL); + } + error = getnetanswer(buf, anslen, BYNAME, &ne, ned, statp); + free(buf); + if (error != 0) { + *h_errnop = statp->res_h_errno; + return (NS_NOTFOUND); + } + if (__copy_netent(&ne, nptr, buffer, buflen) != 0) { + *h_errnop = statp->res_h_errno; + return (NS_NOTFOUND); + } + *((struct netent **)rval) = nptr; + return (NS_SUCCESS); +} + +/* ARGSUSED */ +int +__dns_getnetent_r(void *rval, void *cb_data, va_list ap) +{ + return (NS_UNAVAIL); +} + +int +__dns_setnetent(void *rval, void *cb_data, va_list ap) +{ + res_state statp; + int f; + + f = va_arg(ap, int); + + statp = __res_state(); + if ((statp->options & RES_INIT) == 0 && res_ninit(statp) == -1) + return; + if (f) + statp->options |= RES_STAYOPEN | RES_USEVC; + + return (NS_UNAVAIL); +} + +int +__dns_endnetent(void *rval, void *cb_data, va_list ap) +{ + res_state statp; + + statp = __res_state(); + statp->options &= ~(RES_STAYOPEN | RES_USEVC); + res_nclose(statp); + + return (NS_UNAVAIL); +} ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_net.h#2 (text+ko) ==== @@ -1,0 +1,33 @@ +/*- + * Copyright (c) 2006 Michael Bushkov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +int __dns_getnetbyname_r(void *rval, void *cb_data, va_list ap); +int __dns_getnetbyaddr_r(void *rval, void *cb_data, va_list ap); +int __dns_getnetent_r(void *rval, void *cb_data, va_list ap); +int __dns_setnetent(void *rval, void *cb_data, va_list ap); +int __dns_endnetent(void *rval, void *cb_data, va_list ap); ==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_dns/dns_passwd.c#2 (text+ko) ==== @@ -38,7 +38,9 @@ #include #include #include -#include /* there's no need to #ifdef it anymore */ +#ifdef HESIOD +#include +#endif #include #include #include @@ -56,24 +58,25 @@ #define HESIOD_NAME_MAX 256 +#ifdef HESIOD struct dns_state { long counter; }; static void dns_endstate(void *); NSS_TLS_HANDLING(dns); -static int dns_setpwent(void *, void *, va_list); -static int dns_passwd(void *, void *, va_list); static void dns_endstate(void *p) { free(p); } +#endif int __dns_setpwent(void *retval, void *mdata, va_list ap) { >>> TRUNCATED FOR MAIL (1000 lines) <<<