diff options
author | dougb <dougb@FreeBSD.org> | 2009-05-31 05:42:58 +0000 |
---|---|---|
committer | dougb <dougb@FreeBSD.org> | 2009-05-31 05:42:58 +0000 |
commit | 1e9abbf9ca25c8e19cbc0405a365df5433813cd6 (patch) | |
tree | 21a5399cf53ce4f1ffedece1c1700a317f190f2e /contrib/bind9/lib/bind/irs | |
parent | 9babfe9f9b2fa8b533dad4a39b00918df9809aa7 (diff) | |
parent | fd553238c94c3abfef11bfdfc5cb05b32cbe5f76 (diff) | |
download | FreeBSD-src-1e9abbf9ca25c8e19cbc0405a365df5433813cd6.zip FreeBSD-src-1e9abbf9ca25c8e19cbc0405a365df5433813cd6.tar.gz |
Update BIND to version 9.6.1rc1. This version has better performance and
lots of new features compared to 9.4.x, including:
Full NSEC3 support
Automatic zone re-signing
New update-policy methods tcp-self and 6to4-self
DHCID support.
More detailed statistics counters including those supported in BIND 8.
Faster ACL processing.
Efficient LRU cache-cleaning mechanism.
NSID support.
Diffstat (limited to 'contrib/bind9/lib/bind/irs')
71 files changed, 0 insertions, 23590 deletions
diff --git a/contrib/bind9/lib/bind/irs/Makefile.in b/contrib/bind9/lib/bind/irs/Makefile.in deleted file mode 100644 index e4f38f7..0000000 --- a/contrib/bind9/lib/bind/irs/Makefile.in +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) 2004, 2008 Internet Systems Consortium, Inc. ("ISC") -# Copyright (C) 2001 Internet Software Consortium. -# -# Permission to use, copy, modify, and/or 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. -# -# 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. - -# $Id: Makefile.in,v 1.8.18.4 2008/03/20 23:46:01 tbox Exp $ - -srcdir= @srcdir@ -VPATH = @srcdir@ - -WANT_IRS_THREADS_OBJS= gethostent_r.@O@ getnetent_r.@O@ getnetgrent_r.@O@ \ - getprotoent_r.@O@ getservent_r.@O@ - -WANT_IRS_NISGR_OBJS= nis_gr.@O@ -WANT_IRS_GR_OBJS= dns_gr.@O@ irp_gr.@O@ lcl_gr.@O@ gen_gr.@O@ getgrent.@O@ \ - @WANT_IRS_NISGR_OBJS@ @WANT_IRS_THREADSGR_OBJS@ - -WANT_IRS_THREADSPW_OBJS=getpwent_r.@O@ -WANT_IRS_NISPW_OBJS= nis_pw.@O@ -WANT_IRS_DBPW_OBJS=irp_pw.@O@ lcl_pw.@O@ -WANT_IRS_PW_OBJS= dns_pw.@O@ gen_pw.@O@ getpwent.@O@ \ - @WANT_IRS_DBPW_OBJS@ @WANT_IRS_NISPW_OBJS@ @WANT_IRS_THREADSPW_OBJS@ - -WANT_IRS_NIS_OBJS= \ - nis_ho.@O@ nis_ng.@O@ nis_nw.@O@ nis_pr.@O@ nis_sv.@O@ - -OBJS= @WANT_IRS_GR_OBJS@ @WANT_IRS_NIS_OBJS@ @WANT_IRS_THREADS_OBJS@ \ - @WANT_IRS_PW_OBJS@ \ - dns.@O@ dns_ho.@O@ dns_nw.@O@ dns_pr.@O@ \ - dns_sv.@O@ gai_strerror.@O@ gen.@O@ gen_ho.@O@ \ - gen_ng.@O@ gen_nw.@O@ gen_pr.@O@ gen_sv.@O@ \ - getaddrinfo.@O@ gethostent.@O@ \ - getnameinfo.@O@ getnetent.@O@ \ - getnetgrent.@O@ getprotoent.@O@ getservent.@O@ \ - hesiod.@O@ irp.@O@ irp_ho.@O@ irp_ng.@O@ irp_nw.@O@ \ - irp_pr.@O@ irp_sv.@O@ irpmarshall.@O@ irs_data.@O@ \ - lcl.@O@ lcl_ho.@O@ lcl_ng.@O@ lcl_nw.@O@ lcl_pr.@O@ \ - lcl_sv.@O@ nis.@O@ nul_ng.@O@ util.@O@ - -SRCS= dns.c dns_gr.c dns_ho.c dns_nw.c dns_pr.c dns_pw.c \ - dns_sv.c gai_strerror.c gen.c gen_gr.c gen_ho.c \ - gen_ng.c gen_nw.c gen_pr.c gen_pw.c gen_sv.c \ - getaddrinfo.c getgrent.c gethostent.c \ - getnameinfo.c getnetent.c getnetent_r.c \ - getnetgrent.c getprotoent.c getpwent.c getservent.c \ - hesiod.c irp.c irp_gr.c irp_ho.c irp_ng.c irp_nw.c \ - irp_pr.c irp_pw.c irp_sv.c irpmarshall.c irs_data.c \ - lcl.c lcl_gr.c lcl_ho.c lcl_ng.c lcl_nw.c lcl_pr.c \ - lcl_pw.c lcl_sv.c nis.c nis_gr.c nis_ho.c nis_ng.c \ - nis_nw.c nis_pr.c nis_pw.c nis_sv.c nul_ng.c \ - util.c getgrent_r.c gethostent_r.c getnetgrent_r.c getprotoent_r.c \ - getpwent_r.c getservent_r.c - -WANT_IRS_THREADSGR_OBJS=getgrent_r.@O@ - -TARGETS= ${OBJS} - -CINCLUDES= -I.. -I../include -I${srcdir}/../include - -@BIND9_MAKE_RULES@ diff --git a/contrib/bind9/lib/bind/irs/dns.c b/contrib/bind9/lib/bind/irs/dns.c deleted file mode 100644 index b78a1d6..0000000 --- a/contrib/bind9/lib/bind/irs/dns.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: dns.c,v 1.3.18.2 2006/03/10 00:20:08 marka Exp $"; -#endif - -/*! \file - * \brief - * dns.c --- this is the top-level accessor function for the dns - */ - -#include "port_before.h" - -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <resolv.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "hesiod.h" -#include "dns_p.h" - -/* forward */ - -static void dns_close(struct irs_acc *); -static struct __res_state * dns_res_get(struct irs_acc *); -static void dns_res_set(struct irs_acc *, struct __res_state *, - void (*)(void *)); - -/* public */ - -struct irs_acc * -irs_dns_acc(const char *options) { - struct irs_acc *acc; - struct dns_p *dns; - - UNUSED(options); - - if (!(acc = memget(sizeof *acc))) { - errno = ENOMEM; - return (NULL); - } - memset(acc, 0x5e, sizeof *acc); - if (!(dns = memget(sizeof *dns))) { - errno = ENOMEM; - memput(acc, sizeof *acc); - return (NULL); - } - memset(dns, 0x5e, sizeof *dns); - dns->res = NULL; - dns->free_res = NULL; - if (hesiod_init(&dns->hes_ctx) < 0) { - /* - * We allow the dns accessor class to initialize - * despite hesiod failing to initialize correctly, - * since dns host queries don't depend on hesiod. - */ - dns->hes_ctx = NULL; - } - acc->private = dns; -#ifdef WANT_IRS_GR - acc->gr_map = irs_dns_gr; -#else - acc->gr_map = NULL; -#endif -#ifdef WANT_IRS_PW - acc->pw_map = irs_dns_pw; -#else - acc->pw_map = NULL; -#endif - acc->sv_map = irs_dns_sv; - acc->pr_map = irs_dns_pr; - acc->ho_map = irs_dns_ho; - acc->nw_map = irs_dns_nw; - acc->ng_map = irs_nul_ng; - acc->res_get = dns_res_get; - acc->res_set = dns_res_set; - acc->close = dns_close; - return (acc); -} - -/* methods */ -static struct __res_state * -dns_res_get(struct irs_acc *this) { - struct dns_p *dns = (struct dns_p *)this->private; - - if (dns->res == NULL) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (res == NULL) - return (NULL); - memset(res, 0, sizeof *res); - dns_res_set(this, res, free); - } - - if ((dns->res->options & RES_INIT) == 0U && - res_ninit(dns->res) < 0) - return (NULL); - - return (dns->res); -} - -static void -dns_res_set(struct irs_acc *this, struct __res_state *res, - void (*free_res)(void *)) { - struct dns_p *dns = (struct dns_p *)this->private; - - if (dns->res && dns->free_res) { - res_nclose(dns->res); - (*dns->free_res)(dns->res); - } - dns->res = res; - dns->free_res = free_res; -} - -static void -dns_close(struct irs_acc *this) { - struct dns_p *dns; - - dns = (struct dns_p *)this->private; - if (dns->res && dns->free_res) - (*dns->free_res)(dns->res); - if (dns->hes_ctx) - hesiod_end(dns->hes_ctx); - memput(dns, sizeof *dns); - memput(this, sizeof *this); -} - diff --git a/contrib/bind9/lib/bind/irs/dns_gr.c b/contrib/bind9/lib/bind/irs/dns_gr.c deleted file mode 100644 index 358e5a7..0000000 --- a/contrib/bind9/lib/bind/irs/dns_gr.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: dns_gr.c,v 1.3.18.1 2005/04/27 05:00:54 sra Exp $"; -#endif - -/*! \file - * \brief - * dns_gr.c --- this file contains the functions for accessing - * group information from Hesiod. - */ - -#include "port_before.h" - -#ifndef WANT_IRS_GR -static int __bind_irs_gr_unneeded; -#else - -#include <sys/param.h> -#include <sys/types.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <isc/memcluster.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "hesiod.h" -#include "dns_p.h" - -/* Types. */ - -struct pvt { - /* - * This is our private accessor data. It has a shared hesiod context. - */ - struct dns_p * dns; - /* - * Need space to store the entries read from the group file. - * The members list also needs space per member, and the - * strings making up the user names must be allocated - * somewhere. Rather than doing lots of small allocations, - * we keep one buffer and resize it as needed. - */ - struct group group; - size_t nmemb; /*%< Malloc'd max index of gr_mem[]. */ - char * membuf; - size_t membufsize; -}; - -/* Forward. */ - -static struct group * gr_next(struct irs_gr *); -static struct group * gr_byname(struct irs_gr *, const char *); -static struct group * gr_bygid(struct irs_gr *, gid_t); -static void gr_rewind(struct irs_gr *); -static void gr_close(struct irs_gr *); -static int gr_list(struct irs_gr *, const char *, - gid_t, gid_t *, int *); -static void gr_minimize(struct irs_gr *); -static struct __res_state * gr_res_get(struct irs_gr *); -static void gr_res_set(struct irs_gr *, - struct __res_state *, - void (*)(void *)); - -static struct group * get_hes_group(struct irs_gr *this, - const char *name, - const char *type); - -/* Public. */ - -struct irs_gr * -irs_dns_gr(struct irs_acc *this) { - struct dns_p *dns = (struct dns_p *)this->private; - struct irs_gr *gr; - struct pvt *pvt; - - if (!dns || !dns->hes_ctx) { - errno = ENODEV; - return (NULL); - } - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->dns = dns; - if (!(gr = memget(sizeof *gr))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(gr, 0x5e, sizeof *gr); - gr->private = pvt; - gr->next = gr_next; - gr->byname = gr_byname; - gr->bygid = gr_bygid; - gr->rewind = gr_rewind; - gr->close = gr_close; - gr->list = gr_list; - gr->minimize = gr_minimize; - gr->res_get = gr_res_get; - gr->res_set = gr_res_set; - return (gr); -} - -/* methods */ - -static void -gr_close(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->group.gr_mem) - free(pvt->group.gr_mem); - if (pvt->membuf) - free(pvt->membuf); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct group * -gr_next(struct irs_gr *this) { - - UNUSED(this); - - return (NULL); -} - -static struct group * -gr_byname(struct irs_gr *this, const char *name) { - return (get_hes_group(this, name, "group")); -} - -static struct group * -gr_bygid(struct irs_gr *this, gid_t gid) { - char name[32]; - - sprintf(name, "%ld", (long)gid); - return (get_hes_group(this, name, "gid")); -} - -static void -gr_rewind(struct irs_gr *this) { - - UNUSED(this); - - /* NOOP */ -} - -static int -gr_list(struct irs_gr *this, const char *name, - gid_t basegid, gid_t *groups, int *ngroups) -{ - UNUSED(this); - UNUSED(name); - UNUSED(basegid); - UNUSED(groups); - - *ngroups = 0; - /* There's some way to do this in Hesiod. */ - return (-1); -} - -static void -gr_minimize(struct irs_gr *this) { - - UNUSED(this); - /* NOOP */ -} - -/* Private. */ - -static struct group * -get_hes_group(struct irs_gr *this, const char *name, const char *type) { - struct pvt *pvt = (struct pvt *)this->private; - char **hes_list, *cp, **new; - size_t num_members = 0; - u_long t; - - hes_list = hesiod_resolve(pvt->dns->hes_ctx, name, type); - if (!hes_list) - return (NULL); - - /* - * Copy the returned hesiod string into storage space. - */ - if (pvt->membuf) - free(pvt->membuf); - pvt->membuf = strdup(*hes_list); - hesiod_free_list(pvt->dns->hes_ctx, hes_list); - - cp = pvt->membuf; - pvt->group.gr_name = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->group.gr_passwd = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - errno = 0; - t = strtoul(cp, NULL, 10); - if (errno == ERANGE) - goto cleanup; - pvt->group.gr_gid = (gid_t) t; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - cp++; - - /* - * Parse the members out. - */ - while (*cp) { - if (num_members+1 >= pvt->nmemb || pvt->group.gr_mem == NULL) { - pvt->nmemb += 10; - new = realloc(pvt->group.gr_mem, - pvt->nmemb * sizeof(char *)); - if (new == NULL) - goto cleanup; - pvt->group.gr_mem = new; - } - pvt->group.gr_mem[num_members++] = cp; - if (!(cp = strchr(cp, ','))) - break; - *cp++ = '\0'; - } - if (!pvt->group.gr_mem) { - pvt->group.gr_mem = malloc(sizeof(char*)); - if (!pvt->group.gr_mem) - goto cleanup; - } - pvt->group.gr_mem[num_members] = NULL; - - return (&pvt->group); - - cleanup: - if (pvt->group.gr_mem) { - free(pvt->group.gr_mem); - pvt->group.gr_mem = NULL; - } - if (pvt->membuf) { - free(pvt->membuf); - pvt->membuf = NULL; - } - return (NULL); -} - -static struct __res_state * -gr_res_get(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - - return (__hesiod_res_get(dns->hes_ctx)); -} - -static void -gr_res_set(struct irs_gr *this, struct __res_state * res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - - __hesiod_res_set(dns->hes_ctx, res, free_res); -} - -#endif /* WANT_IRS_GR */ diff --git a/contrib/bind9/lib/bind/irs/dns_ho.c b/contrib/bind9/lib/bind/irs/dns_ho.c deleted file mode 100644 index db7ff02..0000000 --- a/contrib/bind9/lib/bind/irs/dns_ho.c +++ /dev/null @@ -1,1143 +0,0 @@ -/* - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* from gethostnamadr.c 8.1 (Berkeley) 6/4/93 */ -/* BIND Id: gethnamaddr.c,v 8.15 1996/05/22 04:56:30 vixie Exp $ */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: dns_ho.c,v 1.14.18.8 2008/09/24 05:59:50 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports. */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <ctype.h> -#include <errno.h> -#include <stdlib.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> -#include <syslog.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "dns_p.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) sprintf x -#endif - -/* Definitions. */ - -#define MAXALIASES 35 -#define MAXADDRS 35 - -#define MAXPACKET (65535) /*%< Maximum TCP message size */ -#define BOUNDS_CHECK(ptr, count) \ - if ((ptr) + (count) > eom) { \ - had_error++; \ - continue; \ - } else (void)0 - -typedef union { - HEADER hdr; - u_char buf[MAXPACKET]; -} querybuf; - -struct dns_res_target { - struct dns_res_target *next; - querybuf qbuf; /*%< query buffer */ - u_char *answer; /*%< buffer to put answer */ - int anslen; /*%< size of answer buffer */ - int qclass, qtype; /*%< class and type of query */ - int action; /*%< condition whether query is really issued */ - char qname[MAXDNAME +1]; /*%< domain name */ -#if 0 - int n; /*%< result length */ -#endif -}; -enum {RESTGT_DOALWAYS, RESTGT_AFTERFAILURE, RESTGT_IGNORE}; -enum {RESQRY_SUCCESS, RESQRY_FAIL}; - -struct pvt { - struct hostent host; - char * h_addr_ptrs[MAXADDRS + 1]; - char * host_aliases[MAXALIASES]; - char hostbuf[8*1024]; - u_char host_addr[16]; /*%< IPv4 or IPv6 */ - struct __res_state *res; - void (*free_res)(void *); -}; - -typedef union { - int32_t al; - char ac; -} align; - -static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; -static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; -/* Note: the IPv6 loopback address is in the "tunnel" space */ -static const u_char v6local[] = { 0,0, 0,1 }; /*%< last 4 bytes of IPv6 addr */ -/* Forwards. */ - -static void ho_close(struct irs_ho *this); -static struct hostent * ho_byname(struct irs_ho *this, const char *name); -static struct hostent * ho_byname2(struct irs_ho *this, const char *name, - int af); -static struct hostent * ho_byaddr(struct irs_ho *this, const void *addr, - int len, int af); -static struct hostent * ho_next(struct irs_ho *this); -static void ho_rewind(struct irs_ho *this); -static void ho_minimize(struct irs_ho *this); -static struct __res_state * ho_res_get(struct irs_ho *this); -static void ho_res_set(struct irs_ho *this, - struct __res_state *res, - void (*free_res)(void *)); -static struct addrinfo * ho_addrinfo(struct irs_ho *this, const char *name, - const struct addrinfo *pai); - -static void map_v4v6_hostent(struct hostent *hp, char **bp, - char *ep); -static void addrsort(res_state, char **, int); -static struct hostent * gethostans(struct irs_ho *this, - const u_char *ansbuf, int anslen, - const char *qname, int qtype, - int af, int size, - struct addrinfo **ret_aip, - const struct addrinfo *pai); -static int add_hostent(struct pvt *pvt, char *bp, char **hap, - struct addrinfo *ai); -static int init(struct irs_ho *this); - -/* Exports. */ - -struct irs_ho * -irs_dns_ho(struct irs_acc *this) { - struct irs_ho *ho; - struct pvt *pvt; - - UNUSED(this); - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - - if (!(ho = memget(sizeof *ho))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(ho, 0x5e, sizeof *ho); - ho->private = pvt; - ho->close = ho_close; - ho->byname = ho_byname; - ho->byname2 = ho_byname2; - ho->byaddr = ho_byaddr; - ho->next = ho_next; - ho->rewind = ho_rewind; - ho->minimize = ho_minimize; - ho->res_get = ho_res_get; - ho->res_set = ho_res_set; - ho->addrinfo = ho_addrinfo; - return (ho); -} - -/* Methods. */ - -static void -ho_close(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - ho_minimize(this); - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct hostent * -ho_byname(struct irs_ho *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *hp; - - if (init(this) == -1) - return (NULL); - - if (pvt->res->options & RES_USE_INET6) { - hp = ho_byname2(this, name, AF_INET6); - if (hp) - return (hp); - } - return (ho_byname2(this, name, AF_INET)); -} - -static struct hostent * -ho_byname2(struct irs_ho *this, const char *name, int af) -{ - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *hp = NULL; - int n, size; - char tmp[NS_MAXDNAME]; - const char *cp; - struct addrinfo ai; - struct dns_res_target *q, *p; - int querystate = RESQRY_FAIL; - - if (init(this) == -1) - return (NULL); - - q = memget(sizeof(*q)); - if (q == NULL) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = ENOMEM; - goto cleanup; - } - memset(q, 0, sizeof(*q)); - - switch (af) { - case AF_INET: - size = INADDRSZ; - q->qclass = C_IN; - q->qtype = T_A; - q->answer = q->qbuf.buf; - q->anslen = sizeof(q->qbuf); - q->action = RESTGT_DOALWAYS; - break; - case AF_INET6: - size = IN6ADDRSZ; - q->qclass = C_IN; - q->qtype = T_AAAA; - q->answer = q->qbuf.buf; - q->anslen = sizeof(q->qbuf); - q->action = RESTGT_DOALWAYS; - break; - default: - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = EAFNOSUPPORT; - hp = NULL; - goto cleanup; - } - - /* - * if there aren't any dots, it could be a user-level alias. - * this is also done in res_nquery() since we are not the only - * function that looks up host names. - */ - if (!strchr(name, '.') && (cp = res_hostalias(pvt->res, name, - tmp, sizeof tmp))) - name = cp; - - for (p = q; p; p = p->next) { - switch(p->action) { - case RESTGT_DOALWAYS: - break; - case RESTGT_AFTERFAILURE: - if (querystate == RESQRY_SUCCESS) - continue; - break; - case RESTGT_IGNORE: - continue; - } - - if ((n = res_nsearch(pvt->res, name, p->qclass, p->qtype, - p->answer, p->anslen)) < 0) { - querystate = RESQRY_FAIL; - continue; - } - - memset(&ai, 0, sizeof(ai)); - ai.ai_family = af; - if ((hp = gethostans(this, p->answer, n, name, p->qtype, - af, size, NULL, - (const struct addrinfo *)&ai)) != NULL) - goto cleanup; /*%< no more loop is necessary */ - querystate = RESQRY_FAIL; - continue; - } - - cleanup: - if (q != NULL) - memput(q, sizeof(*q)); - return(hp); -} - -static struct hostent * -ho_byaddr(struct irs_ho *this, const void *addr, int len, int af) -{ - struct pvt *pvt = (struct pvt *)this->private; - const u_char *uaddr = addr; - char *qp; - struct hostent *hp = NULL; - struct addrinfo ai; - struct dns_res_target *q, *q2, *p; - int n, size, i; - int querystate = RESQRY_FAIL; - - if (init(this) == -1) - return (NULL); - - q = memget(sizeof(*q)); - q2 = memget(sizeof(*q2)); - if (q == NULL || q2 == NULL) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = ENOMEM; - goto cleanup; - } - memset(q, 0, sizeof(*q)); - memset(q2, 0, sizeof(*q2)); - - if (af == AF_INET6 && len == IN6ADDRSZ && - (!memcmp(uaddr, mapped, sizeof mapped) || - (!memcmp(uaddr, tunnelled, sizeof tunnelled) && - memcmp(&uaddr[sizeof tunnelled], v6local, sizeof(v6local))))) { - /* Unmap. */ - addr = (const char *)addr + sizeof mapped; - uaddr += sizeof mapped; - af = AF_INET; - len = INADDRSZ; - } - switch (af) { - case AF_INET: - size = INADDRSZ; - q->qclass = C_IN; - q->qtype = T_PTR; - q->answer = q->qbuf.buf; - q->anslen = sizeof(q->qbuf); - q->action = RESTGT_DOALWAYS; - break; - case AF_INET6: - size = IN6ADDRSZ; - q->qclass = C_IN; - q->qtype = T_PTR; - q->answer = q->qbuf.buf; - q->anslen = sizeof(q->qbuf); - q->next = q2; - q->action = RESTGT_DOALWAYS; - q2->qclass = C_IN; - q2->qtype = T_PTR; - q2->answer = q2->qbuf.buf; - q2->anslen = sizeof(q2->qbuf); - if ((pvt->res->options & RES_NO_NIBBLE2) != 0U) - q2->action = RESTGT_IGNORE; - else - q2->action = RESTGT_AFTERFAILURE; - break; - default: - errno = EAFNOSUPPORT; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - hp = NULL; - goto cleanup; - } - if (size > len) { - errno = EINVAL; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - hp = NULL; - goto cleanup; - } - switch (af) { - case AF_INET: - qp = q->qname; - (void) sprintf(qp, "%u.%u.%u.%u.in-addr.arpa", - (uaddr[3] & 0xff), - (uaddr[2] & 0xff), - (uaddr[1] & 0xff), - (uaddr[0] & 0xff)); - break; - case AF_INET6: - if (q->action != RESTGT_IGNORE) { - const char *nibsuff = res_get_nibblesuffix(pvt->res); - qp = q->qname; - for (n = IN6ADDRSZ - 1; n >= 0; n--) { - i = SPRINTF((qp, "%x.%x.", - uaddr[n] & 0xf, - (uaddr[n] >> 4) & 0xf)); - if (i != 4) - abort(); - qp += i; - } - if (strlen(q->qname) + strlen(nibsuff) + 1 > - sizeof q->qname) { - errno = ENAMETOOLONG; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - hp = NULL; - goto cleanup; - } - strcpy(qp, nibsuff); /* (checked) */ - } - if (q2->action != RESTGT_IGNORE) { - const char *nibsuff2 = res_get_nibblesuffix2(pvt->res); - qp = q2->qname; - for (n = IN6ADDRSZ - 1; n >= 0; n--) { - i = SPRINTF((qp, "%x.%x.", - uaddr[n] & 0xf, - (uaddr[n] >> 4) & 0xf)); - if (i != 4) - abort(); - qp += i; - } - if (strlen(q2->qname) + strlen(nibsuff2) + 1 > - sizeof q2->qname) { - errno = ENAMETOOLONG; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - hp = NULL; - goto cleanup; - } - strcpy(qp, nibsuff2); /* (checked) */ - } - break; - default: - abort(); - } - - for (p = q; p; p = p->next) { - switch(p->action) { - case RESTGT_DOALWAYS: - break; - case RESTGT_AFTERFAILURE: - if (querystate == RESQRY_SUCCESS) - continue; - break; - case RESTGT_IGNORE: - continue; - } - - if ((n = res_nquery(pvt->res, p->qname, p->qclass, p->qtype, - p->answer, p->anslen)) < 0) { - querystate = RESQRY_FAIL; - continue; - } - - memset(&ai, 0, sizeof(ai)); - ai.ai_family = af; - hp = gethostans(this, p->answer, n, p->qname, T_PTR, af, size, - NULL, (const struct addrinfo *)&ai); - if (!hp) { - querystate = RESQRY_FAIL; - continue; - } - - memcpy(pvt->host_addr, addr, len); - pvt->h_addr_ptrs[0] = (char *)pvt->host_addr; - pvt->h_addr_ptrs[1] = NULL; - if (af == AF_INET && (pvt->res->options & RES_USE_INET6)) { - map_v4v6_address((char*)pvt->host_addr, - (char*)pvt->host_addr); - pvt->host.h_addrtype = AF_INET6; - pvt->host.h_length = IN6ADDRSZ; - } - - RES_SET_H_ERRNO(pvt->res, NETDB_SUCCESS); - goto cleanup; /*%< no more loop is necessary. */ - } - hp = NULL; /*%< H_ERRNO was set by subroutines */ - cleanup: - if (q != NULL) - memput(q, sizeof(*q)); - if (q2 != NULL) - memput(q2, sizeof(*q2)); - return(hp); -} - -static struct hostent * -ho_next(struct irs_ho *this) { - - UNUSED(this); - - return (NULL); -} - -static void -ho_rewind(struct irs_ho *this) { - - UNUSED(this); - - /* NOOP */ -} - -static void -ho_minimize(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res) - res_nclose(pvt->res); -} - -static struct __res_state * -ho_res_get(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - ho_res_set(this, res, free); - } - - return (pvt->res); -} - -/* XXX */ -extern struct addrinfo *addr2addrinfo __P((const struct addrinfo *, - const char *)); - -static struct addrinfo * -ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai) -{ - struct pvt *pvt = (struct pvt *)this->private; - int n; - char tmp[NS_MAXDNAME]; - const char *cp; - struct dns_res_target *q, *q2, *p; - struct addrinfo sentinel, *cur; - int querystate = RESQRY_FAIL; - - if (init(this) == -1) - return (NULL); - - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - - q = memget(sizeof(*q)); - q2 = memget(sizeof(*q2)); - if (q == NULL || q2 == NULL) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = ENOMEM; - goto cleanup; - } - memset(q, 0, sizeof(*q2)); - memset(q2, 0, sizeof(*q2)); - - switch (pai->ai_family) { - case AF_UNSPEC: - /* prefer IPv6 */ - q->qclass = C_IN; - q->qtype = T_AAAA; - q->answer = q->qbuf.buf; - q->anslen = sizeof(q->qbuf); - q->next = q2; - q->action = RESTGT_DOALWAYS; - q2->qclass = C_IN; - q2->qtype = T_A; - q2->answer = q2->qbuf.buf; - q2->anslen = sizeof(q2->qbuf); - q2->action = RESTGT_DOALWAYS; - break; - case AF_INET: - q->qclass = C_IN; - q->qtype = T_A; - q->answer = q->qbuf.buf; - q->anslen = sizeof(q->qbuf); - q->action = RESTGT_DOALWAYS; - break; - case AF_INET6: - q->qclass = C_IN; - q->qtype = T_AAAA; - q->answer = q->qbuf.buf; - q->anslen = sizeof(q->qbuf); - q->action = RESTGT_DOALWAYS; - break; - default: - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); /*%< better error? */ - goto cleanup; - } - - /* - * if there aren't any dots, it could be a user-level alias. - * this is also done in res_nquery() since we are not the only - * function that looks up host names. - */ - if (!strchr(name, '.') && (cp = res_hostalias(pvt->res, name, - tmp, sizeof tmp))) - name = cp; - - for (p = q; p; p = p->next) { - struct addrinfo *ai; - - switch(p->action) { - case RESTGT_DOALWAYS: - break; - case RESTGT_AFTERFAILURE: - if (querystate == RESQRY_SUCCESS) - continue; - break; - case RESTGT_IGNORE: - continue; - } - - if ((n = res_nsearch(pvt->res, name, p->qclass, p->qtype, - p->answer, p->anslen)) < 0) { - querystate = RESQRY_FAIL; - continue; - } - (void)gethostans(this, p->answer, n, name, p->qtype, - pai->ai_family, /*%< XXX: meaningless */ - 0, &ai, pai); - if (ai) { - querystate = RESQRY_SUCCESS; - cur->ai_next = ai; - while (cur->ai_next) - cur = cur->ai_next; - } else - querystate = RESQRY_FAIL; - } - - cleanup: - if (q != NULL) - memput(q, sizeof(*q)); - if (q2 != NULL) - memput(q2, sizeof(*q2)); - return(sentinel.ai_next); -} - -static void -ho_res_set(struct irs_ho *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; -} - -/* Private. */ - -static struct hostent * -gethostans(struct irs_ho *this, - const u_char *ansbuf, int anslen, const char *qname, int qtype, - int af, int size, /*!< meaningless for addrinfo cases */ - struct addrinfo **ret_aip, const struct addrinfo *pai) -{ - struct pvt *pvt = (struct pvt *)this->private; - int type, class, ancount, qdcount, n, haveanswer, had_error; - int error = NETDB_SUCCESS; - int (*name_ok)(const char *); - const HEADER *hp; - const u_char *eom; - const u_char *eor; - const u_char *cp; - const char *tname; - const char *hname; - char *bp, *ep, **ap, **hap; - char tbuf[MAXDNAME+1]; - struct addrinfo sentinel, *cur, ai; - - if (pai == NULL) abort(); - if (ret_aip != NULL) - *ret_aip = NULL; - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - - tname = qname; - eom = ansbuf + anslen; - switch (qtype) { - case T_A: - case T_AAAA: - case T_ANY: /*%< use T_ANY only for T_A/T_AAAA lookup */ - name_ok = res_hnok; - break; - case T_PTR: - name_ok = res_dnok; - break; - default: - abort(); - } - - pvt->host.h_addrtype = af; - pvt->host.h_length = size; - hname = pvt->host.h_name = NULL; - - /* - * Find first satisfactory answer. - */ - if (ansbuf + HFIXEDSZ > eom) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - hp = (const HEADER *)ansbuf; - ancount = ntohs(hp->ancount); - qdcount = ntohs(hp->qdcount); - bp = pvt->hostbuf; - ep = pvt->hostbuf + sizeof(pvt->hostbuf); - cp = ansbuf + HFIXEDSZ; - if (qdcount != 1) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - n = dn_expand(ansbuf, eom, cp, bp, ep - bp); - if (n < 0 || !maybe_ok(pvt->res, bp, name_ok)) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - cp += n + QFIXEDSZ; - if (cp > eom) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - if (qtype == T_A || qtype == T_AAAA || qtype == T_ANY) { - /* res_nsend() has already verified that the query name is the - * same as the one we sent; this just gets the expanded name - * (i.e., with the succeeding search-domain tacked on). - */ - n = strlen(bp) + 1; /*%< for the \\0 */ - if (n > MAXHOSTNAMELEN) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - pvt->host.h_name = bp; - hname = bp; - bp += n; - /* The qname can be abbreviated, but hname is now absolute. */ - qname = pvt->host.h_name; - } - ap = pvt->host_aliases; - *ap = NULL; - pvt->host.h_aliases = pvt->host_aliases; - hap = pvt->h_addr_ptrs; - *hap = NULL; - pvt->host.h_addr_list = pvt->h_addr_ptrs; - haveanswer = 0; - had_error = 0; - while (ancount-- > 0 && cp < eom && !had_error) { - n = dn_expand(ansbuf, eom, cp, bp, ep - bp); - if (n < 0 || !maybe_ok(pvt->res, bp, name_ok)) { - had_error++; - continue; - } - cp += n; /*%< name */ - BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ); - type = ns_get16(cp); - cp += INT16SZ; /*%< type */ - class = ns_get16(cp); - cp += INT16SZ + INT32SZ; /*%< class, TTL */ - n = ns_get16(cp); - cp += INT16SZ; /*%< len */ - BOUNDS_CHECK(cp, n); - if (class != C_IN) { - cp += n; - continue; - } - eor = cp + n; - if ((qtype == T_A || qtype == T_AAAA || qtype == T_ANY) && - type == T_CNAME) { - if (haveanswer) { - int level = LOG_CRIT; -#ifdef LOG_SECURITY - level |= LOG_SECURITY; -#endif - syslog(level, - "gethostans: possible attempt to exploit buffer overflow while looking up %s", - *qname ? qname : "."); - } - n = dn_expand(ansbuf, eor, cp, tbuf, sizeof tbuf); - if (n < 0 || !maybe_ok(pvt->res, tbuf, name_ok)) { - had_error++; - continue; - } - cp += n; - /* Store alias. */ - if (ap >= &pvt->host_aliases[MAXALIASES-1]) - continue; - *ap++ = bp; - n = strlen(bp) + 1; /*%< for the \\0 */ - bp += n; - /* Get canonical name. */ - n = strlen(tbuf) + 1; /*%< for the \\0 */ - if (n > (ep - bp) || n > MAXHOSTNAMELEN) { - had_error++; - continue; - } - strcpy(bp, tbuf); /* (checked) */ - pvt->host.h_name = bp; - hname = bp; - bp += n; - continue; - } - if (qtype == T_PTR && type == T_CNAME) { - n = dn_expand(ansbuf, eor, cp, tbuf, sizeof tbuf); - if (n < 0 || !maybe_dnok(pvt->res, tbuf)) { - had_error++; - continue; - } - cp += n; -#ifdef RES_USE_DNAME - if ((pvt->res->options & RES_USE_DNAME) != 0U) -#endif - { - /* - * We may be able to check this regardless - * of the USE_DNAME bit, but we add the check - * for now since the DNAME support is - * experimental. - */ - if (ns_samename(tname, bp) != 1) - continue; - } - /* Get canonical name. */ - n = strlen(tbuf) + 1; /*%< for the \\0 */ - if (n > (ep - bp)) { - had_error++; - continue; - } - strcpy(bp, tbuf); /* (checked) */ - tname = bp; - bp += n; - continue; - } - if (qtype == T_ANY) { - if (!(type == T_A || type == T_AAAA)) { - cp += n; - continue; - } - } else if (type != qtype) { - cp += n; - continue; - } - switch (type) { - case T_PTR: - if (ret_aip != NULL) { - /* addrinfo never needs T_PTR */ - cp += n; - continue; - } - if (ns_samename(tname, bp) != 1) { - cp += n; - continue; - } - n = dn_expand(ansbuf, eor, cp, bp, ep - bp); - if (n < 0 || !maybe_hnok(pvt->res, bp) || - n >= MAXHOSTNAMELEN) { - had_error++; - break; - } - cp += n; - if (!haveanswer) { - pvt->host.h_name = bp; - hname = bp; - } - else if (ap < &pvt->host_aliases[MAXALIASES-1]) - *ap++ = bp; - else - n = -1; - if (n != -1) { - n = strlen(bp) + 1; /*%< for the \\0 */ - bp += n; - } - break; - case T_A: - case T_AAAA: - if (ns_samename(hname, bp) != 1) { - cp += n; - continue; - } - if (type == T_A && n != INADDRSZ) { - cp += n; - continue; - } - if (type == T_AAAA && n != IN6ADDRSZ) { - cp += n; - continue; - } - - /* make addrinfo. don't overwrite constant PAI */ - ai = *pai; - ai.ai_family = (type == T_AAAA) ? AF_INET6 : AF_INET; - cur->ai_next = addr2addrinfo( - (const struct addrinfo *)&ai, - (const char *)cp); - if (cur->ai_next == NULL) - had_error++; - - if (!haveanswer) { - int nn; - - nn = strlen(bp) + 1; /*%< for the \\0 */ - if (nn >= MAXHOSTNAMELEN) { - cp += n; - had_error++; - continue; - } - pvt->host.h_name = bp; - hname = bp; - bp += nn; - } - /* Ensure alignment. */ - bp = (char *)(((u_long)bp + (sizeof(align) - 1)) & - ~(sizeof(align) - 1)); - /* Avoid overflows. */ - if (bp + n > &pvt->hostbuf[sizeof(pvt->hostbuf) - 1]) { - had_error++; - continue; - } - if (ret_aip) { /*%< need addrinfo. keep it. */ - while (cur->ai_next) - cur = cur->ai_next; - } else if (cur->ai_next) { /*%< need hostent */ - struct addrinfo *aip = cur->ai_next; - - for (aip = cur->ai_next; aip; - aip = aip->ai_next) { - int m; - - m = add_hostent(pvt, bp, hap, aip); - if (m < 0) { - had_error++; - break; - } - if (m == 0) - continue; - if (hap < &pvt->h_addr_ptrs[MAXADDRS]) - hap++; - *hap = NULL; - bp += m; - } - - freeaddrinfo(cur->ai_next); - cur->ai_next = NULL; - } - cp += n; - break; - default: - abort(); - } - if (!had_error) - haveanswer++; - } - if (haveanswer) { - if (ret_aip == NULL) { - *ap = NULL; - *hap = NULL; - - if (pvt->res->nsort && hap != pvt->h_addr_ptrs && - qtype == T_A) - addrsort(pvt->res, pvt->h_addr_ptrs, - hap - pvt->h_addr_ptrs); - if (pvt->host.h_name == NULL) { - n = strlen(qname) + 1; /*%< for the \\0 */ - if (n > (ep - bp) || n >= MAXHOSTNAMELEN) - goto no_recovery; - strcpy(bp, qname); /* (checked) */ - pvt->host.h_name = bp; - bp += n; - } - if (pvt->res->options & RES_USE_INET6) - map_v4v6_hostent(&pvt->host, &bp, ep); - RES_SET_H_ERRNO(pvt->res, NETDB_SUCCESS); - return (&pvt->host); - } else { - if ((pai->ai_flags & AI_CANONNAME) != 0) { - if (pvt->host.h_name == NULL) { - sentinel.ai_next->ai_canonname = - strdup(qname); - } - else { - sentinel.ai_next->ai_canonname = - strdup(pvt->host.h_name); - } - } - *ret_aip = sentinel.ai_next; - return(NULL); - } - } - no_recovery: - if (sentinel.ai_next) { - /* this should be impossible, but check it for safety */ - freeaddrinfo(sentinel.ai_next); - } - if (error == NETDB_SUCCESS) - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - else - RES_SET_H_ERRNO(pvt->res, error); - return(NULL); -} - -static int -add_hostent(struct pvt *pvt, char *bp, char **hap, struct addrinfo *ai) -{ - int addrlen; - char *addrp; - const char **tap; - char *obp = bp; - - switch(ai->ai_addr->sa_family) { - case AF_INET6: - addrlen = IN6ADDRSZ; - addrp = (char *)&((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr; - break; - case AF_INET: - addrlen = INADDRSZ; - addrp = (char *)&((struct sockaddr_in *)ai->ai_addr)->sin_addr; - break; - default: - return(-1); /*%< abort? */ - } - - /* Ensure alignment. */ - bp = (char *)(((u_long)bp + (sizeof(align) - 1)) & - ~(sizeof(align) - 1)); - /* Avoid overflows. */ - if (bp + addrlen > &pvt->hostbuf[sizeof(pvt->hostbuf) - 1]) - return(-1); - if (hap >= &pvt->h_addr_ptrs[MAXADDRS]) - return(0); /*%< fail, but not treat it as an error. */ - /* Suppress duplicates. */ - for (tap = (const char **)pvt->h_addr_ptrs; - *tap != NULL; - tap++) - if (memcmp(*tap, addrp, addrlen) == 0) - break; - if (*tap != NULL) - return (0); - - memcpy(*hap = bp, addrp, addrlen); - return((bp + addrlen) - obp); -} - -static void -map_v4v6_hostent(struct hostent *hp, char **bpp, char *ep) { - char **ap; - - if (hp->h_addrtype != AF_INET || hp->h_length != INADDRSZ) - return; - hp->h_addrtype = AF_INET6; - hp->h_length = IN6ADDRSZ; - for (ap = hp->h_addr_list; *ap; ap++) { - int i = (u_long)*bpp % sizeof(align); - - if (i != 0) - i = sizeof(align) - i; - - if ((ep - *bpp) < (i + IN6ADDRSZ)) { - /* Out of memory. Truncate address list here. */ - *ap = NULL; - return; - } - *bpp += i; - map_v4v6_address(*ap, *bpp); - *ap = *bpp; - *bpp += IN6ADDRSZ; - } -} - -static void -addrsort(res_state statp, char **ap, int num) { - int i, j, needsort = 0, aval[MAXADDRS]; - char **p; - - p = ap; - for (i = 0; i < num; i++, p++) { - for (j = 0 ; (unsigned)j < statp->nsort; j++) - if (statp->sort_list[j].addr.s_addr == - (((struct in_addr *)(*p))->s_addr & - statp->sort_list[j].mask)) - break; - aval[i] = j; - if (needsort == 0 && i > 0 && j < aval[i-1]) - needsort = i; - } - if (!needsort) - return; - - while (needsort < num) { - for (j = needsort - 1; j >= 0; j--) { - if (aval[j] > aval[j+1]) { - char *hp; - - i = aval[j]; - aval[j] = aval[j+1]; - aval[j+1] = i; - - hp = ap[j]; - ap[j] = ap[j+1]; - ap[j+1] = hp; - - } else - break; - } - needsort++; - } -} - -static int -init(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res && !ho_res_get(this)) - return (-1); - if (((pvt->res->options & RES_INIT) == 0U) && - res_ninit(pvt->res) == -1) - return (-1); - return (0); -} diff --git a/contrib/bind9/lib/bind/irs/dns_nw.c b/contrib/bind9/lib/bind/irs/dns_nw.c deleted file mode 100644 index 1d03a52..0000000 --- a/contrib/bind9/lib/bind/irs/dns_nw.c +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: dns_nw.c,v 1.9.18.3 2005/04/27 05:00:55 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports. */ - -#include "port_before.h" - -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <ctype.h> -#include <errno.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "dns_p.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) sprintf x -#endif - -/* Definitions. */ - -#define MAXALIASES 35 - -#define MAXPACKET (64*1024) - -struct pvt { - struct nwent net; - char * ali[MAXALIASES]; - char buf[BUFSIZ+1]; - struct __res_state * res; - void (*free_res)(void *); -}; - -typedef union { - long al; - char ac; -} align; - -enum by_what { by_addr, by_name }; - -/* Forwards. */ - -static void nw_close(struct irs_nw *); -static struct nwent * nw_byname(struct irs_nw *, const char *, int); -static struct nwent * nw_byaddr(struct irs_nw *, void *, int, int); -static struct nwent * nw_next(struct irs_nw *); -static void nw_rewind(struct irs_nw *); -static void nw_minimize(struct irs_nw *); -static struct __res_state * nw_res_get(struct irs_nw *this); -static void nw_res_set(struct irs_nw *this, - struct __res_state *res, - void (*free_res)(void *)); - -static struct nwent * get1101byaddr(struct irs_nw *, u_char *, int); -static struct nwent * get1101byname(struct irs_nw *, const char *); -static struct nwent * get1101answer(struct irs_nw *, - u_char *ansbuf, int anslen, - enum by_what by_what, - int af, const char *name, - const u_char *addr, int addrlen); -static struct nwent * get1101mask(struct irs_nw *this, struct nwent *); -static int make1101inaddr(const u_char *, int, char *, int); -static void normalize_name(char *name); -static int init(struct irs_nw *this); - -/* Exports. */ - -struct irs_nw * -irs_dns_nw(struct irs_acc *this) { - struct irs_nw *nw; - struct pvt *pvt; - - UNUSED(this); - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - if (!(nw = memget(sizeof *nw))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(nw, 0x5e, sizeof *nw); - nw->private = pvt; - nw->close = nw_close; - nw->byname = nw_byname; - nw->byaddr = nw_byaddr; - nw->next = nw_next; - nw->rewind = nw_rewind; - nw->minimize = nw_minimize; - nw->res_get = nw_res_get; - nw->res_set = nw_res_set; - return (nw); -} - -/* Methods. */ - -static void -nw_close(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - nw_minimize(this); - - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct nwent * -nw_byname(struct irs_nw *this, const char *name, int af) { - struct pvt *pvt = (struct pvt *)this->private; - - if (init(this) == -1) - return (NULL); - - switch (af) { - case AF_INET: - return (get1101byname(this, name)); - default: - (void)NULL; - } - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = EAFNOSUPPORT; - return (NULL); -} - -static struct nwent * -nw_byaddr(struct irs_nw *this, void *net, int len, int af) { - struct pvt *pvt = (struct pvt *)this->private; - - if (init(this) == -1) - return (NULL); - - switch (af) { - case AF_INET: - return (get1101byaddr(this, net, len)); - default: - (void)NULL; - } - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = EAFNOSUPPORT; - return (NULL); -} - -static struct nwent * -nw_next(struct irs_nw *this) { - - UNUSED(this); - - return (NULL); -} - -static void -nw_rewind(struct irs_nw *this) { - UNUSED(this); - /* NOOP */ -} - -static void -nw_minimize(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res) - res_nclose(pvt->res); -} - -static struct __res_state * -nw_res_get(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - nw_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -nw_res_set(struct irs_nw *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; -} - -/* Private. */ - -static struct nwent * -get1101byname(struct irs_nw *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - u_char *ansbuf; - int anslen; - struct nwent *result; - - ansbuf = memget(MAXPACKET); - if (ansbuf == NULL) { - errno = ENOMEM; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - anslen = res_nsearch(pvt->res, name, C_IN, T_PTR, ansbuf, MAXPACKET); - if (anslen < 0) { - memput(ansbuf, MAXPACKET); - return (NULL); - } - result = get1101mask(this, get1101answer(this, ansbuf, anslen, by_name, - AF_INET, name, NULL, 0)); - memput(ansbuf, MAXPACKET); - return (result); -} - -static struct nwent * -get1101byaddr(struct irs_nw *this, u_char *net, int len) { - struct pvt *pvt = (struct pvt *)this->private; - char qbuf[sizeof "255.255.255.255.in-addr.arpa"]; - struct nwent *result; - u_char *ansbuf; - int anslen; - - if (len < 1 || len > 32) { - errno = EINVAL; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - if (make1101inaddr(net, len, qbuf, sizeof qbuf) < 0) - return (NULL); - ansbuf = memget(MAXPACKET); - if (ansbuf == NULL) { - errno = ENOMEM; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - anslen = res_nquery(pvt->res, qbuf, C_IN, T_PTR, ansbuf, MAXPACKET); - if (anslen < 0) { - memput(ansbuf, MAXPACKET); - return (NULL); - } - result = get1101mask(this, get1101answer(this, ansbuf, anslen, by_addr, - AF_INET, NULL, net, len)); - memput(ansbuf, MAXPACKET); - return (result); -} - -static struct nwent * -get1101answer(struct irs_nw *this, - u_char *ansbuf, int anslen, enum by_what by_what, - int af, const char *name, const u_char *addr, int addrlen) -{ - struct pvt *pvt = (struct pvt *)this->private; - int type, class, ancount, qdcount, haveanswer; - char *bp, *ep, **ap; - u_char *cp, *eom; - HEADER *hp; - - /* Initialize, and parse header. */ - eom = ansbuf + anslen; - if (ansbuf + HFIXEDSZ > eom) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - hp = (HEADER *)ansbuf; - cp = ansbuf + HFIXEDSZ; - qdcount = ntohs(hp->qdcount); - while (qdcount-- > 0) { - int n = dn_skipname(cp, eom); - cp += n + QFIXEDSZ; - if (n < 0 || cp > eom) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - } - ancount = ntohs(hp->ancount); - if (!ancount) { - if (hp->aa) - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - else - RES_SET_H_ERRNO(pvt->res, TRY_AGAIN); - return (NULL); - } - - /* Prepare a return structure. */ - bp = pvt->buf; - ep = pvt->buf + sizeof(pvt->buf); - pvt->net.n_name = NULL; - pvt->net.n_aliases = pvt->ali; - pvt->net.n_addrtype = af; - pvt->net.n_addr = NULL; - pvt->net.n_length = addrlen; - - /* Save input key if given. */ - switch (by_what) { - case by_name: - if (name != NULL) { - int n = strlen(name) + 1; - - if (n > (ep - bp)) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - pvt->net.n_name = strcpy(bp, name); /* (checked) */ - bp += n; - } - break; - case by_addr: - if (addr != NULL && addrlen != 0) { - int n = addrlen / 8 + ((addrlen % 8) != 0); - - if (INADDRSZ > (ep - bp)) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - memset(bp, 0, INADDRSZ); - memcpy(bp, addr, n); - pvt->net.n_addr = bp; - bp += INADDRSZ; - } - break; - default: - abort(); - } - - /* Parse the answer, collect aliases. */ - ap = pvt->ali; - haveanswer = 0; - while (--ancount >= 0 && cp < eom) { - int n = dn_expand(ansbuf, eom, cp, bp, ep - bp); - - cp += n; /*%< Owner */ - if (n < 0 || !maybe_dnok(pvt->res, bp) || - cp + 3 * INT16SZ + INT32SZ > eom) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - GETSHORT(type, cp); /*%< Type */ - GETSHORT(class, cp); /*%< Class */ - cp += INT32SZ; /*%< TTL */ - GETSHORT(n, cp); /*%< RDLENGTH */ - if (class == C_IN && type == T_PTR) { - int nn; - - nn = dn_expand(ansbuf, eom, cp, bp, ep - bp); - if (nn < 0 || !maybe_hnok(pvt->res, bp) || nn != n) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - normalize_name(bp); - switch (by_what) { - case by_addr: { - if (pvt->net.n_name == NULL) - pvt->net.n_name = bp; - else if (ns_samename(pvt->net.n_name, bp) == 1) - break; - else - *ap++ = bp; - nn = strlen(bp) + 1; - bp += nn; - haveanswer++; - break; - } - case by_name: { - u_int b1, b2, b3, b4; - - if (pvt->net.n_addr != NULL || - sscanf(bp, "%u.%u.%u.%u.in-addr.arpa", - &b1, &b2, &b3, &b4) != 4) - break; - if ((ep - bp) < INADDRSZ) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - return (NULL); - } - pvt->net.n_addr = bp; - *bp++ = b4; - *bp++ = b3; - *bp++ = b2; - *bp++ = b1; - pvt->net.n_length = INADDRSZ * 8; - haveanswer++; - } - } - } - cp += n; /*%< RDATA */ - } - if (!haveanswer) { - RES_SET_H_ERRNO(pvt->res, TRY_AGAIN); - return (NULL); - } - *ap = NULL; - - return (&pvt->net); -} - -static struct nwent * -get1101mask(struct irs_nw *this, struct nwent *nwent) { - struct pvt *pvt = (struct pvt *)this->private; - char qbuf[sizeof "255.255.255.255.in-addr.arpa"], owner[MAXDNAME]; - int anslen, type, class, ancount, qdcount; - u_char *ansbuf, *cp, *eom; - HEADER *hp; - - if (!nwent) - return (NULL); - if (make1101inaddr(nwent->n_addr, nwent->n_length, qbuf, sizeof qbuf) - < 0) { - /* "First, do no harm." */ - return (nwent); - } - - ansbuf = memget(MAXPACKET); - if (ansbuf == NULL) { - errno = ENOMEM; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - /* Query for the A RR that would hold this network's mask. */ - anslen = res_nquery(pvt->res, qbuf, C_IN, T_A, ansbuf, MAXPACKET); - if (anslen < HFIXEDSZ) { - memput(ansbuf, MAXPACKET); - return (nwent); - } - - /* Initialize, and parse header. */ - hp = (HEADER *)ansbuf; - cp = ansbuf + HFIXEDSZ; - eom = ansbuf + anslen; - qdcount = ntohs(hp->qdcount); - while (qdcount-- > 0) { - int n = dn_skipname(cp, eom); - cp += n + QFIXEDSZ; - if (n < 0 || cp > eom) { - memput(ansbuf, MAXPACKET); - return (nwent); - } - } - ancount = ntohs(hp->ancount); - - /* Parse the answer, collect aliases. */ - while (--ancount >= 0 && cp < eom) { - int n = dn_expand(ansbuf, eom, cp, owner, sizeof owner); - - if (n < 0 || !maybe_dnok(pvt->res, owner)) - break; - cp += n; /*%< Owner */ - if (cp + 3 * INT16SZ + INT32SZ > eom) - break; - GETSHORT(type, cp); /*%< Type */ - GETSHORT(class, cp); /*%< Class */ - cp += INT32SZ; /*%< TTL */ - GETSHORT(n, cp); /*%< RDLENGTH */ - if (cp + n > eom) - break; - if (n == INADDRSZ && class == C_IN && type == T_A && - ns_samename(qbuf, owner) == 1) { - /* This A RR indicates the actual netmask. */ - int nn, mm; - - nwent->n_length = 0; - for (nn = 0; nn < INADDRSZ; nn++) - for (mm = 7; mm >= 0; mm--) - if (cp[nn] & (1 << mm)) - nwent->n_length++; - else - break; - } - cp += n; /*%< RDATA */ - } - memput(ansbuf, MAXPACKET); - return (nwent); -} - -static int -make1101inaddr(const u_char *net, int bits, char *name, int size) { - int n, m; - char *ep; - - ep = name + size; - - /* Zero fill any whole bytes left out of the prefix. */ - for (n = (32 - bits) / 8; n > 0; n--) { - if (ep - name < (int)(sizeof "0.")) - goto emsgsize; - m = SPRINTF((name, "0.")); - name += m; - } - - /* Format the partial byte, if any, within the prefix. */ - if ((n = bits % 8) != 0) { - if (ep - name < (int)(sizeof "255.")) - goto emsgsize; - m = SPRINTF((name, "%u.", - net[bits / 8] & ~((1 << (8 - n)) - 1))); - name += m; - } - - /* Format the whole bytes within the prefix. */ - for (n = bits / 8; n > 0; n--) { - if (ep - name < (int)(sizeof "255.")) - goto emsgsize; - m = SPRINTF((name, "%u.", net[n - 1])); - name += m; - } - - /* Add the static text. */ - if (ep - name < (int)(sizeof "in-addr.arpa")) - goto emsgsize; - (void) SPRINTF((name, "in-addr.arpa")); - return (0); - - emsgsize: - errno = EMSGSIZE; - return (-1); -} - -static void -normalize_name(char *name) { - char *t; - - /* Make lower case. */ - for (t = name; *t; t++) - if (isascii((unsigned char)*t) && isupper((unsigned char)*t)) - *t = tolower((*t)&0xff); - - /* Remove trailing dots. */ - while (t > name && t[-1] == '.') - *--t = '\0'; -} - -static int -init(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res && !nw_res_get(this)) - return (-1); - if (((pvt->res->options & RES_INIT) == 0U) && - res_ninit(pvt->res) == -1) - return (-1); - return (0); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/dns_p.h b/contrib/bind9/lib/bind/irs/dns_p.h deleted file mode 100644 index a19ff2d..0000000 --- a/contrib/bind9/lib/bind/irs/dns_p.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: dns_p.h,v 1.3.18.1 2005/04/27 05:00:55 sra Exp $ - */ - -#ifndef _DNS_P_H_INCLUDED -#define _DNS_P_H_INCLUDED - -#define maybe_ok(res, nm, ok) (((res)->options & RES_NOCHECKNAME) != 0U || \ - (ok)(nm) != 0) -#define maybe_hnok(res, hn) maybe_ok((res), (hn), res_hnok) -#define maybe_dnok(res, dn) maybe_ok((res), (dn), res_dnok) - -/*% - * Object state. - */ -struct dns_p { - void *hes_ctx; - struct __res_state *res; - void (*free_res) __P((void *)); -}; - -/* - * Methods. - */ - -extern struct irs_gr * irs_dns_gr __P((struct irs_acc *)); -extern struct irs_pw * irs_dns_pw __P((struct irs_acc *)); -extern struct irs_sv * irs_dns_sv __P((struct irs_acc *)); -extern struct irs_pr * irs_dns_pr __P((struct irs_acc *)); -extern struct irs_ho * irs_dns_ho __P((struct irs_acc *)); -extern struct irs_nw * irs_dns_nw __P((struct irs_acc *)); - -#endif /*_DNS_P_H_INCLUDED*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/dns_pr.c b/contrib/bind9/lib/bind/irs/dns_pr.c deleted file mode 100644 index 7582f85..0000000 --- a/contrib/bind9/lib/bind/irs/dns_pr.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: dns_pr.c,v 1.4.18.1 2005/04/27 05:00:55 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <stdio.h> -#include <string.h> -#include <netdb.h> -#include <ctype.h> -#include <stdlib.h> -#include <errno.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "hesiod.h" -#include "dns_p.h" - -/* Types. */ - -struct pvt { - struct dns_p * dns; - struct protoent proto; - char * prbuf; -}; - -/* Forward. */ - -static void pr_close(struct irs_pr *); -static struct protoent * pr_byname(struct irs_pr *, const char *); -static struct protoent * pr_bynumber(struct irs_pr *, int); -static struct protoent * pr_next(struct irs_pr *); -static void pr_rewind(struct irs_pr *); -static void pr_minimize(struct irs_pr *); -static struct __res_state * pr_res_get(struct irs_pr *); -static void pr_res_set(struct irs_pr *, - struct __res_state *, - void (*)(void *)); - -static struct protoent * parse_hes_list(struct irs_pr *, char **); - -/* Public. */ - -struct irs_pr * -irs_dns_pr(struct irs_acc *this) { - struct dns_p *dns = (struct dns_p *)this->private; - struct pvt *pvt; - struct irs_pr *pr; - - if (!dns->hes_ctx) { - errno = ENODEV; - return (NULL); - } - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - if (!(pr = memget(sizeof *pr))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(pr, 0x5e, sizeof *pr); - pvt->dns = dns; - pr->private = pvt; - pr->byname = pr_byname; - pr->bynumber = pr_bynumber; - pr->next = pr_next; - pr->rewind = pr_rewind; - pr->close = pr_close; - pr->minimize = pr_minimize; - pr->res_get = pr_res_get; - pr->res_set = pr_res_set; - return (pr); -} - -/* Methods. */ - -static void -pr_close(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->proto.p_aliases) - free(pvt->proto.p_aliases); - if (pvt->prbuf) - free(pvt->prbuf); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct protoent * -pr_byname(struct irs_pr *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - struct protoent *proto; - char **hes_list; - - if (!(hes_list = hesiod_resolve(dns->hes_ctx, name, "protocol"))) - return (NULL); - - proto = parse_hes_list(this, hes_list); - hesiod_free_list(dns->hes_ctx, hes_list); - return (proto); -} - -static struct protoent * -pr_bynumber(struct irs_pr *this, int num) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - struct protoent *proto; - char numstr[16]; - char **hes_list; - - sprintf(numstr, "%d", num); - if (!(hes_list = hesiod_resolve(dns->hes_ctx, numstr, "protonum"))) - return (NULL); - - proto = parse_hes_list(this, hes_list); - hesiod_free_list(dns->hes_ctx, hes_list); - return (proto); -} - -static struct protoent * -pr_next(struct irs_pr *this) { - UNUSED(this); - errno = ENODEV; - return (NULL); -} - -static void -pr_rewind(struct irs_pr *this) { - UNUSED(this); - /* NOOP */ -} - -static void -pr_minimize(struct irs_pr *this) { - UNUSED(this); - /* NOOP */ -} - -static struct __res_state * -pr_res_get(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - - return (__hesiod_res_get(dns->hes_ctx)); -} - -static void -pr_res_set(struct irs_pr *this, struct __res_state * res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - - __hesiod_res_set(dns->hes_ctx, res, free_res); -} - -/* Private. */ - -static struct protoent * -parse_hes_list(struct irs_pr *this, char **hes_list) { - struct pvt *pvt = (struct pvt *)this->private; - char *p, *cp, **cpp, **new; - int num = 0; - int max = 0; - - for (cpp = hes_list; *cpp; cpp++) { - cp = *cpp; - - /* Strip away comments, if any. */ - if ((p = strchr(cp, '#'))) - *p = 0; - - /* Skip blank lines. */ - p = cp; - while (*p && !isspace((unsigned char)*p)) - p++; - if (!*p) - continue; - - /* OK, we've got a live one. Let's parse it for real. */ - if (pvt->prbuf) - free(pvt->prbuf); - pvt->prbuf = strdup(cp); - - p = pvt->prbuf; - pvt->proto.p_name = p; - while (*p && !isspace((unsigned char)*p)) - p++; - if (!*p) - continue; - *p++ = '\0'; - - pvt->proto.p_proto = atoi(p); - while (*p && !isspace((unsigned char)*p)) - p++; - if (*p) - *p++ = '\0'; - - while (*p) { - if ((num + 1) >= max || !pvt->proto.p_aliases) { - max += 10; - new = realloc(pvt->proto.p_aliases, - max * sizeof(char *)); - if (!new) { - errno = ENOMEM; - goto cleanup; - } - pvt->proto.p_aliases = new; - } - pvt->proto.p_aliases[num++] = p; - while (*p && !isspace((unsigned char)*p)) - p++; - if (*p) - *p++ = '\0'; - } - if (!pvt->proto.p_aliases) - pvt->proto.p_aliases = malloc(sizeof(char *)); - if (!pvt->proto.p_aliases) - goto cleanup; - pvt->proto.p_aliases[num] = NULL; - return (&pvt->proto); - } - - cleanup: - if (pvt->proto.p_aliases) { - free(pvt->proto.p_aliases); - pvt->proto.p_aliases = NULL; - } - if (pvt->prbuf) { - free(pvt->prbuf); - pvt->prbuf = NULL; - } - return (NULL); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/dns_pw.c b/contrib/bind9/lib/bind/irs/dns_pw.c deleted file mode 100644 index 62c61d5..0000000 --- a/contrib/bind9/lib/bind/irs/dns_pw.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: dns_pw.c,v 1.2.18.1 2005/04/27 05:00:55 sra Exp $"; -#endif - -#include "port_before.h" - -#ifndef WANT_IRS_PW -static int __bind_irs_pw_unneeded; -#else - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <string.h> - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <isc/memcluster.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "hesiod.h" -#include "dns_p.h" - -/* Types. */ - -struct pvt { - struct dns_p * dns; - struct passwd passwd; - char * pwbuf; -}; - -/* Forward. */ - -static void pw_close(struct irs_pw *); -static struct passwd * pw_byname(struct irs_pw *, const char *); -static struct passwd * pw_byuid(struct irs_pw *, uid_t); -static struct passwd * pw_next(struct irs_pw *); -static void pw_rewind(struct irs_pw *); -static void pw_minimize(struct irs_pw *); -static struct __res_state * pw_res_get(struct irs_pw *); -static void pw_res_set(struct irs_pw *, - struct __res_state *, - void (*)(void *)); - -static struct passwd * getpwcommon(struct irs_pw *, const char *, - const char *); - -/* Public. */ - -struct irs_pw * -irs_dns_pw(struct irs_acc *this) { - struct dns_p *dns = (struct dns_p *)this->private; - struct irs_pw *pw; - struct pvt *pvt; - - if (!dns || !dns->hes_ctx) { - errno = ENODEV; - return (NULL); - } - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->dns = dns; - if (!(pw = memget(sizeof *pw))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(pw, 0x5e, sizeof *pw); - pw->private = pvt; - pw->close = pw_close; - pw->byname = pw_byname; - pw->byuid = pw_byuid; - pw->next = pw_next; - pw->rewind = pw_rewind; - pw->minimize = pw_minimize; - pw->res_get = pw_res_get; - pw->res_set = pw_res_set; - return (pw); -} - -/* Methods. */ - -static void -pw_close(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->pwbuf) - free(pvt->pwbuf); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct passwd * -pw_byname(struct irs_pw *this, const char *nam) { - return (getpwcommon(this, nam, "passwd")); -} - -static struct passwd * -pw_byuid(struct irs_pw *this, uid_t uid) { - char uidstr[16]; - - sprintf(uidstr, "%lu", (u_long)uid); - return (getpwcommon(this, uidstr, "uid")); -} - -static struct passwd * -pw_next(struct irs_pw *this) { - UNUSED(this); - errno = ENODEV; - return (NULL); -} - -static void -pw_rewind(struct irs_pw *this) { - UNUSED(this); - /* NOOP */ -} - -static void -pw_minimize(struct irs_pw *this) { - UNUSED(this); - /* NOOP */ -} - -static struct __res_state * -pw_res_get(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - - return (__hesiod_res_get(dns->hes_ctx)); -} - -static void -pw_res_set(struct irs_pw *this, struct __res_state * res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - - __hesiod_res_set(dns->hes_ctx, res, free_res); -} - -/* Private. */ - -static struct passwd * -getpwcommon(struct irs_pw *this, const char *arg, const char *type) { - struct pvt *pvt = (struct pvt *)this->private; - char **hes_list, *cp; - - if (!(hes_list = hesiod_resolve(pvt->dns->hes_ctx, arg, type))) - return (NULL); - if (!*hes_list) { - hesiod_free_list(pvt->dns->hes_ctx, hes_list); - errno = ENOENT; - return (NULL); - } - - memset(&pvt->passwd, 0, sizeof pvt->passwd); - if (pvt->pwbuf) - free(pvt->pwbuf); - pvt->pwbuf = strdup(*hes_list); - hesiod_free_list(pvt->dns->hes_ctx, hes_list); - - cp = pvt->pwbuf; - pvt->passwd.pw_name = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_passwd = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_uid = atoi(cp); - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_gid = atoi(cp); - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_gecos = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_dir = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_shell = cp; - return (&pvt->passwd); - - cleanup: - free(pvt->pwbuf); - pvt->pwbuf = NULL; - return (NULL); -} - -#endif /* WANT_IRS_PW */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/dns_sv.c b/contrib/bind9/lib/bind/irs/dns_sv.c deleted file mode 100644 index fcb25ac..0000000 --- a/contrib/bind9/lib/bind/irs/dns_sv.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: dns_sv.c,v 1.4.18.1 2005/04/27 05:00:55 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> - -#include <stdio.h> -#include <string.h> -#include <netdb.h> -#include <ctype.h> -#include <stdlib.h> -#include <errno.h> - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "hesiod.h" -#include "dns_p.h" - -/* Definitions */ - -struct pvt { - struct dns_p * dns; - struct servent serv; - char * svbuf; - struct __res_state * res; - void (*free_res)(void *); -}; - -/* Forward. */ - -static void sv_close(struct irs_sv *); -static struct servent * sv_byname(struct irs_sv *, - const char *, const char *); -static struct servent * sv_byport(struct irs_sv *, int, const char *); -static struct servent * sv_next(struct irs_sv *); -static void sv_rewind(struct irs_sv *); -static void sv_minimize(struct irs_sv *); -#ifdef SV_RES_SETGET -static struct __res_state * sv_res_get(struct irs_sv *); -static void sv_res_set(struct irs_sv *, - struct __res_state *, - void (*)(void *)); -#endif - -static struct servent * parse_hes_list(struct irs_sv *, - char **, const char *); - -/* Public */ - -struct irs_sv * -irs_dns_sv(struct irs_acc *this) { - struct dns_p *dns = (struct dns_p *)this->private; - struct irs_sv *sv; - struct pvt *pvt; - - if (!dns || !dns->hes_ctx) { - errno = ENODEV; - return (NULL); - } - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->dns = dns; - if (!(sv = memget(sizeof *sv))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(sv, 0x5e, sizeof *sv); - sv->private = pvt; - sv->byname = sv_byname; - sv->byport = sv_byport; - sv->next = sv_next; - sv->rewind = sv_rewind; - sv->close = sv_close; - sv->minimize = sv_minimize; -#ifdef SV_RES_SETGET - sv->res_get = sv_res_get; - sv->res_set = sv_res_set; -#else - sv->res_get = NULL; /*%< sv_res_get; */ - sv->res_set = NULL; /*%< sv_res_set; */ -#endif - return (sv); -} - -/* Methods */ - -static void -sv_close(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->serv.s_aliases) - free(pvt->serv.s_aliases); - if (pvt->svbuf) - free(pvt->svbuf); - - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct servent * -sv_byname(struct irs_sv *this, const char *name, const char *proto) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - struct servent *s; - char **hes_list; - - if (!(hes_list = hesiod_resolve(dns->hes_ctx, name, "service"))) - return (NULL); - - s = parse_hes_list(this, hes_list, proto); - hesiod_free_list(dns->hes_ctx, hes_list); - return (s); -} - -static struct servent * -sv_byport(struct irs_sv *this, int port, const char *proto) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - struct servent *s; - char portstr[16]; - char **hes_list; - - sprintf(portstr, "%d", ntohs(port)); - if (!(hes_list = hesiod_resolve(dns->hes_ctx, portstr, "port"))) - return (NULL); - - s = parse_hes_list(this, hes_list, proto); - hesiod_free_list(dns->hes_ctx, hes_list); - return (s); -} - -static struct servent * -sv_next(struct irs_sv *this) { - UNUSED(this); - errno = ENODEV; - return (NULL); -} - -static void -sv_rewind(struct irs_sv *this) { - UNUSED(this); - /* NOOP */ -} - -/* Private */ - -static struct servent * -parse_hes_list(struct irs_sv *this, char **hes_list, const char *proto) { - struct pvt *pvt = (struct pvt *)this->private; - char *p, *cp, **cpp, **new; - int proto_len; - int num = 0; - int max = 0; - - for (cpp = hes_list; *cpp; cpp++) { - cp = *cpp; - - /* Strip away comments, if any. */ - if ((p = strchr(cp, '#'))) - *p = 0; - - /* Check to make sure the protocol matches. */ - p = cp; - while (*p && !isspace((unsigned char)*p)) - p++; - if (!*p) - continue; - if (proto) { - proto_len = strlen(proto); - if (strncasecmp(++p, proto, proto_len) != 0) - continue; - if (p[proto_len] && !isspace(p[proto_len]&0xff)) - continue; - } - /* OK, we've got a live one. Let's parse it for real. */ - if (pvt->svbuf) - free(pvt->svbuf); - pvt->svbuf = strdup(cp); - - p = pvt->svbuf; - pvt->serv.s_name = p; - while (*p && !isspace(*p&0xff)) - p++; - if (!*p) - continue; - *p++ = '\0'; - - pvt->serv.s_proto = p; - while (*p && !isspace(*p&0xff)) - p++; - if (!*p) - continue; - *p++ = '\0'; - - pvt->serv.s_port = htons((u_short) atoi(p)); - while (*p && !isspace(*p&0xff)) - p++; - if (*p) - *p++ = '\0'; - - while (*p) { - if ((num + 1) >= max || !pvt->serv.s_aliases) { - max += 10; - new = realloc(pvt->serv.s_aliases, - max * sizeof(char *)); - if (!new) { - errno = ENOMEM; - goto cleanup; - } - pvt->serv.s_aliases = new; - } - pvt->serv.s_aliases[num++] = p; - while (*p && !isspace(*p&0xff)) - p++; - if (*p) - *p++ = '\0'; - } - if (!pvt->serv.s_aliases) - pvt->serv.s_aliases = malloc(sizeof(char *)); - if (!pvt->serv.s_aliases) - goto cleanup; - pvt->serv.s_aliases[num] = NULL; - return (&pvt->serv); - } - - cleanup: - if (pvt->serv.s_aliases) { - free(pvt->serv.s_aliases); - pvt->serv.s_aliases = NULL; - } - if (pvt->svbuf) { - free(pvt->svbuf); - pvt->svbuf = NULL; - } - return (NULL); -} - -static void -sv_minimize(struct irs_sv *this) { - UNUSED(this); - /* NOOP */ -} - -#ifdef SV_RES_SETGET -static struct __res_state * -sv_res_get(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - - return (__hesiod_res_get(dns->hes_ctx)); -} - -static void -sv_res_set(struct irs_sv *this, struct __res_state * res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct dns_p *dns = pvt->dns; - - __hesiod_res_set(dns->hes_ctx, res, free_res); -} -#endif - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gai_strerror.c b/contrib/bind9/lib/bind/irs/gai_strerror.c deleted file mode 100644 index 9ca1c4b..0000000 --- a/contrib/bind9/lib/bind/irs/gai_strerror.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 2001 by Internet Software Consortium. - * - * 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. - * - * 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 <port_before.h> -#include <netdb.h> -#include <port_after.h> - -#ifdef DO_PTHREADS -#include <pthread.h> -#include <stdlib.h> -#endif - -static const char *gai_errlist[] = { - "no error", - "address family not supported for name",/*%< EAI_ADDRFAMILY */ - "temporary failure", /*%< EAI_AGAIN */ - "invalid flags", /*%< EAI_BADFLAGS */ - "permanent failure", /*%< EAI_FAIL */ - "address family not supported", /*%< EAI_FAMILY */ - "memory failure", /*%< EAI_MEMORY */ - "no address", /*%< EAI_NODATA */ - "unknown name or service", /*%< EAI_NONAME */ - "service not supported for socktype", /*%< EAI_SERVICE */ - "socktype not supported", /*%< EAI_SOCKTYPE */ - "system failure", /*%< EAI_SYSTEM */ - "bad hints", /*%< EAI_BADHINTS */ - "bad protocol", /*%< EAI_PROTOCOL */ - "unknown error" /*%< Must be last. */ -}; - -static const int gai_nerr = (sizeof(gai_errlist)/sizeof(*gai_errlist)); - -#define EAI_BUFSIZE 128 - -const char * -gai_strerror(int ecode) { -#ifndef DO_PTHREADS - static char buf[EAI_BUFSIZE]; -#else /* DO_PTHREADS */ -#ifndef LIBBIND_MUTEX_INITIALIZER -#define LIBBIND_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER -#endif - static pthread_mutex_t lock = LIBBIND_MUTEX_INITIALIZER; - static pthread_key_t key; - static int once = 0; - char *buf; -#endif - - if (ecode >= 0 && ecode < (gai_nerr - 1)) - return (gai_errlist[ecode]); - -#ifdef DO_PTHREADS - if (!once) { - if (pthread_mutex_lock(&lock) != 0) - goto unknown; - if (!once) { - if (pthread_key_create(&key, free) != 0) { - (void)pthread_mutex_unlock(&lock); - goto unknown; - } - once = 1; - } - if (pthread_mutex_unlock(&lock) != 0) - goto unknown; - } - - buf = pthread_getspecific(key); - if (buf == NULL) { - buf = malloc(EAI_BUFSIZE); - if (buf == NULL) - goto unknown; - if (pthread_setspecific(key, buf) != 0) { - free(buf); - goto unknown; - } - } -#endif - /* - * XXX This really should be snprintf(buf, EAI_BUFSIZE, ...). - * It is safe until message catalogs are used. - */ - sprintf(buf, "%s: %d", gai_errlist[gai_nerr - 1], ecode); - return (buf); - -#ifdef DO_PTHREADS - unknown: - return ("unknown error"); -#endif -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gen.c b/contrib/bind9/lib/bind/irs/gen.c deleted file mode 100644 index 8e9146e..0000000 --- a/contrib/bind9/lib/bind/irs/gen.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: gen.c,v 1.5.18.2 2005/04/27 05:00:56 sra Exp $"; -#endif - -/*! \file - * \brief - * this is the top level dispatcher - * - * The dispatcher is implemented as an accessor class; it is an - * accessor class that calls other accessor classes, as controlled by a - * configuration file. - * - * A big difference between this accessor class and others is that the - * map class initializers are NULL, and the map classes are already - * filled in with method functions that will do the right thing. - */ - -/* Imports */ - -#include "port_before.h" - -#include <isc/assertions.h> -#include <ctype.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "gen_p.h" - -/* Definitions */ - -struct nameval { - const char * name; - int val; -}; - -static const struct nameval acc_names[irs_nacc+1] = { - { "local", irs_lcl }, - { "dns", irs_dns }, - { "nis", irs_nis }, - { "irp", irs_irp }, - { NULL, irs_nacc } -}; - -typedef struct irs_acc *(*accinit) __P((const char *options)); - -static const accinit accs[irs_nacc+1] = { - irs_lcl_acc, - irs_dns_acc, -#ifdef WANT_IRS_NIS - irs_nis_acc, -#else - NULL, -#endif - irs_irp_acc, - NULL -}; - -static const struct nameval map_names[irs_nmap+1] = { - { "group", irs_gr }, - { "passwd", irs_pw }, - { "services", irs_sv }, - { "protocols", irs_pr }, - { "hosts", irs_ho }, - { "networks", irs_nw }, - { "netgroup", irs_ng }, - { NULL, irs_nmap } -}; - -static const struct nameval option_names[] = { - { "merge", IRS_MERGE }, - { "continue", IRS_CONTINUE }, - { NULL, 0 } -}; - -/* Forward */ - -static void gen_close(struct irs_acc *); -static struct __res_state * gen_res_get(struct irs_acc *); -static void gen_res_set(struct irs_acc *, struct __res_state *, - void (*)(void *)); -static int find_name(const char *, const struct nameval nv[]); -static void init_map_rules(struct gen_p *, const char *conf_file); -static struct irs_rule *release_rule(struct irs_rule *); -static int add_rule(struct gen_p *, - enum irs_map_id, enum irs_acc_id, - const char *); - -/* Public */ - -struct irs_acc * -irs_gen_acc(const char *options, const char *conf_file) { - struct irs_acc *acc; - struct gen_p *irs; - - if (!(acc = memget(sizeof *acc))) { - errno = ENOMEM; - return (NULL); - } - memset(acc, 0x5e, sizeof *acc); - if (!(irs = memget(sizeof *irs))) { - errno = ENOMEM; - memput(acc, sizeof *acc); - return (NULL); - } - memset(irs, 0x5e, sizeof *irs); - irs->options = strdup(options); - irs->res = NULL; - irs->free_res = NULL; - memset(irs->accessors, 0, sizeof irs->accessors); - memset(irs->map_rules, 0, sizeof irs->map_rules); - init_map_rules(irs, conf_file); - acc->private = irs; -#ifdef WANT_IRS_GR - acc->gr_map = irs_gen_gr; -#else - acc->gr_map = NULL; -#endif -#ifdef WANT_IRS_PW - acc->pw_map = irs_gen_pw; -#else - acc->pw_map = NULL; -#endif - acc->sv_map = irs_gen_sv; - acc->pr_map = irs_gen_pr; - acc->ho_map = irs_gen_ho; - acc->nw_map = irs_gen_nw; - acc->ng_map = irs_gen_ng; - acc->res_get = gen_res_get; - acc->res_set = gen_res_set; - acc->close = gen_close; - return (acc); -} - -/* Methods */ - -static struct __res_state * -gen_res_get(struct irs_acc *this) { - struct gen_p *irs = (struct gen_p *)this->private; - - if (irs->res == NULL) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (res == NULL) - return (NULL); - memset(res, 0, sizeof *res); - gen_res_set(this, res, free); - } - - if (((irs->res->options & RES_INIT) == 0U) && res_ninit(irs->res) < 0) - return (NULL); - - return (irs->res); -} - -static void -gen_res_set(struct irs_acc *this, struct __res_state *res, - void (*free_res)(void *)) { - struct gen_p *irs = (struct gen_p *)this->private; -#if 0 - struct irs_rule *rule; - struct irs_ho *ho; - struct irs_nw *nw; -#endif - - if (irs->res && irs->free_res) { - res_nclose(irs->res); - (*irs->free_res)(irs->res); - } - - irs->res = res; - irs->free_res = free_res; - -#if 0 - for (rule = irs->map_rules[irs_ho]; rule; rule = rule->next) { - ho = rule->inst->ho; - - (*ho->res_set)(ho, res, NULL); - } - for (rule = irs->map_rules[irs_nw]; rule; rule = rule->next) { - nw = rule->inst->nw; - - (*nw->res_set)(nw, res, NULL); - } -#endif -} - -static void -gen_close(struct irs_acc *this) { - struct gen_p *irs = (struct gen_p *)this->private; - int n; - - /* Search rules. */ - for (n = 0; n < irs_nmap; n++) - while (irs->map_rules[n] != NULL) - irs->map_rules[n] = release_rule(irs->map_rules[n]); - - /* Access methods. */ - for (n = 0; n < irs_nacc; n++) { - /* Map objects. */ - if (irs->accessors[n].gr != NULL) - (*irs->accessors[n].gr->close)(irs->accessors[n].gr); - if (irs->accessors[n].pw != NULL) - (*irs->accessors[n].pw->close)(irs->accessors[n].pw); - if (irs->accessors[n].sv != NULL) - (*irs->accessors[n].sv->close)(irs->accessors[n].sv); - if (irs->accessors[n].pr != NULL) - (*irs->accessors[n].pr->close)(irs->accessors[n].pr); - if (irs->accessors[n].ho != NULL) - (*irs->accessors[n].ho->close)(irs->accessors[n].ho); - if (irs->accessors[n].nw != NULL) - (*irs->accessors[n].nw->close)(irs->accessors[n].nw); - if (irs->accessors[n].ng != NULL) - (*irs->accessors[n].ng->close)(irs->accessors[n].ng); - /* Enclosing accessor. */ - if (irs->accessors[n].acc != NULL) - (*irs->accessors[n].acc->close)(irs->accessors[n].acc); - } - - /* The options string was strdup'd. */ - free((void*)irs->options); - - if (irs->res && irs->free_res) - (*irs->free_res)(irs->res); - - /* The private data container. */ - memput(irs, sizeof *irs); - - /* The object. */ - memput(this, sizeof *this); -} - -/* Private */ - -static int -find_name(const char *name, const struct nameval names[]) { - int n; - - for (n = 0; names[n].name != NULL; n++) - if (strcmp(name, names[n].name) == 0) - return (names[n].val); - return (-1); -} - -static struct irs_rule * -release_rule(struct irs_rule *rule) { - struct irs_rule *next = rule->next; - - memput(rule, sizeof *rule); - return (next); -} - -static int -add_rule(struct gen_p *irs, - enum irs_map_id map, enum irs_acc_id acc, - const char *options) -{ - struct irs_rule **rules, *last, *tmp, *new; - struct irs_inst *inst; - const char *cp; - int n; - -#ifndef WANT_IRS_GR - if (map == irs_gr) - return (-1); -#endif -#ifndef WANT_IRS_PW - if (map == irs_pw) - return (-1); -#endif -#ifndef WANT_IRS_NIS - if (acc == irs_nis) - return (-1); -#endif - new = memget(sizeof *new); - if (new == NULL) - return (-1); - memset(new, 0x5e, sizeof *new); - new->next = NULL; - - new->inst = &irs->accessors[acc]; - - new->flags = 0; - cp = options; - while (cp && *cp) { - char option[50], *next; - - next = strchr(cp, ','); - if (next) - n = next++ - cp; - else - n = strlen(cp); - if ((size_t)n > sizeof option - 1) - n = sizeof option - 1; - strncpy(option, cp, n); - option[n] = '\0'; - - n = find_name(option, option_names); - if (n >= 0) - new->flags |= n; - - cp = next; - } - - rules = &irs->map_rules[map]; - for (last = NULL, tmp = *rules; - tmp != NULL; - last = tmp, tmp = tmp->next) - (void)NULL; - if (last == NULL) - *rules = new; - else - last->next = new; - - /* Try to instantiate map accessors for this if necessary & approp. */ - inst = &irs->accessors[acc]; - if (inst->acc == NULL && accs[acc] != NULL) - inst->acc = (*accs[acc])(irs->options); - if (inst->acc != NULL) { - if (inst->gr == NULL && inst->acc->gr_map != NULL) - inst->gr = (*inst->acc->gr_map)(inst->acc); - if (inst->pw == NULL && inst->acc->pw_map != NULL) - inst->pw = (*inst->acc->pw_map)(inst->acc); - if (inst->sv == NULL && inst->acc->sv_map != NULL) - inst->sv = (*inst->acc->sv_map)(inst->acc); - if (inst->pr == NULL && inst->acc->pr_map != NULL) - inst->pr = (*inst->acc->pr_map)(inst->acc); - if (inst->ho == NULL && inst->acc->ho_map != NULL) - inst->ho = (*inst->acc->ho_map)(inst->acc); - if (inst->nw == NULL && inst->acc->nw_map != NULL) - inst->nw = (*inst->acc->nw_map)(inst->acc); - if (inst->ng == NULL && inst->acc->ng_map != NULL) - inst->ng = (*inst->acc->ng_map)(inst->acc); - } - - return (0); -} - -static void -default_map_rules(struct gen_p *irs) { - /* Install time honoured and proved BSD style rules as default. */ - add_rule(irs, irs_gr, irs_lcl, ""); - add_rule(irs, irs_pw, irs_lcl, ""); - add_rule(irs, irs_sv, irs_lcl, ""); - add_rule(irs, irs_pr, irs_lcl, ""); - add_rule(irs, irs_ho, irs_dns, "continue"); - add_rule(irs, irs_ho, irs_lcl, ""); - add_rule(irs, irs_nw, irs_dns, "continue"); - add_rule(irs, irs_nw, irs_lcl, ""); - add_rule(irs, irs_ng, irs_lcl, ""); -} - -static void -init_map_rules(struct gen_p *irs, const char *conf_file) { - char line[1024], pattern[40], mapname[20], accname[20], options[100]; - FILE *conf; - - if (conf_file == NULL) - conf_file = _PATH_IRS_CONF ; - - /* A conf file of "" means compiled in defaults. Irpd wants this */ - if (conf_file[0] == '\0' || (conf = fopen(conf_file, "r")) == NULL) { - default_map_rules(irs); - return; - } - (void) sprintf(pattern, "%%%lus %%%lus %%%lus\n", - (unsigned long)sizeof mapname, - (unsigned long)sizeof accname, - (unsigned long)sizeof options); - while (fgets(line, sizeof line, conf)) { - enum irs_map_id map; - enum irs_acc_id acc; - char *tmp; - int n; - - for (tmp = line; - isascii((unsigned char)*tmp) && - isspace((unsigned char)*tmp); - tmp++) - (void)NULL; - if (*tmp == '#' || *tmp == '\n' || *tmp == '\0') - continue; - n = sscanf(tmp, pattern, mapname, accname, options); - if (n < 2) - continue; - if (n < 3) - options[0] = '\0'; - - n = find_name(mapname, map_names); - INSIST(n < irs_nmap); - if (n < 0) - continue; - map = (enum irs_map_id) n; - - n = find_name(accname, acc_names); - INSIST(n < irs_nacc); - if (n < 0) - continue; - acc = (enum irs_acc_id) n; - - add_rule(irs, map, acc, options); - } - fclose(conf); -} diff --git a/contrib/bind9/lib/bind/irs/gen_gr.c b/contrib/bind9/lib/bind/irs/gen_gr.c deleted file mode 100644 index 0829ed8..0000000 --- a/contrib/bind9/lib/bind/irs/gen_gr.c +++ /dev/null @@ -1,493 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: gen_gr.c,v 1.6.18.2 2005/04/27 05:00:56 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#ifndef WANT_IRS_GR -static int __bind_irs_gr_unneeded; -#else - -#include <sys/types.h> - -#include <isc/assertions.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "gen_p.h" - -/* Definitions */ - -struct pvt { - struct irs_rule * rules; - struct irs_rule * rule; - struct irs_gr * gr; - /* - * Need space to store the entries read from the group file. - * The members list also needs space per member, and the - * strings making up the user names must be allocated - * somewhere. Rather than doing lots of small allocations, - * we keep one buffer and resize it as needed. - */ - struct group group; - size_t nmemb; /*%< Malloc'd max index of gr_mem[]. */ - char * membuf; - size_t membufsize; - struct __res_state * res; - void (*free_res)(void *); -}; - -/* Forward */ - -static void gr_close(struct irs_gr *); -static struct group * gr_next(struct irs_gr *); -static struct group * gr_byname(struct irs_gr *, const char *); -static struct group * gr_bygid(struct irs_gr *, gid_t); -static void gr_rewind(struct irs_gr *); -static int gr_list(struct irs_gr *, const char *, - gid_t, gid_t *, int *); -static void gr_minimize(struct irs_gr *); -static struct __res_state * gr_res_get(struct irs_gr *); -static void gr_res_set(struct irs_gr *, - struct __res_state *, - void (*)(void *)); - -static int grmerge(struct irs_gr *gr, const struct group *src, - int preserve); - -static int countvec(char **vec); -static int isnew(char **old, char *new); -static int countnew(char **old, char **new); -static size_t sizenew(char **old, char **new); -static int newgid(int, gid_t *, gid_t); - -/* Macros */ - -#define FREE_IF(x) do { if ((x) != NULL) { free(x); (x) = NULL; } } while (0) - -/* Public */ - -struct irs_gr * -irs_gen_gr(struct irs_acc *this) { - struct gen_p *accpvt = (struct gen_p *)this->private; - struct irs_gr *gr; - struct pvt *pvt; - - if (!(gr = memget(sizeof *gr))) { - errno = ENOMEM; - return (NULL); - } - memset(gr, 0x5e, sizeof *gr); - if (!(pvt = memget(sizeof *pvt))) { - memput(gr, sizeof *gr); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->rules = accpvt->map_rules[irs_gr]; - pvt->rule = pvt->rules; - gr->private = pvt; - gr->close = gr_close; - gr->next = gr_next; - gr->byname = gr_byname; - gr->bygid = gr_bygid; - gr->rewind = gr_rewind; - gr->list = gr_list; - gr->minimize = gr_minimize; - gr->res_get = gr_res_get; - gr->res_set = gr_res_set; - return (gr); -} - -/* Methods. */ - -static void -gr_close(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct group * -gr_next(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct group *rval; - struct irs_gr *gr; - - while (pvt->rule) { - gr = pvt->rule->inst->gr; - rval = (*gr->next)(gr); - if (rval) - return (rval); - if (!(pvt->rule->flags & IRS_CONTINUE)) - break; - pvt->rule = pvt->rule->next; - if (pvt->rule) { - gr = pvt->rule->inst->gr; - (*gr->rewind)(gr); - } - } - return (NULL); -} - -static struct group * -gr_byname(struct irs_gr *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct group *tval; - struct irs_gr *gr; - int dirty; - - dirty = 0; - for (rule = pvt->rules; rule; rule = rule->next) { - gr = rule->inst->gr; - tval = (*gr->byname)(gr, name); - if (tval) { - if (!grmerge(this, tval, dirty++)) - return (NULL); - if (!(rule->flags & IRS_MERGE)) - break; - } else { - if (!(rule->flags & IRS_CONTINUE)) - break; - } - } - if (dirty) - return (&pvt->group); - return (NULL); -} - -static struct group * -gr_bygid(struct irs_gr *this, gid_t gid) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct group *tval; - struct irs_gr *gr; - int dirty; - - dirty = 0; - for (rule = pvt->rules; rule; rule = rule->next) { - gr = rule->inst->gr; - tval = (*gr->bygid)(gr, gid); - if (tval) { - if (!grmerge(this, tval, dirty++)) - return (NULL); - if (!(rule->flags & IRS_MERGE)) - break; - } else { - if (!(rule->flags & IRS_CONTINUE)) - break; - } - } - if (dirty) - return (&pvt->group); - return (NULL); -} - -static void -gr_rewind(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_gr *gr; - - pvt->rule = pvt->rules; - if (pvt->rule) { - gr = pvt->rule->inst->gr; - (*gr->rewind)(gr); - } -} - -static int -gr_list(struct irs_gr *this, const char *name, - gid_t basegid, gid_t *groups, int *ngroups) -{ - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct irs_gr *gr; - int t_ngroups, maxgroups; - gid_t *t_groups; - int n, t, rval = 0; - - maxgroups = *ngroups; - *ngroups = 0; - t_groups = (gid_t *)malloc(maxgroups * sizeof(gid_t)); - if (!t_groups) { - errno = ENOMEM; - return (-1); - } - - for (rule = pvt->rules; rule; rule = rule->next) { - t_ngroups = maxgroups; - gr = rule->inst->gr; - t = (*gr->list)(gr, name, basegid, t_groups, &t_ngroups); - for (n = 0; n < t_ngroups; n++) { - if (newgid(*ngroups, groups, t_groups[n])) { - if (*ngroups == maxgroups) { - rval = -1; - goto done; - } - groups[(*ngroups)++] = t_groups[n]; - } - } - if (t == 0) { - if (!(rule->flags & IRS_MERGE)) - break; - } else { - if (!(rule->flags & IRS_CONTINUE)) - break; - } - } - done: - free(t_groups); - return (rval); -} - -static void -gr_minimize(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_gr *gr = rule->inst->gr; - - (*gr->minimize)(gr); - } -} - -static struct __res_state * -gr_res_get(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - gr_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -gr_res_set(struct irs_gr *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_gr *gr = rule->inst->gr; - - if (gr->res_set) - (*gr->res_set)(gr, pvt->res, NULL); - } -} - -/* Private. */ - -static int -grmerge(struct irs_gr *this, const struct group *src, int preserve) { - struct pvt *pvt = (struct pvt *)this->private; - char *cp, **m, **p, *oldmembuf, *ep; - int n, ndst, nnew; - size_t used; - - if (!preserve) { - pvt->group.gr_gid = src->gr_gid; - if (pvt->nmemb < 1) { - m = malloc(sizeof *m); - if (m == NULL) { - /* No harm done, no work done. */ - return (0); - } - pvt->group.gr_mem = m; - pvt->nmemb = 1; - } - pvt->group.gr_mem[0] = NULL; - } - ndst = countvec(pvt->group.gr_mem); - nnew = countnew(pvt->group.gr_mem, src->gr_mem); - - /* - * Make sure destination member array is large enough. - * p points to new portion. - */ - n = ndst + nnew + 1; - if ((size_t)n > pvt->nmemb) { - m = realloc(pvt->group.gr_mem, n * sizeof *m); - if (m == NULL) { - /* No harm done, no work done. */ - return (0); - } - pvt->group.gr_mem = m; - pvt->nmemb = n; - } - p = pvt->group.gr_mem + ndst; - - /* - * Enlarge destination membuf; cp points at new portion. - */ - n = sizenew(pvt->group.gr_mem, src->gr_mem); - INSIST((nnew == 0) == (n == 0)); - if (!preserve) { - n += strlen(src->gr_name) + 1; - n += strlen(src->gr_passwd) + 1; - } - if (n == 0) { - /* No work to do. */ - return (1); - } - used = preserve ? pvt->membufsize : 0; - cp = malloc(used + n); - if (cp == NULL) { - /* No harm done, no work done. */ - return (0); - } - ep = cp + used + n; - if (used != 0) - memcpy(cp, pvt->membuf, used); - oldmembuf = pvt->membuf; - pvt->membuf = cp; - pvt->membufsize = used + n; - cp += used; - - /* - * Adjust group.gr_mem. - */ - if (pvt->membuf != oldmembuf) - for (m = pvt->group.gr_mem; *m; m++) - *m = pvt->membuf + (*m - oldmembuf); - - /* - * Add new elements. - */ - for (m = src->gr_mem; *m; m++) - if (isnew(pvt->group.gr_mem, *m)) { - *p++ = cp; - *p = NULL; - n = strlen(*m) + 1; - if (n > ep - cp) { - FREE_IF(oldmembuf); - return (0); - } - strcpy(cp, *m); /* (checked) */ - cp += n; - } - if (preserve) { - pvt->group.gr_name = pvt->membuf + - (pvt->group.gr_name - oldmembuf); - pvt->group.gr_passwd = pvt->membuf + - (pvt->group.gr_passwd - oldmembuf); - } else { - pvt->group.gr_name = cp; - n = strlen(src->gr_name) + 1; - if (n > ep - cp) { - FREE_IF(oldmembuf); - return (0); - } - strcpy(cp, src->gr_name); /* (checked) */ - cp += n; - - pvt->group.gr_passwd = cp; - n = strlen(src->gr_passwd) + 1; - if (n > ep - cp) { - FREE_IF(oldmembuf); - return (0); - } - strcpy(cp, src->gr_passwd); /* (checked) */ - cp += n; - } - FREE_IF(oldmembuf); - INSIST(cp >= pvt->membuf && cp <= &pvt->membuf[pvt->membufsize]); - return (1); -} - -static int -countvec(char **vec) { - int n = 0; - - while (*vec++) - n++; - return (n); -} - -static int -isnew(char **old, char *new) { - for (; *old; old++) - if (strcmp(*old, new) == 0) - return (0); - return (1); -} - -static int -countnew(char **old, char **new) { - int n = 0; - - for (; *new; new++) - n += isnew(old, *new); - return (n); -} - -static size_t -sizenew(char **old, char **new) { - size_t n = 0; - - for (; *new; new++) - if (isnew(old, *new)) - n += strlen(*new) + 1; - return (n); -} - -static int -newgid(int ngroups, gid_t *groups, gid_t group) { - ngroups--, groups++; - for (; ngroups-- > 0; groups++) - if (*groups == group) - return (0); - return (1); -} - -#endif /* WANT_IRS_GR */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gen_ho.c b/contrib/bind9/lib/bind/irs/gen_ho.c deleted file mode 100644 index c5e09da..0000000 --- a/contrib/bind9/lib/bind/irs/gen_ho.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: gen_ho.c,v 1.3.18.2 2006/03/10 00:20:08 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <stdlib.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "gen_p.h" - -/* Definitions */ - -struct pvt { - struct irs_rule * rules; - struct irs_rule * rule; - struct irs_ho * ho; - struct __res_state * res; - void (*free_res)(void *); -}; - -/* Forwards */ - -static void ho_close(struct irs_ho *this); -static struct hostent * ho_byname(struct irs_ho *this, const char *name); -static struct hostent * ho_byname2(struct irs_ho *this, const char *name, - int af); -static struct hostent * ho_byaddr(struct irs_ho *this, const void *addr, - int len, int af); -static struct hostent * ho_next(struct irs_ho *this); -static void ho_rewind(struct irs_ho *this); -static void ho_minimize(struct irs_ho *this); -static struct __res_state * ho_res_get(struct irs_ho *this); -static void ho_res_set(struct irs_ho *this, - struct __res_state *res, - void (*free_res)(void *)); -static struct addrinfo * ho_addrinfo(struct irs_ho *this, const char *name, - const struct addrinfo *pai); - -static int init(struct irs_ho *this); - -/* Exports */ - -struct irs_ho * -irs_gen_ho(struct irs_acc *this) { - struct gen_p *accpvt = (struct gen_p *)this->private; - struct irs_ho *ho; - struct pvt *pvt; - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - if (!(ho = memget(sizeof *ho))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(ho, 0x5e, sizeof *ho); - pvt->rules = accpvt->map_rules[irs_ho]; - pvt->rule = pvt->rules; - ho->private = pvt; - ho->close = ho_close; - ho->byname = ho_byname; - ho->byname2 = ho_byname2; - ho->byaddr = ho_byaddr; - ho->next = ho_next; - ho->rewind = ho_rewind; - ho->minimize = ho_minimize; - ho->res_get = ho_res_get; - ho->res_set = ho_res_set; - ho->addrinfo = ho_addrinfo; - return (ho); -} - -/* Methods. */ - -static void -ho_close(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - ho_minimize(this); - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct hostent * -ho_byname(struct irs_ho *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct hostent *rval; - struct irs_ho *ho; - int therrno = NETDB_INTERNAL; - int softerror = 0; - - if (init(this) == -1) - return (NULL); - - for (rule = pvt->rules; rule; rule = rule->next) { - ho = rule->inst->ho; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = 0; - rval = (*ho->byname)(ho, name); - if (rval != NULL) - return (rval); - if (softerror == 0 && - pvt->res->res_h_errno != HOST_NOT_FOUND && - pvt->res->res_h_errno != NETDB_INTERNAL) { - softerror = 1; - therrno = pvt->res->res_h_errno; - } - if (rule->flags & IRS_CONTINUE) - continue; - /* - * The value TRY_AGAIN can mean that the service - * is not available, or just that this particular name - * cannot be resolved now. We use the errno ECONNREFUSED - * to distinguish. If a lookup sets that errno when - * H_ERRNO is TRY_AGAIN, we continue to try other lookup - * functions, otherwise we return the TRY_AGAIN error. - */ - if (pvt->res->res_h_errno != TRY_AGAIN || errno != ECONNREFUSED) - break; - } - if (softerror != 0 && pvt->res->res_h_errno == HOST_NOT_FOUND) - RES_SET_H_ERRNO(pvt->res, therrno); - return (NULL); -} - -static struct hostent * -ho_byname2(struct irs_ho *this, const char *name, int af) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct hostent *rval; - struct irs_ho *ho; - int therrno = NETDB_INTERNAL; - int softerror = 0; - - if (init(this) == -1) - return (NULL); - - for (rule = pvt->rules; rule; rule = rule->next) { - ho = rule->inst->ho; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = 0; - rval = (*ho->byname2)(ho, name, af); - if (rval != NULL) - return (rval); - if (softerror == 0 && - pvt->res->res_h_errno != HOST_NOT_FOUND && - pvt->res->res_h_errno != NETDB_INTERNAL) { - softerror = 1; - therrno = pvt->res->res_h_errno; - } - if (rule->flags & IRS_CONTINUE) - continue; - /* - * See the comments in ho_byname() explaining - * the interpretation of TRY_AGAIN and ECONNREFUSED. - */ - if (pvt->res->res_h_errno != TRY_AGAIN || errno != ECONNREFUSED) - break; - } - if (softerror != 0 && pvt->res->res_h_errno == HOST_NOT_FOUND) - RES_SET_H_ERRNO(pvt->res, therrno); - return (NULL); -} - -static struct hostent * -ho_byaddr(struct irs_ho *this, const void *addr, int len, int af) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct hostent *rval; - struct irs_ho *ho; - int therrno = NETDB_INTERNAL; - int softerror = 0; - - - if (init(this) == -1) - return (NULL); - - for (rule = pvt->rules; rule; rule = rule->next) { - ho = rule->inst->ho; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = 0; - rval = (*ho->byaddr)(ho, addr, len, af); - if (rval != NULL) - return (rval); - if (softerror == 0 && - pvt->res->res_h_errno != HOST_NOT_FOUND && - pvt->res->res_h_errno != NETDB_INTERNAL) { - softerror = 1; - therrno = pvt->res->res_h_errno; - } - - if (rule->flags & IRS_CONTINUE) - continue; - /* - * See the comments in ho_byname() explaining - * the interpretation of TRY_AGAIN and ECONNREFUSED. - */ - if (pvt->res->res_h_errno != TRY_AGAIN || errno != ECONNREFUSED) - break; - } - if (softerror != 0 && pvt->res->res_h_errno == HOST_NOT_FOUND) - RES_SET_H_ERRNO(pvt->res, therrno); - return (NULL); -} - -static struct hostent * -ho_next(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *rval; - struct irs_ho *ho; - - while (pvt->rule) { - ho = pvt->rule->inst->ho; - rval = (*ho->next)(ho); - if (rval) - return (rval); - if (!(pvt->rule->flags & IRS_CONTINUE)) - break; - pvt->rule = pvt->rule->next; - if (pvt->rule) { - ho = pvt->rule->inst->ho; - (*ho->rewind)(ho); - } - } - return (NULL); -} - -static void -ho_rewind(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_ho *ho; - - pvt->rule = pvt->rules; - if (pvt->rule) { - ho = pvt->rule->inst->ho; - (*ho->rewind)(ho); - } -} - -static void -ho_minimize(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - if (pvt->res) - res_nclose(pvt->res); - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_ho *ho = rule->inst->ho; - - (*ho->minimize)(ho); - } -} - -static struct __res_state * -ho_res_get(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - ho_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -ho_res_set(struct irs_ho *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_ho *ho = rule->inst->ho; - - (*ho->res_set)(ho, pvt->res, NULL); - } -} - -static struct addrinfo * -ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai) -{ - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct addrinfo *rval = NULL; - struct irs_ho *ho; - int therrno = NETDB_INTERNAL; - int softerror = 0; - - if (init(this) == -1) - return (NULL); - - for (rule = pvt->rules; rule; rule = rule->next) { - ho = rule->inst->ho; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = 0; - if (ho->addrinfo == NULL) /*%< for safety */ - continue; - rval = (*ho->addrinfo)(ho, name, pai); - if (rval != NULL) - return (rval); - if (softerror == 0 && - pvt->res->res_h_errno != HOST_NOT_FOUND && - pvt->res->res_h_errno != NETDB_INTERNAL) { - softerror = 1; - therrno = pvt->res->res_h_errno; - } - if (rule->flags & IRS_CONTINUE) - continue; - /* - * See the comments in ho_byname() explaining - * the interpretation of TRY_AGAIN and ECONNREFUSED. - */ - if (pvt->res->res_h_errno != TRY_AGAIN || - errno != ECONNREFUSED) - break; - } - if (softerror != 0 && pvt->res->res_h_errno == HOST_NOT_FOUND) - RES_SET_H_ERRNO(pvt->res, therrno); - return (NULL); -} - -static int -init(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res && !ho_res_get(this)) - return (-1); - - if (((pvt->res->options & RES_INIT) == 0U) && - (res_ninit(pvt->res) == -1)) - return (-1); - - return (0); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gen_ng.c b/contrib/bind9/lib/bind/irs/gen_ng.c deleted file mode 100644 index 67f4edd..0000000 --- a/contrib/bind9/lib/bind/irs/gen_ng.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: gen_ng.c,v 1.2.18.1 2005/04/27 05:00:56 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <errno.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "gen_p.h" - -/* Types */ - -struct pvt { - struct irs_rule * rules; - struct irs_rule * rule; - char * curgroup; -}; - -/* Forward */ - -static void ng_close(struct irs_ng *); -static int ng_next(struct irs_ng *, const char **, - const char **, const char **); -static int ng_test(struct irs_ng *, const char *, - const char *, const char *, - const char *); -static void ng_rewind(struct irs_ng *, const char *); -static void ng_minimize(struct irs_ng *); - -/* Public */ - -struct irs_ng * -irs_gen_ng(struct irs_acc *this) { - struct gen_p *accpvt = (struct gen_p *)this->private; - struct irs_ng *ng; - struct pvt *pvt; - - if (!(ng = memget(sizeof *ng))) { - errno = ENOMEM; - return (NULL); - } - memset(ng, 0x5e, sizeof *ng); - if (!(pvt = memget(sizeof *pvt))) { - memput(ng, sizeof *ng); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->rules = accpvt->map_rules[irs_ng]; - pvt->rule = pvt->rules; - ng->private = pvt; - ng->close = ng_close; - ng->next = ng_next; - ng->test = ng_test; - ng->rewind = ng_rewind; - ng->minimize = ng_minimize; - return (ng); -} - -/* Methods */ - -static void -ng_close(struct irs_ng *this) { - struct pvt *pvt = (struct pvt *)this->private; - - ng_minimize(this); - if (pvt->curgroup) - free(pvt->curgroup); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static int -ng_next(struct irs_ng *this, const char **host, const char **user, - const char **domain) -{ - struct pvt *pvt = (struct pvt *)this->private; - struct irs_ng *ng; - - while (pvt->rule) { - ng = pvt->rule->inst->ng; - if ((*ng->next)(ng, host, user, domain) == 1) - return (1); - if (!(pvt->rule->flags & IRS_CONTINUE)) - break; - pvt->rule = pvt->rule->next; - if (pvt->rule) { - ng = pvt->rule->inst->ng; - (*ng->rewind)(ng, pvt->curgroup); - } - } - return (0); -} - -static int -ng_test(struct irs_ng *this, const char *name, - const char *user, const char *host, const char *domain) -{ - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct irs_ng *ng; - int rval; - - rval = 0; - for (rule = pvt->rules; rule; rule = rule->next) { - ng = rule->inst->ng; - rval = (*ng->test)(ng, name, user, host, domain); - if (rval || !(rule->flags & IRS_CONTINUE)) - break; - } - return (rval); -} - -static void -ng_rewind(struct irs_ng *this, const char *group) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_ng *ng; - - pvt->rule = pvt->rules; - if (pvt->rule) { - if (pvt->curgroup) - free(pvt->curgroup); - pvt->curgroup = strdup(group); - ng = pvt->rule->inst->ng; - (*ng->rewind)(ng, pvt->curgroup); - } -} - -static void -ng_minimize(struct irs_ng *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_ng *ng = rule->inst->ng; - - (*ng->minimize)(ng); - } -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gen_nw.c b/contrib/bind9/lib/bind/irs/gen_nw.c deleted file mode 100644 index 8452f3f..0000000 --- a/contrib/bind9/lib/bind/irs/gen_nw.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: gen_nw.c,v 1.3.18.1 2005/04/27 05:00:56 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <resolv.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "gen_p.h" - -/* Types */ - -struct pvt { - struct irs_rule * rules; - struct irs_rule * rule; - struct __res_state * res; - void (*free_res)(void *); -}; - -/* Forward */ - -static void nw_close(struct irs_nw*); -static struct nwent * nw_next(struct irs_nw *); -static struct nwent * nw_byname(struct irs_nw *, const char *, int); -static struct nwent * nw_byaddr(struct irs_nw *, void *, int, int); -static void nw_rewind(struct irs_nw *); -static void nw_minimize(struct irs_nw *); -static struct __res_state * nw_res_get(struct irs_nw *this); -static void nw_res_set(struct irs_nw *this, - struct __res_state *res, - void (*free_res)(void *)); - -static int init(struct irs_nw *this); - -/* Public */ - -struct irs_nw * -irs_gen_nw(struct irs_acc *this) { - struct gen_p *accpvt = (struct gen_p *)this->private; - struct irs_nw *nw; - struct pvt *pvt; - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - if (!(nw = memget(sizeof *nw))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(nw, 0x5e, sizeof *nw); - pvt->rules = accpvt->map_rules[irs_nw]; - pvt->rule = pvt->rules; - nw->private = pvt; - nw->close = nw_close; - nw->next = nw_next; - nw->byname = nw_byname; - nw->byaddr = nw_byaddr; - nw->rewind = nw_rewind; - nw->minimize = nw_minimize; - nw->res_get = nw_res_get; - nw->res_set = nw_res_set; - return (nw); -} - -/* Methods */ - -static void -nw_close(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - nw_minimize(this); - - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct nwent * -nw_next(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct nwent *rval; - struct irs_nw *nw; - - if (init(this) == -1) - return(NULL); - - while (pvt->rule) { - nw = pvt->rule->inst->nw; - rval = (*nw->next)(nw); - if (rval) - return (rval); - if (!(pvt->rules->flags & IRS_CONTINUE)) - break; - pvt->rule = pvt->rule->next; - if (pvt->rule) { - nw = pvt->rule->inst->nw; - (*nw->rewind)(nw); - } - } - return (NULL); -} - -static struct nwent * -nw_byname(struct irs_nw *this, const char *name, int type) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct nwent *rval; - struct irs_nw *nw; - - if (init(this) == -1) - return(NULL); - - for (rule = pvt->rules; rule; rule = rule->next) { - nw = rule->inst->nw; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - rval = (*nw->byname)(nw, name, type); - if (rval != NULL) - return (rval); - if (pvt->res->res_h_errno != TRY_AGAIN && - !(rule->flags & IRS_CONTINUE)) - break; - } - return (NULL); -} - -static struct nwent * -nw_byaddr(struct irs_nw *this, void *net, int length, int type) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct nwent *rval; - struct irs_nw *nw; - - if (init(this) == -1) - return(NULL); - - for (rule = pvt->rules; rule; rule = rule->next) { - nw = rule->inst->nw; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - rval = (*nw->byaddr)(nw, net, length, type); - if (rval != NULL) - return (rval); - if (pvt->res->res_h_errno != TRY_AGAIN && - !(rule->flags & IRS_CONTINUE)) - break; - } - return (NULL); -} - -static void -nw_rewind(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_nw *nw; - - pvt->rule = pvt->rules; - if (pvt->rule) { - nw = pvt->rule->inst->nw; - (*nw->rewind)(nw); - } -} - -static void -nw_minimize(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - if (pvt->res) - res_nclose(pvt->res); - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_nw *nw = rule->inst->nw; - - (*nw->minimize)(nw); - } -} - -static struct __res_state * -nw_res_get(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - nw_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -nw_res_set(struct irs_nw *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_nw *nw = rule->inst->nw; - - (*nw->res_set)(nw, pvt->res, NULL); - } -} - -static int -init(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res && !nw_res_get(this)) - return (-1); - if (((pvt->res->options & RES_INIT) == 0U) && - res_ninit(pvt->res) == -1) - return (-1); - return (0); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gen_p.h b/contrib/bind9/lib/bind/irs/gen_p.h deleted file mode 100644 index a0a312d..0000000 --- a/contrib/bind9/lib/bind/irs/gen_p.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: gen_p.h,v 1.2.18.1 2005/04/27 05:00:56 sra Exp $ - */ - -/*! \file - * Notes: - * We hope to create a complete set of thread-safe entry points someday, - * which will mean a set of getXbyY() functions that take as an argument - * a pointer to the map class, which will have a pointer to the private - * data, which will be used preferentially to the static variables that - * are necessary to support the "classic" interface. This "classic" - * interface will then be reimplemented as stubs on top of the thread - * safe modules, and will keep the map class pointers as their only - * static data. HOWEVER, we are not there yet. So while we will call - * the just-barely-converted map class methods with map class pointers, - * right now they probably all still use statics. We're not fooling - * anybody, and we're not trying to (yet). - */ - -#ifndef _GEN_P_H_INCLUDED -#define _GEN_P_H_INCLUDED - -/*% - * These are the access methods. - */ -enum irs_acc_id { - irs_lcl, /*%< Local. */ - irs_dns, /*%< DNS or Hesiod. */ - irs_nis, /*%< Sun NIS ("YP"). */ - irs_irp, /*%< IR protocol. */ - irs_nacc -}; - -/*% - * These are the map types. - */ -enum irs_map_id { - irs_gr, /*%< "group" */ - irs_pw, /*%< "passwd" */ - irs_sv, /*%< "services" */ - irs_pr, /*%< "protocols" */ - irs_ho, /*%< "hosts" */ - irs_nw, /*%< "networks" */ - irs_ng, /*%< "netgroup" */ - irs_nmap -}; - -/*% - * This is an accessor instance. - */ -struct irs_inst { - struct irs_acc *acc; - struct irs_gr * gr; - struct irs_pw * pw; - struct irs_sv * sv; - struct irs_pr * pr; - struct irs_ho * ho; - struct irs_nw * nw; - struct irs_ng * ng; -}; - -/*% - * This is a search rule for some map type. - */ -struct irs_rule { - struct irs_rule * next; - struct irs_inst * inst; - int flags; -}; -#define IRS_MERGE 0x0001 /*%< Don't stop if acc. has data? */ -#define IRS_CONTINUE 0x0002 /*%< Don't stop if acc. has no data? */ -/* - * This is the private data for a search access class. - */ -struct gen_p { - char * options; - struct irs_rule * map_rules[(int)irs_nmap]; - struct irs_inst accessors[(int)irs_nacc]; - struct __res_state * res; - void (*free_res) __P((void *)); -}; - -/* - * Externs. - */ - -extern struct irs_acc * irs_gen_acc __P((const char *, const char *conf_file)); -extern struct irs_gr * irs_gen_gr __P((struct irs_acc *)); -extern struct irs_pw * irs_gen_pw __P((struct irs_acc *)); -extern struct irs_sv * irs_gen_sv __P((struct irs_acc *)); -extern struct irs_pr * irs_gen_pr __P((struct irs_acc *)); -extern struct irs_ho * irs_gen_ho __P((struct irs_acc *)); -extern struct irs_nw * irs_gen_nw __P((struct irs_acc *)); -extern struct irs_ng * irs_gen_ng __P((struct irs_acc *)); - -#endif /*_IRS_P_H_INCLUDED*/ diff --git a/contrib/bind9/lib/bind/irs/gen_pr.c b/contrib/bind9/lib/bind/irs/gen_pr.c deleted file mode 100644 index 5c9d69c..0000000 --- a/contrib/bind9/lib/bind/irs/gen_pr.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: gen_pr.c,v 1.2.18.1 2005/04/27 05:00:56 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <resolv.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "gen_p.h" - -/* Types */ - -struct pvt { - struct irs_rule * rules; - struct irs_rule * rule; - struct __res_state * res; - void (*free_res)(void *); -}; - -/* Forward */ - -static void pr_close(struct irs_pr*); -static struct protoent * pr_next(struct irs_pr *); -static struct protoent * pr_byname(struct irs_pr *, const char *); -static struct protoent * pr_bynumber(struct irs_pr *, int); -static void pr_rewind(struct irs_pr *); -static void pr_minimize(struct irs_pr *); -static struct __res_state * pr_res_get(struct irs_pr *); -static void pr_res_set(struct irs_pr *, - struct __res_state *, - void (*)(void *)); - -/* Public */ - -struct irs_pr * -irs_gen_pr(struct irs_acc *this) { - struct gen_p *accpvt = (struct gen_p *)this->private; - struct irs_pr *pr; - struct pvt *pvt; - - if (!(pr = memget(sizeof *pr))) { - errno = ENOMEM; - return (NULL); - } - memset(pr, 0x5e, sizeof *pr); - if (!(pvt = memget(sizeof *pvt))) { - memput(pr, sizeof *pr); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->rules = accpvt->map_rules[irs_pr]; - pvt->rule = pvt->rules; - pr->private = pvt; - pr->close = pr_close; - pr->next = pr_next; - pr->byname = pr_byname; - pr->bynumber = pr_bynumber; - pr->rewind = pr_rewind; - pr->minimize = pr_minimize; - pr->res_get = pr_res_get; - pr->res_set = pr_res_set; - return (pr); -} - -/* Methods */ - -static void -pr_close(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct protoent * -pr_next(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct protoent *rval; - struct irs_pr *pr; - - while (pvt->rule) { - pr = pvt->rule->inst->pr; - rval = (*pr->next)(pr); - if (rval) - return (rval); - if (!(pvt->rules->flags & IRS_CONTINUE)) - break; - pvt->rule = pvt->rule->next; - if (pvt->rule) { - pr = pvt->rule->inst->pr; - (*pr->rewind)(pr); - } - } - return (NULL); -} - -static struct protoent * -pr_byname(struct irs_pr *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct protoent *rval; - struct irs_pr *pr; - - rval = NULL; - for (rule = pvt->rules; rule; rule = rule->next) { - pr = rule->inst->pr; - rval = (*pr->byname)(pr, name); - if (rval || !(rule->flags & IRS_CONTINUE)) - break; - } - return (rval); -} - -static struct protoent * -pr_bynumber(struct irs_pr *this, int proto) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct protoent *rval; - struct irs_pr *pr; - - rval = NULL; - for (rule = pvt->rules; rule; rule = rule->next) { - pr = rule->inst->pr; - rval = (*pr->bynumber)(pr, proto); - if (rval || !(rule->flags & IRS_CONTINUE)) - break; - } - return (rval); -} - -static void -pr_rewind(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_pr *pr; - - pvt->rule = pvt->rules; - if (pvt->rule) { - pr = pvt->rule->inst->pr; - (*pr->rewind)(pr); - } -} - -static void -pr_minimize(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_pr *pr = rule->inst->pr; - - (*pr->minimize)(pr); - } -} - -static struct __res_state * -pr_res_get(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - pr_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -pr_res_set(struct irs_pr *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_pr *pr = rule->inst->pr; - - if (pr->res_set) - (*pr->res_set)(pr, pvt->res, NULL); - } -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gen_pw.c b/contrib/bind9/lib/bind/irs/gen_pw.c deleted file mode 100644 index 80d9b5d..0000000 --- a/contrib/bind9/lib/bind/irs/gen_pw.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: gen_pw.c,v 1.2.18.1 2005/04/27 05:00:57 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#ifndef WANT_IRS_PW -static int __bind_irs_pw_unneeded; -#else - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <errno.h> -#include <pwd.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "gen_p.h" - -/* Types */ - -struct pvt { - struct irs_rule * rules; - struct irs_rule * rule; - struct __res_state * res; - void (*free_res)(void *); -}; - -/* Forward */ - -static void pw_close(struct irs_pw *); -static struct passwd * pw_next(struct irs_pw *); -static struct passwd * pw_byname(struct irs_pw *, const char *); -static struct passwd * pw_byuid(struct irs_pw *, uid_t); -static void pw_rewind(struct irs_pw *); -static void pw_minimize(struct irs_pw *); -static struct __res_state * pw_res_get(struct irs_pw *); -static void pw_res_set(struct irs_pw *, - struct __res_state *, - void (*)(void *)); - -/* Public */ - -struct irs_pw * -irs_gen_pw(struct irs_acc *this) { - struct gen_p *accpvt = (struct gen_p *)this->private; - struct irs_pw *pw; - struct pvt *pvt; - - if (!(pw = memget(sizeof *pw))) { - errno = ENOMEM; - return (NULL); - } - memset(pw, 0x5e, sizeof *pw); - if (!(pvt = memget(sizeof *pvt))) { - memput(pw, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->rules = accpvt->map_rules[irs_pw]; - pvt->rule = pvt->rules; - pw->private = pvt; - pw->close = pw_close; - pw->next = pw_next; - pw->byname = pw_byname; - pw->byuid = pw_byuid; - pw->rewind = pw_rewind; - pw->minimize = pw_minimize; - pw->res_get = pw_res_get; - pw->res_set = pw_res_set; - return (pw); -} - -/* Methods */ - -static void -pw_close(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct passwd * -pw_next(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct passwd *rval; - struct irs_pw *pw; - - while (pvt->rule) { - pw = pvt->rule->inst->pw; - rval = (*pw->next)(pw); - if (rval) - return (rval); - if (!(pvt->rule->flags & IRS_CONTINUE)) - break; - pvt->rule = pvt->rule->next; - if (pvt->rule) { - pw = pvt->rule->inst->pw; - (*pw->rewind)(pw); - } - } - return (NULL); -} - -static void -pw_rewind(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_pw *pw; - - pvt->rule = pvt->rules; - if (pvt->rule) { - pw = pvt->rule->inst->pw; - (*pw->rewind)(pw); - } -} - -static struct passwd * -pw_byname(struct irs_pw *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct passwd *rval; - struct irs_pw *pw; - - rval = NULL; - for (rule = pvt->rules; rule; rule = rule->next) { - pw = rule->inst->pw; - rval = (*pw->byname)(pw, name); - if (rval || !(rule->flags & IRS_CONTINUE)) - break; - } - return (rval); -} - -static struct passwd * -pw_byuid(struct irs_pw *this, uid_t uid) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct passwd *rval; - struct irs_pw *pw; - - rval = NULL; - for (rule = pvt->rules; rule; rule = rule->next) { - pw = rule->inst->pw; - rval = (*pw->byuid)(pw, uid); - if (rval || !(rule->flags & IRS_CONTINUE)) - break; - } - return (rval); -} - -static void -pw_minimize(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_pw *pw = rule->inst->pw; - - (*pw->minimize)(pw); - } -} - -static struct __res_state * -pw_res_get(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - pw_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -pw_res_set(struct irs_pw *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_pw *pw = rule->inst->pw; - - if (pw->res_set) - (*pw->res_set)(pw, pvt->res, NULL); - } -} - -#endif /* WANT_IRS_PW */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gen_sv.c b/contrib/bind9/lib/bind/irs/gen_sv.c deleted file mode 100644 index 66f0ab7..0000000 --- a/contrib/bind9/lib/bind/irs/gen_sv.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: gen_sv.c,v 1.2.18.1 2005/04/27 05:00:57 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <errno.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "gen_p.h" - -/* Types */ - -struct pvt { - struct irs_rule * rules; - struct irs_rule * rule; - struct __res_state * res; - void (*free_res)(void *); -}; - -/* Forward */ - -static void sv_close(struct irs_sv*); -static struct servent * sv_next(struct irs_sv *); -static struct servent * sv_byname(struct irs_sv *, const char *, - const char *); -static struct servent * sv_byport(struct irs_sv *, int, const char *); -static void sv_rewind(struct irs_sv *); -static void sv_minimize(struct irs_sv *); -static struct __res_state * sv_res_get(struct irs_sv *); -static void sv_res_set(struct irs_sv *, - struct __res_state *, - void (*)(void *)); - -/* Public */ - -struct irs_sv * -irs_gen_sv(struct irs_acc *this) { - struct gen_p *accpvt = (struct gen_p *)this->private; - struct irs_sv *sv; - struct pvt *pvt; - - if (!(sv = memget(sizeof *sv))) { - errno = ENOMEM; - return (NULL); - } - memset(sv, 0x5e, sizeof *sv); - if (!(pvt = memget(sizeof *pvt))) { - memput(sv, sizeof *sv); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->rules = accpvt->map_rules[irs_sv]; - pvt->rule = pvt->rules; - sv->private = pvt; - sv->close = sv_close; - sv->next = sv_next; - sv->byname = sv_byname; - sv->byport = sv_byport; - sv->rewind = sv_rewind; - sv->minimize = sv_minimize; - sv->res_get = sv_res_get; - sv->res_set = sv_res_set; - return (sv); -} - -/* Methods */ - -static void -sv_close(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct servent * -sv_next(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct servent *rval; - struct irs_sv *sv; - - while (pvt->rule) { - sv = pvt->rule->inst->sv; - rval = (*sv->next)(sv); - if (rval) - return (rval); - if (!(pvt->rule->flags & IRS_CONTINUE)) - break; - pvt->rule = pvt->rule->next; - if (pvt->rule) { - sv = pvt->rule->inst->sv; - (*sv->rewind)(sv); - } - } - return (NULL); -} - -static struct servent * -sv_byname(struct irs_sv *this, const char *name, const char *proto) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct servent *rval; - struct irs_sv *sv; - - rval = NULL; - for (rule = pvt->rules; rule; rule = rule->next) { - sv = rule->inst->sv; - rval = (*sv->byname)(sv, name, proto); - if (rval || !(rule->flags & IRS_CONTINUE)) - break; - } - return (rval); -} - -static struct servent * -sv_byport(struct irs_sv *this, int port, const char *proto) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - struct servent *rval; - struct irs_sv *sv; - - rval = NULL; - for (rule = pvt->rules; rule; rule = rule->next) { - sv = rule->inst->sv; - rval = (*sv->byport)(sv, port, proto); - if (rval || !(rule->flags & IRS_CONTINUE)) - break; - } - return (rval); -} - -static void -sv_rewind(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_sv *sv; - - pvt->rule = pvt->rules; - if (pvt->rule) { - sv = pvt->rule->inst->sv; - (*sv->rewind)(sv); - } -} - -static void -sv_minimize(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_sv *sv = rule->inst->sv; - - (*sv->minimize)(sv); - } -} - -static struct __res_state * -sv_res_get(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - sv_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -sv_res_set(struct irs_sv *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - struct irs_rule *rule; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; - - for (rule = pvt->rules; rule != NULL; rule = rule->next) { - struct irs_sv *sv = rule->inst->sv; - - if (sv->res_set) - (*sv->res_set)(sv, pvt->res, NULL); - } -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getaddrinfo.c b/contrib/bind9/lib/bind/irs/getaddrinfo.c deleted file mode 100644 index 1839ba4..0000000 --- a/contrib/bind9/lib/bind/irs/getaddrinfo.c +++ /dev/null @@ -1,1253 +0,0 @@ -/* $KAME: getaddrinfo.c,v 1.14 2001/01/06 09:41:15 jinmei Exp $ */ - -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * 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. Neither the name of the project 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 PROJECT 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 PROJECT 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. - */ - -/*! \file - * Issues to be discussed: - *\li Thread safe-ness must be checked. - *\li Return values. There are nonstandard return values defined and used - * in the source code. This is because RFC2553 is silent about which error - * code must be returned for which situation. - *\li IPv4 classful (shortened) form. RFC2553 is silent about it. XNET 5.2 - * says to use inet_aton() to convert IPv4 numeric to binary (allows - * classful form as a result). - * current code - disallow classful form for IPv4 (due to use of inet_pton). - *\li freeaddrinfo(NULL). RFC2553 is silent about it. XNET 5.2 says it is - * invalid. - * current code - SEGV on freeaddrinfo(NULL) - * Note: - *\li We use getipnodebyname() just for thread-safeness. There's no intent - * to let it do PF_UNSPEC (actually we never pass PF_UNSPEC to - * getipnodebyname(). - *\li The code filters out AFs that are not supported by the kernel, - * when globbing NULL hostname (to loopback, or wildcard). Is it the right - * thing to do? What is the relationship with post-RFC2553 AI_ADDRCONFIG - * in ai_flags? - *\li (post-2553) semantics of AI_ADDRCONFIG itself is too vague. - * (1) what should we do against numeric hostname (2) what should we do - * against NULL hostname (3) what is AI_ADDRCONFIG itself. AF not ready? - * non-loopback address configured? global address configured? - * \par Additional Issue: - * To avoid search order issue, we have a big amount of code duplicate - * from gethnamaddr.c and some other places. The issues that there's no - * lower layer function to lookup "IPv4 or IPv6" record. Calling - * gethostbyname2 from getaddrinfo will end up in wrong search order, as - * follows: - * \li The code makes use of following calls when asked to resolver with - * ai_family = PF_UNSPEC: - *\code getipnodebyname(host, AF_INET6); - * getipnodebyname(host, AF_INET); - *\endcode - * \li This will result in the following queries if the node is configure to - * prefer /etc/hosts than DNS: - *\code - * lookup /etc/hosts for IPv6 address - * lookup DNS for IPv6 address - * lookup /etc/hosts for IPv4 address - * lookup DNS for IPv4 address - *\endcode - * which may not meet people's requirement. - * \li The right thing to happen is to have underlying layer which does - * PF_UNSPEC lookup (lookup both) and return chain of addrinfos. - * This would result in a bit of code duplicate with _dns_ghbyname() and - * friends. - */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/socket.h> - -#include <net/if.h> -#include <netinet/in.h> - -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <netdb.h> -#include <resolv.h> -#include <string.h> -#include <stdlib.h> -#include <stddef.h> -#include <ctype.h> -#include <unistd.h> -#include <stdio.h> -#include <errno.h> - -#include <stdarg.h> - -#include <irs.h> -#include <isc/assertions.h> - -#include "port_after.h" - -#include "irs_data.h" - -#define SUCCESS 0 -#define ANY 0 -#define YES 1 -#define NO 0 - -static const char in_addrany[] = { 0, 0, 0, 0 }; -static const char in6_addrany[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static const char in_loopback[] = { 127, 0, 0, 1 }; -static const char in6_loopback[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -}; - -static const struct afd { - int a_af; - int a_addrlen; - int a_socklen; - int a_off; - const char *a_addrany; - const char *a_loopback; - int a_scoped; -} afdl [] = { - {PF_INET6, sizeof(struct in6_addr), - sizeof(struct sockaddr_in6), - offsetof(struct sockaddr_in6, sin6_addr), - in6_addrany, in6_loopback, 1}, - {PF_INET, sizeof(struct in_addr), - sizeof(struct sockaddr_in), - offsetof(struct sockaddr_in, sin_addr), - in_addrany, in_loopback, 0}, - {0, 0, 0, 0, NULL, NULL, 0}, -}; - -struct explore { - int e_af; - int e_socktype; - int e_protocol; - const char *e_protostr; - int e_wild; -#define WILD_AF(ex) ((ex)->e_wild & 0x01) -#define WILD_SOCKTYPE(ex) ((ex)->e_wild & 0x02) -#define WILD_PROTOCOL(ex) ((ex)->e_wild & 0x04) -}; - -static const struct explore explore[] = { -#if 0 - { PF_LOCAL, 0, ANY, ANY, NULL, 0x01 }, -#endif - { PF_INET6, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 }, - { PF_INET6, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 }, - { PF_INET6, SOCK_RAW, ANY, NULL, 0x05 }, - { PF_INET, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 }, - { PF_INET, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 }, - { PF_INET, SOCK_RAW, ANY, NULL, 0x05 }, - { -1, 0, 0, NULL, 0 }, -}; - -#define PTON_MAX 16 - -static int str_isnumber __P((const char *)); -static int explore_fqdn __P((const struct addrinfo *, const char *, - const char *, struct addrinfo **)); -static int explore_copy __P((const struct addrinfo *, const struct addrinfo *, - struct addrinfo **)); -static int explore_null __P((const struct addrinfo *, - const char *, struct addrinfo **)); -static int explore_numeric __P((const struct addrinfo *, const char *, - const char *, struct addrinfo **)); -static int explore_numeric_scope __P((const struct addrinfo *, const char *, - const char *, struct addrinfo **)); -static int get_canonname __P((const struct addrinfo *, - struct addrinfo *, const char *)); -static struct addrinfo *get_ai __P((const struct addrinfo *, - const struct afd *, const char *)); -static struct addrinfo *copy_ai __P((const struct addrinfo *)); -static int get_portmatch __P((const struct addrinfo *, const char *)); -static int get_port __P((const struct addrinfo *, const char *, int)); -static const struct afd *find_afd __P((int)); -static int addrconfig __P((int)); -static int ip6_str2scopeid __P((char *, struct sockaddr_in6 *, - u_int32_t *scopeidp)); -static struct net_data *init __P((void)); - -struct addrinfo *hostent2addrinfo __P((struct hostent *, - const struct addrinfo *)); -struct addrinfo *addr2addrinfo __P((const struct addrinfo *, - const char *)); - -#if 0 -static const char *ai_errlist[] = { - "Success", - "Address family for hostname not supported", /*%< EAI_ADDRFAMILY */ - "Temporary failure in name resolution", /*%< EAI_AGAIN */ - "Invalid value for ai_flags", /*%< EAI_BADFLAGS */ - "Non-recoverable failure in name resolution", /*%< EAI_FAIL */ - "ai_family not supported", /*%< EAI_FAMILY */ - "Memory allocation failure", /*%< EAI_MEMORY */ - "No address associated with hostname", /*%< EAI_NODATA */ - "hostname nor servname provided, or not known", /*%< EAI_NONAME */ - "servname not supported for ai_socktype", /*%< EAI_SERVICE */ - "ai_socktype not supported", /*%< EAI_SOCKTYPE */ - "System error returned in errno", /*%< EAI_SYSTEM */ - "Invalid value for hints", /*%< EAI_BADHINTS */ - "Resolved protocol is unknown", /*%< EAI_PROTOCOL */ - "Unknown error", /*%< EAI_MAX */ -}; -#endif - -/* XXX macros that make external reference is BAD. */ - -#define GET_AI(ai, afd, addr) \ -do { \ - /* external reference: pai, error, and label free */ \ - (ai) = get_ai(pai, (afd), (addr)); \ - if ((ai) == NULL) { \ - error = EAI_MEMORY; \ - goto free; \ - } \ -} while (/*CONSTCOND*/0) - -#define GET_PORT(ai, serv) \ -do { \ - /* external reference: error and label free */ \ - error = get_port((ai), (serv), 0); \ - if (error != 0) \ - goto free; \ -} while (/*CONSTCOND*/0) - -#define GET_CANONNAME(ai, str) \ -do { \ - /* external reference: pai, error and label free */ \ - error = get_canonname(pai, (ai), (str)); \ - if (error != 0) \ - goto free; \ -} while (/*CONSTCOND*/0) - -#ifndef SOLARIS2 -#define SETERROR(err) \ -do { \ - /* external reference: error, and label bad */ \ - error = (err); \ - goto bad; \ - /*NOTREACHED*/ \ -} while (/*CONSTCOND*/0) -#else -#define SETERROR(err) \ -do { \ - /* external reference: error, and label bad */ \ - error = (err); \ - if (error == error) \ - goto bad; \ -} while (/*CONSTCOND*/0) -#endif - - -#define MATCH_FAMILY(x, y, w) \ - ((x) == (y) || (/*CONSTCOND*/(w) && ((x) == PF_UNSPEC || (y) == PF_UNSPEC))) -#define MATCH(x, y, w) \ - ((x) == (y) || (/*CONSTCOND*/(w) && ((x) == ANY || (y) == ANY))) - -#if 0 /*%< bind8 has its own version */ -char * -gai_strerror(ecode) - int ecode; -{ - if (ecode < 0 || ecode > EAI_MAX) - ecode = EAI_MAX; - return ai_errlist[ecode]; -} -#endif - -void -freeaddrinfo(ai) - struct addrinfo *ai; -{ - struct addrinfo *next; - - do { - next = ai->ai_next; - if (ai->ai_canonname) - free(ai->ai_canonname); - /* no need to free(ai->ai_addr) */ - free(ai); - ai = next; - } while (ai); -} - -static int -str_isnumber(p) - const char *p; -{ - char *ep; - - if (*p == '\0') - return NO; - ep = NULL; - errno = 0; - (void)strtoul(p, &ep, 10); - if (errno == 0 && ep && *ep == '\0') - return YES; - else - return NO; -} - -int -getaddrinfo(hostname, servname, hints, res) - const char *hostname, *servname; - const struct addrinfo *hints; - struct addrinfo **res; -{ - struct addrinfo sentinel; - struct addrinfo *cur; - int error = 0; - struct addrinfo ai, ai0, *afai = NULL; - struct addrinfo *pai; - const struct explore *ex; - - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - pai = &ai; - pai->ai_flags = 0; - pai->ai_family = PF_UNSPEC; - pai->ai_socktype = ANY; - pai->ai_protocol = ANY; -#if defined(sun) && defined(_SOCKLEN_T) && defined(__sparcv9) - /* - * clear _ai_pad to preserve binary - * compatibility with previously compiled 64-bit - * applications in a pre-SUSv3 environment by - * guaranteeing the upper 32-bits are empty. - */ - pai->_ai_pad = 0; -#endif - pai->ai_addrlen = 0; - pai->ai_canonname = NULL; - pai->ai_addr = NULL; - pai->ai_next = NULL; - - if (hostname == NULL && servname == NULL) - return EAI_NONAME; - if (hints) { - /* error check for hints */ - if (hints->ai_addrlen || hints->ai_canonname || - hints->ai_addr || hints->ai_next) - SETERROR(EAI_BADHINTS); /*%< xxx */ - if (hints->ai_flags & ~AI_MASK) - SETERROR(EAI_BADFLAGS); - switch (hints->ai_family) { - case PF_UNSPEC: - case PF_INET: - case PF_INET6: - break; - default: - SETERROR(EAI_FAMILY); - } - memcpy(pai, hints, sizeof(*pai)); - -#if defined(sun) && defined(_SOCKLEN_T) && defined(__sparcv9) - /* - * We need to clear _ai_pad to preserve binary - * compatibility. See prior comment. - */ - pai->_ai_pad = 0; -#endif - /* - * if both socktype/protocol are specified, check if they - * are meaningful combination. - */ - if (pai->ai_socktype != ANY && pai->ai_protocol != ANY) { - for (ex = explore; ex->e_af >= 0; ex++) { - if (pai->ai_family != ex->e_af) - continue; - if (ex->e_socktype == ANY) - continue; - if (ex->e_protocol == ANY) - continue; - if (pai->ai_socktype == ex->e_socktype && - pai->ai_protocol != ex->e_protocol) { - SETERROR(EAI_BADHINTS); - } - } - } - } - - /* - * post-2553: AI_ALL and AI_V4MAPPED are effective only against - * AF_INET6 query. They needs to be ignored if specified in other - * occassions. - */ - switch (pai->ai_flags & (AI_ALL | AI_V4MAPPED)) { - case AI_V4MAPPED: - case AI_ALL | AI_V4MAPPED: - if (pai->ai_family != AF_INET6) - pai->ai_flags &= ~(AI_ALL | AI_V4MAPPED); - break; - case AI_ALL: -#if 1 - /* illegal */ - SETERROR(EAI_BADFLAGS); -#else - pai->ai_flags &= ~(AI_ALL | AI_V4MAPPED); - break; -#endif - } - - /* - * check for special cases. (1) numeric servname is disallowed if - * socktype/protocol are left unspecified. (2) servname is disallowed - * for raw and other inet{,6} sockets. - */ - if (MATCH_FAMILY(pai->ai_family, PF_INET, 1) -#ifdef PF_INET6 - || MATCH_FAMILY(pai->ai_family, PF_INET6, 1) -#endif - ) { - ai0 = *pai; /* backup *pai */ - - if (pai->ai_family == PF_UNSPEC) { -#ifdef PF_INET6 - pai->ai_family = PF_INET6; -#else - pai->ai_family = PF_INET; -#endif - } - error = get_portmatch(pai, servname); - if (error) - SETERROR(error); - - *pai = ai0; - } - - ai0 = *pai; - - /* NULL hostname, or numeric hostname */ - for (ex = explore; ex->e_af >= 0; ex++) { - *pai = ai0; - - if (!MATCH_FAMILY(pai->ai_family, ex->e_af, WILD_AF(ex))) - continue; - if (!MATCH(pai->ai_socktype, ex->e_socktype, WILD_SOCKTYPE(ex))) - continue; - if (!MATCH(pai->ai_protocol, ex->e_protocol, WILD_PROTOCOL(ex))) - continue; - - if (pai->ai_family == PF_UNSPEC) - pai->ai_family = ex->e_af; - if (pai->ai_socktype == ANY && ex->e_socktype != ANY) - pai->ai_socktype = ex->e_socktype; - if (pai->ai_protocol == ANY && ex->e_protocol != ANY) - pai->ai_protocol = ex->e_protocol; - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - continue; - - if (hostname == NULL) { - /* - * filter out AFs that are not supported by the kernel - * XXX errno? - */ - if (!addrconfig(pai->ai_family)) - continue; - error = explore_null(pai, servname, &cur->ai_next); - } else - error = explore_numeric_scope(pai, hostname, servname, - &cur->ai_next); - - if (error) - goto free; - - while (cur && cur->ai_next) - cur = cur->ai_next; - } - - /* - * XXX - * If numreic representation of AF1 can be interpreted as FQDN - * representation of AF2, we need to think again about the code below. - */ - if (sentinel.ai_next) - goto good; - - if (pai->ai_flags & AI_NUMERICHOST) - SETERROR(EAI_NONAME); - if (hostname == NULL) - SETERROR(EAI_NONAME); - - /* - * hostname as alphabetical name. - * We'll make sure that - * - if returning addrinfo list is empty, return non-zero error - * value (already known one or EAI_NONAME). - * - otherwise, - * + if we haven't had any errors, return 0 (i.e. success). - * + if we've had an error, free the list and return the error. - * without any assumption on the behavior of explore_fqdn(). - */ - - /* first, try to query DNS for all possible address families. */ - *pai = ai0; - error = explore_fqdn(pai, hostname, servname, &afai); - if (error) { - if (afai != NULL) - freeaddrinfo(afai); - goto free; - } - if (afai == NULL) { - error = EAI_NONAME; /*%< we've had no errors. */ - goto free; - } - - /* - * we would like to prefer AF_INET6 than AF_INET, so we'll make an - * outer loop by AFs. - */ - for (ex = explore; ex->e_af >= 0; ex++) { - *pai = ai0; - - if (pai->ai_family == PF_UNSPEC) - pai->ai_family = ex->e_af; - - if (!MATCH_FAMILY(pai->ai_family, ex->e_af, WILD_AF(ex))) - continue; - if (!MATCH(pai->ai_socktype, ex->e_socktype, - WILD_SOCKTYPE(ex))) { - continue; - } - if (!MATCH(pai->ai_protocol, ex->e_protocol, - WILD_PROTOCOL(ex))) { - continue; - } - -#ifdef AI_ADDRCONFIG - /* - * If AI_ADDRCONFIG is specified, check if we are - * expected to return the address family or not. - */ - if ((pai->ai_flags & AI_ADDRCONFIG) != 0 && - !addrconfig(pai->ai_family)) - continue; -#endif - - if (pai->ai_family == PF_UNSPEC) - pai->ai_family = ex->e_af; - if (pai->ai_socktype == ANY && ex->e_socktype != ANY) - pai->ai_socktype = ex->e_socktype; - if (pai->ai_protocol == ANY && ex->e_protocol != ANY) - pai->ai_protocol = ex->e_protocol; - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - continue; - - if ((error = explore_copy(pai, afai, &cur->ai_next)) != 0) { - freeaddrinfo(afai); - goto free; - } - - while (cur && cur->ai_next) - cur = cur->ai_next; - } - - freeaddrinfo(afai); /*%< afai must not be NULL at this point. */ - - if (sentinel.ai_next) { -good: - *res = sentinel.ai_next; - return(SUCCESS); - } else { - /* - * All the process succeeded, but we've had an empty list. - * This can happen if the given hints do not match our - * candidates. - */ - error = EAI_NONAME; - } - -free: -bad: - if (sentinel.ai_next) - freeaddrinfo(sentinel.ai_next); - *res = NULL; - return(error); -} - -/*% - * FQDN hostname, DNS lookup - */ -static int -explore_fqdn(pai, hostname, servname, res) - const struct addrinfo *pai; - const char *hostname; - const char *servname; - struct addrinfo **res; -{ - struct addrinfo *result; - struct addrinfo *cur; - struct net_data *net_data = init(); - struct irs_ho *ho; - int error = 0; - char tmp[NS_MAXDNAME]; - const char *cp; - - INSIST(res != NULL && *res == NULL); - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return(0); - - if (!net_data || !(ho = net_data->ho)) - return(0); -#if 0 /*%< XXX (notyet) */ - if (net_data->ho_stayopen && net_data->ho_last && - net_data->ho_last->h_addrtype == af) { - if (ns_samename(name, net_data->ho_last->h_name) == 1) - return (net_data->ho_last); - for (hap = net_data->ho_last->h_aliases; hap && *hap; hap++) - if (ns_samename(name, *hap) == 1) - return (net_data->ho_last); - } -#endif - if (!strchr(hostname, '.') && - (cp = res_hostalias(net_data->res, hostname, - tmp, sizeof(tmp)))) - hostname = cp; - result = (*ho->addrinfo)(ho, hostname, pai); - if (!net_data->ho_stayopen) { - (*ho->minimize)(ho); - } - if (result == NULL) { - int e = h_errno; - - switch(e) { - case NETDB_INTERNAL: - error = EAI_SYSTEM; - break; - case TRY_AGAIN: - error = EAI_AGAIN; - break; - case NO_RECOVERY: - error = EAI_FAIL; - break; - case HOST_NOT_FOUND: - case NO_DATA: - error = EAI_NONAME; - break; - default: - case NETDB_SUCCESS: /*%< should be impossible... */ - error = EAI_NONAME; - break; - } - goto free; - } - - for (cur = result; cur; cur = cur->ai_next) { - GET_PORT(cur, servname); /*%< XXX: redundant lookups... */ - /* canonname should already be filled. */ - } - - *res = result; - - return(0); - -free: - if (result) - freeaddrinfo(result); - return error; -} - -static int -explore_copy(pai, src0, res) - const struct addrinfo *pai; /*%< seed */ - const struct addrinfo *src0; /*%< source */ - struct addrinfo **res; -{ - int error; - struct addrinfo sentinel, *cur; - const struct addrinfo *src; - - error = 0; - sentinel.ai_next = NULL; - cur = &sentinel; - - for (src = src0; src != NULL; src = src->ai_next) { - if (src->ai_family != pai->ai_family) - continue; - - cur->ai_next = copy_ai(src); - if (!cur->ai_next) { - error = EAI_MEMORY; - goto fail; - } - - cur->ai_next->ai_socktype = pai->ai_socktype; - cur->ai_next->ai_protocol = pai->ai_protocol; - cur = cur->ai_next; - } - - *res = sentinel.ai_next; - return 0; - -fail: - freeaddrinfo(sentinel.ai_next); - return error; -} - -/*% - * hostname == NULL. - * passive socket -> anyaddr (0.0.0.0 or ::) - * non-passive socket -> localhost (127.0.0.1 or ::1) - */ -static int -explore_null(pai, servname, res) - const struct addrinfo *pai; - const char *servname; - struct addrinfo **res; -{ - const struct afd *afd; - struct addrinfo *cur; - struct addrinfo sentinel; - int error; - - *res = NULL; - sentinel.ai_next = NULL; - cur = &sentinel; - - afd = find_afd(pai->ai_family); - if (afd == NULL) - return 0; - - if (pai->ai_flags & AI_PASSIVE) { - GET_AI(cur->ai_next, afd, afd->a_addrany); - /* xxx meaningless? - * GET_CANONNAME(cur->ai_next, "anyaddr"); - */ - GET_PORT(cur->ai_next, servname); - } else { - GET_AI(cur->ai_next, afd, afd->a_loopback); - /* xxx meaningless? - * GET_CANONNAME(cur->ai_next, "localhost"); - */ - GET_PORT(cur->ai_next, servname); - } - cur = cur->ai_next; - - *res = sentinel.ai_next; - return 0; - -free: - if (sentinel.ai_next) - freeaddrinfo(sentinel.ai_next); - return error; -} - -/*% - * numeric hostname - */ -static int -explore_numeric(pai, hostname, servname, res) - const struct addrinfo *pai; - const char *hostname; - const char *servname; - struct addrinfo **res; -{ - const struct afd *afd; - struct addrinfo *cur; - struct addrinfo sentinel; - int error; - char pton[PTON_MAX]; - - *res = NULL; - sentinel.ai_next = NULL; - cur = &sentinel; - - afd = find_afd(pai->ai_family); - if (afd == NULL) - return 0; - - switch (afd->a_af) { -#if 0 /*X/Open spec*/ - case AF_INET: - if (inet_aton(hostname, (struct in_addr *)pton) == 1) { - if (pai->ai_family == afd->a_af || - pai->ai_family == PF_UNSPEC /*?*/) { - GET_AI(cur->ai_next, afd, pton); - GET_PORT(cur->ai_next, servname); - while (cur->ai_next) - cur = cur->ai_next; - } else - SETERROR(EAI_FAMILY); /*xxx*/ - } - break; -#endif - default: - if (inet_pton(afd->a_af, hostname, pton) == 1) { - if (pai->ai_family == afd->a_af || - pai->ai_family == PF_UNSPEC /*?*/) { - GET_AI(cur->ai_next, afd, pton); - GET_PORT(cur->ai_next, servname); - while (cur->ai_next) - cur = cur->ai_next; - } else - SETERROR(EAI_FAMILY); /*xxx*/ - } - break; - } - - *res = sentinel.ai_next; - return 0; - -free: -bad: - if (sentinel.ai_next) - freeaddrinfo(sentinel.ai_next); - return error; -} - -/*% - * numeric hostname with scope - */ -static int -explore_numeric_scope(pai, hostname, servname, res) - const struct addrinfo *pai; - const char *hostname; - const char *servname; - struct addrinfo **res; -{ -#ifndef SCOPE_DELIMITER - return explore_numeric(pai, hostname, servname, res); -#else - const struct afd *afd; - struct addrinfo *cur; - int error; - char *cp, *hostname2 = NULL, *scope, *addr; - struct sockaddr_in6 *sin6; - - afd = find_afd(pai->ai_family); - if (afd == NULL) - return 0; - - if (!afd->a_scoped) - return explore_numeric(pai, hostname, servname, res); - - cp = strchr(hostname, SCOPE_DELIMITER); - if (cp == NULL) - return explore_numeric(pai, hostname, servname, res); - - /* - * Handle special case of <scoped_address><delimiter><scope id> - */ - hostname2 = strdup(hostname); - if (hostname2 == NULL) - return EAI_MEMORY; - /* terminate at the delimiter */ - hostname2[cp - hostname] = '\0'; - addr = hostname2; - scope = cp + 1; - - error = explore_numeric(pai, addr, servname, res); - if (error == 0) { - u_int32_t scopeid = 0; - - for (cur = *res; cur; cur = cur->ai_next) { - if (cur->ai_family != AF_INET6) - continue; - sin6 = (struct sockaddr_in6 *)(void *)cur->ai_addr; - if (!ip6_str2scopeid(scope, sin6, &scopeid)) { - free(hostname2); - return(EAI_NONAME); /*%< XXX: is return OK? */ - } -#ifdef HAVE_SIN6_SCOPE_ID - sin6->sin6_scope_id = scopeid; -#endif - } - } - - free(hostname2); - - return error; -#endif -} - -static int -get_canonname(pai, ai, str) - const struct addrinfo *pai; - struct addrinfo *ai; - const char *str; -{ - if ((pai->ai_flags & AI_CANONNAME) != 0) { - ai->ai_canonname = (char *)malloc(strlen(str) + 1); - if (ai->ai_canonname == NULL) - return EAI_MEMORY; - strcpy(ai->ai_canonname, str); - } - return 0; -} - -static struct addrinfo * -get_ai(pai, afd, addr) - const struct addrinfo *pai; - const struct afd *afd; - const char *addr; -{ - char *p; - struct addrinfo *ai; - - ai = (struct addrinfo *)malloc(sizeof(struct addrinfo) - + (afd->a_socklen)); - if (ai == NULL) - return NULL; - - memcpy(ai, pai, sizeof(struct addrinfo)); - ai->ai_addr = (struct sockaddr *)(void *)(ai + 1); - memset(ai->ai_addr, 0, (size_t)afd->a_socklen); -#ifdef HAVE_SA_LEN - ai->ai_addr->sa_len = afd->a_socklen; -#endif - ai->ai_addrlen = 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); - return ai; -} - -/* XXX need to malloc() the same way we do from other functions! */ -static struct addrinfo * -copy_ai(pai) - const struct addrinfo *pai; -{ - struct addrinfo *ai; - size_t l; - - l = sizeof(*ai) + pai->ai_addrlen; - if ((ai = (struct addrinfo *)malloc(l)) == NULL) - return NULL; - memset(ai, 0, l); - memcpy(ai, pai, sizeof(*ai)); - ai->ai_addr = (struct sockaddr *)(void *)(ai + 1); - memcpy(ai->ai_addr, pai->ai_addr, pai->ai_addrlen); - - if (pai->ai_canonname) { - l = strlen(pai->ai_canonname) + 1; - if ((ai->ai_canonname = malloc(l)) == NULL) { - free(ai); - return NULL; - } - strcpy(ai->ai_canonname, pai->ai_canonname); /* (checked) */ - } else { - /* just to make sure */ - ai->ai_canonname = NULL; - } - - ai->ai_next = NULL; - - return ai; -} - -static int -get_portmatch(const struct addrinfo *ai, const char *servname) { - - /* get_port does not touch first argument. when matchonly == 1. */ - /* LINTED const cast */ - return get_port((const struct addrinfo *)ai, servname, 1); -} - -static int -get_port(const struct addrinfo *ai, const char *servname, int matchonly) { - const char *proto; - struct servent *sp; - int port; - int allownumeric; - - if (servname == NULL) - return 0; - switch (ai->ai_family) { - case AF_INET: -#ifdef AF_INET6 - case AF_INET6: -#endif - break; - default: - return 0; - } - - switch (ai->ai_socktype) { - case SOCK_RAW: - return EAI_SERVICE; - case SOCK_DGRAM: - case SOCK_STREAM: - allownumeric = 1; - break; - case ANY: - switch (ai->ai_family) { - case AF_INET: -#ifdef AF_INET6 - case AF_INET6: -#endif - allownumeric = 1; - break; - default: - allownumeric = 0; - break; - } - break; - default: - return EAI_SOCKTYPE; - } - - if (str_isnumber(servname)) { - if (!allownumeric) - return EAI_SERVICE; - port = atoi(servname); - if (port < 0 || port > 65535) - return EAI_SERVICE; - port = htons(port); - } else { - switch (ai->ai_socktype) { - case SOCK_DGRAM: - proto = "udp"; - break; - case SOCK_STREAM: - proto = "tcp"; - break; - default: - proto = NULL; - break; - } - - if ((sp = getservbyname(servname, proto)) == NULL) - return EAI_SERVICE; - port = sp->s_port; - } - - if (!matchonly) { - switch (ai->ai_family) { - case AF_INET: - ((struct sockaddr_in *)(void *) - ai->ai_addr)->sin_port = port; - break; - case AF_INET6: - ((struct sockaddr_in6 *)(void *) - ai->ai_addr)->sin6_port = port; - break; - } - } - - return 0; -} - -static const struct afd * -find_afd(af) - int af; -{ - const struct afd *afd; - - if (af == PF_UNSPEC) - return NULL; - for (afd = afdl; afd->a_af; afd++) { - if (afd->a_af == af) - return afd; - } - return NULL; -} - -/*% - * post-2553: AI_ADDRCONFIG check. if we use getipnodeby* as backend, backend - * will take care of it. - * the semantics of AI_ADDRCONFIG is not defined well. we are not sure - * if the code is right or not. - */ -static int -addrconfig(af) - int af; -{ - int s; - - /* XXX errno */ - s = socket(af, SOCK_DGRAM, 0); - if (s < 0) { - if (errno != EMFILE) - return 0; - } else - close(s); - return 1; -} - -/* convert a string to a scope identifier. XXX: IPv6 specific */ -static int -ip6_str2scopeid(char *scope, struct sockaddr_in6 *sin6, - u_int32_t *scopeidp) -{ - u_int32_t scopeid; - u_long lscopeid; - struct in6_addr *a6 = &sin6->sin6_addr; - char *ep; - - /* empty scopeid portion is invalid */ - if (*scope == '\0') - return (0); - -#ifdef USE_IFNAMELINKID - if (IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6) || - IN6_IS_ADDR_MC_NODELOCAL(a6)) { - /* - * Using interface names as link indices can be allowed - * only when we can assume a one-to-one mappings between - * links and interfaces. See comments in getnameinfo.c. - */ - scopeid = if_nametoindex(scope); - if (scopeid == 0) - goto trynumeric; - *scopeidp = scopeid; - return (1); - } -#endif - - /* still unclear about literal, allow numeric only - placeholder */ - if (IN6_IS_ADDR_SITELOCAL(a6) || IN6_IS_ADDR_MC_SITELOCAL(a6)) - goto trynumeric; - if (IN6_IS_ADDR_MC_ORGLOCAL(a6)) - goto trynumeric; - else - goto trynumeric; /*%< global */ - /* try to convert to a numeric id as a last resort */ -trynumeric: - errno = 0; - lscopeid = strtoul(scope, &ep, 10); - scopeid = lscopeid & 0xffffffff; - if (errno == 0 && ep && *ep == '\0' && scopeid == lscopeid) { - *scopeidp = scopeid; - return (1); - } else - return (0); -} - -struct addrinfo * -hostent2addrinfo(hp, pai) - struct hostent *hp; - const struct addrinfo *pai; -{ - int i, af, error = 0; - char **aplist = NULL, *ap; - struct addrinfo sentinel, *cur; - const struct afd *afd; - - af = hp->h_addrtype; - if (pai->ai_family != AF_UNSPEC && af != pai->ai_family) - return(NULL); - - afd = find_afd(af); - if (afd == NULL) - return(NULL); - - aplist = hp->h_addr_list; - - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - - for (i = 0; (ap = aplist[i]) != NULL; i++) { -#if 0 /*%< the trick seems too much */ - af = hp->h_addr_list; - if (af == AF_INET6 && - IN6_IS_ADDR_V4MAPPED((struct in6_addr *)ap)) { - af = AF_INET; - ap = ap + sizeof(struct in6_addr) - - sizeof(struct in_addr); - } - afd = find_afd(af); - if (afd == NULL) - continue; -#endif /* 0 */ - - GET_AI(cur->ai_next, afd, ap); - - /* GET_PORT(cur->ai_next, servname); */ - if ((pai->ai_flags & AI_CANONNAME) != 0) { - /* - * RFC2553 says that ai_canonname will be set only for - * the first element. we do it for all the elements, - * just for convenience. - */ - GET_CANONNAME(cur->ai_next, hp->h_name); - } - while (cur->ai_next) /*%< no need to loop, actually. */ - cur = cur->ai_next; - continue; - - free: - if (cur->ai_next) - freeaddrinfo(cur->ai_next); - cur->ai_next = NULL; - /* continue, without tht pointer CUR advanced. */ - } - - return(sentinel.ai_next); -} - -struct addrinfo * -addr2addrinfo(pai, cp) - const struct addrinfo *pai; - const char *cp; -{ - const struct afd *afd; - - afd = find_afd(pai->ai_family); - if (afd == NULL) - return(NULL); - - return(get_ai(pai, afd, cp)); -} - -static struct net_data * -init() -{ - struct net_data *net_data; - - if (!(net_data = net_data_init(NULL))) - goto error; - if (!net_data->ho) { - net_data->ho = (*net_data->irs->ho_map)(net_data->irs); - if (!net_data->ho || !net_data->res) { -error: - errno = EIO; - if (net_data && net_data->res) - RES_SET_H_ERRNO(net_data->res, NETDB_INTERNAL); - return (NULL); - } - - (*net_data->ho->res_set)(net_data->ho, net_data->res, NULL); - } - - return (net_data); -} diff --git a/contrib/bind9/lib/bind/irs/getgrent.c b/contrib/bind9/lib/bind/irs/getgrent.c deleted file mode 100644 index fe91ab3..0000000 --- a/contrib/bind9/lib/bind/irs/getgrent.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: getgrent.c,v 1.4.18.1 2005/04/27 05:00:57 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#if !defined(WANT_IRS_GR) || defined(__BIND_NOSTATIC) -static int __bind_irs_gr_unneeded; -#else - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <grp.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_data.h" - -/* Forward */ - -static struct net_data *init(void); -void endgrent(void); - -/* Public */ - -struct group * -getgrent() { - struct net_data *net_data = init(); - - return (getgrent_p(net_data)); -} - -struct group * -getgrnam(const char *name) { - struct net_data *net_data = init(); - - return (getgrnam_p(name, net_data)); -} - -struct group * -getgrgid(gid_t gid) { - struct net_data *net_data = init(); - - return (getgrgid_p(gid, net_data)); -} - -int -setgroupent(int stayopen) { - struct net_data *net_data = init(); - - return (setgroupent_p(stayopen, net_data)); -} - -#ifdef SETGRENT_VOID -void -setgrent(void) { - struct net_data *net_data = init(); - - setgrent_p(net_data); -} -#else -int -setgrent(void) { - struct net_data *net_data = init(); - - return (setgrent_p(net_data)); -} -#endif /* SETGRENT_VOID */ - -void -endgrent() { - struct net_data *net_data = init(); - - endgrent_p(net_data); -} - -int -getgrouplist(GETGROUPLIST_ARGS) { - struct net_data *net_data = init(); - - return (getgrouplist_p(name, basegid, groups, ngroups, net_data)); -} - -/* Shared private. */ - -struct group * -getgrent_p(struct net_data *net_data) { - struct irs_gr *gr; - - if (!net_data || !(gr = net_data->gr)) - return (NULL); - net_data->gr_last = (*gr->next)(gr); - return (net_data->gr_last); -} - -struct group * -getgrnam_p(const char *name, struct net_data *net_data) { - struct irs_gr *gr; - - if (!net_data || !(gr = net_data->gr)) - return (NULL); - if (net_data->gr_stayopen && net_data->gr_last && - !strcmp(net_data->gr_last->gr_name, name)) - return (net_data->gr_last); - net_data->gr_last = (*gr->byname)(gr, name); - if (!net_data->gr_stayopen) - endgrent(); - return (net_data->gr_last); -} - -struct group * -getgrgid_p(gid_t gid, struct net_data *net_data) { - struct irs_gr *gr; - - if (!net_data || !(gr = net_data->gr)) - return (NULL); - if (net_data->gr_stayopen && net_data->gr_last && - (gid_t)net_data->gr_last->gr_gid == gid) - return (net_data->gr_last); - net_data->gr_last = (*gr->bygid)(gr, gid); - if (!net_data->gr_stayopen) - endgrent(); - return (net_data->gr_last); -} - -int -setgroupent_p(int stayopen, struct net_data *net_data) { - struct irs_gr *gr; - - if (!net_data || !(gr = net_data->gr)) - return (0); - (*gr->rewind)(gr); - net_data->gr_stayopen = (stayopen != 0); - if (stayopen == 0) - net_data_minimize(net_data); - return (1); -} - -#ifdef SETGRENT_VOID -void -setgrent_p(struct net_data *net_data) { - (void)setgroupent_p(0, net_data); -} -#else -int -setgrent_p(struct net_data *net_data) { - return (setgroupent_p(0, net_data)); -} -#endif /* SETGRENT_VOID */ - -void -endgrent_p(struct net_data *net_data) { - struct irs_gr *gr; - - if ((net_data != NULL) && ((gr = net_data->gr) != NULL)) - (*gr->minimize)(gr); -} - -int -getgrouplist_p(const char *name, gid_t basegid, gid_t *groups, int *ngroups, - struct net_data *net_data) { - struct irs_gr *gr; - - if (!net_data || !(gr = net_data->gr)) { - *ngroups = 0; - return (-1); - } - return ((*gr->list)(gr, name, basegid, groups, ngroups)); -} - -/* Private */ - -static struct net_data * -init() { - struct net_data *net_data; - - if (!(net_data = net_data_init(NULL))) - goto error; - if (!net_data->gr) { - net_data->gr = (*net_data->irs->gr_map)(net_data->irs); - - if (!net_data->gr || !net_data->res) { - error: - errno = EIO; - return (NULL); - } - (*net_data->gr->res_set)(net_data->gr, net_data->res, - NULL); - } - - return (net_data); -} - -#endif /* WANT_IRS_GR */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getgrent_r.c b/contrib/bind9/lib/bind/irs/getgrent_r.c deleted file mode 100644 index 1f7d94d..0000000 --- a/contrib/bind9/lib/bind/irs/getgrent_r.c +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1998-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getgrent_r.c,v 1.6.18.1 2005/04/27 05:00:57 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <port_before.h> -#if !defined(_REENTRANT) || !defined(DO_PTHREADS) || !defined(WANT_IRS_PW) - static int getgrent_r_not_required = 0; -#else -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <sys/types.h> -#if (defined(POSIX_GETGRNAM_R) || defined(POSIX_GETGRGID_R)) && \ - defined(_POSIX_PTHREAD_SEMANTICS) - /* turn off solaris remapping in <grp.h> */ -#define _UNIX95 -#undef _POSIX_PTHREAD_SEMANTICS -#include <grp.h> -#define _POSIX_PTHREAD_SEMANTICS 1 -#else -#include <grp.h> -#endif -#include <sys/param.h> -#include <port_after.h> - -#ifdef GROUP_R_RETURN - -static int -copy_group(struct group *, struct group *, char *buf, int buflen); - -/* POSIX 1003.1c */ -#ifdef POSIX_GETGRNAM_R -int -__posix_getgrnam_r(const char *name, struct group *gptr, - char *buf, int buflen, struct group **result) { -#else -int -getgrnam_r(const char *name, struct group *gptr, - char *buf, size_t buflen, struct group **result) { -#endif - struct group *ge = getgrnam(name); - int res; - - if (ge == NULL) { - *result = NULL; - return (0); - } - - res = copy_group(ge, gptr, buf, buflen); - *result = res ? NULL : gptr; - return (res); -} - -#ifdef POSIX_GETGRNAM_R -struct group * -getgrnam_r(const char *name, struct group *gptr, - char *buf, int buflen) { - struct group *ge = getgrnam(name); - int res; - - if (ge == NULL) - return (NULL); - res = copy_group(ge, gptr, buf, buflen); - return (res ? NULL : gptr); -} -#endif /* POSIX_GETGRNAM_R */ - -/* POSIX 1003.1c */ -#ifdef POSIX_GETGRGID_R -int -__posix_getgrgid_r(gid_t gid, struct group *gptr, - char *buf, int buflen, struct group **result) { -#else /* POSIX_GETGRGID_R */ -int -getgrgid_r(gid_t gid, struct group *gptr, - char *buf, size_t buflen, struct group **result) { -#endif /* POSIX_GETGRGID_R */ - struct group *ge = getgrgid(gid); - int res; - - if (ge == NULL) { - *result = NULL; - return (0); - } - - res = copy_group(ge, gptr, buf, buflen); - *result = res ? NULL : gptr; - return (res); -} - -#ifdef POSIX_GETGRGID_R -struct group * -getgrgid_r(gid_t gid, struct group *gptr, - char *buf, int buflen) { - struct group *ge = getgrgid(gid); - int res; - - if (ge == NULL) - return (NULL); - - res = copy_group(ge, gptr, buf, buflen); - return (res ? NULL : gptr); -} -#endif - -/*% - * These assume a single context is in operation per thread. - * If this is not the case we will need to call irs directly - * rather than through the base functions. - */ - -GROUP_R_RETURN -getgrent_r(struct group *gptr, GROUP_R_ARGS) { - struct group *ge = getgrent(); - int res; - - if (ge == NULL) { - return (GROUP_R_BAD); - } - - res = copy_group(ge, gptr, buf, buflen); - return (res ? GROUP_R_BAD : GROUP_R_OK); -} - -GROUP_R_SET_RETURN -setgrent_r(GROUP_R_ENT_ARGS) { - - setgrent(); -#ifdef GROUP_R_SET_RESULT - return (GROUP_R_SET_RESULT); -#endif -} - -GROUP_R_END_RETURN -endgrent_r(GROUP_R_ENT_ARGS) { - - endgrent(); - GROUP_R_END_RESULT(GROUP_R_OK); -} - - -#if 0 - /* XXX irs does not have a fgetgrent() */ -GROUP_R_RETURN -fgetgrent_r(FILE *f, struct group *gptr, GROUP_R_ARGS) { - struct group *ge = fgetgrent(f); - int res; - - if (ge == NULL) - return (GROUP_R_BAD); - - res = copy_group(ge, gptr, buf, buflen); - return (res ? GROUP_R_BAD : GROUP_R_OK); -} -#endif - -/* Private */ - -static int -copy_group(struct group *ge, struct group *gptr, char *buf, int buflen) { - char *cp; - int i, n; - int numptr, len; - - /* Find out the amount of space required to store the answer. */ - numptr = 1; /*%< NULL ptr */ - len = (char *)ALIGN(buf) - buf; - for (i = 0; ge->gr_mem[i]; i++, numptr++) { - len += strlen(ge->gr_mem[i]) + 1; - } - len += strlen(ge->gr_name) + 1; - len += strlen(ge->gr_passwd) + 1; - len += numptr * sizeof(char*); - - if (len > buflen) { - errno = ERANGE; - return (ERANGE); - } - - /* copy group id */ - gptr->gr_gid = ge->gr_gid; - - cp = (char *)ALIGN(buf) + numptr * sizeof(char *); - - /* copy official name */ - n = strlen(ge->gr_name) + 1; - strcpy(cp, ge->gr_name); - gptr->gr_name = cp; - cp += n; - - /* copy member list */ - gptr->gr_mem = (char **)ALIGN(buf); - for (i = 0 ; ge->gr_mem[i]; i++) { - n = strlen(ge->gr_mem[i]) + 1; - strcpy(cp, ge->gr_mem[i]); - gptr->gr_mem[i] = cp; - cp += n; - } - gptr->gr_mem[i] = NULL; - - /* copy password */ - n = strlen(ge->gr_passwd) + 1; - strcpy(cp, ge->gr_passwd); - gptr->gr_passwd = cp; - cp += n; - - return (0); -} -#else /* GROUP_R_RETURN */ - static int getgrent_r_unknown_system = 0; -#endif /* GROUP_R_RETURN */ -#endif /* !def(_REENTRANT) || !def(DO_PTHREADS) || !def(WANT_IRS_PW) */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gethostent.c b/contrib/bind9/lib/bind/irs/gethostent.c deleted file mode 100644 index 23aaa30..0000000 --- a/contrib/bind9/lib/bind/irs/gethostent.c +++ /dev/null @@ -1,1070 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: gethostent.c,v 1.6.18.2 2006/01/10 05:09:08 marka Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#if !defined(__BIND_NOSTATIC) - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/ioctl.h> -#include <netinet/in.h> -#include <net/if.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <ctype.h> -#include <errno.h> -#include <stdlib.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include <irs.h> -#include <isc/memcluster.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "irs_data.h" - -/* Definitions */ - -struct pvt { - char * aliases[1]; - char * addrs[2]; - char addr[NS_IN6ADDRSZ]; - char name[NS_MAXDNAME + 1]; - struct hostent host; -}; - -/* Forward */ - -static struct net_data *init(void); -static void freepvt(struct net_data *); -static struct hostent *fakeaddr(const char *, int, struct net_data *); - - -/* Public */ - -struct hostent * -gethostbyname(const char *name) { - struct net_data *net_data = init(); - - return (gethostbyname_p(name, net_data)); -} - -struct hostent * -gethostbyname2(const char *name, int af) { - struct net_data *net_data = init(); - - return (gethostbyname2_p(name, af, net_data)); -} - -struct hostent * -gethostbyaddr(const char *addr, int len, int af) { - struct net_data *net_data = init(); - - return (gethostbyaddr_p(addr, len, af, net_data)); -} - -struct hostent * -gethostent() { - struct net_data *net_data = init(); - - return (gethostent_p(net_data)); -} - -void -sethostent(int stayopen) { - struct net_data *net_data = init(); - sethostent_p(stayopen, net_data); -} - - -void -endhostent() { - struct net_data *net_data = init(); - endhostent_p(net_data); -} - -/* Shared private. */ - -struct hostent * -gethostbyname_p(const char *name, struct net_data *net_data) { - struct hostent *hp; - - if (!net_data) - return (NULL); - - if (net_data->res->options & RES_USE_INET6) { - hp = gethostbyname2_p(name, AF_INET6, net_data); - if (hp) - return (hp); - } - return (gethostbyname2_p(name, AF_INET, net_data)); -} - -struct hostent * -gethostbyname2_p(const char *name, int af, struct net_data *net_data) { - struct irs_ho *ho; - char tmp[NS_MAXDNAME]; - struct hostent *hp; - const char *cp; - char **hap; - - if (!net_data || !(ho = net_data->ho)) - return (NULL); - if (net_data->ho_stayopen && net_data->ho_last && - net_data->ho_last->h_addrtype == af) { - if (ns_samename(name, net_data->ho_last->h_name) == 1) - return (net_data->ho_last); - for (hap = net_data->ho_last->h_aliases; hap && *hap; hap++) - if (ns_samename(name, *hap) == 1) - return (net_data->ho_last); - } - if (!strchr(name, '.') && (cp = res_hostalias(net_data->res, name, - tmp, sizeof tmp))) - name = cp; - if ((hp = fakeaddr(name, af, net_data)) != NULL) - return (hp); - net_data->ho_last = (*ho->byname2)(ho, name, af); - if (!net_data->ho_stayopen) - endhostent(); - return (net_data->ho_last); -} - -struct hostent * -gethostbyaddr_p(const char *addr, int len, int af, struct net_data *net_data) { - struct irs_ho *ho; - char **hap; - - if (!net_data || !(ho = net_data->ho)) - return (NULL); - if (net_data->ho_stayopen && net_data->ho_last && - net_data->ho_last->h_length == len) - for (hap = net_data->ho_last->h_addr_list; - hap && *hap; - hap++) - if (!memcmp(addr, *hap, len)) - return (net_data->ho_last); - net_data->ho_last = (*ho->byaddr)(ho, addr, len, af); - if (!net_data->ho_stayopen) - endhostent(); - return (net_data->ho_last); -} - - -struct hostent * -gethostent_p(struct net_data *net_data) { - struct irs_ho *ho; - struct hostent *hp; - - if (!net_data || !(ho = net_data->ho)) - return (NULL); - while ((hp = (*ho->next)(ho)) != NULL && - hp->h_addrtype == AF_INET6 && - (net_data->res->options & RES_USE_INET6) == 0U) - continue; - net_data->ho_last = hp; - return (net_data->ho_last); -} - - -void -sethostent_p(int stayopen, struct net_data *net_data) { - struct irs_ho *ho; - - if (!net_data || !(ho = net_data->ho)) - return; - freepvt(net_data); - (*ho->rewind)(ho); - net_data->ho_stayopen = (stayopen != 0); - if (stayopen == 0) - net_data_minimize(net_data); -} - -void -endhostent_p(struct net_data *net_data) { - struct irs_ho *ho; - - if ((net_data != NULL) && ((ho = net_data->ho) != NULL)) - (*ho->minimize)(ho); -} - -#ifndef IN6_IS_ADDR_V4COMPAT -static const unsigned char in6addr_compat[12] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -#define IN6_IS_ADDR_V4COMPAT(x) (!memcmp((x)->s6_addr, in6addr_compat, 12) && \ - ((x)->s6_addr[12] != 0 || \ - (x)->s6_addr[13] != 0 || \ - (x)->s6_addr[14] != 0 || \ - ((x)->s6_addr[15] != 0 && \ - (x)->s6_addr[15] != 1))) -#endif -#ifndef IN6_IS_ADDR_V4MAPPED -#define IN6_IS_ADDR_V4MAPPED(x) (!memcmp((x)->s6_addr, in6addr_mapped, 12)) -#endif - -static const unsigned char in6addr_mapped[12] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff }; - -static int scan_interfaces(int *, int *); -static struct hostent *copyandmerge(struct hostent *, struct hostent *, int, int *); - -/*% - * Public functions - */ - -/*% - * AI_V4MAPPED + AF_INET6 - * If no IPv6 address then a query for IPv4 and map returned values. - * - * AI_ALL + AI_V4MAPPED + AF_INET6 - * Return IPv6 and IPv4 mapped. - * - * AI_ADDRCONFIG - * Only return IPv6 / IPv4 address if there is an interface of that - * type active. - */ - -struct hostent * -getipnodebyname(const char *name, int af, int flags, int *error_num) { - int have_v4 = 1, have_v6 = 1; - struct in_addr in4; - struct in6_addr in6; - struct hostent he, *he1 = NULL, *he2 = NULL, *he3; - int v4 = 0, v6 = 0; - struct net_data *net_data = init(); - u_long options; - int tmp_err; - - if (net_data == NULL) { - *error_num = NO_RECOVERY; - return (NULL); - } - - /* If we care about active interfaces then check. */ - if ((flags & AI_ADDRCONFIG) != 0) - if (scan_interfaces(&have_v4, &have_v6) == -1) { - *error_num = NO_RECOVERY; - return (NULL); - } - - /* Check for literal address. */ - if ((v4 = inet_pton(AF_INET, name, &in4)) != 1) - v6 = inet_pton(AF_INET6, name, &in6); - - /* Impossible combination? */ - - if ((af == AF_INET6 && (flags & AI_V4MAPPED) == 0 && v4 == 1) || - (af == AF_INET && v6 == 1) || - (have_v4 == 0 && v4 == 1) || - (have_v6 == 0 && v6 == 1) || - (have_v4 == 0 && af == AF_INET) || - (have_v6 == 0 && af == AF_INET6)) { - *error_num = HOST_NOT_FOUND; - return (NULL); - } - - /* Literal address? */ - if (v4 == 1 || v6 == 1) { - char *addr_list[2]; - char *aliases[1]; - - DE_CONST(name, he.h_name); - he.h_addr_list = addr_list; - he.h_addr_list[0] = (v4 == 1) ? (char *)&in4 : (char *)&in6; - he.h_addr_list[1] = NULL; - he.h_aliases = aliases; - he.h_aliases[0] = NULL; - he.h_length = (v4 == 1) ? INADDRSZ : IN6ADDRSZ; - he.h_addrtype = (v4 == 1) ? AF_INET : AF_INET6; - return (copyandmerge(&he, NULL, af, error_num)); - } - - options = net_data->res->options; - net_data->res->options &= ~RES_USE_INET6; - - tmp_err = NO_RECOVERY; - if (have_v6 && af == AF_INET6) { - he2 = gethostbyname2_p(name, AF_INET6, net_data); - if (he2 != NULL) { - he1 = copyandmerge(he2, NULL, af, error_num); - if (he1 == NULL) - return (NULL); - he2 = NULL; - } else { - tmp_err = net_data->res->res_h_errno; - } - } - - if (have_v4 && - ((af == AF_INET) || - (af == AF_INET6 && (flags & AI_V4MAPPED) != 0 && - (he1 == NULL || (flags & AI_ALL) != 0)))) { - he2 = gethostbyname2_p(name, AF_INET, net_data); - if (he1 == NULL && he2 == NULL) { - *error_num = net_data->res->res_h_errno; - return (NULL); - } - } else - *error_num = tmp_err; - - net_data->res->options = options; - - he3 = copyandmerge(he1, he2, af, error_num); - - if (he1 != NULL) - freehostent(he1); - return (he3); -} - -struct hostent * -getipnodebyaddr(const void *src, size_t len, int af, int *error_num) { - struct hostent *he1, *he2; - struct net_data *net_data = init(); - - /* Sanity Checks. */ - if (src == NULL) { - *error_num = NO_RECOVERY; - return (NULL); - } - - switch (af) { - case AF_INET: - if (len != (size_t)INADDRSZ) { - *error_num = NO_RECOVERY; - return (NULL); - } - break; - case AF_INET6: - if (len != (size_t)IN6ADDRSZ) { - *error_num = NO_RECOVERY; - return (NULL); - } - break; - default: - *error_num = NO_RECOVERY; - return (NULL); - } - - /* - * Lookup IPv4 and IPv4 mapped/compatible addresses - */ - if ((af == AF_INET6 && - IN6_IS_ADDR_V4COMPAT((const struct in6_addr *)src)) || - (af == AF_INET6 && - IN6_IS_ADDR_V4MAPPED((const struct in6_addr *)src)) || - (af == AF_INET)) { - const char *cp = src; - - if (af == AF_INET6) - cp += 12; - he1 = gethostbyaddr_p(cp, 4, AF_INET, net_data); - if (he1 == NULL) { - *error_num = net_data->res->res_h_errno; - return (NULL); - } - he2 = copyandmerge(he1, NULL, af, error_num); - if (he2 == NULL) - return (NULL); - /* - * Restore original address if mapped/compatible. - */ - if (af == AF_INET6) - memcpy(he1->h_addr, src, len); - return (he2); - } - - /* - * Lookup IPv6 address. - */ - if (memcmp((const struct in6_addr *)src, &in6addr_any, 16) == 0) { - *error_num = HOST_NOT_FOUND; - return (NULL); - } - - he1 = gethostbyaddr_p(src, 16, AF_INET6, net_data); - if (he1 == NULL) { - *error_num = net_data->res->res_h_errno; - return (NULL); - } - return (copyandmerge(he1, NULL, af, error_num)); -} - -void -freehostent(struct hostent *he) { - char **cpp; - int names = 1; - int addresses = 1; - - memput(he->h_name, strlen(he->h_name) + 1); - - cpp = he->h_addr_list; - while (*cpp != NULL) { - memput(*cpp, (he->h_addrtype == AF_INET) ? - INADDRSZ : IN6ADDRSZ); - *cpp = NULL; - cpp++; - addresses++; - } - - cpp = he->h_aliases; - while (*cpp != NULL) { - memput(*cpp, strlen(*cpp) + 1); - cpp++; - names++; - } - - memput(he->h_aliases, sizeof(char *) * (names)); - memput(he->h_addr_list, sizeof(char *) * (addresses)); - memput(he, sizeof *he); -} - -/*% - * Private - */ - -/*% - * Scan the interface table and set have_v4 and have_v6 depending - * upon whether there are IPv4 and IPv6 interface addresses. - * - * Returns: - * 0 on success - * -1 on failure. - */ - -#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR) && \ - !defined(IRIX_EMUL_IOCTL_SIOCGIFCONF) - -#ifdef __hpux -#define lifc_len iflc_len -#define lifc_buf iflc_buf -#define lifc_req iflc_req -#define LIFCONF if_laddrconf -#else -#define SETFAMILYFLAGS -#define LIFCONF lifconf -#endif - -#ifdef __hpux -#define lifr_addr iflr_addr -#define lifr_name iflr_name -#define lifr_dstaddr iflr_dstaddr -#define lifr_flags iflr_flags -#define ss_family sa_family -#define LIFREQ if_laddrreq -#else -#define LIFREQ lifreq -#endif - -static void -scan_interfaces6(int *have_v4, int *have_v6) { - struct LIFCONF lifc; - struct LIFREQ lifreq; - struct in_addr in4; - struct in6_addr in6; - char *buf = NULL, *cp, *cplim; - static unsigned int bufsiz = 4095; - int s, cpsize, n; - - /* Get interface list from system. */ - if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) - goto cleanup; - - /* - * Grow buffer until large enough to contain all interface - * descriptions. - */ - for (;;) { - buf = memget(bufsiz); - if (buf == NULL) - goto cleanup; -#ifdef SETFAMILYFLAGS - lifc.lifc_family = AF_UNSPEC; /*%< request all families */ - lifc.lifc_flags = 0; -#endif - lifc.lifc_len = bufsiz; - lifc.lifc_buf = buf; - if ((n = ioctl(s, SIOCGLIFCONF, (char *)&lifc)) != -1) { - /* - * Some OS's just return what will fit rather - * than set EINVAL if the buffer is too small - * to fit all the interfaces in. If - * lifc.lifc_len is too near to the end of the - * buffer we will grow it just in case and - * retry. - */ - if (lifc.lifc_len + 2 * sizeof(lifreq) < bufsiz) - break; - } - if ((n == -1) && errno != EINVAL) - goto cleanup; - - if (bufsiz > 1000000) - goto cleanup; - - memput(buf, bufsiz); - bufsiz += 4096; - } - - /* Parse system's interface list. */ - cplim = buf + lifc.lifc_len; /*%< skip over if's with big ifr_addr's */ - for (cp = buf; - (*have_v4 == 0 || *have_v6 == 0) && cp < cplim; - cp += cpsize) { - memcpy(&lifreq, cp, sizeof lifreq); -#ifdef HAVE_SA_LEN -#ifdef FIX_ZERO_SA_LEN - if (lifreq.lifr_addr.sa_len == 0) - lifreq.lifr_addr.sa_len = 16; -#endif -#ifdef HAVE_MINIMUM_IFREQ - cpsize = sizeof lifreq; - if (lifreq.lifr_addr.sa_len > sizeof (struct sockaddr)) - cpsize += (int)lifreq.lifr_addr.sa_len - - (int)(sizeof (struct sockaddr)); -#else - cpsize = sizeof lifreq.lifr_name + lifreq.lifr_addr.sa_len; -#endif /* HAVE_MINIMUM_IFREQ */ -#elif defined SIOCGIFCONF_ADDR - cpsize = sizeof lifreq; -#else - cpsize = sizeof lifreq.lifr_name; - /* XXX maybe this should be a hard error? */ - if (ioctl(s, SIOCGLIFADDR, (char *)&lifreq) < 0) - continue; -#endif - switch (lifreq.lifr_addr.ss_family) { - case AF_INET: - if (*have_v4 == 0) { - memcpy(&in4, - &((struct sockaddr_in *) - &lifreq.lifr_addr)->sin_addr, - sizeof in4); - if (in4.s_addr == INADDR_ANY) - break; - n = ioctl(s, SIOCGLIFFLAGS, (char *)&lifreq); - if (n < 0) - break; - if ((lifreq.lifr_flags & IFF_UP) == 0) - break; - *have_v4 = 1; - } - break; - case AF_INET6: - if (*have_v6 == 0) { - memcpy(&in6, - &((struct sockaddr_in6 *) - &lifreq.lifr_addr)->sin6_addr, sizeof in6); - if (memcmp(&in6, &in6addr_any, sizeof in6) == 0) - break; - n = ioctl(s, SIOCGLIFFLAGS, (char *)&lifreq); - if (n < 0) - break; - if ((lifreq.lifr_flags & IFF_UP) == 0) - break; - *have_v6 = 1; - } - break; - } - } - if (buf != NULL) - memput(buf, bufsiz); - close(s); - /* printf("scan interface -> 4=%d 6=%d\n", *have_v4, *have_v6); */ - return; - cleanup: - if (buf != NULL) - memput(buf, bufsiz); - if (s != -1) - close(s); - /* printf("scan interface -> 4=%d 6=%d\n", *have_v4, *have_v6); */ - return; -} -#endif - -#if ( defined(__linux__) || defined(__linux) || defined(LINUX) ) -#ifndef IF_NAMESIZE -# ifdef IFNAMSIZ -# define IF_NAMESIZE IFNAMSIZ -# else -# define IF_NAMESIZE 16 -# endif -#endif -static void -scan_linux6(int *have_v6) { - FILE *proc = NULL; - char address[33]; - char name[IF_NAMESIZE+1]; - int ifindex, prefix, flag3, flag4; - - proc = fopen("/proc/net/if_inet6", "r"); - if (proc == NULL) - return; - - if (fscanf(proc, "%32[a-f0-9] %x %x %x %x %16s\n", - address, &ifindex, &prefix, &flag3, &flag4, name) == 6) - *have_v6 = 1; - fclose(proc); - return; -} -#endif - -static int -scan_interfaces(int *have_v4, int *have_v6) { - struct ifconf ifc; - union { - char _pad[256]; /*%< leave space for IPv6 addresses */ - struct ifreq ifreq; - } u; - struct in_addr in4; - struct in6_addr in6; - char *buf = NULL, *cp, *cplim; - static unsigned int bufsiz = 4095; - int s, n; - size_t cpsize; - - /* Set to zero. Used as loop terminators below. */ - *have_v4 = *have_v6 = 0; - -#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR) && \ - !defined(IRIX_EMUL_IOCTL_SIOCGIFCONF) - /* - * Try to scan the interfaces using IPv6 ioctls(). - */ - scan_interfaces6(have_v4, have_v6); - if (*have_v4 != 0 && *have_v6 != 0) - return (0); -#endif -#ifdef __linux - scan_linux6(have_v6); -#endif - - /* Get interface list from system. */ - if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) - goto err_ret; - - /* - * Grow buffer until large enough to contain all interface - * descriptions. - */ - for (;;) { - buf = memget(bufsiz); - if (buf == NULL) - goto err_ret; - ifc.ifc_len = bufsiz; - ifc.ifc_buf = buf; -#ifdef IRIX_EMUL_IOCTL_SIOCGIFCONF - /* - * This is a fix for IRIX OS in which the call to ioctl with - * the flag SIOCGIFCONF may not return an entry for all the - * interfaces like most flavors of Unix. - */ - if (emul_ioctl(&ifc) >= 0) - break; -#else - if ((n = ioctl(s, SIOCGIFCONF, (char *)&ifc)) != -1) { - /* - * Some OS's just return what will fit rather - * than set EINVAL if the buffer is too small - * to fit all the interfaces in. If - * ifc.ifc_len is too near to the end of the - * buffer we will grow it just in case and - * retry. - */ - if (ifc.ifc_len + 2 * sizeof(u.ifreq) < bufsiz) - break; - } -#endif - if ((n == -1) && errno != EINVAL) - goto err_ret; - - if (bufsiz > 1000000) - goto err_ret; - - memput(buf, bufsiz); - bufsiz += 4096; - } - - /* Parse system's interface list. */ - cplim = buf + ifc.ifc_len; /*%< skip over if's with big ifr_addr's */ - for (cp = buf; - (*have_v4 == 0 || *have_v6 == 0) && cp < cplim; - cp += cpsize) { - memcpy(&u.ifreq, cp, sizeof u.ifreq); -#ifdef HAVE_SA_LEN -#ifdef FIX_ZERO_SA_LEN - if (u.ifreq.ifr_addr.sa_len == 0) - u.ifreq.ifr_addr.sa_len = 16; -#endif -#ifdef HAVE_MINIMUM_IFREQ - cpsize = sizeof u.ifreq; - if (u.ifreq.ifr_addr.sa_len > sizeof (struct sockaddr)) - cpsize += (int)u.ifreq.ifr_addr.sa_len - - (int)(sizeof (struct sockaddr)); -#else - cpsize = sizeof u.ifreq.ifr_name + u.ifreq.ifr_addr.sa_len; -#endif /* HAVE_MINIMUM_IFREQ */ - if (cpsize > sizeof u.ifreq && cpsize <= sizeof u) - memcpy(&u.ifreq, cp, cpsize); -#elif defined SIOCGIFCONF_ADDR - cpsize = sizeof u.ifreq; -#else - cpsize = sizeof u.ifreq.ifr_name; - /* XXX maybe this should be a hard error? */ - if (ioctl(s, SIOCGIFADDR, (char *)&u.ifreq) < 0) - continue; -#endif - switch (u.ifreq.ifr_addr.sa_family) { - case AF_INET: - if (*have_v4 == 0) { - memcpy(&in4, - &((struct sockaddr_in *) - &u.ifreq.ifr_addr)->sin_addr, - sizeof in4); - if (in4.s_addr == INADDR_ANY) - break; - n = ioctl(s, SIOCGIFFLAGS, (char *)&u.ifreq); - if (n < 0) - break; - if ((u.ifreq.ifr_flags & IFF_UP) == 0) - break; - *have_v4 = 1; - } - break; - case AF_INET6: - if (*have_v6 == 0) { - memcpy(&in6, - &((struct sockaddr_in6 *) - &u.ifreq.ifr_addr)->sin6_addr, - sizeof in6); - if (memcmp(&in6, &in6addr_any, sizeof in6) == 0) - break; - n = ioctl(s, SIOCGIFFLAGS, (char *)&u.ifreq); - if (n < 0) - break; - if ((u.ifreq.ifr_flags & IFF_UP) == 0) - break; - *have_v6 = 1; - } - break; - } - } - if (buf != NULL) - memput(buf, bufsiz); - close(s); - /* printf("scan interface -> 4=%d 6=%d\n", *have_v4, *have_v6); */ - return (0); - err_ret: - if (buf != NULL) - memput(buf, bufsiz); - if (s != -1) - close(s); - /* printf("scan interface -> 4=%d 6=%d\n", *have_v4, *have_v6); */ - return (-1); -} - -static struct hostent * -copyandmerge(struct hostent *he1, struct hostent *he2, int af, int *error_num) { - struct hostent *he = NULL; - int addresses = 1; /*%< NULL terminator */ - int names = 1; /*%< NULL terminator */ - int len = 0; - char **cpp, **npp; - - /* - * Work out array sizes; - */ - if (he1 != NULL) { - cpp = he1->h_addr_list; - while (*cpp != NULL) { - addresses++; - cpp++; - } - cpp = he1->h_aliases; - while (*cpp != NULL) { - names++; - cpp++; - } - } - - if (he2 != NULL) { - cpp = he2->h_addr_list; - while (*cpp != NULL) { - addresses++; - cpp++; - } - if (he1 == NULL) { - cpp = he2->h_aliases; - while (*cpp != NULL) { - names++; - cpp++; - } - } - } - - if (addresses == 1) { - *error_num = NO_ADDRESS; - return (NULL); - } - - he = memget(sizeof *he); - if (he == NULL) - goto no_recovery; - - he->h_addr_list = memget(sizeof(char *) * (addresses)); - if (he->h_addr_list == NULL) - goto cleanup0; - memset(he->h_addr_list, 0, sizeof(char *) * (addresses)); - - /* copy addresses */ - npp = he->h_addr_list; - if (he1 != NULL) { - cpp = he1->h_addr_list; - while (*cpp != NULL) { - *npp = memget((af == AF_INET) ? INADDRSZ : IN6ADDRSZ); - if (*npp == NULL) - goto cleanup1; - /* convert to mapped if required */ - if (af == AF_INET6 && he1->h_addrtype == AF_INET) { - memcpy(*npp, in6addr_mapped, - sizeof in6addr_mapped); - memcpy(*npp + sizeof in6addr_mapped, *cpp, - INADDRSZ); - } else { - memcpy(*npp, *cpp, - (af == AF_INET) ? INADDRSZ : IN6ADDRSZ); - } - cpp++; - npp++; - } - } - - if (he2 != NULL) { - cpp = he2->h_addr_list; - while (*cpp != NULL) { - *npp = memget((af == AF_INET) ? INADDRSZ : IN6ADDRSZ); - if (*npp == NULL) - goto cleanup1; - /* convert to mapped if required */ - if (af == AF_INET6 && he2->h_addrtype == AF_INET) { - memcpy(*npp, in6addr_mapped, - sizeof in6addr_mapped); - memcpy(*npp + sizeof in6addr_mapped, *cpp, - INADDRSZ); - } else { - memcpy(*npp, *cpp, - (af == AF_INET) ? INADDRSZ : IN6ADDRSZ); - } - cpp++; - npp++; - } - } - - he->h_aliases = memget(sizeof(char *) * (names)); - if (he->h_aliases == NULL) - goto cleanup1; - memset(he->h_aliases, 0, sizeof(char *) * (names)); - - /* copy aliases */ - npp = he->h_aliases; - cpp = (he1 != NULL) ? he1->h_aliases : he2->h_aliases; - while (*cpp != NULL) { - len = strlen (*cpp) + 1; - *npp = memget(len); - if (*npp == NULL) - goto cleanup2; - strcpy(*npp, *cpp); - npp++; - cpp++; - } - - /* copy hostname */ - he->h_name = memget(strlen((he1 != NULL) ? - he1->h_name : he2->h_name) + 1); - if (he->h_name == NULL) - goto cleanup2; - strcpy(he->h_name, (he1 != NULL) ? he1->h_name : he2->h_name); - - /* set address type and length */ - he->h_addrtype = af; - he->h_length = (af == AF_INET) ? INADDRSZ : IN6ADDRSZ; - return(he); - - cleanup2: - cpp = he->h_aliases; - while (*cpp != NULL) { - memput(*cpp, strlen(*cpp) + 1); - cpp++; - } - memput(he->h_aliases, sizeof(char *) * (names)); - - cleanup1: - cpp = he->h_addr_list; - while (*cpp != NULL) { - memput(*cpp, (af == AF_INET) ? INADDRSZ : IN6ADDRSZ); - *cpp = NULL; - cpp++; - } - memput(he->h_addr_list, sizeof(char *) * (addresses)); - - cleanup0: - memput(he, sizeof *he); - - no_recovery: - *error_num = NO_RECOVERY; - return (NULL); -} - -static struct net_data * -init() { - struct net_data *net_data; - - if (!(net_data = net_data_init(NULL))) - goto error; - if (!net_data->ho) { - net_data->ho = (*net_data->irs->ho_map)(net_data->irs); - if (!net_data->ho || !net_data->res) { - error: - errno = EIO; - if (net_data && net_data->res) - RES_SET_H_ERRNO(net_data->res, NETDB_INTERNAL); - return (NULL); - } - - (*net_data->ho->res_set)(net_data->ho, net_data->res, NULL); - } - - return (net_data); -} - -static void -freepvt(struct net_data *net_data) { - if (net_data->ho_data) { - free(net_data->ho_data); - net_data->ho_data = NULL; - } -} - -static struct hostent * -fakeaddr(const char *name, int af, struct net_data *net_data) { - struct pvt *pvt; - - freepvt(net_data); - net_data->ho_data = malloc(sizeof (struct pvt)); - if (!net_data->ho_data) { - errno = ENOMEM; - RES_SET_H_ERRNO(net_data->res, NETDB_INTERNAL); - return (NULL); - } - pvt = net_data->ho_data; -#ifndef __bsdi__ - /* - * Unlike its forebear(inet_aton), our friendly inet_pton() is strict - * in its interpretation of its input, and it will only return "1" if - * the input string is a formally valid(and thus unambiguous with - * respect to host names) internet address specification for this AF. - * - * This means "telnet 0xdeadbeef" and "telnet 127.1" are dead now. - */ - if (inet_pton(af, name, pvt->addr) != 1) { -#else - /* BSDI XXX - * We put this back to inet_aton -- we really want the old behavior - * Long live 127.1... - */ - if ((af != AF_INET || - inet_aton(name, (struct in_addr *)pvt->addr) != 1) && - inet_pton(af, name, pvt->addr) != 1) { -#endif - RES_SET_H_ERRNO(net_data->res, HOST_NOT_FOUND); - return (NULL); - } - strncpy(pvt->name, name, NS_MAXDNAME); - pvt->name[NS_MAXDNAME] = '\0'; - if (af == AF_INET && (net_data->res->options & RES_USE_INET6) != 0U) { - map_v4v6_address(pvt->addr, pvt->addr); - af = AF_INET6; - } - pvt->host.h_addrtype = af; - switch(af) { - case AF_INET: - pvt->host.h_length = NS_INADDRSZ; - break; - case AF_INET6: - pvt->host.h_length = NS_IN6ADDRSZ; - break; - default: - errno = EAFNOSUPPORT; - RES_SET_H_ERRNO(net_data->res, NETDB_INTERNAL); - return (NULL); - } - pvt->host.h_name = pvt->name; - pvt->host.h_aliases = pvt->aliases; - pvt->aliases[0] = NULL; - pvt->addrs[0] = (char *)pvt->addr; - pvt->addrs[1] = NULL; - pvt->host.h_addr_list = pvt->addrs; - RES_SET_H_ERRNO(net_data->res, NETDB_SUCCESS); - return (&pvt->host); -} - -#ifdef grot /*%< for future use in gethostbyaddr(), for "SUNSECURITY" */ - struct hostent *rhp; - char **haddr; - u_long old_options; - char hname2[MAXDNAME+1]; - - if (af == AF_INET) { - /* - * turn off search as the name should be absolute, - * 'localhost' should be matched by defnames - */ - strncpy(hname2, hp->h_name, MAXDNAME); - hname2[MAXDNAME] = '\0'; - old_options = net_data->res->options; - net_data->res->options &= ~RES_DNSRCH; - net_data->res->options |= RES_DEFNAMES; - if (!(rhp = gethostbyname(hname2))) { - net_data->res->options = old_options; - RES_SET_H_ERRNO(net_data->res, HOST_NOT_FOUND); - return (NULL); - } - net_data->res->options = old_options; - for (haddr = rhp->h_addr_list; *haddr; haddr++) - if (!memcmp(*haddr, addr, INADDRSZ)) - break; - if (!*haddr) { - RES_SET_H_ERRNO(net_data->res, HOST_NOT_FOUND); - return (NULL); - } - } -#endif /* grot */ -#endif /*__BIND_NOSTATIC*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/gethostent_r.c b/contrib/bind9/lib/bind/irs/gethostent_r.c deleted file mode 100644 index 96d2a57..0000000 --- a/contrib/bind9/lib/bind/irs/gethostent_r.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1998-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: gethostent_r.c,v 1.5.18.4 2005/09/03 12:45:14 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <port_before.h> -#if !defined(_REENTRANT) || !defined(DO_PTHREADS) - static int gethostent_r_not_required = 0; -#else -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <netdb.h> -#include <sys/param.h> -#include <port_after.h> - -#ifdef HOST_R_RETURN - -static HOST_R_RETURN -copy_hostent(struct hostent *, struct hostent *, HOST_R_COPY_ARGS); - -HOST_R_RETURN -gethostbyname_r(const char *name, struct hostent *hptr, HOST_R_ARGS) { - struct hostent *he = gethostbyname(name); -#ifdef HOST_R_SETANSWER - int n = 0; -#endif - -#ifdef HOST_R_ERRNO - HOST_R_ERRNO; -#endif - -#ifdef HOST_R_SETANSWER - if (he == NULL || (n = copy_hostent(he, hptr, HOST_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = hptr; - - return (n); -#else - if (he == NULL) - return (HOST_R_BAD); - - return (copy_hostent(he, hptr, HOST_R_COPY)); -#endif -} - -HOST_R_RETURN -gethostbyaddr_r(const char *addr, int len, int type, - struct hostent *hptr, HOST_R_ARGS) { - struct hostent *he = gethostbyaddr(addr, len, type); -#ifdef HOST_R_SETANSWER - int n = 0; -#endif - -#ifdef HOST_R_ERRNO - HOST_R_ERRNO; -#endif - -#ifdef HOST_R_SETANSWER - if (he == NULL || (n = copy_hostent(he, hptr, HOST_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = hptr; - - return (n); -#else - if (he == NULL) - return (HOST_R_BAD); - - return (copy_hostent(he, hptr, HOST_R_COPY)); -#endif -} - -/*% - * These assume a single context is in operation per thread. - * If this is not the case we will need to call irs directly - * rather than through the base functions. - */ - -HOST_R_RETURN -gethostent_r(struct hostent *hptr, HOST_R_ARGS) { - struct hostent *he = gethostent(); -#ifdef HOST_R_SETANSWER - int n = 0; -#endif - -#ifdef HOST_R_ERRNO - HOST_R_ERRNO; -#endif - -#ifdef HOST_R_SETANSWER - if (he == NULL || (n = copy_hostent(he, hptr, HOST_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = hptr; - - return (n); -#else - if (he == NULL) - return (HOST_R_BAD); - - return (copy_hostent(he, hptr, HOST_R_COPY)); -#endif -} - -HOST_R_SET_RETURN -#ifdef HOST_R_ENT_ARGS -sethostent_r(int stay_open, HOST_R_ENT_ARGS) -#else -sethostent_r(int stay_open) -#endif -{ -#ifdef HOST_R_ENT_ARGS - UNUSED(hdptr); -#endif - sethostent(stay_open); -#ifdef HOST_R_SET_RESULT - return (HOST_R_SET_RESULT); -#endif -} - -HOST_R_END_RETURN -#ifdef HOST_R_ENT_ARGS -endhostent_r(HOST_R_ENT_ARGS) -#else -endhostent_r(void) -#endif -{ -#ifdef HOST_R_ENT_ARGS - UNUSED(hdptr); -#endif - endhostent(); - HOST_R_END_RESULT(HOST_R_OK); -} - -/* Private */ - -#ifndef HOSTENT_DATA -static HOST_R_RETURN -copy_hostent(struct hostent *he, struct hostent *hptr, HOST_R_COPY_ARGS) { - 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 (HOST_R_BAD); - } - - /* 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 (HOST_R_OK); -} -#else /* !HOSTENT_DATA */ -static int -copy_hostent(struct hostent *he, struct hostent *hptr, HOST_R_COPY_ARGS) { - char *cp, *eob; - int i, n; - - /* copy address size and type */ - hptr->h_addrtype = he->h_addrtype; - n = hptr->h_length = he->h_length; - - /* copy up to first 35 addresses */ - i = 0; - cp = hdptr->hostbuf; - eob = hdptr->hostbuf + sizeof(hdptr->hostbuf); - hptr->h_addr_list = hdptr->h_addr_ptrs; - while (he->h_addr_list[i] && i < (_MAXADDRS)) { - if (n < (eob - cp)) { - memcpy(cp, he->h_addr_list[i], n); - hptr->h_addr_list[i] = cp; - cp += n; - } else { - break; - } - i++; - } - hptr->h_addr_list[i] = NULL; - - /* copy official name */ - if ((n = strlen(he->h_name) + 1) < (eob - cp)) { - strcpy(cp, he->h_name); - hptr->h_name = cp; - cp += n; - } else { - return (-1); - } - - /* copy aliases */ - i = 0; - hptr->h_aliases = hdptr->host_aliases; - while (he->h_aliases[i] && i < (_MAXALIASES-1)) { - if ((n = strlen(he->h_aliases[i]) + 1) < (eob - cp)) { - strcpy(cp, he->h_aliases[i]); - hptr->h_aliases[i] = cp; - cp += n; - } else { - break; - } - i++; - } - hptr->h_aliases[i] = NULL; - - return (HOST_R_OK); -} -#endif /* !HOSTENT_DATA */ -#else /* HOST_R_RETURN */ - static int gethostent_r_unknown_system = 0; -#endif /* HOST_R_RETURN */ -#endif /* !defined(_REENTRANT) || !defined(DO_PTHREADS) */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getnameinfo.c b/contrib/bind9/lib/bind/irs/getnameinfo.c deleted file mode 100644 index 89c8230..0000000 --- a/contrib/bind9/lib/bind/irs/getnameinfo.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Issues to be discussed: - * - Thread safe-ness must be checked - */ - -#if ( defined(__linux__) || defined(__linux) || defined(LINUX) ) -#ifndef IF_NAMESIZE -# ifdef IFNAMSIZ -# define IF_NAMESIZE IFNAMSIZ -# else -# define IF_NAMESIZE 16 -# endif -#endif -#endif - -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * 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 WIDE Project and - * its contributors. - * 4. Neither the name of the project 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 PROJECT 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 PROJECT 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. - */ - -#include <port_before.h> - -#include <sys/types.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> -#include <net/if.h> - -#include <netdb.h> -#include <resolv.h> -#include <string.h> -#include <stddef.h> - -#include <port_after.h> - -/*% - * Note that a_off will be dynamically adjusted so that to be consistent - * with the definition of sockaddr_in{,6}. - * The value presented below is just a guess. - */ -static struct afd { - int a_af; - int a_addrlen; - size_t a_socklen; - int a_off; -} afdl [] = { - /* first entry is linked last... */ - {PF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in), - offsetof(struct sockaddr_in, sin_addr)}, - {PF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6), - offsetof(struct sockaddr_in6, sin6_addr)}, - {0, 0, 0, 0}, -}; - -struct sockinet { -#ifdef HAVE_SA_LEN - u_char si_len; -#endif - u_char si_family; - u_short si_port; -}; - -static int ip6_parsenumeric __P((const struct sockaddr *, const char *, char *, - size_t, int)); -#ifdef HAVE_SIN6_SCOPE_ID -static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t, int)); -#endif - -int -getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) - const struct sockaddr *sa; - size_t salen; - char *host; - size_t hostlen; - char *serv; - size_t servlen; - int flags; -{ - struct afd *afd; - struct servent *sp; - struct hostent *hp; - u_short port; -#ifdef HAVE_SA_LEN - size_t len; -#endif - int family, i; - const char *addr; - char *p; - char numserv[512]; - char numaddr[512]; - const struct sockaddr_in6 *sin6; - - if (sa == NULL) - return EAI_FAIL; - -#ifdef HAVE_SA_LEN - len = sa->sa_len; - if (len != salen) return EAI_FAIL; -#endif - - family = sa->sa_family; - for (i = 0; afdl[i].a_af; i++) - if (afdl[i].a_af == family) { - afd = &afdl[i]; - goto found; - } - return EAI_FAMILY; - - found: - if (salen != afd->a_socklen) return EAI_FAIL; - - port = ((const struct sockinet *)sa)->si_port; /*%< network byte order */ - addr = (const char *)sa + afd->a_off; - - if (serv == NULL || servlen == 0U) { - /* - * rfc2553bis says that serv == NULL or servlen == 0 means that - * the caller does not want the result. - */ - } else if (flags & NI_NUMERICSERV) { - sprintf(numserv, "%d", ntohs(port)); - if (strlen(numserv) > servlen) - return EAI_MEMORY; - strcpy(serv, numserv); - } else { - sp = getservbyport(port, (flags & NI_DGRAM) ? "udp" : "tcp"); - if (sp) { - if (strlen(sp->s_name) + 1 > servlen) - return EAI_MEMORY; - strcpy(serv, sp->s_name); - } else - return EAI_NONAME; - } - - switch (sa->sa_family) { - case AF_INET: - if (ntohl(*(const u_int32_t *)addr) >> IN_CLASSA_NSHIFT == 0) - flags |= NI_NUMERICHOST; - break; - case AF_INET6: - sin6 = (const struct sockaddr_in6 *)sa; - switch (sin6->sin6_addr.s6_addr[0]) { - case 0x00: - if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) - ; - else if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr)) - ; - else - flags |= NI_NUMERICHOST; - break; - default: - if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) - flags |= NI_NUMERICHOST; - else if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) - flags |= NI_NUMERICHOST; - break; - } - break; - } - if (host == NULL || hostlen == 0U) { - /* - * rfc2553bis says that host == NULL or hostlen == 0 means that - * the caller does not want the result. - */ - } else if (flags & NI_NUMERICHOST) { - goto numeric; - } else { - hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af); - - if (hp) { - if (flags & NI_NOFQDN) { - p = strchr(hp->h_name, '.'); - if (p) *p = '\0'; - } - if (strlen(hp->h_name) + 1 > hostlen) - return EAI_MEMORY; - strcpy(host, hp->h_name); - } else { - if (flags & NI_NAMEREQD) - return EAI_NONAME; - numeric: - switch(afd->a_af) { - case AF_INET6: - { - int error; - - if ((error = ip6_parsenumeric(sa, addr, host, - hostlen, - flags)) != 0) - return(error); - break; - } - - default: - if (inet_ntop(afd->a_af, addr, numaddr, - sizeof(numaddr)) == NULL) - return EAI_NONAME; - if (strlen(numaddr) + 1 > hostlen) - return EAI_MEMORY; - strcpy(host, numaddr); - } - } - } - return(0); -} - -static int -ip6_parsenumeric(const struct sockaddr *sa, const char *addr, char *host, - size_t hostlen, int flags) -{ - size_t numaddrlen; - char numaddr[512]; - -#ifndef HAVE_SIN6_SCOPE_ID - UNUSED(sa); - UNUSED(flags); -#endif - - if (inet_ntop(AF_INET6, addr, numaddr, sizeof(numaddr)) - == NULL) - return EAI_SYSTEM; - - numaddrlen = strlen(numaddr); - if (numaddrlen + 1 > hostlen) /*%< don't forget terminator */ - return EAI_MEMORY; - strcpy(host, numaddr); - -#ifdef HAVE_SIN6_SCOPE_ID - if (((const struct sockaddr_in6 *)sa)->sin6_scope_id) { - char scopebuf[MAXHOSTNAMELEN]; /*%< XXX */ - int scopelen; - - /* ip6_sa2str never fails */ - scopelen = ip6_sa2str((const struct sockaddr_in6 *)sa, - scopebuf, sizeof(scopebuf), flags); - - if (scopelen + 1 + numaddrlen + 1 > hostlen) - return EAI_MEMORY; - - /* construct <numeric-addr><delim><scopeid> */ - memcpy(host + numaddrlen + 1, scopebuf, - scopelen); - host[numaddrlen] = SCOPE_DELIMITER; - host[numaddrlen + 1 + scopelen] = '\0'; - } -#endif - - return 0; -} - -#ifdef HAVE_SIN6_SCOPE_ID -/* ARGSUSED */ -static int -ip6_sa2str(const struct sockaddr_in6 *sa6, char *buf, - size_t bufsiz, int flags) -{ -#ifdef USE_IFNAMELINKID - unsigned int ifindex = (unsigned int)sa6->sin6_scope_id; - const struct in6_addr *a6 = &sa6->sin6_addr; -#endif - char tmp[64]; - -#ifdef NI_NUMERICSCOPE - if (flags & NI_NUMERICSCOPE) { - sprintf(tmp, "%u", sa6->sin6_scope_id); - if (bufsiz != 0U) { - strncpy(buf, tmp, bufsiz - 1); - buf[bufsiz - 1] = '\0'; - } - return(strlen(tmp)); - } -#endif - -#ifdef USE_IFNAMELINKID - /* - * For a link-local address, convert the index to an interface - * name, assuming a one-to-one mapping between links and interfaces. - * Note, however, that this assumption is stronger than the - * specification of the scoped address architecture; the - * specficication says that more than one interfaces can belong to - * a single link. - */ - - /* if_indextoname() does not take buffer size. not a good api... */ - if ((IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6)) && - bufsiz >= IF_NAMESIZE) { - char *p = if_indextoname(ifindex, buf); - if (p) { - return(strlen(p)); - } - } -#endif - - /* last resort */ - sprintf(tmp, "%u", sa6->sin6_scope_id); - if (bufsiz != 0U) { - strncpy(buf, tmp, bufsiz - 1); - buf[bufsiz - 1] = '\0'; - } - return(strlen(tmp)); -} -#endif - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getnetent.c b/contrib/bind9/lib/bind/irs/getnetent.c deleted file mode 100644 index 5f7d233..0000000 --- a/contrib/bind9/lib/bind/irs/getnetent.c +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: getnetent.c,v 1.6.18.1 2005/04/27 05:00:58 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#if !defined(__BIND_NOSTATIC) - -#include <sys/types.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> - -#include <ctype.h> -#include <errno.h> -#include <netdb.h> -#include <resolv.h> -#include <stdlib.h> -#include <string.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "irs_data.h" - -/* Definitions */ - -struct pvt { - struct netent netent; - char * aliases[1]; - char name[MAXDNAME + 1]; -}; - -/* Forward */ - -static struct net_data *init(void); -static struct netent *nw_to_net(struct nwent *, struct net_data *); -static void freepvt(struct net_data *); -static struct netent *fakeaddr(const char *, int af, struct net_data *); - -/* Portability */ - -#ifndef INADDR_NONE -# define INADDR_NONE 0xffffffff -#endif - -/* Public */ - -struct netent * -getnetent() { - struct net_data *net_data = init(); - - return (getnetent_p(net_data)); -} - -struct netent * -getnetbyname(const char *name) { - struct net_data *net_data = init(); - - return (getnetbyname_p(name, net_data)); -} - -struct netent * -getnetbyaddr(unsigned long net, int type) { - struct net_data *net_data = init(); - - return (getnetbyaddr_p(net, type, net_data)); -} - -void -setnetent(int stayopen) { - struct net_data *net_data = init(); - - setnetent_p(stayopen, net_data); -} - - -void -endnetent() { - struct net_data *net_data = init(); - - endnetent_p(net_data); -} - -/* Shared private. */ - -struct netent * -getnetent_p(struct net_data *net_data) { - struct irs_nw *nw; - - if (!net_data || !(nw = net_data->nw)) - return (NULL); - net_data->nww_last = (*nw->next)(nw); - net_data->nw_last = nw_to_net(net_data->nww_last, net_data); - return (net_data->nw_last); -} - -struct netent * -getnetbyname_p(const char *name, struct net_data *net_data) { - struct irs_nw *nw; - struct netent *np; - char **nap; - - if (!net_data || !(nw = net_data->nw)) - return (NULL); - if (net_data->nw_stayopen && net_data->nw_last) { - if (!strcmp(net_data->nw_last->n_name, name)) - return (net_data->nw_last); - for (nap = net_data->nw_last->n_aliases; nap && *nap; nap++) - if (!strcmp(name, *nap)) - return (net_data->nw_last); - } - if ((np = fakeaddr(name, AF_INET, net_data)) != NULL) - return (np); - net_data->nww_last = (*nw->byname)(nw, name, AF_INET); - net_data->nw_last = nw_to_net(net_data->nww_last, net_data); - if (!net_data->nw_stayopen) - endnetent(); - return (net_data->nw_last); -} - -struct netent * -getnetbyaddr_p(unsigned long net, int type, struct net_data *net_data) { - struct irs_nw *nw; - u_char addr[4]; - int bits; - - if (!net_data || !(nw = net_data->nw)) - return (NULL); - if (net_data->nw_stayopen && net_data->nw_last) - if (type == net_data->nw_last->n_addrtype && - net == net_data->nw_last->n_net) - return (net_data->nw_last); - - /* cannonize net(host order) */ - if (net < 256UL) { - net <<= 24; - bits = 8; - } else if (net < 65536UL) { - net <<= 16; - bits = 16; - } else if (net < 16777216UL) { - net <<= 8; - bits = 24; - } else - bits = 32; - - /* convert to net order */ - addr[0] = (0xFF000000 & net) >> 24; - addr[1] = (0x00FF0000 & net) >> 16; - addr[2] = (0x0000FF00 & net) >> 8; - addr[3] = (0x000000FF & net); - - /* reduce bits to as close to natural number as possible */ - if ((bits == 32) && (addr[0] < 224) && (addr[3] == 0)) { - if ((addr[0] < 192) && (addr[2] == 0)) { - if ((addr[0] < 128) && (addr[1] == 0)) - bits = 8; - else - bits = 16; - } else { - bits = 24; - } - } - - net_data->nww_last = (*nw->byaddr)(nw, addr, bits, AF_INET); - net_data->nw_last = nw_to_net(net_data->nww_last, net_data); - if (!net_data->nw_stayopen) - endnetent(); - return (net_data->nw_last); -} - - - - -void -setnetent_p(int stayopen, struct net_data *net_data) { - struct irs_nw *nw; - - if (!net_data || !(nw = net_data->nw)) - return; - freepvt(net_data); - (*nw->rewind)(nw); - net_data->nw_stayopen = (stayopen != 0); - if (stayopen == 0) - net_data_minimize(net_data); -} - -void -endnetent_p(struct net_data *net_data) { - struct irs_nw *nw; - - if ((net_data != NULL) && ((nw = net_data->nw) != NULL)) - (*nw->minimize)(nw); -} - -/* Private */ - -static struct net_data * -init() { - struct net_data *net_data; - - if (!(net_data = net_data_init(NULL))) - goto error; - if (!net_data->nw) { - net_data->nw = (*net_data->irs->nw_map)(net_data->irs); - - if (!net_data->nw || !net_data->res) { - error: - errno = EIO; - return (NULL); - } - (*net_data->nw->res_set)(net_data->nw, net_data->res, NULL); - } - - return (net_data); -} - -static void -freepvt(struct net_data *net_data) { - if (net_data->nw_data) { - free(net_data->nw_data); - net_data->nw_data = NULL; - } -} - -static struct netent * -fakeaddr(const char *name, int af, struct net_data *net_data) { - struct pvt *pvt; - const char *cp; - u_long tmp; - - if (af != AF_INET) { - /* XXX should support IPv6 some day */ - errno = EAFNOSUPPORT; - RES_SET_H_ERRNO(net_data->res, NETDB_INTERNAL); - return (NULL); - } - if (!isascii((unsigned char)(name[0])) || - !isdigit((unsigned char)(name[0]))) - return (NULL); - for (cp = name; *cp; ++cp) - if (!isascii(*cp) || (!isdigit((unsigned char)*cp) && *cp != '.')) - return (NULL); - if (*--cp == '.') - return (NULL); - - /* All-numeric, no dot at the end. */ - - tmp = inet_network(name); - if (tmp == INADDR_NONE) { - RES_SET_H_ERRNO(net_data->res, HOST_NOT_FOUND); - return (NULL); - } - - /* Valid network number specified. - * Fake up a netent as if we'd actually - * done a lookup. - */ - freepvt(net_data); - net_data->nw_data = malloc(sizeof (struct pvt)); - if (!net_data->nw_data) { - errno = ENOMEM; - RES_SET_H_ERRNO(net_data->res, NETDB_INTERNAL); - return (NULL); - } - pvt = net_data->nw_data; - - strncpy(pvt->name, name, MAXDNAME); - pvt->name[MAXDNAME] = '\0'; - pvt->netent.n_name = pvt->name; - pvt->netent.n_addrtype = AF_INET; - pvt->netent.n_aliases = pvt->aliases; - pvt->aliases[0] = NULL; - pvt->netent.n_net = tmp; - - return (&pvt->netent); -} - -static struct netent * -nw_to_net(struct nwent *nwent, struct net_data *net_data) { - struct pvt *pvt; - u_long addr = 0; - int i; - int msbyte; - - if (!nwent || nwent->n_addrtype != AF_INET) - return (NULL); - freepvt(net_data); - net_data->nw_data = malloc(sizeof (struct pvt)); - if (!net_data->nw_data) { - errno = ENOMEM; - RES_SET_H_ERRNO(net_data->res, NETDB_INTERNAL); - return (NULL); - } - pvt = net_data->nw_data; - pvt->netent.n_name = nwent->n_name; - pvt->netent.n_aliases = nwent->n_aliases; - pvt->netent.n_addrtype = nwent->n_addrtype; - -/*% - * What this code does: Converts net addresses from network to host form. - * - * msbyte: the index of the most significant byte in the n_addr array. - * - * Shift bytes in significant order into addr. When all signicant - * bytes are in, zero out bits in the LSB that are not part of the network. - */ - msbyte = nwent->n_length / 8 + - ((nwent->n_length % 8) != 0 ? 1 : 0) - 1; - for (i = 0; i <= msbyte; i++) - addr = (addr << 8) | ((unsigned char *)nwent->n_addr)[i]; - i = (32 - nwent->n_length) % 8; - if (i != 0) - addr &= ~((1 << (i + 1)) - 1); - pvt->netent.n_net = addr; - return (&pvt->netent); -} - -#endif /*__BIND_NOSTATIC*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getnetent_r.c b/contrib/bind9/lib/bind/irs/getnetent_r.c deleted file mode 100644 index 7e56ddc..0000000 --- a/contrib/bind9/lib/bind/irs/getnetent_r.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1998-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getnetent_r.c,v 1.4.18.2 2005/09/03 12:45:14 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <port_before.h> -#if !defined(_REENTRANT) || !defined(DO_PTHREADS) - static int getnetent_r_not_required = 0; -#else -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <netdb.h> -#include <sys/param.h> -#include <port_after.h> - -#ifdef NET_R_RETURN - -static NET_R_RETURN -copy_netent(struct netent *, struct netent *, NET_R_COPY_ARGS); - -NET_R_RETURN -getnetbyname_r(const char *name, struct netent *nptr, NET_R_ARGS) { - struct netent *ne = getnetbyname(name); -#ifdef NET_R_SETANSWER - int n = 0; - - if (ne == NULL || (n = copy_netent(ne, nptr, NET_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = ne; - if (ne == NULL) - *h_errnop = h_errno; - return (n); -#else - if (ne == NULL) - return (NET_R_BAD); - - return (copy_netent(ne, nptr, NET_R_COPY)); -#endif -} - -#ifndef GETNETBYADDR_ADDR_T -#define GETNETBYADDR_ADDR_T long -#endif -NET_R_RETURN -getnetbyaddr_r(GETNETBYADDR_ADDR_T addr, int type, struct netent *nptr, NET_R_ARGS) { - struct netent *ne = getnetbyaddr(addr, type); -#ifdef NET_R_SETANSWER - int n = 0; - - if (ne == NULL || (n = copy_netent(ne, nptr, NET_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = ne; - if (ne == NULL) - *h_errnop = h_errno; - return (n); -#else - - if (ne == NULL) - return (NET_R_BAD); - - return (copy_netent(ne, nptr, NET_R_COPY)); -#endif -} - -/*% - * These assume a single context is in operation per thread. - * If this is not the case we will need to call irs directly - * rather than through the base functions. - */ - -NET_R_RETURN -getnetent_r(struct netent *nptr, NET_R_ARGS) { - struct netent *ne = getnetent(); -#ifdef NET_R_SETANSWER - int n = 0; - - if (ne == NULL || (n = copy_netent(ne, nptr, NET_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = ne; - if (ne == NULL) - *h_errnop = h_errno; - return (n); -#else - - if (ne == NULL) - return (NET_R_BAD); - - return (copy_netent(ne, nptr, NET_R_COPY)); -#endif -} - -NET_R_SET_RETURN -#ifdef NET_R_ENT_ARGS -setnetent_r(int stay_open, NET_R_ENT_ARGS) -#else -setnetent_r(int stay_open) -#endif -{ -#ifdef NET_R_ENT_ARGS - UNUSED(ndptr); -#endif - setnetent(stay_open); -#ifdef NET_R_SET_RESULT - return (NET_R_SET_RESULT); -#endif -} - -NET_R_END_RETURN -#ifdef NET_R_ENT_ARGS -endnetent_r(NET_R_ENT_ARGS) -#else -endnetent_r() -#endif -{ -#ifdef NET_R_ENT_ARGS - UNUSED(ndptr); -#endif - endnetent(); - NET_R_END_RESULT(NET_R_OK); -} - -/* Private */ - -#ifndef NETENT_DATA -static NET_R_RETURN -copy_netent(struct netent *ne, struct netent *nptr, NET_R_COPY_ARGS) { - char *cp; - int i, n; - int numptr, len; - - /* Find out the amount of space required to store the answer. */ - numptr = 1; /*%< NULL ptr */ - len = (char *)ALIGN(buf) - buf; - for (i = 0; ne->n_aliases[i]; i++, numptr++) { - len += strlen(ne->n_aliases[i]) + 1; - } - len += strlen(ne->n_name) + 1; - len += numptr * sizeof(char*); - - if (len > (int)buflen) { - errno = ERANGE; - return (NET_R_BAD); - } - - /* copy net value and type */ - nptr->n_addrtype = ne->n_addrtype; - nptr->n_net = ne->n_net; - - cp = (char *)ALIGN(buf) + numptr * sizeof(char *); - - /* copy official name */ - n = strlen(ne->n_name) + 1; - strcpy(cp, ne->n_name); - nptr->n_name = cp; - cp += n; - - /* copy aliases */ - nptr->n_aliases = (char **)ALIGN(buf); - for (i = 0 ; ne->n_aliases[i]; i++) { - n = strlen(ne->n_aliases[i]) + 1; - strcpy(cp, ne->n_aliases[i]); - nptr->n_aliases[i] = cp; - cp += n; - } - nptr->n_aliases[i] = NULL; - - return (NET_R_OK); -} -#else /* !NETENT_DATA */ -static int -copy_netent(struct netent *ne, struct netent *nptr, NET_R_COPY_ARGS) { - char *cp, *eob; - int i, n; - - /* copy net value and type */ - nptr->n_addrtype = ne->n_addrtype; - nptr->n_net = ne->n_net; - - /* copy official name */ - cp = ndptr->line; - eob = ndptr->line + sizeof(ndptr->line); - if ((n = strlen(ne->n_name) + 1) < (eob - cp)) { - strcpy(cp, ne->n_name); - nptr->n_name = cp; - cp += n; - } else { - return (-1); - } - - /* copy aliases */ - i = 0; - nptr->n_aliases = ndptr->net_aliases; - while (ne->n_aliases[i] && i < (_MAXALIASES-1)) { - if ((n = strlen(ne->n_aliases[i]) + 1) < (eob - cp)) { - strcpy(cp, ne->n_aliases[i]); - nptr->n_aliases[i] = cp; - cp += n; - } else { - break; - } - i++; - } - nptr->n_aliases[i] = NULL; - - return (NET_R_OK); -} -#endif /* !NETENT_DATA */ -#else /* NET_R_RETURN */ - static int getnetent_r_unknown_system = 0; -#endif /* NET_R_RETURN */ -#endif /* !defined(_REENTRANT) || !defined(DO_PTHREADS) */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getnetgrent.c b/contrib/bind9/lib/bind/irs/getnetgrent.c deleted file mode 100644 index 1e6ff9b..0000000 --- a/contrib/bind9/lib/bind/irs/getnetgrent.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getnetgrent.c,v 1.3.18.2 2008/02/27 00:08:30 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports */ - -#include "port_before.h" - -#if !defined(__BIND_NOSTATIC) - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <resolv.h> -#include <stdio.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_data.h" - -/* Forward */ - -static struct net_data *init(void); - - -/* Public */ - -#ifndef SETNETGRENT_ARGS -#define SETNETGRENT_ARGS const char *netgroup -#endif -void -setnetgrent(SETNETGRENT_ARGS) { - struct net_data *net_data = init(); - - setnetgrent_p(netgroup, net_data); -} - -void -endnetgrent(void) { - struct net_data *net_data = init(); - - endnetgrent_p(net_data); -} - -#ifndef INNETGR_ARGS -#define INNETGR_ARGS const char *netgroup, const char *host, \ - const char *user, const char *domain -#endif -int -innetgr(INNETGR_ARGS) { - struct net_data *net_data = init(); - - return (innetgr_p(netgroup, host, user, domain, net_data)); -} - -int -getnetgrent(NGR_R_CONST char **host, NGR_R_CONST char **user, - NGR_R_CONST char **domain) -{ - struct net_data *net_data = init(); - const char *ch, *cu, *cd; - int ret; - - ret = getnetgrent_p(&ch, &cu, &cd, net_data); - if (ret != 1) - return (ret); - - DE_CONST(ch, *host); - DE_CONST(cu, *user); - DE_CONST(cd, *domain); - return (ret); -} - -/* Shared private. */ - -void -setnetgrent_p(const char *netgroup, struct net_data *net_data) { - struct irs_ng *ng; - - if ((net_data != NULL) && ((ng = net_data->ng) != NULL)) - (*ng->rewind)(ng, netgroup); -} - -void -endnetgrent_p(struct net_data *net_data) { - struct irs_ng *ng; - - if (!net_data) - return; - if ((ng = net_data->ng) != NULL) - (*ng->close)(ng); - net_data->ng = NULL; -} - -int -innetgr_p(const char *netgroup, const char *host, - const char *user, const char *domain, - struct net_data *net_data) { - struct irs_ng *ng; - - if (!net_data || !(ng = net_data->ng)) - return (0); - return ((*ng->test)(ng, netgroup, host, user, domain)); -} - -int -getnetgrent_p(const char **host, const char **user, const char **domain, - struct net_data *net_data ) { - struct irs_ng *ng; - - if (!net_data || !(ng = net_data->ng)) - return (0); - return ((*ng->next)(ng, host, user, domain)); -} - -/* Private */ - -static struct net_data * -init(void) { - struct net_data *net_data; - - if (!(net_data = net_data_init(NULL))) - goto error; - if (!net_data->ng) { - net_data->ng = (*net_data->irs->ng_map)(net_data->irs); - if (!net_data->ng) { - error: - errno = EIO; - return (NULL); - } - } - - return (net_data); -} - -#endif /*__BIND_NOSTATIC*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getnetgrent_r.c b/contrib/bind9/lib/bind/irs/getnetgrent_r.c deleted file mode 100644 index 3ff5542..0000000 --- a/contrib/bind9/lib/bind/irs/getnetgrent_r.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1998-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getnetgrent_r.c,v 1.7.18.6 2008/02/28 05:49:37 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <port_before.h> -#if !defined(_REENTRANT) || !defined(DO_PTHREADS) - static int getnetgrent_r_not_required = 0; -#else -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <netdb.h> -#include <stdlib.h> -#include <port_after.h> - -#ifdef NGR_R_RETURN -#ifndef NGR_R_PRIVATE -#define NGR_R_PRIVATE 0 -#endif - -static NGR_R_RETURN -copy_protoent(NGR_R_CONST char **, NGR_R_CONST char **, NGR_R_CONST char **, - const char *, const char *, const char *, NGR_R_COPY_ARGS); - -NGR_R_RETURN -innetgr_r(const char *netgroup, const char *host, const char *user, - const char *domain) { - char *ng, *ho, *us, *dom; - - DE_CONST(netgroup, ng); - DE_CONST(host, ho); - DE_CONST(user, us); - DE_CONST(domain, dom); - - return (innetgr(ng, ho, us, dom)); -} - -/*% - * These assume a single context is in operation per thread. - * If this is not the case we will need to call irs directly - * rather than through the base functions. - */ - -NGR_R_RETURN -getnetgrent_r(NGR_R_CONST char **machinep, NGR_R_CONST char **userp, - NGR_R_CONST char **domainp, NGR_R_ARGS) -{ - NGR_R_CONST char *mp, *up, *dp; - int res = getnetgrent(&mp, &up, &dp); - - if (res != 1) - return (res); - - return (copy_protoent(machinep, userp, domainp, - mp, up, dp, NGR_R_COPY)); -} - -#if NGR_R_PRIVATE == 2 -struct private { - char *buf; -}; - -#endif -NGR_R_SET_RETURN -#ifdef NGR_R_SET_ARGS -setnetgrent_r(NGR_R_SET_CONST char *netgroup, NGR_R_SET_ARGS) -#else -setnetgrent_r(NGR_R_SET_CONST char *netgroup) -#endif -{ -#if NGR_R_PRIVATE == 2 - struct private *p; -#endif - char *tmp; -#if defined(NGR_R_SET_ARGS) && NGR_R_PRIVATE == 0 - UNUSED(buf); - UNUSED(buflen); -#endif - - DE_CONST(netgroup, tmp); - setnetgrent(tmp); - -#if NGR_R_PRIVATE == 1 - *buf = NULL; -#elif NGR_R_PRIVATE == 2 - *buf = p = malloc(sizeof(struct private)); - if (p == NULL) -#ifdef NGR_R_SET_RESULT - return (NGR_R_BAD); -#else - return; -#endif - p->buf = NULL; -#endif -#ifdef NGR_R_SET_RESULT - return (NGR_R_SET_RESULT); -#endif -} - -NGR_R_END_RETURN -#ifdef NGR_R_END_ARGS -endnetgrent_r(NGR_R_END_ARGS) -#else -endnetgrent_r(void) -#endif -{ -#if NGR_R_PRIVATE == 2 - struct private *p = buf; -#endif -#if defined(NGR_R_SET_ARGS) && NGR_R_PRIVATE == 0 - UNUSED(buf); - UNUSED(buflen); -#endif - - endnetgrent(); -#if NGR_R_PRIVATE == 1 - if (*buf != NULL) - free(*buf); - *buf = NULL; -#elif NGR_R_PRIVATE == 2 - if (p->buf != NULL) - free(p->buf); - free(p); -#endif - NGR_R_END_RESULT(NGR_R_OK); -} - -/* Private */ - -static int -copy_protoent(NGR_R_CONST char **machinep, NGR_R_CONST char **userp, - NGR_R_CONST char **domainp, const char *mp, const char *up, - const char *dp, NGR_R_COPY_ARGS) -{ -#if NGR_R_PRIVATE == 2 - struct private *p = buf; -#endif - char *cp; - int n; - int len; - - /* Find out the amount of space required to store the answer. */ - len = 0; - if (mp != NULL) len += strlen(mp) + 1; - if (up != NULL) len += strlen(up) + 1; - if (dp != NULL) len += strlen(dp) + 1; - -#if NGR_R_PRIVATE == 1 - if (*buf != NULL) - free(*buf); - *buf = malloc(len); - if (*buf == NULL) - return(NGR_R_BAD); - cp = *buf; -#elif NGR_R_PRIVATE == 2 - if (p->buf) - free(p->buf); - p->buf = malloc(len); - if (p->buf == NULL) - return(NGR_R_BAD); - cp = p->buf; -#else - if (len > (int)buflen) { - errno = ERANGE; - return (NGR_R_BAD); - } - cp = buf; -#endif - - if (mp != NULL) { - n = strlen(mp) + 1; - strcpy(cp, mp); - *machinep = cp; - cp += n; - } else - *machinep = NULL; - - if (up != NULL) { - n = strlen(up) + 1; - strcpy(cp, up); - *userp = cp; - cp += n; - } else - *userp = NULL; - - if (dp != NULL) { - n = strlen(dp) + 1; - strcpy(cp, dp); - *domainp = cp; - cp += n; - } else - *domainp = NULL; - - return (NGR_R_OK); -} -#else /* NGR_R_RETURN */ - static int getnetgrent_r_unknown_system = 0; -#endif /* NGR_R_RETURN */ -#endif /* !defined(_REENTRANT) || !defined(DO_PTHREADS) */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getprotoent.c b/contrib/bind9/lib/bind/irs/getprotoent.c deleted file mode 100644 index 9e3d775..0000000 --- a/contrib/bind9/lib/bind/irs/getprotoent.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: getprotoent.c,v 1.3.18.1 2005/04/27 05:00:58 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#if !defined(__BIND_NOSTATIC) - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_data.h" - -/* Forward */ - -static struct net_data *init(void); - -/* Public */ - -struct protoent * -getprotoent() { - struct net_data *net_data = init(); - - return (getprotoent_p(net_data)); -} - -struct protoent * -getprotobyname(const char *name) { - struct net_data *net_data = init(); - - return (getprotobyname_p(name, net_data)); -} - -struct protoent * -getprotobynumber(int proto) { - struct net_data *net_data = init(); - - return (getprotobynumber_p(proto, net_data)); -} - -void -setprotoent(int stayopen) { - struct net_data *net_data = init(); - - setprotoent_p(stayopen, net_data); -} - -void -endprotoent() { - struct net_data *net_data = init(); - - endprotoent_p(net_data); -} - -/* Shared private. */ - -struct protoent * -getprotoent_p(struct net_data *net_data) { - struct irs_pr *pr; - - if (!net_data || !(pr = net_data->pr)) - return (NULL); - net_data->pr_last = (*pr->next)(pr); - return (net_data->pr_last); -} - -struct protoent * -getprotobyname_p(const char *name, struct net_data *net_data) { - struct irs_pr *pr; - char **pap; - - if (!net_data || !(pr = net_data->pr)) - return (NULL); - if (net_data->pr_stayopen && net_data->pr_last) { - if (!strcmp(net_data->pr_last->p_name, name)) - return (net_data->pr_last); - for (pap = net_data->pr_last->p_aliases; pap && *pap; pap++) - if (!strcmp(name, *pap)) - return (net_data->pr_last); - } - net_data->pr_last = (*pr->byname)(pr, name); - if (!net_data->pr_stayopen) - endprotoent(); - return (net_data->pr_last); -} - -struct protoent * -getprotobynumber_p(int proto, struct net_data *net_data) { - struct irs_pr *pr; - - if (!net_data || !(pr = net_data->pr)) - return (NULL); - if (net_data->pr_stayopen && net_data->pr_last) - if (net_data->pr_last->p_proto == proto) - return (net_data->pr_last); - net_data->pr_last = (*pr->bynumber)(pr, proto); - if (!net_data->pr_stayopen) - endprotoent(); - return (net_data->pr_last); -} - -void -setprotoent_p(int stayopen, struct net_data *net_data) { - struct irs_pr *pr; - - if (!net_data || !(pr = net_data->pr)) - return; - (*pr->rewind)(pr); - net_data->pr_stayopen = (stayopen != 0); - if (stayopen == 0) - net_data_minimize(net_data); -} - -void -endprotoent_p(struct net_data *net_data) { - struct irs_pr *pr; - - if ((net_data != NULL) && ((pr = net_data->pr) != NULL)) - (*pr->minimize)(pr); -} - -/* Private */ - -static struct net_data * -init() { - struct net_data *net_data; - - if (!(net_data = net_data_init(NULL))) - goto error; - if (!net_data->pr) { - net_data->pr = (*net_data->irs->pr_map)(net_data->irs); - - if (!net_data->pr || !net_data->res) { - error: - errno = EIO; - return (NULL); - } - (*net_data->pr->res_set)(net_data->pr, net_data->res, NULL); - } - - return (net_data); -} - -#endif /*__BIND_NOSTATIC*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getprotoent_r.c b/contrib/bind9/lib/bind/irs/getprotoent_r.c deleted file mode 100644 index 00b1572..0000000 --- a/contrib/bind9/lib/bind/irs/getprotoent_r.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1998-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getprotoent_r.c,v 1.4.18.2 2006/08/01 01:19:12 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <port_before.h> -#if !defined(_REENTRANT) || !defined(DO_PTHREADS) - static int getprotoent_r_not_required = 0; -#else -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <netdb.h> -#include <port_after.h> - -#ifdef PROTO_R_RETURN - -static PROTO_R_RETURN -copy_protoent(struct protoent *, struct protoent *, PROTO_R_COPY_ARGS); - -PROTO_R_RETURN -getprotobyname_r(const char *name, struct protoent *pptr, PROTO_R_ARGS) { - struct protoent *pe = getprotobyname(name); -#ifdef PROTO_R_SETANSWER - int n = 0; - - if (pe == NULL || (n = copy_protoent(pe, pptr, PROTO_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = pptr; - - return (n); -#else - if (pe == NULL) - return (PROTO_R_BAD); - - return (copy_protoent(pe, pptr, PROTO_R_COPY)); -#endif -} - -PROTO_R_RETURN -getprotobynumber_r(int proto, struct protoent *pptr, PROTO_R_ARGS) { - struct protoent *pe = getprotobynumber(proto); -#ifdef PROTO_R_SETANSWER - int n = 0; - - if (pe == NULL || (n = copy_protoent(pe, pptr, PROTO_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = pptr; - - return (n); -#else - if (pe == NULL) - return (PROTO_R_BAD); - - return (copy_protoent(pe, pptr, PROTO_R_COPY)); -#endif -} - -/*% - * These assume a single context is in operation per thread. - * If this is not the case we will need to call irs directly - * rather than through the base functions. - */ - -PROTO_R_RETURN -getprotoent_r(struct protoent *pptr, PROTO_R_ARGS) { - struct protoent *pe = getprotoent(); -#ifdef PROTO_R_SETANSWER - int n = 0; - - if (pe == NULL || (n = copy_protoent(pe, pptr, PROTO_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = pptr; - - return (n); -#else - if (pe == NULL) - return (PROTO_R_BAD); - - return (copy_protoent(pe, pptr, PROTO_R_COPY)); -#endif -} - -PROTO_R_SET_RETURN -#ifdef PROTO_R_ENT_ARGS -setprotoent_r(int stay_open, PROTO_R_ENT_ARGS) -#else -setprotoent_r(int stay_open) -#endif -{ -#ifdef PROTO_R_ENT_UNUSED - PROTO_R_ENT_UNUSED; -#endif - setprotoent(stay_open); -#ifdef PROTO_R_SET_RESULT - return (PROTO_R_SET_RESULT); -#endif -} - -PROTO_R_END_RETURN -#ifdef PROTO_R_ENT_ARGS -endprotoent_r(PROTO_R_ENT_ARGS) -#else -endprotoent_r() -#endif -{ -#ifdef PROTO_R_ENT_UNUSED - PROTO_R_ENT_UNUSED; -#endif - endprotoent(); - PROTO_R_END_RESULT(PROTO_R_OK); -} - -/* Private */ - -#ifndef PROTOENT_DATA -static PROTO_R_RETURN -copy_protoent(struct protoent *pe, struct protoent *pptr, PROTO_R_COPY_ARGS) { - char *cp; - int i, n; - int numptr, len; - - /* Find out the amount of space required to store the answer. */ - numptr = 1; /*%< NULL ptr */ - len = (char *)ALIGN(buf) - buf; - for (i = 0; pe->p_aliases[i]; i++, numptr++) { - len += strlen(pe->p_aliases[i]) + 1; - } - len += strlen(pe->p_name) + 1; - len += numptr * sizeof(char*); - - if (len > (int)buflen) { - errno = ERANGE; - return (PROTO_R_BAD); - } - - /* copy protocol value*/ - pptr->p_proto = pe->p_proto; - - cp = (char *)ALIGN(buf) + numptr * sizeof(char *); - - /* copy official name */ - n = strlen(pe->p_name) + 1; - strcpy(cp, pe->p_name); - pptr->p_name = cp; - cp += n; - - /* copy aliases */ - pptr->p_aliases = (char **)ALIGN(buf); - for (i = 0 ; pe->p_aliases[i]; i++) { - n = strlen(pe->p_aliases[i]) + 1; - strcpy(cp, pe->p_aliases[i]); - pptr->p_aliases[i] = cp; - cp += n; - } - pptr->p_aliases[i] = NULL; - - return (PROTO_R_OK); -} -#else /* !PROTOENT_DATA */ -static int -copy_protoent(struct protoent *pe, struct protoent *pptr, PROTO_R_COPY_ARGS) { - char *cp, *eob; - int i, n; - - /* copy protocol value */ - pptr->p_proto = pe->p_proto; - - /* copy official name */ - cp = pdptr->line; - eob = pdptr->line + sizeof(pdptr->line); - if ((n = strlen(pe->p_name) + 1) < (eob - cp)) { - strcpy(cp, pe->p_name); - pptr->p_name = cp; - cp += n; - } else { - return (-1); - } - - /* copy aliases */ - i = 0; - pptr->p_aliases = pdptr->proto_aliases; - while (pe->p_aliases[i] && i < (_MAXALIASES-1)) { - if ((n = strlen(pe->p_aliases[i]) + 1) < (eob - cp)) { - strcpy(cp, pe->p_aliases[i]); - pptr->p_aliases[i] = cp; - cp += n; - } else { - break; - } - i++; - } - pptr->p_aliases[i] = NULL; - - return (PROTO_R_OK); -} -#endif /* PROTOENT_DATA */ -#else /* PROTO_R_RETURN */ - static int getprotoent_r_unknown_system = 0; -#endif /* PROTO_R_RETURN */ -#endif /* !defined(_REENTRANT) || !defined(DO_PTHREADS) */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getpwent.c b/contrib/bind9/lib/bind/irs/getpwent.c deleted file mode 100644 index 86f1d03..0000000 --- a/contrib/bind9/lib/bind/irs/getpwent.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: getpwent.c,v 1.2.18.1 2005/04/27 05:00:59 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#if !defined(WANT_IRS_PW) || defined(__BIND_NOSTATIC) -static int __bind_irs_pw_unneeded; -#else - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <pwd.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_data.h" - -/* Forward */ - -static struct net_data * init(void); - -/* Public */ - -struct passwd * -getpwent(void) { - struct net_data *net_data = init(); - - return (getpwent_p(net_data)); -} - -struct passwd * -getpwnam(const char *name) { - struct net_data *net_data = init(); - - return (getpwnam_p(name, net_data)); -} - -struct passwd * -getpwuid(uid_t uid) { - struct net_data *net_data = init(); - - return (getpwuid_p(uid, net_data)); -} - -int -setpassent(int stayopen) { - struct net_data *net_data = init(); - - return (setpassent_p(stayopen, net_data)); -} - -#ifdef SETPWENT_VOID -void -setpwent() { - struct net_data *net_data = init(); - - setpwent_p(net_data); -} -#else -int -setpwent() { - struct net_data *net_data = init(); - - return (setpwent_p(net_data)); -} -#endif - -void -endpwent() { - struct net_data *net_data = init(); - - endpwent_p(net_data); -} - -/* Shared private. */ - -struct passwd * -getpwent_p(struct net_data *net_data) { - struct irs_pw *pw; - - if (!net_data || !(pw = net_data->pw)) - return (NULL); - net_data->pw_last = (*pw->next)(pw); - return (net_data->pw_last); -} - -struct passwd * -getpwnam_p(const char *name, struct net_data *net_data) { - struct irs_pw *pw; - - if (!net_data || !(pw = net_data->pw)) - return (NULL); - if (net_data->pw_stayopen && net_data->pw_last && - !strcmp(net_data->pw_last->pw_name, name)) - return (net_data->pw_last); - net_data->pw_last = (*pw->byname)(pw, name); - if (!net_data->pw_stayopen) - endpwent(); - return (net_data->pw_last); -} - -struct passwd * -getpwuid_p(uid_t uid, struct net_data *net_data) { - struct irs_pw *pw; - - if (!net_data || !(pw = net_data->pw)) - return (NULL); - if (net_data->pw_stayopen && net_data->pw_last && - net_data->pw_last->pw_uid == uid) - return (net_data->pw_last); - net_data->pw_last = (*pw->byuid)(pw, uid); - if (!net_data->pw_stayopen) - endpwent(); - return (net_data->pw_last); -} - -int -setpassent_p(int stayopen, struct net_data *net_data) { - struct irs_pw *pw; - - if (!net_data || !(pw = net_data->pw)) - return (0); - (*pw->rewind)(pw); - net_data->pw_stayopen = (stayopen != 0); - if (stayopen == 0) - net_data_minimize(net_data); - return (1); -} - -#ifdef SETPWENT_VOID -void -setpwent_p(struct net_data *net_data) { - (void) setpassent_p(0, net_data); -} -#else -int -setpwent_p(struct net_data *net_data) { - return (setpassent_p(0, net_data)); -} -#endif - -void -endpwent_p(struct net_data *net_data) { - struct irs_pw *pw; - - if ((net_data != NULL) && ((pw = net_data->pw) != NULL)) - (*pw->minimize)(pw); -} - -/* Private */ - -static struct net_data * -init() { - struct net_data *net_data; - if (!(net_data = net_data_init(NULL))) - goto error; - if (!net_data->pw) { - net_data->pw = (*net_data->irs->pw_map)(net_data->irs); - - if (!net_data->pw || !net_data->res) { - error: - errno = EIO; - return (NULL); - } - (*net_data->pw->res_set)(net_data->pw, net_data->res, NULL); - } - - return (net_data); -} - -#endif /* WANT_IRS_PW */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getpwent_r.c b/contrib/bind9/lib/bind/irs/getpwent_r.c deleted file mode 100644 index 212d016..0000000 --- a/contrib/bind9/lib/bind/irs/getpwent_r.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1998-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getpwent_r.c,v 1.6.18.2 2005/04/27 05:00:59 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <port_before.h> -#if !defined(_REENTRANT) || !defined(DO_PTHREADS) || !defined(WANT_IRS_PW) - static int getpwent_r_not_required = 0; -#else -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <sys/types.h> -#if (defined(POSIX_GETPWNAM_R) || defined(POSIX_GETPWUID_R)) -#if defined(_POSIX_PTHREAD_SEMANTICS) - /* turn off solaris remapping in <grp.h> */ -#undef _POSIX_PTHREAD_SEMANTICS -#include <pwd.h> -#define _POSIX_PTHREAD_SEMANTICS 1 -#else -#define _UNIX95 1 -#include <pwd.h> -#endif -#else -#include <pwd.h> -#endif -#include <port_after.h> - -#ifdef PASS_R_RETURN - -static int -copy_passwd(struct passwd *, struct passwd *, char *buf, int buflen); - -/* POSIX 1003.1c */ -#ifdef POSIX_GETPWNAM_R -int -__posix_getpwnam_r(const char *login, struct passwd *pwptr, - char *buf, size_t buflen, struct passwd **result) { -#else -int -getpwnam_r(const char *login, struct passwd *pwptr, - char *buf, size_t buflen, struct passwd **result) { -#endif - struct passwd *pw = getpwnam(login); - int res; - - if (pw == NULL) { - *result = NULL; - return (0); - } - - res = copy_passwd(pw, pwptr, buf, buflen); - *result = res ? NULL : pwptr; - return (res); -} - -#ifdef POSIX_GETPWNAM_R -struct passwd * -getpwnam_r(const char *login, struct passwd *pwptr, char *buf, int buflen) { - struct passwd *pw = getpwnam(login); - int res; - - if (pw == NULL) - return (NULL); - - res = copy_passwd(pw, pwptr, buf, buflen); - return (res ? NULL : pwptr); -} -#endif - -/* POSIX 1003.1c */ -#ifdef POSIX_GETPWUID_R -int -__posix_getpwuid_r(uid_t uid, struct passwd *pwptr, - char *buf, int buflen, struct passwd **result) { -#else -int -getpwuid_r(uid_t uid, struct passwd *pwptr, - char *buf, size_t buflen, struct passwd **result) { -#endif - struct passwd *pw = getpwuid(uid); - int res; - - if (pw == NULL) { - *result = NULL; - return (0); - } - - res = copy_passwd(pw, pwptr, buf, buflen); - *result = res ? NULL : pwptr; - return (res); -} - -#ifdef POSIX_GETPWUID_R -struct passwd * -getpwuid_r(uid_t uid, struct passwd *pwptr, char *buf, int buflen) { - struct passwd *pw = getpwuid(uid); - int res; - - if (pw == NULL) - return (NULL); - - res = copy_passwd(pw, pwptr, buf, buflen); - return (res ? NULL : pwptr); -} -#endif - -/*% - * These assume a single context is in operation per thread. - * If this is not the case we will need to call irs directly - * rather than through the base functions. - */ - -PASS_R_RETURN -getpwent_r(struct passwd *pwptr, PASS_R_ARGS) { - struct passwd *pw = getpwent(); - int res = 0; - - if (pw == NULL) - return (PASS_R_BAD); - - res = copy_passwd(pw, pwptr, buf, buflen); - return (res ? PASS_R_BAD : PASS_R_OK); -} - -PASS_R_SET_RETURN -#ifdef PASS_R_ENT_ARGS -setpassent_r(int stayopen, PASS_R_ENT_ARGS) -#else -setpassent_r(int stayopen) -#endif -{ - - setpassent(stayopen); -#ifdef PASS_R_SET_RESULT - return (PASS_R_SET_RESULT); -#endif -} - -PASS_R_SET_RETURN -#ifdef PASS_R_ENT_ARGS -setpwent_r(PASS_R_ENT_ARGS) -#else -setpwent_r(void) -#endif -{ - - setpwent(); -#ifdef PASS_R_SET_RESULT - return (PASS_R_SET_RESULT); -#endif -} - -PASS_R_END_RETURN -#ifdef PASS_R_ENT_ARGS -endpwent_r(PASS_R_ENT_ARGS) -#else -endpwent_r(void) -#endif -{ - - endpwent(); - PASS_R_END_RESULT(PASS_R_OK); -} - - -#ifdef HAS_FGETPWENT -PASS_R_RETURN -fgetpwent_r(FILE *f, struct passwd *pwptr, PASS_R_COPY_ARGS) { - struct passwd *pw = fgetpwent(f); - int res = 0; - - if (pw == NULL) - return (PASS_R_BAD); - - res = copy_passwd(pw, pwptr, PASS_R_COPY); - return (res ? PASS_R_BAD : PASS_R_OK ); -} -#endif - -/* Private */ - -static int -copy_passwd(struct passwd *pw, struct passwd *pwptr, char *buf, int buflen) { - char *cp; - int n; - int len; - - /* Find out the amount of space required to store the answer. */ - len = strlen(pw->pw_name) + 1; - len += strlen(pw->pw_passwd) + 1; -#ifdef HAVE_PW_CLASS - len += strlen(pw->pw_class) + 1; -#endif - len += strlen(pw->pw_gecos) + 1; - len += strlen(pw->pw_dir) + 1; - len += strlen(pw->pw_shell) + 1; - - if (len > buflen) { - errno = ERANGE; - return (ERANGE); - } - - /* copy fixed atomic values*/ - pwptr->pw_uid = pw->pw_uid; - pwptr->pw_gid = pw->pw_gid; -#ifdef HAVE_PW_CHANGE - pwptr->pw_change = pw->pw_change; -#endif -#ifdef HAVE_PW_EXPIRE - pwptr->pw_expire = pw->pw_expire; -#endif - - cp = buf; - - /* copy official name */ - n = strlen(pw->pw_name) + 1; - strcpy(cp, pw->pw_name); - pwptr->pw_name = cp; - cp += n; - - /* copy password */ - n = strlen(pw->pw_passwd) + 1; - strcpy(cp, pw->pw_passwd); - pwptr->pw_passwd = cp; - cp += n; - -#ifdef HAVE_PW_CLASS - /* copy class */ - n = strlen(pw->pw_class) + 1; - strcpy(cp, pw->pw_class); - pwptr->pw_class = cp; - cp += n; -#endif - - /* copy gecos */ - n = strlen(pw->pw_gecos) + 1; - strcpy(cp, pw->pw_gecos); - pwptr->pw_gecos = cp; - cp += n; - - /* copy directory */ - n = strlen(pw->pw_dir) + 1; - strcpy(cp, pw->pw_dir); - pwptr->pw_dir = cp; - cp += n; - - /* copy login shell */ - n = strlen(pw->pw_shell) + 1; - strcpy(cp, pw->pw_shell); - pwptr->pw_shell = cp; - cp += n; - - return (0); -} -#else /* PASS_R_RETURN */ - static int getpwent_r_unknown_system = 0; -#endif /* PASS_R_RETURN */ -#endif /* !def(_REENTRANT) || !def(DO_PTHREADS) || !def(WANT_IRS_PW) */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getservent.c b/contrib/bind9/lib/bind/irs/getservent.c deleted file mode 100644 index 92ed18b..0000000 --- a/contrib/bind9/lib/bind/irs/getservent.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: getservent.c,v 1.3.18.1 2005/04/27 05:00:59 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#if !defined(__BIND_NOSTATIC) - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_data.h" - -/* Forward */ - -static struct net_data *init(void); - -/* Public */ - -struct servent * -getservent(void) { - struct net_data *net_data = init(); - - return (getservent_p(net_data)); -} - -struct servent * -getservbyname(const char *name, const char *proto) { - struct net_data *net_data = init(); - - return (getservbyname_p(name, proto, net_data)); -} - -struct servent * -getservbyport(int port, const char *proto) { - struct net_data *net_data = init(); - - return (getservbyport_p(port, proto, net_data)); -} - -void -setservent(int stayopen) { - struct net_data *net_data = init(); - - setservent_p(stayopen, net_data); -} - -void -endservent() { - struct net_data *net_data = init(); - - endservent_p(net_data); -} - -/* Shared private. */ - -struct servent * -getservent_p(struct net_data *net_data) { - struct irs_sv *sv; - - if (!net_data || !(sv = net_data->sv)) - return (NULL); - net_data->sv_last = (*sv->next)(sv); - return (net_data->sv_last); -} - -struct servent * -getservbyname_p(const char *name, const char *proto, - struct net_data *net_data) { - struct irs_sv *sv; - char **sap; - - if (!net_data || !(sv = net_data->sv)) - return (NULL); - if (net_data->sv_stayopen && net_data->sv_last) - if (!proto || !strcmp(net_data->sv_last->s_proto, proto)) { - if (!strcmp(net_data->sv_last->s_name, name)) - return (net_data->sv_last); - for (sap = net_data->sv_last->s_aliases; - sap && *sap; sap++) - if (!strcmp(name, *sap)) - return (net_data->sv_last); - } - net_data->sv_last = (*sv->byname)(sv, name, proto); - if (!net_data->sv_stayopen) - endservent(); - return (net_data->sv_last); -} - -struct servent * -getservbyport_p(int port, const char *proto, struct net_data *net_data) { - struct irs_sv *sv; - - if (!net_data || !(sv = net_data->sv)) - return (NULL); - if (net_data->sv_stayopen && net_data->sv_last) - if (port == net_data->sv_last->s_port && - ( !proto || - !strcmp(net_data->sv_last->s_proto, proto))) - return (net_data->sv_last); - net_data->sv_last = (*sv->byport)(sv, port, proto); - return (net_data->sv_last); -} - -void -setservent_p(int stayopen, struct net_data *net_data) { - struct irs_sv *sv; - - if (!net_data || !(sv = net_data->sv)) - return; - (*sv->rewind)(sv); - net_data->sv_stayopen = (stayopen != 0); - if (stayopen == 0) - net_data_minimize(net_data); -} - -void -endservent_p(struct net_data *net_data) { - struct irs_sv *sv; - - if ((net_data != NULL) && ((sv = net_data->sv) != NULL)) - (*sv->minimize)(sv); -} - -/* Private */ - -static struct net_data * -init() { - struct net_data *net_data; - - if (!(net_data = net_data_init(NULL))) - goto error; - if (!net_data->sv) { - net_data->sv = (*net_data->irs->sv_map)(net_data->irs); - - if (!net_data->sv || !net_data->res) { - error: - errno = EIO; - return (NULL); - } - (*net_data->sv->res_set)(net_data->sv, net_data->res, NULL); - } - - return (net_data); -} - -#endif /*__BIND_NOSTATIC*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/getservent_r.c b/contrib/bind9/lib/bind/irs/getservent_r.c deleted file mode 100644 index 12c2b9b..0000000 --- a/contrib/bind9/lib/bind/irs/getservent_r.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1998-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: getservent_r.c,v 1.4.18.2 2006/08/01 01:19:12 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <port_before.h> -#if !defined(_REENTRANT) || !defined(DO_PTHREADS) - static int getservent_r_not_required = 0; -#else -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <netdb.h> -#include <sys/param.h> -#include <port_after.h> - -#ifdef SERV_R_RETURN - -static SERV_R_RETURN -copy_servent(struct servent *, struct servent *, SERV_R_COPY_ARGS); - -SERV_R_RETURN -getservbyname_r(const char *name, const char *proto, - struct servent *sptr, SERV_R_ARGS) { - struct servent *se = getservbyname(name, proto); -#ifdef SERV_R_SETANSWER - int n = 0; - - if (se == NULL || (n = copy_servent(se, sptr, SERV_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = sptr; - - return (n); -#else - if (se == NULL) - return (SERV_R_BAD); - - return (copy_servent(se, sptr, SERV_R_COPY)); -#endif -} - -SERV_R_RETURN -getservbyport_r(int port, const char *proto, - struct servent *sptr, SERV_R_ARGS) { - struct servent *se = getservbyport(port, proto); -#ifdef SERV_R_SETANSWER - int n = 0; - - if (se == NULL || (n = copy_servent(se, sptr, SERV_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = sptr; - - return (n); -#else - if (se == NULL) - return (SERV_R_BAD); - - return (copy_servent(se, sptr, SERV_R_COPY)); -#endif -} - -/*% - * These assume a single context is in operation per thread. - * If this is not the case we will need to call irs directly - * rather than through the base functions. - */ - -SERV_R_RETURN -getservent_r(struct servent *sptr, SERV_R_ARGS) { - struct servent *se = getservent(); -#ifdef SERV_R_SETANSWER - int n = 0; - - if (se == NULL || (n = copy_servent(se, sptr, SERV_R_COPY)) != 0) - *answerp = NULL; - else - *answerp = sptr; - - return (n); -#else - if (se == NULL) - return (SERV_R_BAD); - - return (copy_servent(se, sptr, SERV_R_COPY)); -#endif -} - -SERV_R_SET_RETURN -#ifdef SERV_R_ENT_ARGS -setservent_r(int stay_open, SERV_R_ENT_ARGS) -#else -setservent_r(int stay_open) -#endif -{ -#ifdef SERV_R_ENT_UNUSED - SERV_R_ENT_UNUSED; -#endif - setservent(stay_open); -#ifdef SERV_R_SET_RESULT - return (SERV_R_SET_RESULT); -#endif -} - -SERV_R_END_RETURN -#ifdef SERV_R_ENT_ARGS -endservent_r(SERV_R_ENT_ARGS) -#else -endservent_r() -#endif -{ -#ifdef SERV_R_ENT_UNUSED - SERV_R_ENT_UNUSED; -#endif - endservent(); - SERV_R_END_RESULT(SERV_R_OK); -} - -/* Private */ - -#ifndef SERVENT_DATA -static SERV_R_RETURN -copy_servent(struct servent *se, struct servent *sptr, SERV_R_COPY_ARGS) { - char *cp; - int i, n; - int numptr, len; - - /* Find out the amount of space required to store the answer. */ - numptr = 1; /*%< NULL ptr */ - len = (char *)ALIGN(buf) - buf; - for (i = 0; se->s_aliases[i]; i++, numptr++) { - len += strlen(se->s_aliases[i]) + 1; - } - len += strlen(se->s_name) + 1; - len += strlen(se->s_proto) + 1; - len += numptr * sizeof(char*); - - if (len > (int)buflen) { - errno = ERANGE; - return (SERV_R_BAD); - } - - /* copy port value */ - sptr->s_port = se->s_port; - - cp = (char *)ALIGN(buf) + numptr * sizeof(char *); - - /* copy official name */ - n = strlen(se->s_name) + 1; - strcpy(cp, se->s_name); - sptr->s_name = cp; - cp += n; - - /* copy aliases */ - sptr->s_aliases = (char **)ALIGN(buf); - for (i = 0 ; se->s_aliases[i]; i++) { - n = strlen(se->s_aliases[i]) + 1; - strcpy(cp, se->s_aliases[i]); - sptr->s_aliases[i] = cp; - cp += n; - } - sptr->s_aliases[i] = NULL; - - /* copy proto */ - n = strlen(se->s_proto) + 1; - strcpy(cp, se->s_proto); - sptr->s_proto = cp; - cp += n; - - return (SERV_R_OK); -} -#else /* !SERVENT_DATA */ -static int -copy_servent(struct servent *se, struct servent *sptr, SERV_R_COPY_ARGS) { - char *cp, *eob; - int i, n; - - /* copy port value */ - sptr->s_port = se->s_port; - - /* copy official name */ - cp = sdptr->line; - eob = sdptr->line + sizeof(sdptr->line); - if ((n = strlen(se->s_name) + 1) < (eob - cp)) { - strcpy(cp, se->s_name); - sptr->s_name = cp; - cp += n; - } else { - return (-1); - } - - /* copy aliases */ - i = 0; - sptr->s_aliases = sdptr->serv_aliases; - while (se->s_aliases[i] && i < (_MAXALIASES-1)) { - if ((n = strlen(se->s_aliases[i]) + 1) < (eob - cp)) { - strcpy(cp, se->s_aliases[i]); - sptr->s_aliases[i] = cp; - cp += n; - } else { - break; - } - i++; - } - sptr->s_aliases[i] = NULL; - - /* copy proto */ - if ((n = strlen(se->s_proto) + 1) < (eob - cp)) { - strcpy(cp, se->s_proto); - sptr->s_proto = cp; - cp += n; - } else { - return (-1); - } - - return (SERV_R_OK); -} -#endif /* !SERVENT_DATA */ -#else /*SERV_R_RETURN */ - static int getservent_r_unknown_system = 0; -#endif /*SERV_R_RETURN */ -#endif /* !defined(_REENTRANT) || !defined(DO_PTHREADS) */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/hesiod.c b/contrib/bind9/lib/bind/irs/hesiod.c deleted file mode 100644 index 5abb57c..0000000 --- a/contrib/bind9/lib/bind/irs/hesiod.c +++ /dev/null @@ -1,505 +0,0 @@ -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: hesiod.c,v 1.4.18.3 2005/07/28 07:38:08 marka Exp $"; -#endif - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - - -/*! \file - * \brief - * hesiod.c --- the core portion of the hesiod resolver. - * - * This file is derived from the hesiod library from Project Athena; - * It has been extensively rewritten by Theodore Ts'o to have a more - * thread-safe interface. - * \author - * This file is primarily maintained by <tytso@mit.edu> and <ghudson@mit.edu>. - */ - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "port_after.h" - -#include "pathnames.h" -#include "hesiod.h" -#include "hesiod_p.h" - -/* Forward */ - -int hesiod_init(void **context); -void hesiod_end(void *context); -char * hesiod_to_bind(void *context, const char *name, - const char *type); -char ** hesiod_resolve(void *context, const char *name, - const char *type); -void hesiod_free_list(void *context, char **list); - -static int parse_config_file(struct hesiod_p *ctx, const char *filename); -static char ** get_txt_records(struct hesiod_p *ctx, int class, - const char *name); -static int init(struct hesiod_p *ctx); - -/* Public */ - -/*% - * This function is called to initialize a hesiod_p. - */ -int -hesiod_init(void **context) { - struct hesiod_p *ctx; - char *cp; - - ctx = malloc(sizeof(struct hesiod_p)); - if (ctx == 0) { - errno = ENOMEM; - return (-1); - } - - memset(ctx, 0, sizeof (*ctx)); - - if (parse_config_file(ctx, _PATH_HESIOD_CONF) < 0) { -#ifdef DEF_RHS - /* - * Use compiled in defaults. - */ - ctx->LHS = malloc(strlen(DEF_LHS) + 1); - ctx->RHS = malloc(strlen(DEF_RHS) + 1); - if (ctx->LHS == NULL || ctx->RHS == NULL) { - errno = ENOMEM; - goto cleanup; - } - strcpy(ctx->LHS, DEF_LHS); /* (checked) */ - strcpy(ctx->RHS, DEF_RHS); /* (checked) */ -#else - goto cleanup; -#endif - } - /* - * The default RHS can be overridden by an environment - * variable. - */ - if ((cp = getenv("HES_DOMAIN")) != NULL) { - size_t RHSlen = strlen(cp) + 2; - if (ctx->RHS) - free(ctx->RHS); - ctx->RHS = malloc(RHSlen); - if (!ctx->RHS) { - errno = ENOMEM; - goto cleanup; - } - if (cp[0] == '.') { - strcpy(ctx->RHS, cp); /* (checked) */ - } else { - strcpy(ctx->RHS, "."); /* (checked) */ - strcat(ctx->RHS, cp); /* (checked) */ - } - } - - /* - * If there is no default hesiod realm set, we return an - * error. - */ - if (!ctx->RHS) { - errno = ENOEXEC; - goto cleanup; - } - -#if 0 - if (res_ninit(ctx->res) < 0) - goto cleanup; -#endif - - *context = ctx; - return (0); - - cleanup: - hesiod_end(ctx); - return (-1); -} - -/*% - * This function deallocates the hesiod_p - */ -void -hesiod_end(void *context) { - struct hesiod_p *ctx = (struct hesiod_p *) context; - int save_errno = errno; - - if (ctx->res) - res_nclose(ctx->res); - if (ctx->RHS) - free(ctx->RHS); - if (ctx->LHS) - free(ctx->LHS); - if (ctx->res && ctx->free_res) - (*ctx->free_res)(ctx->res); - free(ctx); - errno = save_errno; -} - -/*% - * This function takes a hesiod (name, type) and returns a DNS - * name which is to be resolved. - */ -char * -hesiod_to_bind(void *context, const char *name, const char *type) { - struct hesiod_p *ctx = (struct hesiod_p *) context; - char *bindname; - char **rhs_list = NULL; - const char *RHS, *cp; - - /* Decide what our RHS is, and set cp to the end of the actual name. */ - if ((cp = strchr(name, '@')) != NULL) { - if (strchr(cp + 1, '.')) - RHS = cp + 1; - else if ((rhs_list = hesiod_resolve(context, cp + 1, - "rhs-extension")) != NULL) - RHS = *rhs_list; - else { - errno = ENOENT; - return (NULL); - } - } else { - RHS = ctx->RHS; - cp = name + strlen(name); - } - - /* - * Allocate the space we need, including up to three periods and - * the terminating NUL. - */ - if ((bindname = malloc((cp - name) + strlen(type) + strlen(RHS) + - (ctx->LHS ? strlen(ctx->LHS) : 0) + 4)) == NULL) { - errno = ENOMEM; - if (rhs_list) - hesiod_free_list(context, rhs_list); - return NULL; - } - - /* Now put together the DNS name. */ - memcpy(bindname, name, cp - name); - bindname[cp - name] = '\0'; - strcat(bindname, "."); - strcat(bindname, type); - if (ctx->LHS) { - if (ctx->LHS[0] != '.') - strcat(bindname, "."); - strcat(bindname, ctx->LHS); - } - if (RHS[0] != '.') - strcat(bindname, "."); - strcat(bindname, RHS); - - if (rhs_list) - hesiod_free_list(context, rhs_list); - - return (bindname); -} - -/*% - * This is the core function. Given a hesiod (name, type), it - * returns an array of strings returned by the resolver. - */ -char ** -hesiod_resolve(void *context, const char *name, const char *type) { - struct hesiod_p *ctx = (struct hesiod_p *) context; - char *bindname = hesiod_to_bind(context, name, type); - char **retvec; - - if (bindname == NULL) - return (NULL); - if (init(ctx) == -1) { - free(bindname); - return (NULL); - } - - if ((retvec = get_txt_records(ctx, C_IN, bindname))) { - free(bindname); - return (retvec); - } - - if (errno != ENOENT) - return (NULL); - - retvec = get_txt_records(ctx, C_HS, bindname); - free(bindname); - return (retvec); -} - -void -hesiod_free_list(void *context, char **list) { - char **p; - - UNUSED(context); - - for (p = list; *p; p++) - free(*p); - free(list); -} - -/*% - * This function parses the /etc/hesiod.conf file - */ -static int -parse_config_file(struct hesiod_p *ctx, const char *filename) { - char *key, *data, *cp, **cpp; - char buf[MAXDNAME+7]; - FILE *fp; - - /* - * Clear the existing configuration variable, just in case - * they're set. - */ - if (ctx->RHS) - free(ctx->RHS); - if (ctx->LHS) - free(ctx->LHS); - ctx->RHS = ctx->LHS = 0; - - /* - * Now open and parse the file... - */ - if (!(fp = fopen(filename, "r"))) - return (-1); - - while (fgets(buf, sizeof(buf), fp) != NULL) { - cp = buf; - if (*cp == '#' || *cp == '\n' || *cp == '\r') - continue; - while(*cp == ' ' || *cp == '\t') - cp++; - key = cp; - while(*cp != ' ' && *cp != '\t' && *cp != '=') - cp++; - *cp++ = '\0'; - - while(*cp == ' ' || *cp == '\t' || *cp == '=') - cp++; - data = cp; - while(*cp != ' ' && *cp != '\n' && *cp != '\r') - cp++; - *cp++ = '\0'; - - if (strcmp(key, "lhs") == 0) - cpp = &ctx->LHS; - else if (strcmp(key, "rhs") == 0) - cpp = &ctx->RHS; - else - continue; - - *cpp = malloc(strlen(data) + 1); - if (!*cpp) { - errno = ENOMEM; - goto cleanup; - } - strcpy(*cpp, data); - } - fclose(fp); - return (0); - - cleanup: - fclose(fp); - if (ctx->RHS) - free(ctx->RHS); - if (ctx->LHS) - free(ctx->LHS); - ctx->RHS = ctx->LHS = 0; - return (-1); -} - -/*% - * Given a DNS class and a DNS name, do a lookup for TXT records, and - * return a list of them. - */ -static char ** -get_txt_records(struct hesiod_p *ctx, int class, const char *name) { - struct { - int type; /*%< RR type */ - int class; /*%< RR class */ - int dlen; /*%< len of data section */ - u_char *data; /*%< pointer to data */ - } rr; - HEADER *hp; - u_char qbuf[MAX_HESRESP], abuf[MAX_HESRESP]; - u_char *cp, *erdata, *eom; - char *dst, *edst, **list; - int ancount, qdcount; - int i, j, n, skip; - - /* - * Construct the query and send it. - */ - n = res_nmkquery(ctx->res, QUERY, name, class, T_TXT, NULL, 0, - NULL, qbuf, MAX_HESRESP); - if (n < 0) { - errno = EMSGSIZE; - return (NULL); - } - n = res_nsend(ctx->res, qbuf, n, abuf, MAX_HESRESP); - if (n < 0) { - errno = ECONNREFUSED; - return (NULL); - } - if (n < HFIXEDSZ) { - errno = EMSGSIZE; - return (NULL); - } - - /* - * OK, parse the result. - */ - hp = (HEADER *) abuf; - ancount = ntohs(hp->ancount); - qdcount = ntohs(hp->qdcount); - cp = abuf + sizeof(HEADER); - eom = abuf + n; - - /* Skip query, trying to get to the answer section which follows. */ - for (i = 0; i < qdcount; i++) { - skip = dn_skipname(cp, eom); - if (skip < 0 || cp + skip + QFIXEDSZ > eom) { - errno = EMSGSIZE; - return (NULL); - } - cp += skip + QFIXEDSZ; - } - - list = malloc((ancount + 1) * sizeof(char *)); - if (!list) { - errno = ENOMEM; - return (NULL); - } - j = 0; - for (i = 0; i < ancount; i++) { - skip = dn_skipname(cp, eom); - if (skip < 0) { - errno = EMSGSIZE; - goto cleanup; - } - cp += skip; - if (cp + 3 * INT16SZ + INT32SZ > eom) { - errno = EMSGSIZE; - goto cleanup; - } - rr.type = ns_get16(cp); - cp += INT16SZ; - rr.class = ns_get16(cp); - cp += INT16SZ + INT32SZ; /*%< skip the ttl, too */ - rr.dlen = ns_get16(cp); - cp += INT16SZ; - if (cp + rr.dlen > eom) { - errno = EMSGSIZE; - goto cleanup; - } - rr.data = cp; - cp += rr.dlen; - if (rr.class != class || rr.type != T_TXT) - continue; - if (!(list[j] = malloc(rr.dlen))) - goto cleanup; - dst = list[j++]; - edst = dst + rr.dlen; - erdata = rr.data + rr.dlen; - cp = rr.data; - while (cp < erdata) { - n = (unsigned char) *cp++; - if (cp + n > eom || dst + n > edst) { - errno = EMSGSIZE; - goto cleanup; - } - memcpy(dst, cp, n); - cp += n; - dst += n; - } - if (cp != erdata) { - errno = EMSGSIZE; - goto cleanup; - } - *dst = '\0'; - } - list[j] = NULL; - if (j == 0) { - errno = ENOENT; - goto cleanup; - } - return (list); - - cleanup: - for (i = 0; i < j; i++) - free(list[i]); - free(list); - return (NULL); -} - -struct __res_state * -__hesiod_res_get(void *context) { - struct hesiod_p *ctx = context; - - if (!ctx->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (res == NULL) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - __hesiod_res_set(ctx, res, free); - } - - return (ctx->res); -} - -void -__hesiod_res_set(void *context, struct __res_state *res, - void (*free_res)(void *)) { - struct hesiod_p *ctx = context; - - if (ctx->res && ctx->free_res) { - res_nclose(ctx->res); - (*ctx->free_res)(ctx->res); - } - - ctx->res = res; - ctx->free_res = free_res; -} - -static int -init(struct hesiod_p *ctx) { - - if (!ctx->res && !__hesiod_res_get(ctx)) - return (-1); - - if (((ctx->res->options & RES_INIT) == 0U) && - (res_ninit(ctx->res) == -1)) - return (-1); - - return (0); -} diff --git a/contrib/bind9/lib/bind/irs/hesiod_p.h b/contrib/bind9/lib/bind/irs/hesiod_p.h deleted file mode 100644 index f42f84a..0000000 --- a/contrib/bind9/lib/bind/irs/hesiod_p.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: hesiod_p.h,v 1.2.18.1 2005/04/27 05:00:59 sra Exp $ - */ - -#ifndef _HESIOD_P_H_INCLUDED -#define _HESIOD_P_H_INCLUDED - -/** \file - * \brief - * hesiod_p.h -- private definitions for the hesiod library. - * - * \author - * This file is primarily maintained by tytso@mit.edu and ghudson@mit.edu. - */ - -#define DEF_RHS ".Athena.MIT.EDU" /*%< Defaults if HESIOD_CONF */ -#define DEF_LHS ".ns" /*%< file is not */ - /*%< present. */ -struct hesiod_p { - char * LHS; /*%< normally ".ns" */ - char * RHS; /*%< AKA the default hesiod domain */ - struct __res_state * res; /*%< resolver context */ - void (*free_res)(void *); - void (*res_set)(struct hesiod_p *, struct __res_state *, - void (*)(void *)); - struct __res_state * (*res_get)(struct hesiod_p *); -}; - -#define MAX_HESRESP 1024 - -#endif /*_HESIOD_P_H_INCLUDED*/ diff --git a/contrib/bind9/lib/bind/irs/irp.c b/contrib/bind9/lib/bind/irs/irp.c deleted file mode 100644 index aae4e7b..0000000 --- a/contrib/bind9/lib/bind/irs/irp.c +++ /dev/null @@ -1,583 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996, 1998 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: irp.c,v 1.6.18.5 2008/02/28 05:49:37 marka Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <syslog.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <stdlib.h> -#include <errno.h> -#include <string.h> -#include <stdarg.h> -#include <fcntl.h> -#include <syslog.h> -#include <ctype.h> -#include <unistd.h> - -#include <isc/memcluster.h> - -#include <irs.h> -#include <irp.h> - -#include "irs_p.h" -#include "irp_p.h" - -#include "port_after.h" - -/* Forward. */ - -static void irp_close(struct irs_acc *); - -#define LINEINCR 128 - -#if !defined(SUN_LEN) -#define SUN_LEN(su) \ - (sizeof (*(su)) - sizeof ((su)->sun_path) + strlen((su)->sun_path)) -#endif - - -/* Public */ - - -/* send errors to syslog if true. */ -int irp_log_errors = 1; - -/*% - * This module handles the irp module connection to irpd. - * - * The client expects a synchronous interface to functions like - * getpwnam(3), so we can't use the ctl_* i/o library on this end of - * the wire (it's used in the server). - */ - -/*% - * irs_acc *irs_irp_acc(const char *options); - * - * Initialize the irp module. - */ -struct irs_acc * -irs_irp_acc(const char *options) { - struct irs_acc *acc; - struct irp_p *irp; - - UNUSED(options); - - if (!(acc = memget(sizeof *acc))) { - errno = ENOMEM; - return (NULL); - } - memset(acc, 0x5e, sizeof *acc); - if (!(irp = memget(sizeof *irp))) { - errno = ENOMEM; - free(acc); - return (NULL); - } - irp->inlast = 0; - irp->incurr = 0; - irp->fdCxn = -1; - acc->private = irp; - -#ifdef WANT_IRS_GR - acc->gr_map = irs_irp_gr; -#else - acc->gr_map = NULL; -#endif -#ifdef WANT_IRS_PW - acc->pw_map = irs_irp_pw; -#else - acc->pw_map = NULL; -#endif - acc->sv_map = irs_irp_sv; - acc->pr_map = irs_irp_pr; - acc->ho_map = irs_irp_ho; - acc->nw_map = irs_irp_nw; - acc->ng_map = irs_irp_ng; - acc->close = irp_close; - return (acc); -} - - -int -irs_irp_connection_setup(struct irp_p *cxndata, int *warned) { - if (irs_irp_is_connected(cxndata)) { - return (0); - } else if (irs_irp_connect(cxndata) != 0) { - if (warned != NULL && !*warned) { - syslog(LOG_ERR, "irpd connection failed: %m\n"); - (*warned)++; - } - - return (-1); - } - - return (0); -} - -/*% - * int irs_irp_connect(void); - * - * Sets up the connection to the remote irpd server. - * - * Returns: - * - * 0 on success, -1 on failure. - * - */ -int -irs_irp_connect(struct irp_p *pvt) { - int flags; - struct sockaddr *addr; - struct sockaddr_in iaddr; -#ifndef NO_SOCKADDR_UN - struct sockaddr_un uaddr; -#endif - long ipaddr; - const char *irphost; - int code; - char text[256]; - int socklen = 0; - - if (pvt->fdCxn != -1) { - perror("fd != 1"); - return (-1); - } - -#ifndef NO_SOCKADDR_UN - memset(&uaddr, 0, sizeof uaddr); -#endif - memset(&iaddr, 0, sizeof iaddr); - - irphost = getenv(IRPD_HOST_ENV); - if (irphost == NULL) { - irphost = "127.0.0.1"; - } - -#ifndef NO_SOCKADDR_UN - if (irphost[0] == '/') { - addr = (struct sockaddr *)&uaddr; - strncpy(uaddr.sun_path, irphost, sizeof uaddr.sun_path); - uaddr.sun_family = AF_UNIX; - socklen = SUN_LEN(&uaddr); -#ifdef HAVE_SA_LEN - uaddr.sun_len = socklen; -#endif - } else -#endif - { - if (inet_pton(AF_INET, irphost, &ipaddr) != 1) { - errno = EADDRNOTAVAIL; - perror("inet_pton"); - return (-1); - } - - addr = (struct sockaddr *)&iaddr; - socklen = sizeof iaddr; -#ifdef HAVE_SA_LEN - iaddr.sin_len = socklen; -#endif - iaddr.sin_family = AF_INET; - iaddr.sin_port = htons(IRPD_PORT); - iaddr.sin_addr.s_addr = ipaddr; - } - - - pvt->fdCxn = socket(addr->sa_family, SOCK_STREAM, PF_UNSPEC); - if (pvt->fdCxn < 0) { - perror("socket"); - return (-1); - } - - if (connect(pvt->fdCxn, addr, socklen) != 0) { - perror("connect"); - return (-1); - } - - flags = fcntl(pvt->fdCxn, F_GETFL, 0); - if (flags < 0) { - close(pvt->fdCxn); - perror("close"); - return (-1); - } - -#if 0 - flags |= O_NONBLOCK; - if (fcntl(pvt->fdCxn, F_SETFL, flags) < 0) { - close(pvt->fdCxn); - perror("fcntl"); - return (-1); - } -#endif - - code = irs_irp_read_response(pvt, text, sizeof text); - if (code != IRPD_WELCOME_CODE) { - if (irp_log_errors) { - syslog(LOG_WARNING, "Connection failed: %s", text); - } - irs_irp_disconnect(pvt); - return (-1); - } - - return (0); -} - -/*% - * int irs_irp_is_connected(struct irp_p *pvt); - * - * Returns: - * - * Non-zero if streams are setup to remote. - * - */ - -int -irs_irp_is_connected(struct irp_p *pvt) { - return (pvt->fdCxn >= 0); -} - -/*% - * void - * irs_irp_disconnect(struct irp_p *pvt); - * - * Closes streams to remote. - */ - -void -irs_irp_disconnect(struct irp_p *pvt) { - if (pvt->fdCxn != -1) { - close(pvt->fdCxn); - pvt->fdCxn = -1; - } -} - - - -int -irs_irp_read_line(struct irp_p *pvt, char *buffer, int len) { - char *realstart = &pvt->inbuffer[0]; - char *p, *start, *end; - int spare; - int i; - int buffpos = 0; - int left = len - 1; - - while (left > 0) { - start = p = &pvt->inbuffer[pvt->incurr]; - end = &pvt->inbuffer[pvt->inlast]; - - while (p != end && *p != '\n') - p++; - - if (p == end) { - /* Found no newline so shift data down if necessary - * and append new data to buffer - */ - if (start > realstart) { - memmove(realstart, start, end - start); - pvt->inlast = end - start; - start = realstart; - pvt->incurr = 0; - end = &pvt->inbuffer[pvt->inlast]; - } - - spare = sizeof (pvt->inbuffer) - pvt->inlast; - - p = end; - i = read(pvt->fdCxn, end, spare); - if (i < 0) { - close(pvt->fdCxn); - pvt->fdCxn = -1; - return (buffpos > 0 ? buffpos : -1); - } else if (i == 0) { - return (buffpos); - } - - end += i; - pvt->inlast += i; - - while (p != end && *p != '\n') - p++; - } - - if (p == end) { - /* full buffer and still no newline */ - i = sizeof pvt->inbuffer; - } else { - /* include newline */ - i = p - start + 1; - } - - if (i > left) - i = left; - memcpy(buffer + buffpos, start, i); - pvt->incurr += i; - buffpos += i; - buffer[buffpos] = '\0'; - - if (p != end) { - left = 0; - } else { - left -= i; - } - } - -#if 0 - fprintf(stderr, "read line: %s\n", buffer); -#endif - return (buffpos); -} - -/*% - * int irp_read_response(struct irp_p *pvt); - * - * Returns: - * - * The number found at the beginning of the line read from - * FP. 0 on failure(0 is not a legal response code). The - * rest of the line is discarded. - * - */ - -int -irs_irp_read_response(struct irp_p *pvt, char *text, size_t textlen) { - char line[1024]; - int code; - char *p; - - if (irs_irp_read_line(pvt, line, sizeof line) <= 0) { - return (0); - } - - p = strchr(line, '\n'); - if (p == NULL) { - return (0); - } - - if (sscanf(line, "%d", &code) != 1) { - code = 0; - } else if (text != NULL && textlen > 0U) { - p = line; - while (isspace((unsigned char)*p)) p++; - while (isdigit((unsigned char)*p)) p++; - while (isspace((unsigned char)*p)) p++; - strncpy(text, p, textlen - 1); - p[textlen - 1] = '\0'; - } - - return (code); -} - -/*% - * char *irp_read_body(struct irp_p *pvt, size_t *size); - * - * Read in the body of a response. Terminated by a line with - * just a dot on it. Lines should be terminated with a CR-LF - * sequence, but we're nt piccky if the CR is missing. - * No leading dot escaping is done as the protcol doesn't - * use leading dots anywhere. - * - * Returns: - * - * Pointer to null-terminated buffer allocated by memget. - * *SIZE is set to the length of the buffer. - * - */ - -char * -irs_irp_read_body(struct irp_p *pvt, size_t *size) { - char line[1024]; - u_int linelen; - size_t len = LINEINCR; - char *buffer = memget(len); - int idx = 0; - - if (buffer == NULL) - return (NULL); - - for (;;) { - if (irs_irp_read_line(pvt, line, sizeof line) <= 0 || - strchr(line, '\n') == NULL) - goto death; - - linelen = strlen(line); - - if (line[linelen - 1] != '\n') - goto death; - - /* We're not strict about missing \r. Should we be?? */ - if (linelen > 2 && line[linelen - 2] == '\r') { - line[linelen - 2] = '\n'; - line[linelen - 1] = '\0'; - linelen--; - } - - if (linelen == 2 && line[0] == '.') { - *size = len; - buffer[idx] = '\0'; - - return (buffer); - } - - if (linelen > (len - (idx + 1))) { - char *p = memget(len + LINEINCR); - - if (p == NULL) - goto death; - memcpy(p, buffer, len); - memput(buffer, len); - buffer = p; - len += LINEINCR; - } - - memcpy(buffer + idx, line, linelen); - idx += linelen; - } - death: - memput(buffer, len); - return (NULL); -} - -/*% - * int irs_irp_get_full_response(struct irp_p *pvt, int *code, - * char **body, size_t *bodylen); - * - * Gets the response to a command. If the response indicates - * there's a body to follow(code % 10 == 1), then the - * body buffer is allcoated with memget and stored in - * *BODY. The length of the allocated body buffer is stored - * in *BODY. The caller must give the body buffer back to - * memput when done. The results code is stored in *CODE. - * - * Returns: - * - * 0 if a result was read. -1 on some sort of failure. - * - */ - -int -irs_irp_get_full_response(struct irp_p *pvt, int *code, char *text, - size_t textlen, char **body, size_t *bodylen) { - int result = irs_irp_read_response(pvt, text, textlen); - - *body = NULL; - - if (result == 0) { - return (-1); - } - - *code = result; - - /* Code that matches 2xx is a good result code. - * Code that matches xx1 means there's a response body coming. - */ - if ((result / 100) == 2 && (result % 10) == 1) { - *body = irs_irp_read_body(pvt, bodylen); - if (*body == NULL) { - return (-1); - } - } - - return (0); -} - -/*% - * int irs_irp_send_command(struct irp_p *pvt, const char *fmt, ...); - * - * Sends command to remote connected via the PVT - * structure. FMT and args after it are fprintf-like - * arguments for formatting. - * - * Returns: - * - * 0 on success, -1 on failure. - */ - -int -irs_irp_send_command(struct irp_p *pvt, const char *fmt, ...) { - va_list ap; - char buffer[1024]; - int pos = 0; - int i, todo; - - - if (pvt->fdCxn < 0) { - return (-1); - } - - va_start(ap, fmt); - (void) vsprintf(buffer, fmt, ap); - todo = strlen(buffer); - va_end(ap); - if (todo > (int)sizeof(buffer) - 3) { - syslog(LOG_CRIT, "memory overrun in irs_irp_send_command()"); - exit(1); - } - strcat(buffer, "\r\n"); - todo = strlen(buffer); - - while (todo > 0) { - i = write(pvt->fdCxn, buffer + pos, todo); -#if 0 - /* XXX brister */ - fprintf(stderr, "Wrote: \""); - fwrite(buffer + pos, sizeof (char), todo, stderr); - fprintf(stderr, "\"\n"); -#endif - if (i < 0) { - close(pvt->fdCxn); - pvt->fdCxn = -1; - return (-1); - } - todo -= i; - } - - return (0); -} - - -/* Methods */ - -/*% - * void irp_close(struct irs_acc *this) - * - */ - -static void -irp_close(struct irs_acc *this) { - struct irp_p *irp = (struct irp_p *)this->private; - - if (irp != NULL) { - irs_irp_disconnect(irp); - memput(irp, sizeof *irp); - } - - memput(this, sizeof *this); -} - - - - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irp_gr.c b/contrib/bind9/lib/bind/irs/irp_gr.c deleted file mode 100644 index bdab3da..0000000 --- a/contrib/bind9/lib/bind/irs/irp_gr.c +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright(c) 1996, 1998 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: irp_gr.c,v 1.3.18.1 2005/04/27 05:01:00 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* extern */ - -#include "port_before.h" - -#ifndef WANT_IRS_PW -static int __bind_irs_gr_unneeded; -#else - -#include <syslog.h> -#include <sys/param.h> -#include <sys/types.h> - -#include <errno.h> -#include <fcntl.h> -#include <grp.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <syslog.h> - -#include <irs.h> -#include <irp.h> -#include <isc/memcluster.h> -#include <isc/irpmarshall.h> - -#include "irs_p.h" -#include "lcl_p.h" -#include "irp_p.h" - -#include "port_after.h" - - -/* Types. */ - -/*! \file - * \brief - * Module for the getnetgrent(3) family to use when connected to a - * remote irp daemon. - * \brief - * See irpd.c for justification of caching done here. - * - */ - -struct pvt { - struct irp_p *girpdata; /*%< global IRP data */ - int warned; - struct group group; -}; - -/* Forward. */ - -static void gr_close(struct irs_gr *); -static struct group * gr_next(struct irs_gr *); -static struct group * gr_byname(struct irs_gr *, const char *); -static struct group * gr_bygid(struct irs_gr *, gid_t); -static void gr_rewind(struct irs_gr *); -static void gr_minimize(struct irs_gr *); - -/* Private */ -static void free_group(struct group *gr); - - -/* Public. */ - -/*% - * Initialize the group sub-module. - * - */ - -struct irs_gr * -irs_irp_gr(struct irs_acc *this) { - struct irs_gr *gr; - struct pvt *pvt; - - if (!(gr = memget(sizeof *gr))) { - errno = ENOMEM; - return (NULL); - } - memset(gr, 0x0, sizeof *gr); - - if (!(pvt = memget(sizeof *pvt))) { - memput(gr, sizeof *gr); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0x0, sizeof *pvt); - pvt->girpdata = this->private; - - gr->private = pvt; - gr->close = gr_close; - gr->next = gr_next; - gr->byname = gr_byname; - gr->bygid = gr_bygid; - gr->rewind = gr_rewind; - gr->list = make_group_list; - gr->minimize = gr_minimize; - return (gr); -} - -/* Methods. */ - -/*% - * Close the sub-module. - * - */ - -static void -gr_close(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - gr_minimize(this); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -/*% - * Gets the next group out of the cached data and returns it. - * - */ - -static struct group * -gr_next(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct group *gr = &pvt->group; - char *body; - size_t bodylen; - int code; - char text[256]; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getgrent") != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - if (irp_log_errors) { - syslog(LOG_WARNING, "getgrent failed: %s", text); - } - return (NULL); - } - - if (code == IRPD_GETGROUP_OK) { - free_group(gr); - if (irp_unmarshall_gr(gr, body) != 0) { - gr = NULL; - } - } else { - gr = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (gr); -} - -/*% - * Gets a group by name from irpd and returns it. - * - */ - -static struct group * -gr_byname(struct irs_gr *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct group *gr = &pvt->group; - char *body; - size_t bodylen; - int code; - char text[256]; - - - if (gr->gr_name != NULL && strcmp(name, gr->gr_name) == 0) { - return (gr); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getgrnam %s", name) != 0) - return (NULL); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETGROUP_OK) { - free_group(gr); - if (irp_unmarshall_gr(gr, body) != 0) { - gr = NULL; - } - } else { - gr = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (gr); -} - -/*% - * Gets a group by gid from irpd and returns it. - * - */ - -static struct group * -gr_bygid(struct irs_gr *this, gid_t gid) { - struct pvt *pvt = (struct pvt *)this->private; - struct group *gr = &pvt->group; - char *body; - size_t bodylen; - int code; - char text[256]; - - if (gr->gr_name != NULL && (gid_t)gr->gr_gid == gid) { - return (gr); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getgrgid %d", gid) != 0) - return (NULL); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETGROUP_OK) { - free_group(gr); - if (irp_unmarshall_gr(gr, body) != 0) { - gr = NULL; - } - } else { - gr = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (gr); -} - -/*% - * void gr_rewind(struct irs_gr *this) - * - */ - -static void -gr_rewind(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - char text[256]; - int code; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return; - } - - if (irs_irp_send_command(pvt->girpdata, "setgrent") != 0) { - return; - } - - code = irs_irp_read_response(pvt->girpdata, text, sizeof text); - if (code != IRPD_GETGROUP_SETOK) { - if (irp_log_errors) { - syslog(LOG_WARNING, "setgrent failed: %s", text); - } - } - - return; -} - -/*% - * Frees up cached data and disconnects(if necessary) from the remote. - * - */ - -static void -gr_minimize(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - free_group(&pvt->group); - irs_irp_disconnect(pvt->girpdata); -} - -/* Private. */ - -/*% - * static void free_group(struct group *gr); - * - * Deallocate all the memory irp_unmarshall_gr allocated. - * - */ - -static void -free_group(struct group *gr) { - char **p; - - if (gr == NULL) - return; - - if (gr->gr_name != NULL) - free(gr->gr_name); - - if (gr->gr_passwd != NULL) - free(gr->gr_passwd); - - for (p = gr->gr_mem ; p != NULL && *p != NULL ; p++) - free(*p); - - if (gr->gr_mem) - free(gr->gr_mem); - - if (p != NULL) - free(p); -} - - -#endif /* WANT_IRS_GR */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irp_ho.c b/contrib/bind9/lib/bind/irs/irp_ho.c deleted file mode 100644 index d71285e..0000000 --- a/contrib/bind9/lib/bind/irs/irp_ho.c +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996,1998 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: irp_ho.c,v 1.2.18.1 2005/04/27 05:01:00 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports. */ - -#include "port_before.h" - -#include <syslog.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> - -#include <irs.h> -#include <irp.h> -#include <isc/irpmarshall.h> -#include <isc/memcluster.h> - -#include "irs_p.h" -#include "dns_p.h" -#include "irp_p.h" - -#include "port_after.h" - -/* Definitions. */ - -#define MAXALIASES 35 -#define MAXADDRS 35 -#define Max(a,b) ((a) > (b) ? (a) : (b)) - - -struct pvt { - struct irp_p *girpdata; - int warned; - struct hostent host; -}; - -/* Forward. */ - -static void ho_close(struct irs_ho *this); -static struct hostent * ho_byname(struct irs_ho *this, const char *name); -static struct hostent * ho_byname2(struct irs_ho *this, const char *name, - int af); -static struct hostent * ho_byaddr(struct irs_ho *this, const void *addr, - int len, int af); -static struct hostent * ho_next(struct irs_ho *this); -static void ho_rewind(struct irs_ho *this); -static void ho_minimize(struct irs_ho *this); - -static void free_host(struct hostent *ho); -static struct addrinfo * ho_addrinfo(struct irs_ho *this, const char *name, - const struct addrinfo *pai); - -/* Public. */ - -/*% - * struct irs_ho * irs_irp_ho(struct irs_acc *this) - * - * Notes: - * - * Initializes the irp_ho module. - * - */ - -struct irs_ho * -irs_irp_ho(struct irs_acc *this) { - struct irs_ho *ho; - struct pvt *pvt; - - if (!(ho = memget(sizeof *ho))) { - errno = ENOMEM; - return (NULL); - } - memset(ho, 0x0, sizeof *ho); - - if (!(pvt = memget(sizeof *pvt))) { - memput(ho, sizeof *ho); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->girpdata = this->private; - - ho->private = pvt; - ho->close = ho_close; - ho->byname = ho_byname; - ho->byname2 = ho_byname2; - ho->byaddr = ho_byaddr; - ho->next = ho_next; - ho->rewind = ho_rewind; - ho->minimize = ho_minimize; - ho->addrinfo = ho_addrinfo; - - return (ho); -} - -/* Methods. */ - -/*% - * Closes down the module. - * - */ - -static void -ho_close(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - ho_minimize(this); - - free_host(&pvt->host); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - - - -/* - * struct hostent * ho_byname(struct irs_ho *this, const char *name) - * - */ - -static struct hostent * -ho_byname(struct irs_ho *this, const char *name) { - return (ho_byname2(this, name, AF_INET)); -} - - - - - -/* - * struct hostent * ho_byname2(struct irs_ho *this, const char *name, int af) - * - */ - -static struct hostent * -ho_byname2(struct irs_ho *this, const char *name, int af) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *ho = &pvt->host; - char *body = NULL; - size_t bodylen; - int code; - char text[256]; - - if (ho->h_name != NULL && - strcmp(name, ho->h_name) == 0 && - af == ho->h_addrtype) { - return (ho); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "gethostbyname2 %s %s", - name, ADDR_T_STR(af)) != 0) - return (NULL); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETHOST_OK) { - free_host(ho); - if (irp_unmarshall_ho(ho, body) != 0) { - ho = NULL; - } - } else { - ho = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (ho); -} - - - -/* - * struct hostent * ho_byaddr(struct irs_ho *this, const void *addr, - * int len, int af) - * - */ - -static struct hostent * -ho_byaddr(struct irs_ho *this, const void *addr, int len, int af) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *ho = &pvt->host; - char *body = NULL; - size_t bodylen; - int code; - char **p; - char paddr[MAXPADDRSIZE]; - char text[256]; - - if (ho->h_name != NULL && - af == ho->h_addrtype && - len == ho->h_length) { - for (p = ho->h_addr_list ; *p != NULL ; p++) { - if (memcmp(*p, addr, len) == 0) - return (ho); - } - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (inet_ntop(af, addr, paddr, sizeof paddr) == NULL) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "gethostbyaddr %s %s", - paddr, ADDR_T_STR(af)) != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETHOST_OK) { - free_host(ho); - if (irp_unmarshall_ho(ho, body) != 0) { - ho = NULL; - } - } else { - ho = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (ho); -} - -/*% - * The implementation for gethostent(3). The first time it's - * called all the data is pulled from the remote(i.e. what - * the maximum number of gethostent(3) calls would return) - * and that data is cached. - * - */ - -static struct hostent * -ho_next(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *ho = &pvt->host; - char *body; - size_t bodylen; - int code; - char text[256]; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "gethostent") != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETHOST_OK) { - free_host(ho); - if (irp_unmarshall_ho(ho, body) != 0) { - ho = NULL; - } - } else { - ho = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (ho); -} - -/*% - * void ho_rewind(struct irs_ho *this) - * - */ - -static void -ho_rewind(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - char text[256]; - int code; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return; - } - - if (irs_irp_send_command(pvt->girpdata, "sethostent") != 0) { - return; - } - - code = irs_irp_read_response(pvt->girpdata, text, sizeof text); - if (code != IRPD_GETHOST_SETOK) { - if (irp_log_errors) { - syslog(LOG_WARNING, "sethostent failed: %s", text); - } - } - - return; -} - -/*% - * void ho_minimize(struct irs_ho *this) - * - */ - -static void -ho_minimize(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - free_host(&pvt->host); - - irs_irp_disconnect(pvt->girpdata); -} - -/*% - * void free_host(struct hostent *ho) - * - */ - -static void -free_host(struct hostent *ho) { - char **p; - - if (ho == NULL) { - return; - } - - if (ho->h_name != NULL) - free(ho->h_name); - - if (ho->h_aliases != NULL) { - for (p = ho->h_aliases ; *p != NULL ; p++) - free(*p); - free(ho->h_aliases); - } - - if (ho->h_addr_list != NULL) { - for (p = ho->h_addr_list ; *p != NULL ; p++) - free(*p); - free(ho->h_addr_list); - } -} - -/* dummy */ -static struct addrinfo * -ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai) -{ - UNUSED(this); - UNUSED(name); - UNUSED(pai); - return(NULL); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irp_ng.c b/contrib/bind9/lib/bind/irs/irp_ng.c deleted file mode 100644 index e0aa468..0000000 --- a/contrib/bind9/lib/bind/irs/irp_ng.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996, 1998 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: irp_ng.c,v 1.2.18.2 2006/12/07 04:53:02 marka Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <syslog.h> - -#include <irs.h> -#include <irp.h> -#include <isc/memcluster.h> -#include <isc/irpmarshall.h> - -#include "irs_p.h" -#include "irp_p.h" - -#include "port_after.h" - -/* Definitions */ - -struct pvt { - struct irp_p *girpdata; - int warned; -}; - - -/* Forward */ - -static void ng_rewind(struct irs_ng *, const char*); -static void ng_close(struct irs_ng *); -static int ng_next(struct irs_ng *, const char **, const char **, - const char **); -static int ng_test(struct irs_ng *, const char *, - const char *, const char *, - const char *); -static void ng_minimize(struct irs_ng *); - - -/* Public */ - -/*% - * Intialize the irp netgroup module. - * - */ - -struct irs_ng * -irs_irp_ng(struct irs_acc *this) { - struct irs_ng *ng; - struct pvt *pvt; - - if (!(ng = memget(sizeof *ng))) { - errno = ENOMEM; - return (NULL); - } - memset(ng, 0x5e, sizeof *ng); - - if (!(pvt = memget(sizeof *pvt))) { - memput(ng, sizeof *ng); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->girpdata = this->private; - - ng->private = pvt; - ng->close = ng_close; - ng->next = ng_next; - ng->test = ng_test; - ng->rewind = ng_rewind; - ng->minimize = ng_minimize; - return (ng); -} - -/* Methods */ - - - -/* - * void ng_close(struct irs_ng *this) - * - */ - -static void -ng_close(struct irs_ng *this) { - struct pvt *pvt = (struct pvt *)this->private; - - ng_minimize(this); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - - - - -/* - * void ng_rewind(struct irs_ng *this, const char *group) - * - * - */ - -static void -ng_rewind(struct irs_ng *this, const char *group) { - struct pvt *pvt = (struct pvt *)this->private; - char text[256]; - int code; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return; - } - - if (irs_irp_send_command(pvt->girpdata, - "setnetgrent %s", group) != 0) { - return; - } - - code = irs_irp_read_response(pvt->girpdata, text, sizeof text); - if (code != IRPD_GETNETGR_SETOK) { - if (irp_log_errors) { - syslog(LOG_WARNING, "setnetgrent(%s) failed: %s", - group, text); - } - } - - return; -} - -/* - * Get the next netgroup item from the cache. - * - */ - -static int -ng_next(struct irs_ng *this, const char **host, const char **user, - const char **domain) -{ - struct pvt *pvt = (struct pvt *)this->private; - int code; - char *body = NULL; - size_t bodylen; - int rval = 0; - char text[256]; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (0); - } - - if (irs_irp_send_command(pvt->girpdata, "getnetgrent") != 0) - return (0); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (0); - } - - if (code == IRPD_GETNETGR_OK) { - if (irp_unmarshall_ng(host, user, domain, body) == 0) { - rval = 1; - } - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (rval); -} - -/* - * Search for a match in a netgroup. - * - */ - -static int -ng_test(struct irs_ng *this, const char *name, - const char *host, const char *user, const char *domain) -{ - struct pvt *pvt = (struct pvt *)this->private; - char *body = NULL; - size_t bodylen = 0; - int code; - char text[256]; - int rval = 0; - - UNUSED(name); - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (0); - } - - if (irp_marshall_ng(host, user, domain, &body, &bodylen) != 0) { - return (0); - } - - if (irs_irp_send_command(pvt->girpdata, "innetgr %s", body) == 0) { - code = irs_irp_read_response(pvt->girpdata, text, sizeof text); - if (code == IRPD_GETNETGR_MATCHES) { - rval = 1; - } - } - - memput(body, bodylen); - - return (rval); -} - - - - -/* - * void ng_minimize(struct irs_ng *this) - * - */ - -static void -ng_minimize(struct irs_ng *this) { - struct pvt *pvt = (struct pvt *)this->private; - - irs_irp_disconnect(pvt->girpdata); -} - - - - -/* Private */ - - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irp_nw.c b/contrib/bind9/lib/bind/irs/irp_nw.c deleted file mode 100644 index b285120..0000000 --- a/contrib/bind9/lib/bind/irs/irp_nw.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996,1998 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: irp_nw.c,v 1.2.18.2 2006/03/10 00:20:08 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#if 0 - -#endif - -/* Imports */ - -#include "port_before.h" - -#include <syslog.h> -#include <sys/types.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <fcntl.h> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> - -#include <irs.h> -#include <irp.h> -#include <isc/irpmarshall.h> - -#include <isc/memcluster.h> -#include <isc/misc.h> - -#include "irs_p.h" -#include "lcl_p.h" -#include "irp_p.h" - -#include "port_after.h" - -#define MAXALIASES 35 -#define MAXADDRSIZE 4 - -struct pvt { - struct irp_p *girpdata; - int warned; - struct nwent net; -}; - -/* Forward */ - -static void nw_close(struct irs_nw *); -static struct nwent * nw_byname(struct irs_nw *, const char *, int); -static struct nwent * nw_byaddr(struct irs_nw *, void *, int, int); -static struct nwent * nw_next(struct irs_nw *); -static void nw_rewind(struct irs_nw *); -static void nw_minimize(struct irs_nw *); - -static void free_nw(struct nwent *nw); - - -/* Public */ - -/*% - * struct irs_nw * irs_irp_nw(struct irs_acc *this) - * - */ - -struct irs_nw * -irs_irp_nw(struct irs_acc *this) { - struct irs_nw *nw; - struct pvt *pvt; - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - - if (!(nw = memget(sizeof *nw))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(nw, 0x0, sizeof *nw); - pvt->girpdata = this->private; - - nw->private = pvt; - nw->close = nw_close; - nw->byname = nw_byname; - nw->byaddr = nw_byaddr; - nw->next = nw_next; - nw->rewind = nw_rewind; - nw->minimize = nw_minimize; - return (nw); -} - -/* Methods */ - -/*% - * void nw_close(struct irs_nw *this) - * - */ - -static void -nw_close(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - nw_minimize(this); - - free_nw(&pvt->net); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -/*% - * struct nwent * nw_byaddr(struct irs_nw *this, void *net, - * int length, int type) - * - */ - -static struct nwent * -nw_byaddr(struct irs_nw *this, void *net, int length, int type) { - struct pvt *pvt = (struct pvt *)this->private; - struct nwent *nw = &pvt->net; - char *body = NULL; - size_t bodylen; - int code; - char paddr[24]; /*%< bigenough for ip4 w/ cidr spec. */ - char text[256]; - - if (inet_net_ntop(type, net, length, paddr, sizeof paddr) == NULL) { - return (NULL); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getnetbyaddr %s %s", - paddr, ADDR_T_STR(type)) != 0) - return (NULL); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETNET_OK) { - free_nw(nw); - if (irp_unmarshall_nw(nw, body) != 0) { - nw = NULL; - } - } else { - nw = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (nw); -} - -/*% - * struct nwent * nw_byname(struct irs_nw *this, const char *name, int type) - * - */ - -static struct nwent * -nw_byname(struct irs_nw *this, const char *name, int type) { - struct pvt *pvt = (struct pvt *)this->private; - struct nwent *nw = &pvt->net; - char *body = NULL; - size_t bodylen; - int code; - char text[256]; - - if (nw->n_name != NULL && - strcmp(name, nw->n_name) == 0 && - nw->n_addrtype == type) { - return (nw); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getnetbyname %s", name) != 0) - return (NULL); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETNET_OK) { - free_nw(nw); - if (irp_unmarshall_nw(nw, body) != 0) { - nw = NULL; - } - } else { - nw = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (nw); -} - -/*% - * void nw_rewind(struct irs_nw *this) - * - */ - -static void -nw_rewind(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - char text[256]; - int code; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return; - } - - if (irs_irp_send_command(pvt->girpdata, "setnetent") != 0) { - return; - } - - code = irs_irp_read_response(pvt->girpdata, text, sizeof text); - if (code != IRPD_GETNET_SETOK) { - if (irp_log_errors) { - syslog(LOG_WARNING, "setnetent failed: %s", text); - } - } - - return; -} - -/*% - * Prepares the cache if necessary and returns the first, or - * next item from it. - */ - -static struct nwent * -nw_next(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct nwent *nw = &pvt->net; - char *body; - size_t bodylen; - int code; - char text[256]; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getnetent") != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETNET_OK) { - free_nw(nw); - if (irp_unmarshall_nw(nw, body) != 0) { - nw = NULL; - } - } else { - nw = NULL; - } - - if (body != NULL) - memput(body, bodylen); - return (nw); -} - -/*% - * void nw_minimize(struct irs_nw *this) - * - */ - -static void -nw_minimize(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - irs_irp_disconnect(pvt->girpdata); -} - - - - -/* private. */ - -/*% - * deallocate all the memory irp_unmarshall_pw allocated. - * - */ - -static void -free_nw(struct nwent *nw) { - char **p; - - if (nw == NULL) - return; - - if (nw->n_name != NULL) - free(nw->n_name); - - if (nw->n_aliases != NULL) { - for (p = nw->n_aliases ; *p != NULL ; p++) { - free(*p); - } - free(nw->n_aliases); - } - - if (nw->n_addr != NULL) - free(nw->n_addr); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irp_p.h b/contrib/bind9/lib/bind/irs/irp_p.h deleted file mode 100644 index 21d31cc..0000000 --- a/contrib/bind9/lib/bind/irs/irp_p.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: irp_p.h,v 1.4.18.1 2005/04/27 05:01:00 sra Exp $ - */ - -#ifndef _IRP_P_H_INCLUDED -#define _IRP_P_H_INCLUDED - -#include <stdio.h> - -struct irp_p { - char inbuffer[1024]; - int inlast; /*%< index of one past the last char in buffer */ - int incurr; /*%< index of the next char to be read from buffer */ - int fdCxn; -}; - -/* - * Externs. - */ - -extern struct irs_acc * irs_irp_acc __P((const char *)); -extern struct irs_gr * irs_irp_gr __P((struct irs_acc *)); -extern struct irs_pw * irs_irp_pw __P((struct irs_acc *)); -extern struct irs_sv * irs_irp_sv __P((struct irs_acc *)); -extern struct irs_pr * irs_irp_pr __P((struct irs_acc *)); -extern struct irs_ho * irs_irp_ho __P((struct irs_acc *)); -extern struct irs_nw * irs_irp_nw __P((struct irs_acc *)); -extern struct irs_ng * irs_irp_ng __P((struct irs_acc *)); - -int irs_irp_connect(struct irp_p *pvt); -int irs_irp_is_connected(struct irp_p *pvt); -void irs_irp_disconnect(struct irp_p *pvt); -int irs_irp_read_response(struct irp_p *pvt, char *text, size_t textlen); -char *irs_irp_read_body(struct irp_p *pvt, size_t *size); -int irs_irp_get_full_response(struct irp_p *pvt, int *code, - char *text, size_t textlen, - char **body, size_t *bodylen); - -extern int irp_log_errors; - -#endif - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irp_pr.c b/contrib/bind9/lib/bind/irs/irp_pr.c deleted file mode 100644 index 00e69ab..0000000 --- a/contrib/bind9/lib/bind/irs/irp_pr.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: irp_pr.c,v 1.2.18.1 2005/04/27 05:01:01 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* extern */ - -#include "port_before.h" - -#include <syslog.h> -#include <sys/types.h> - -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <netdb.h> -#include <syslog.h> - -#include <irs.h> -#include <irp.h> -#include <isc/memcluster.h> -#include <isc/irpmarshall.h> - -#include "irs_p.h" -#include "lcl_p.h" -#include "irp_p.h" - -#include "port_after.h" - - -#define MAXALIASES 35 - -/* Types */ - -struct pvt { - struct irp_p *girpdata; - int warned; - struct protoent proto; -}; - -/* Forward */ - -static void pr_close(struct irs_pr *); -static struct protoent * pr_next(struct irs_pr *); -static struct protoent * pr_byname(struct irs_pr *, const char *); -static struct protoent * pr_bynumber(struct irs_pr *, int); -static void pr_rewind(struct irs_pr *); -static void pr_minimize(struct irs_pr *); - -static void free_proto(struct protoent *pr); - -/* Public */ - -/*% - * struct irs_pr * irs_irp_pr(struct irs_acc *this) - * - */ - -struct irs_pr * -irs_irp_pr(struct irs_acc *this) { - struct irs_pr *pr; - struct pvt *pvt; - - if (!(pr = memget(sizeof *pr))) { - errno = ENOMEM; - return (NULL); - } - memset(pr, 0x0, sizeof *pr); - - if (!(pvt = memget(sizeof *pvt))) { - memput(pr, sizeof *pr); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->girpdata = this->private; - - pr->private = pvt; - pr->close = pr_close; - pr->byname = pr_byname; - pr->bynumber = pr_bynumber; - pr->next = pr_next; - pr->rewind = pr_rewind; - pr->minimize = pr_minimize; - return (pr); -} - -/* Methods */ - -/*% - * void pr_close(struct irs_pr *this) - * - */ - -static void -pr_close(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pr_minimize(this); - - free_proto(&pvt->proto); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -/*% - * struct protoent * pr_byname(struct irs_pr *this, const char *name) - * - */ - -static struct protoent * -pr_byname(struct irs_pr *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct protoent *pr = &pvt->proto; - char *body = NULL; - size_t bodylen; - int code; - int i; - char text[256]; - - if (pr->p_name != NULL && strcmp(name, pr->p_name) == 0) { - return (pr); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - i = irs_irp_send_command(pvt->girpdata, "getprotobyname %s", name); - if (i != 0) - return (NULL); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETPROTO_OK) { - free_proto(pr); - if (irp_unmarshall_pr(pr, body) != 0) { - pr = NULL; - } - } else { - pr = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (pr); -} - -/*% - * struct protoent * pr_bynumber(struct irs_pr *this, int proto) - * - */ - -static struct protoent * -pr_bynumber(struct irs_pr *this, int proto) { - struct pvt *pvt = (struct pvt *)this->private; - struct protoent *pr = &pvt->proto; - char *body = NULL; - size_t bodylen; - int code; - int i; - char text[256]; - - if (pr->p_name != NULL && proto == pr->p_proto) { - return (pr); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - i = irs_irp_send_command(pvt->girpdata, "getprotobynumber %d", proto); - if (i != 0) - return (NULL); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETPROTO_OK) { - free_proto(pr); - if (irp_unmarshall_pr(pr, body) != 0) { - pr = NULL; - } - } else { - pr = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (pr); -} - -/*% - * void pr_rewind(struct irs_pr *this) - * - */ - -static void -pr_rewind(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - char text[256]; - int code; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return; - } - - if (irs_irp_send_command(pvt->girpdata, "setprotoent") != 0) { - return; - } - - code = irs_irp_read_response(pvt->girpdata, text, sizeof text); - if (code != IRPD_GETPROTO_SETOK) { - if (irp_log_errors) { - syslog(LOG_WARNING, "setprotoent failed: %s", text); - } - } - - return; -} - -/*% - * Prepares the cache if necessary and returns the next item in it. - * - */ - -static struct protoent * -pr_next(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct protoent *pr = &pvt->proto; - char *body; - size_t bodylen; - int code; - char text[256]; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getprotoent") != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETPROTO_OK) { - free_proto(pr); - if (irp_unmarshall_pr(pr, body) != 0) { - pr = NULL; - } - } else { - pr = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (pr); -} - -/*% - * void pr_minimize(struct irs_pr *this) - * - */ - -static void -pr_minimize(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - irs_irp_disconnect(pvt->girpdata); -} - -/*% - * Deallocate all the memory irp_unmarshall_pr allocated. - * - */ - -static void -free_proto(struct protoent *pr) { - char **p; - - if (pr == NULL) - return; - - if (pr->p_name != NULL) - free(pr->p_name); - - for (p = pr->p_aliases ; p != NULL && *p != NULL ; p++) - free(*p); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irp_pw.c b/contrib/bind9/lib/bind/irs/irp_pw.c deleted file mode 100644 index a326375..0000000 --- a/contrib/bind9/lib/bind/irs/irp_pw.c +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: irp_pw.c,v 1.3.18.1 2005/04/27 05:01:01 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Extern */ - -#include "port_before.h" - -#ifndef WANT_IRS_PW -static int __bind_irs_pw_unneeded; -#else - -#include <syslog.h> -#include <sys/param.h> - -#include <db.h> -#include <errno.h> -#include <fcntl.h> -#include <limits.h> -#include <pwd.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> -#include <utmp.h> -#include <unistd.h> - -#include <irs.h> -#include <irp.h> -#include <isc/memcluster.h> -#include <isc/irpmarshall.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "irp_p.h" - - -/* Types */ - -struct pvt { - struct irp_p *girpdata; /*%< global IRP data */ - int warned; - struct passwd passwd; /*%< password structure */ -}; - -/* Forward */ - -static void pw_close(struct irs_pw *); -static struct passwd * pw_next(struct irs_pw *); -static struct passwd * pw_byname(struct irs_pw *, const char *); -static struct passwd * pw_byuid(struct irs_pw *, uid_t); -static void pw_rewind(struct irs_pw *); -static void pw_minimize(struct irs_pw *); - -static void free_passwd(struct passwd *pw); - -/* Public */ -struct irs_pw * -irs_irp_pw(struct irs_acc *this) { - struct irs_pw *pw; - struct pvt *pvt; - - if (!(pw = memget(sizeof *pw))) { - errno = ENOMEM; - return (NULL); - } - memset(pw, 0, sizeof *pw); - - if (!(pvt = memget(sizeof *pvt))) { - memput(pw, sizeof *pw); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->girpdata = this->private; - - pw->private = pvt; - pw->close = pw_close; - pw->next = pw_next; - pw->byname = pw_byname; - pw->byuid = pw_byuid; - pw->rewind = pw_rewind; - pw->minimize = pw_minimize; - - return (pw); -} - -/* Methods */ - -/*% - * void pw_close(struct irs_pw *this) - * - */ - -static void -pw_close(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pw_minimize(this); - - free_passwd(&pvt->passwd); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -/*% - * struct passwd * pw_next(struct irs_pw *this) - * - */ - -static struct passwd * -pw_next(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct passwd *pw = &pvt->passwd; - char *body; - size_t bodylen; - int code; - char text[256]; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getpwent") != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETUSER_OK) { - free_passwd(pw); - if (irp_unmarshall_pw(pw, body) != 0) { - pw = NULL; - } - } else { - pw = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (pw); -} - -/*% - * struct passwd * pw_byname(struct irs_pw *this, const char *name) - * - */ - -static struct passwd * -pw_byname(struct irs_pw *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct passwd *pw = &pvt->passwd; - char *body = NULL; - char text[256]; - size_t bodylen; - int code; - - if (pw->pw_name != NULL && strcmp(name, pw->pw_name) == 0) { - return (pw); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getpwnam %s", name) != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETUSER_OK) { - free_passwd(pw); - if (irp_unmarshall_pw(pw, body) != 0) { - pw = NULL; - } - } else { - pw = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (pw); -} - -/*% - * struct passwd * pw_byuid(struct irs_pw *this, uid_t uid) - * - */ - -static struct passwd * -pw_byuid(struct irs_pw *this, uid_t uid) { - struct pvt *pvt = (struct pvt *)this->private; - char *body; - char text[256]; - size_t bodylen; - int code; - struct passwd *pw = &pvt->passwd; - - if (pw->pw_name != NULL && pw->pw_uid == uid) { - return (pw); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getpwuid %d", uid) != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETUSER_OK) { - free_passwd(pw); - if (irp_unmarshall_pw(pw, body) != 0) { - pw = NULL; - } - } else { - pw = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (pw); -} - -/*% - * void pw_rewind(struct irs_pw *this) - * - */ - -static void -pw_rewind(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - char text[256]; - int code; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return; - } - - if (irs_irp_send_command(pvt->girpdata, "setpwent") != 0) { - return; - } - - code = irs_irp_read_response(pvt->girpdata, text, sizeof text); - if (code != IRPD_GETUSER_SETOK) { - if (irp_log_errors) { - syslog(LOG_WARNING, "setpwent failed: %s", text); - } - } - - return; -} - -/*% - * void pw_minimize(struct irs_pw *this) - * - */ - -static void -pw_minimize(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - irs_irp_disconnect(pvt->girpdata); -} - - -/* Private. */ - -/*% - * Deallocate all the memory irp_unmarshall_pw allocated. - * - */ - -static void -free_passwd(struct passwd *pw) { - if (pw == NULL) - return; - - if (pw->pw_name != NULL) - free(pw->pw_name); - - if (pw->pw_passwd != NULL) - free(pw->pw_passwd); - -#ifdef HAVE_PW_CLASS - if (pw->pw_class != NULL) - free(pw->pw_class); -#endif - - if (pw->pw_gecos != NULL) - free(pw->pw_gecos); - - if (pw->pw_dir != NULL) - free(pw->pw_dir); - - if (pw->pw_shell != NULL) - free(pw->pw_shell); -} - -#endif /* WANT_IRS_PW */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irp_sv.c b/contrib/bind9/lib/bind/irs/irp_sv.c deleted file mode 100644 index 22ea980..0000000 --- a/contrib/bind9/lib/bind/irs/irp_sv.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996,1998 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: irp_sv.c,v 1.2.18.1 2005/04/27 05:01:01 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* extern */ - -#include "port_before.h" - -#include <syslog.h> -#include <sys/types.h> -#include <sys/socket.h> - -#ifdef IRS_LCL_SV_DB -#include <db.h> -#endif -#include <errno.h> -#include <fcntl.h> -#include <limits.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <syslog.h> - -#include <irs.h> -#include <irp.h> -#include <isc/irpmarshall.h> -#include <isc/memcluster.h> - -#include "irs_p.h" -#include "lcl_p.h" -#include "irp_p.h" - -#include "port_after.h" - -/* Types */ - -struct pvt { - struct irp_p *girpdata; - int warned; - struct servent service; -}; - -/* Forward */ - -static void sv_close(struct irs_sv*); -static struct servent * sv_next(struct irs_sv *); -static struct servent * sv_byname(struct irs_sv *, const char *, - const char *); -static struct servent * sv_byport(struct irs_sv *, int, const char *); -static void sv_rewind(struct irs_sv *); -static void sv_minimize(struct irs_sv *); - -static void free_service(struct servent *sv); - - - -/* Public */ - -/*% - * struct irs_sv * irs_irp_sv(struct irs_acc *this) - * - */ - -struct irs_sv * -irs_irp_sv(struct irs_acc *this) { - struct irs_sv *sv; - struct pvt *pvt; - - if ((sv = memget(sizeof *sv)) == NULL) { - errno = ENOMEM; - return (NULL); - } - memset(sv, 0x0, sizeof *sv); - - if ((pvt = memget(sizeof *pvt)) == NULL) { - memput(sv, sizeof *sv); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->girpdata = this->private; - - sv->private = pvt; - sv->close = sv_close; - sv->next = sv_next; - sv->byname = sv_byname; - sv->byport = sv_byport; - sv->rewind = sv_rewind; - sv->minimize = sv_minimize; - - return (sv); -} - -/* Methods */ - -/*% - * void sv_close(struct irs_sv *this) - * - */ - -static void -sv_close(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - - sv_minimize(this); - - free_service(&pvt->service); - - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -/*% - * Fills the cache if necessary and returns the next item from it. - * - */ - -static struct servent * -sv_next(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct servent *sv = &pvt->service; - char *body; - size_t bodylen; - int code; - char text[256]; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getservent") != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETSERVICE_OK) { - free_service(sv); - if (irp_unmarshall_sv(sv, body) != 0) { - sv = NULL; - } - } else { - sv = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (sv); -} - -/*% - * struct servent * sv_byname(struct irs_sv *this, const char *name, - * const char *proto) - * - */ - -static struct servent * -sv_byname(struct irs_sv *this, const char *name, const char *proto) { - struct pvt *pvt = (struct pvt *)this->private; - struct servent *sv = &pvt->service; - char *body; - char text[256]; - size_t bodylen; - int code; - - if (sv->s_name != NULL && - strcmp(name, sv->s_name) == 0 && - strcasecmp(proto, sv->s_proto) == 0) { - return (sv); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getservbyname %s %s", - name, proto) != 0) - return (NULL); - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETSERVICE_OK) { - free_service(sv); - if (irp_unmarshall_sv(sv, body) != 0) { - sv = NULL; - } - } else { - sv = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (sv); -} - -/*% - * struct servent * sv_byport(struct irs_sv *this, int port, - * const char *proto) - * - */ - -static struct servent * -sv_byport(struct irs_sv *this, int port, const char *proto) { - struct pvt *pvt = (struct pvt *)this->private; - struct servent *sv = &pvt->service; - char *body; - size_t bodylen; - char text[256]; - int code; - - if (sv->s_name != NULL && - port == sv->s_port && - strcasecmp(proto, sv->s_proto) == 0) { - return (sv); - } - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return (NULL); - } - - if (irs_irp_send_command(pvt->girpdata, "getservbyport %d %s", - ntohs((short)port), proto) != 0) { - return (NULL); - } - - if (irs_irp_get_full_response(pvt->girpdata, &code, - text, sizeof text, - &body, &bodylen) != 0) { - return (NULL); - } - - if (code == IRPD_GETSERVICE_OK) { - free_service(sv); - if (irp_unmarshall_sv(sv, body) != 0) { - sv = NULL; - } - } else { - sv = NULL; - } - - if (body != NULL) { - memput(body, bodylen); - } - - return (sv); -} - -/*% - * void sv_rewind(struct irs_sv *this) - * - */ - -static void -sv_rewind(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - char text[256]; - int code; - - if (irs_irp_connection_setup(pvt->girpdata, &pvt->warned) != 0) { - return; - } - - if (irs_irp_send_command(pvt->girpdata, "setservent") != 0) { - return; - } - - code = irs_irp_read_response(pvt->girpdata, text, sizeof text); - if (code != IRPD_GETSERVICE_SETOK) { - if (irp_log_errors) { - syslog(LOG_WARNING, "setservent failed: %s", text); - } - } - - return; -} - -/*% - * void sv_minimize(struct irs_sv *this) - * - */ - -static void -sv_minimize(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - - irs_irp_disconnect(pvt->girpdata); -} - - - - - - -static void -free_service(struct servent *sv) { - char **p; - - if (sv == NULL) { - return; - } - - if (sv->s_name != NULL) { - free(sv->s_name); - } - - for (p = sv->s_aliases ; p != NULL && *p != NULL ; p++) { - free(*p); - } - - if (sv->s_proto != NULL) { - free(sv->s_proto); - } -} - - - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irpmarshall.c b/contrib/bind9/lib/bind/irs/irpmarshall.c deleted file mode 100644 index 8c34fa2..0000000 --- a/contrib/bind9/lib/bind/irs/irpmarshall.c +++ /dev/null @@ -1,2301 +0,0 @@ -/* - * Copyright(c) 1989, 1993, 1995 - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: irpmarshall.c,v 1.5.18.2 2006/03/10 00:20:08 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#if 0 - -Check values are in approrpriate endian order. - -Double check memory allocations on unmarhsalling - -#endif - - -/* Extern */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <stdio.h> -#include <ctype.h> -#include <pwd.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> -#include <utmp.h> -#include <unistd.h> -#include <assert.h> -#include <errno.h> - -#include <irs.h> -#include <isc/memcluster.h> -#include <isc/irpmarshall.h> - -#include "port_after.h" - - -#ifndef HAVE_STRNDUP -static char *strndup(const char *str, size_t len); -#endif - -static char **splitarray(const char *buffer, const char *buffend, char delim); -static int joinarray(char * const * argv, char *buffer, char delim); -static char *getfield(char **res, size_t reslen, char **buffer, char delim); -static size_t joinlength(char * const *argv); -static void free_array(char **argv, size_t entries); - -#define ADDR_T_STR(x) (x == AF_INET ? "AF_INET" :\ - (x == AF_INET6 ? "AF_INET6" : "UNKNOWN")) - -#define MAXPADDRSIZE (sizeof "255.255.255.255" + 1) - -static char COMMA = ','; - -static const char *COMMASTR = ","; -static const char *COLONSTR = ":"; - - - -/* See big comment at bottom of irpmarshall.h for description. */ - - -#ifdef WANT_IRS_PW -/* +++++++++++++++++++++++++ struct passwd +++++++++++++++++++++++++ */ - -/*% - * int irp_marshall_pw(const struct passwd *pw, char **buffer, size_t *len) - * - * notes: \li - * - * See irpmarshall.h - * - * return: \li - * - * 0 on sucess, -1 on failure. - * - */ - -int -irp_marshall_pw(const struct passwd *pw, char **buffer, size_t *len) { - size_t need = 1 ; /*%< for null byte */ - char pwUid[24]; - char pwGid[24]; - char pwChange[24]; - char pwExpire[24]; - const char *pwClass; - const char *fieldsep = COLONSTR; - - if (pw == NULL || len == NULL) { - errno = EINVAL; - return (-1); - } - - sprintf(pwUid, "%ld", (long)pw->pw_uid); - sprintf(pwGid, "%ld", (long)pw->pw_gid); - -#ifdef HAVE_PW_CHANGE - sprintf(pwChange, "%ld", (long)pw->pw_change); -#else - pwChange[0] = '0'; - pwChange[1] = '\0'; -#endif - -#ifdef HAVE_PW_EXPIRE - sprintf(pwExpire, "%ld", (long)pw->pw_expire); -#else - pwExpire[0] = '0'; - pwExpire[1] = '\0'; -#endif - -#ifdef HAVE_PW_CLASS - pwClass = pw->pw_class; -#else - pwClass = ""; -#endif - - need += strlen(pw->pw_name) + 1; /*%< one for fieldsep */ - need += strlen(pw->pw_passwd) + 1; - need += strlen(pwUid) + 1; - need += strlen(pwGid) + 1; - need += strlen(pwClass) + 1; - need += strlen(pwChange) + 1; - need += strlen(pwExpire) + 1; - need += strlen(pw->pw_gecos) + 1; - need += strlen(pw->pw_dir) + 1; - need += strlen(pw->pw_shell) + 1; - - if (buffer == NULL) { - *len = need; - return (0); - } - - if (*buffer != NULL && need > *len) { - errno = EINVAL; - return (-1); - } - - if (*buffer == NULL) { - need += 2; /*%< for CRLF */ - *buffer = memget(need); - if (*buffer == NULL) { - errno = ENOMEM; - return (-1); - } - - *len = need; - } - - strcpy(*buffer, pw->pw_name); strcat(*buffer, fieldsep); - strcat(*buffer, pw->pw_passwd); strcat(*buffer, fieldsep); - strcat(*buffer, pwUid); strcat(*buffer, fieldsep); - strcat(*buffer, pwGid); strcat(*buffer, fieldsep); - strcat(*buffer, pwClass); strcat(*buffer, fieldsep); - strcat(*buffer, pwChange); strcat(*buffer, fieldsep); - strcat(*buffer, pwExpire); strcat(*buffer, fieldsep); - strcat(*buffer, pw->pw_gecos); strcat(*buffer, fieldsep); - strcat(*buffer, pw->pw_dir); strcat(*buffer, fieldsep); - strcat(*buffer, pw->pw_shell); strcat(*buffer, fieldsep); - - return (0); -} - -/*% - * int irp_unmarshall_pw(struct passwd *pw, char *buffer) - * - * notes: \li - * - * See irpmarshall.h - * - * return: \li - * - * 0 on success, -1 on failure - * - */ - -int -irp_unmarshall_pw(struct passwd *pw, char *buffer) { - char *name, *pass, *class, *gecos, *dir, *shell; - uid_t pwuid; - gid_t pwgid; - time_t pwchange; - time_t pwexpire; - char *p; - long t; - char tmpbuf[24]; - char *tb = &tmpbuf[0]; - char fieldsep = ':'; - int myerrno = EINVAL; - - name = pass = class = gecos = dir = shell = NULL; - p = buffer; - - /* pw_name field */ - name = NULL; - if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0) { - goto error; - } - - /* pw_passwd field */ - pass = NULL; - if (getfield(&pass, 0, &p, fieldsep) == NULL) { /*%< field can be empty */ - goto error; - } - - - /* pw_uid field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0) { - goto error; - } - t = strtol(tmpbuf, &tb, 10); - if (*tb) { - goto error; /*%< junk in value */ - } - pwuid = (uid_t)t; - if ((long) pwuid != t) { /*%< value must have been too big. */ - goto error; - } - - - - /* pw_gid field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0) { - goto error; - } - t = strtol(tmpbuf, &tb, 10); - if (*tb) { - goto error; /*%< junk in value */ - } - pwgid = (gid_t)t; - if ((long)pwgid != t) { /*%< value must have been too big. */ - goto error; - } - - - - /* pw_class field */ - class = NULL; - if (getfield(&class, 0, &p, fieldsep) == NULL) { - goto error; - } - - - - /* pw_change field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0) { - goto error; - } - t = strtol(tmpbuf, &tb, 10); - if (*tb) { - goto error; /*%< junk in value */ - } - pwchange = (time_t)t; - if ((long)pwchange != t) { /*%< value must have been too big. */ - goto error; - } - - - - /* pw_expire field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0) { - goto error; - } - t = strtol(tmpbuf, &tb, 10); - if (*tb) { - goto error; /*%< junk in value */ - } - pwexpire = (time_t)t; - if ((long) pwexpire != t) { /*%< value must have been too big. */ - goto error; - } - - - - /* pw_gecos field */ - gecos = NULL; - if (getfield(&gecos, 0, &p, fieldsep) == NULL) { - goto error; - } - - - - /* pw_dir field */ - dir = NULL; - if (getfield(&dir, 0, &p, fieldsep) == NULL) { - goto error; - } - - - - /* pw_shell field */ - shell = NULL; - if (getfield(&shell, 0, &p, fieldsep) == NULL) { - goto error; - } - - - - pw->pw_name = name; - pw->pw_passwd = pass; - pw->pw_uid = pwuid; - pw->pw_gid = pwgid; - pw->pw_gecos = gecos; - pw->pw_dir = dir; - pw->pw_shell = shell; - -#ifdef HAVE_PW_CHANGE - pw->pw_change = pwchange; -#endif -#ifdef HAVE_PW_CLASS - pw->pw_class = class; -#endif -#ifdef HAVE_PW_EXPIRE - pw->pw_expire = pwexpire; -#endif - - return (0); - - error: - errno = myerrno; - - if (name != NULL) free(name); - if (pass != NULL) free(pass); - if (gecos != NULL) free(gecos); - if (dir != NULL) free(dir); - if (shell != NULL) free(shell); - - return (-1); -} - -/* ------------------------- struct passwd ------------------------- */ -#endif /* WANT_IRS_PW */ -/* +++++++++++++++++++++++++ struct group +++++++++++++++++++++++++ */ - -/*% - * int irp_marshall_gr(const struct group *gr, char **buffer, size_t *len) - * - * notes: \li - * - * See irpmarshall.h. - * - * return: \li - * - * 0 on success, -1 on failure - */ - -int -irp_marshall_gr(const struct group *gr, char **buffer, size_t *len) { - size_t need = 1; /*%< for null byte */ - char grGid[24]; - const char *fieldsep = COLONSTR; - - if (gr == NULL || len == NULL) { - errno = EINVAL; - return (-1); - } - - sprintf(grGid, "%ld", (long)gr->gr_gid); - - need += strlen(gr->gr_name) + 1; -#ifndef MISSING_GR_PASSWD - need += strlen(gr->gr_passwd) + 1; -#else - need++; -#endif - need += strlen(grGid) + 1; - need += joinlength(gr->gr_mem) + 1; - - if (buffer == NULL) { - *len = need; - return (0); - } - - if (*buffer != NULL && need > *len) { - errno = EINVAL; - return (-1); - } - - if (*buffer == NULL) { - need += 2; /*%< for CRLF */ - *buffer = memget(need); - if (*buffer == NULL) { - errno = ENOMEM; - return (-1); - } - - *len = need; - } - - strcpy(*buffer, gr->gr_name); strcat(*buffer, fieldsep); -#ifndef MISSING_GR_PASSWD - strcat(*buffer, gr->gr_passwd); -#endif - strcat(*buffer, fieldsep); - strcat(*buffer, grGid); strcat(*buffer, fieldsep); - joinarray(gr->gr_mem, *buffer, COMMA) ; strcat(*buffer, fieldsep); - - return (0); -} - -/*% - * int irp_unmarshall_gr(struct group *gr, char *buffer) - * - * notes: \li - * - * See irpmarshall.h - * - * return: \li - * - * 0 on success and -1 on failure. - * - */ - -int -irp_unmarshall_gr(struct group *gr, char *buffer) { - char *p, *q; - gid_t grgid; - long t; - char *name = NULL; - char *pass = NULL; - char **members = NULL; - char tmpbuf[24]; - char *tb; - char fieldsep = ':'; - int myerrno = EINVAL; - - if (gr == NULL || buffer == NULL) { - errno = EINVAL; - return (-1); - } - - p = buffer; - - /* gr_name field */ - name = NULL; - if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) { - goto error; - } - - - /* gr_passwd field */ - pass = NULL; - if (getfield(&pass, 0, &p, fieldsep) == NULL) { - goto error; - } - - - /* gr_gid field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - t = strtol(tmpbuf, &tb, 10); - if (*tb) { - goto error; /*%< junk in value */ - } - grgid = (gid_t)t; - if ((long) grgid != t) { /*%< value must have been too big. */ - goto error; - } - - - /* gr_mem field. Member names are separated by commas */ - q = strchr(p, fieldsep); - if (q == NULL) { - goto error; - } - members = splitarray(p, q, COMMA); - if (members == NULL) { - myerrno = errno; - goto error; - } - p = q + 1; - - - gr->gr_name = name; -#ifndef MISSING_GR_PASSWD - gr->gr_passwd = pass; -#endif - gr->gr_gid = grgid; - gr->gr_mem = members; - - return (0); - - error: - errno = myerrno; - - if (name != NULL) free(name); - if (pass != NULL) free(pass); - - return (-1); -} - - -/* ------------------------- struct group ------------------------- */ - - - - -/* +++++++++++++++++++++++++ struct servent +++++++++++++++++++++++++ */ - -/*% - * int irp_marshall_sv(const struct servent *sv, char **buffer, size_t *len) - * - * notes: \li - * - * See irpmarshall.h - * - * return: \li - * - * 0 on success, -1 on failure. - * - */ - -int -irp_marshall_sv(const struct servent *sv, char **buffer, size_t *len) { - size_t need = 1; /*%< for null byte */ - char svPort[24]; - const char *fieldsep = COLONSTR; - short realport; - - if (sv == NULL || len == NULL) { - errno = EINVAL; - return (-1); - } - - /* the int s_port field is actually a short in network order. We - want host order to make the marshalled data look correct */ - realport = ntohs((short)sv->s_port); - sprintf(svPort, "%d", realport); - - need += strlen(sv->s_name) + 1; - need += joinlength(sv->s_aliases) + 1; - need += strlen(svPort) + 1; - need += strlen(sv->s_proto) + 1; - - if (buffer == NULL) { - *len = need; - return (0); - } - - if (*buffer != NULL && need > *len) { - errno = EINVAL; - return (-1); - } - - if (*buffer == NULL) { - need += 2; /*%< for CRLF */ - *buffer = memget(need); - if (*buffer == NULL) { - errno = ENOMEM; - return (-1); - } - - *len = need; - } - - strcpy(*buffer, sv->s_name); strcat(*buffer, fieldsep); - joinarray(sv->s_aliases, *buffer, COMMA); strcat(*buffer, fieldsep); - strcat(*buffer, svPort); strcat(*buffer, fieldsep); - strcat(*buffer, sv->s_proto); strcat(*buffer, fieldsep); - - return (0); -} - -/*% - * int irp_unmarshall_sv(struct servent *sv, char *buffer) - * - * notes: \li - * - * See irpmarshall.h - * - * return: \li - * - * 0 on success, -1 on failure. - * - */ - -int -irp_unmarshall_sv(struct servent *sv, char *buffer) { - char *p, *q; - short svport; - long t; - char *name = NULL; - char *proto = NULL; - char **aliases = NULL; - char tmpbuf[24]; - char *tb; - char fieldsep = ':'; - int myerrno = EINVAL; - - if (sv == NULL || buffer == NULL) - return (-1); - - p = buffer; - - - /* s_name field */ - name = NULL; - if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) { - goto error; - } - - - /* s_aliases field */ - q = strchr(p, fieldsep); - if (q == NULL) { - goto error; - } - aliases = splitarray(p, q, COMMA); - if (aliases == NULL) { - myerrno = errno; - goto error; - } - p = q + 1; - - - /* s_port field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - t = strtol(tmpbuf, &tb, 10); - if (*tb) { - goto error; /*%< junk in value */ - } - svport = (short)t; - if ((long) svport != t) { /*%< value must have been too big. */ - goto error; - } - svport = htons(svport); - - /* s_proto field */ - proto = NULL; - if (getfield(&proto, 0, &p, fieldsep) == NULL) { - goto error; - } - - sv->s_name = name; - sv->s_aliases = aliases; - sv->s_port = svport; - sv->s_proto = proto; - - return (0); - - error: - errno = myerrno; - - if (name != NULL) free(name); - if (proto != NULL) free(proto); - free_array(aliases, 0); - - return (-1); -} - - -/* ------------------------- struct servent ------------------------- */ - -/* +++++++++++++++++++++++++ struct protoent +++++++++++++++++++++++++ */ - -/*% - * int irp_marshall_pr(struct protoent *pr, char **buffer, size_t *len) - * - * notes: \li - * - * See irpmarshall.h - * - * return: \li - * - * 0 on success and -1 on failure. - * - */ - -int -irp_marshall_pr(struct protoent *pr, char **buffer, size_t *len) { - size_t need = 1; /*%< for null byte */ - char prProto[24]; - const char *fieldsep = COLONSTR; - - if (pr == NULL || len == NULL) { - errno = EINVAL; - return (-1); - } - - sprintf(prProto, "%d", (int)pr->p_proto); - - need += strlen(pr->p_name) + 1; - need += joinlength(pr->p_aliases) + 1; - need += strlen(prProto) + 1; - - if (buffer == NULL) { - *len = need; - return (0); - } - - if (*buffer != NULL && need > *len) { - errno = EINVAL; - return (-1); - } - - if (*buffer == NULL) { - need += 2; /*%< for CRLF */ - *buffer = memget(need); - if (*buffer == NULL) { - errno = ENOMEM; - return (-1); - } - - *len = need; - } - - strcpy(*buffer, pr->p_name); strcat(*buffer, fieldsep); - joinarray(pr->p_aliases, *buffer, COMMA); strcat(*buffer, fieldsep); - strcat(*buffer, prProto); strcat(*buffer, fieldsep); - - return (0); - -} - -/*% - * int irp_unmarshall_pr(struct protoent *pr, char *buffer) - * - * notes: \li - * - * See irpmarshall.h - * - * return: \li - * - * 0 on success, -1 on failure - * - */ - -int irp_unmarshall_pr(struct protoent *pr, char *buffer) { - char *p, *q; - int prproto; - long t; - char *name = NULL; - char **aliases = NULL; - char tmpbuf[24]; - char *tb; - char fieldsep = ':'; - int myerrno = EINVAL; - - if (pr == NULL || buffer == NULL) { - errno = EINVAL; - return (-1); - } - - p = buffer; - - /* p_name field */ - name = NULL; - if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) { - goto error; - } - - - /* p_aliases field */ - q = strchr(p, fieldsep); - if (q == NULL) { - goto error; - } - aliases = splitarray(p, q, COMMA); - if (aliases == NULL) { - myerrno = errno; - goto error; - } - p = q + 1; - - - /* p_proto field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - t = strtol(tmpbuf, &tb, 10); - if (*tb) { - goto error; /*%< junk in value */ - } - prproto = (int)t; - if ((long) prproto != t) { /*%< value must have been too big. */ - goto error; - } - - pr->p_name = name; - pr->p_aliases = aliases; - pr->p_proto = prproto; - - return (0); - - error: - errno = myerrno; - - if (name != NULL) free(name); - free_array(aliases, 0); - - return (-1); -} - -/* ------------------------- struct protoent ------------------------- */ - - - -/* +++++++++++++++++++++++++ struct hostent +++++++++++++++++++++++++ */ - -/*% - * int irp_marshall_ho(struct hostent *ho, char **buffer, size_t *len) - * - * notes: \li - * - * See irpmarshall.h. - * - * return: \li - * - * 0 on success, -1 on failure. - * - */ - -int -irp_marshall_ho(struct hostent *ho, char **buffer, size_t *len) { - size_t need = 1; /*%< for null byte */ - char hoaddrtype[24]; - char holength[24]; - char **av; - char *p; - int addrlen; - int malloced = 0; - size_t remlen; - const char *fieldsep = "@"; - - if (ho == NULL || len == NULL) { - errno = EINVAL; - return (-1); - } - - switch(ho->h_addrtype) { - case AF_INET: - strcpy(hoaddrtype, "AF_INET"); - break; - - case AF_INET6: - strcpy(hoaddrtype, "AF_INET6"); - break; - - default: - errno = EINVAL; - return (-1); - } - - sprintf(holength, "%d", ho->h_length); - - need += strlen(ho->h_name) + 1; - need += joinlength(ho->h_aliases) + 1; - need += strlen(hoaddrtype) + 1; - need += strlen(holength) + 1; - - /* we determine an upper bound on the string length needed, not an - exact length. */ - addrlen = (ho->h_addrtype == AF_INET ? 16 : 46) ; /*%< XX other AF's?? */ - for (av = ho->h_addr_list; av != NULL && *av != NULL ; av++) - need += addrlen; - - if (buffer == NULL) { - *len = need; - return (0); - } - - if (*buffer != NULL && need > *len) { - errno = EINVAL; - return (-1); - } - - if (*buffer == NULL) { - need += 2; /*%< for CRLF */ - *buffer = memget(need); - if (*buffer == NULL) { - errno = ENOMEM; - return (-1); - } - - *len = need; - malloced = 1; - } - - strcpy(*buffer, ho->h_name); strcat(*buffer, fieldsep); - joinarray(ho->h_aliases, *buffer, COMMA); strcat(*buffer, fieldsep); - strcat(*buffer, hoaddrtype); strcat(*buffer, fieldsep); - strcat(*buffer, holength); strcat(*buffer, fieldsep); - - p = *buffer + strlen(*buffer); - remlen = need - strlen(*buffer); - for (av = ho->h_addr_list ; av != NULL && *av != NULL ; av++) { - if (inet_ntop(ho->h_addrtype, *av, p, remlen) == NULL) { - goto error; - } - if (*(av + 1) != NULL) - strcat(p, COMMASTR); - remlen -= strlen(p); - p += strlen(p); - } - strcat(*buffer, fieldsep); - - return (0); - - error: - if (malloced) { - memput(*buffer, need); - } - - return (-1); -} - -/*% - * int irp_unmarshall_ho(struct hostent *ho, char *buffer) - * - * notes: \li - * - * See irpmarshall.h. - * - * return: \li - * - * 0 on success, -1 on failure. - * - */ - -int -irp_unmarshall_ho(struct hostent *ho, char *buffer) { - char *p, *q, *r; - int hoaddrtype; - int holength; - long t; - char *name; - char **aliases = NULL; - char **hohaddrlist = NULL; - size_t hoaddrsize; - char tmpbuf[24]; - char *tb; - char **alist; - int addrcount; - char fieldsep = '@'; - int myerrno = EINVAL; - - if (ho == NULL || buffer == NULL) { - errno = EINVAL; - return (-1); - } - - p = buffer; - - /* h_name field */ - name = NULL; - if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) { - goto error; - } - - - /* h_aliases field */ - q = strchr(p, fieldsep); - if (q == NULL) { - goto error; - } - aliases = splitarray(p, q, COMMA); - if (aliases == NULL) { - myerrno = errno; - goto error; - } - p = q + 1; - - - /* h_addrtype field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - if (strcmp(tmpbuf, "AF_INET") == 0) - hoaddrtype = AF_INET; - else if (strcmp(tmpbuf, "AF_INET6") == 0) - hoaddrtype = AF_INET6; - else - goto error; - - - /* h_length field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - t = strtol(tmpbuf, &tb, 10); - if (*tb) { - goto error; /*%< junk in value */ - } - holength = (int)t; - if ((long) holength != t) { /*%< value must have been too big. */ - goto error; - } - - - /* h_addr_list field */ - q = strchr(p, fieldsep); - if (q == NULL) - goto error; - - /* count how many addresss are in there */ - if (q > p + 1) { - for (addrcount = 1, r = p ; r != q ; r++) { - if (*r == COMMA) - addrcount++; - } - } else { - addrcount = 0; - } - - hoaddrsize = (addrcount + 1) * sizeof (char *); - hohaddrlist = malloc(hoaddrsize); - if (hohaddrlist == NULL) { - myerrno = ENOMEM; - goto error; - } - - memset(hohaddrlist, 0x0, hoaddrsize); - - alist = hohaddrlist; - for (t = 0, r = p ; r != q ; p = r + 1, t++) { - char saved; - while (r != q && *r != COMMA) r++; - saved = *r; - *r = 0x0; - - alist[t] = malloc(hoaddrtype == AF_INET ? 4 : 16); - if (alist[t] == NULL) { - myerrno = ENOMEM; - goto error; - } - - if (inet_pton(hoaddrtype, p, alist[t]) == -1) - goto error; - *r = saved; - } - alist[t] = NULL; - - ho->h_name = name; - ho->h_aliases = aliases; - ho->h_addrtype = hoaddrtype; - ho->h_length = holength; - ho->h_addr_list = hohaddrlist; - - return (0); - - error: - errno = myerrno; - - if (name != NULL) free(name); - free_array(hohaddrlist, 0); - free_array(aliases, 0); - - return (-1); -} - -/* ------------------------- struct hostent------------------------- */ - - - -/* +++++++++++++++++++++++++ struct netgrp +++++++++++++++++++++++++ */ - -/*% - * int irp_marshall_ng(const char *host, const char *user, - * const char *domain, char *buffer, size_t *len) - * - * notes: \li - * - * See note for irp_marshall_ng_start - * - * return: \li - * - * 0 on success, 0 on failure. - * - */ - -int -irp_marshall_ng(const char *host, const char *user, const char *domain, - char **buffer, size_t *len) { - size_t need = 1; /*%< for nul byte */ - const char *fieldsep = ","; - - if (len == NULL) { - errno = EINVAL; - return (-1); - } - - need += 4; /*%< two parens and two commas */ - need += (host == NULL ? 0 : strlen(host)); - need += (user == NULL ? 0 : strlen(user)); - need += (domain == NULL ? 0 : strlen(domain)); - - if (buffer == NULL) { - *len = need; - return (0); - } else if (*buffer != NULL && need > *len) { - errno = EINVAL; - return (-1); - } - - if (*buffer == NULL) { - need += 2; /*%< for CRLF */ - *buffer = memget(need); - if (*buffer == NULL) { - errno = ENOMEM; - return (-1); - } - - *len = need; - } - - (*buffer)[0] = '('; - (*buffer)[1] = '\0'; - - if (host != NULL) - strcat(*buffer, host); - strcat(*buffer, fieldsep); - - if (user != NULL) - strcat(*buffer, user); - strcat(*buffer, fieldsep); - - if (domain != NULL) - strcat(*buffer, domain); - strcat(*buffer, ")"); - - return (0); -} - - - -/* ---------- */ - -/*% - * int irp_unmarshall_ng(const char **host, const char **user, - * const char **domain, char *buffer) - * - * notes: \li - * - * Unpacks the BUFFER into 3 character arrays it allocates and assigns - * to *HOST, *USER and *DOMAIN. If any field of the value is empty, - * then the corresponding paramater value will be set to NULL. - * - * return: \li - * - * 0 on success and -1 on failure. - */ - -int -irp_unmarshall_ng(const char **hostp, const char **userp, const char **domainp, - char *buffer) -{ - char *p, *q; - char fieldsep = ','; - int myerrno = EINVAL; - char *host, *user, *domain; - - if (userp == NULL || hostp == NULL || - domainp == NULL || buffer == NULL) { - errno = EINVAL; - return (-1); - } - - host = user = domain = NULL; - - p = buffer; - while (isspace((unsigned char)*p)) { - p++; - } - if (*p != '(') { - goto error; - } - - q = p + 1; - while (*q && *q != fieldsep) - q++; - if (!*q) { - goto error; - } else if (q > p + 1) { - host = strndup(p, q - p); - } - - p = q + 1; - if (!*p) { - goto error; - } else if (*p != fieldsep) { - q = p + 1; - while (*q && *q != fieldsep) - q++; - if (!*q) { - goto error; - } - user = strndup(p, q - p); - } else { - p++; - } - - if (!*p) { - goto error; - } else if (*p != ')') { - q = p + 1; - while (*q && *q != ')') - q++; - if (!*q) { - goto error; - } - domain = strndup(p, q - p); - } - *hostp = host; - *userp = user; - *domainp = domain; - - return (0); - - error: - errno = myerrno; - - if (host != NULL) free(host); - if (user != NULL) free(user); - - return (-1); -} - -/* ------------------------- struct netgrp ------------------------- */ - - - - -/* +++++++++++++++++++++++++ struct nwent +++++++++++++++++++++++++ */ - -/*% - * int irp_marshall_nw(struct nwent *ne, char **buffer, size_t *len) - * - * notes: \li - * - * See at top. - * - * return: \li - * - * 0 on success and -1 on failure. - * - */ - -int -irp_marshall_nw(struct nwent *ne, char **buffer, size_t *len) { - size_t need = 1; /*%< for null byte */ - char nAddrType[24]; - char nNet[MAXPADDRSIZE]; - const char *fieldsep = COLONSTR; - - if (ne == NULL || len == NULL) { - return (-1); - } - - strcpy(nAddrType, ADDR_T_STR(ne->n_addrtype)); - - if (inet_net_ntop(ne->n_addrtype, ne->n_addr, ne->n_length, - nNet, sizeof nNet) == NULL) { - return (-1); - } - - - need += strlen(ne->n_name) + 1; - need += joinlength(ne->n_aliases) + 1; - need += strlen(nAddrType) + 1; - need += strlen(nNet) + 1; - - if (buffer == NULL) { - *len = need; - return (0); - } - - if (*buffer != NULL && need > *len) { - errno = EINVAL; - return (-1); - } - - if (*buffer == NULL) { - need += 2; /*%< for CRLF */ - *buffer = memget(need); - if (*buffer == NULL) { - errno = ENOMEM; - return (-1); - } - - *len = need; - } - - strcpy(*buffer, ne->n_name); strcat(*buffer, fieldsep); - joinarray(ne->n_aliases, *buffer, COMMA) ; strcat(*buffer, fieldsep); - strcat(*buffer, nAddrType); strcat(*buffer, fieldsep); - strcat(*buffer, nNet); strcat(*buffer, fieldsep); - - return (0); -} - -/*% - * int irp_unmarshall_nw(struct nwent *ne, char *buffer) - * - * notes: \li - * - * See note up top. - * - * return: \li - * - * 0 on success and -1 on failure. - * - */ - -int -irp_unmarshall_nw(struct nwent *ne, char *buffer) { - char *p, *q; - int naddrtype; - long nnet; - int bits; - char *name = NULL; - char **aliases = NULL; - char tmpbuf[24]; - char *tb; - char fieldsep = ':'; - int myerrno = EINVAL; - - if (ne == NULL || buffer == NULL) { - goto error; - } - - p = buffer; - - /* n_name field */ - name = NULL; - if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) { - goto error; - } - - - /* n_aliases field. Aliases are separated by commas */ - q = strchr(p, fieldsep); - if (q == NULL) { - goto error; - } - aliases = splitarray(p, q, COMMA); - if (aliases == NULL) { - myerrno = errno; - goto error; - } - p = q + 1; - - - /* h_addrtype field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - if (strcmp(tmpbuf, "AF_INET") == 0) - naddrtype = AF_INET; - else if (strcmp(tmpbuf, "AF_INET6") == 0) - naddrtype = AF_INET6; - else - goto error; - - - /* n_net field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - nnet = 0; - bits = inet_net_pton(naddrtype, tmpbuf, &nnet, sizeof nnet); - if (bits < 0) { - goto error; - } - - /* nnet = ntohl(nnet); */ /* keep in network order for nwent */ - - ne->n_name = name; - ne->n_aliases = aliases; - ne->n_addrtype = naddrtype; - ne->n_length = bits; - ne->n_addr = malloc(sizeof nnet); - if (ne->n_addr == NULL) { - goto error; - } - - memcpy(ne->n_addr, &nnet, sizeof nnet); - - return (0); - - error: - errno = myerrno; - - if (name != NULL) free(name); - free_array(aliases, 0); - - return (-1); -} - - -/* ------------------------- struct nwent ------------------------- */ - - -/* +++++++++++++++++++++++++ struct netent +++++++++++++++++++++++++ */ - -/*% - * int irp_marshall_ne(struct netent *ne, char **buffer, size_t *len) - * - * notes: \li - * - * See at top. - * - * return: \li - * - * 0 on success and -1 on failure. - * - */ - -int -irp_marshall_ne(struct netent *ne, char **buffer, size_t *len) { - size_t need = 1; /*%< for null byte */ - char nAddrType[24]; - char nNet[MAXPADDRSIZE]; - const char *fieldsep = COLONSTR; - long nval; - - if (ne == NULL || len == NULL) { - return (-1); - } - - strcpy(nAddrType, ADDR_T_STR(ne->n_addrtype)); - - nval = htonl(ne->n_net); - if (inet_ntop(ne->n_addrtype, &nval, nNet, sizeof nNet) == NULL) { - return (-1); - } - - need += strlen(ne->n_name) + 1; - need += joinlength(ne->n_aliases) + 1; - need += strlen(nAddrType) + 1; - need += strlen(nNet) + 1; - - if (buffer == NULL) { - *len = need; - return (0); - } - - if (*buffer != NULL && need > *len) { - errno = EINVAL; - return (-1); - } - - if (*buffer == NULL) { - need += 2; /*%< for CRLF */ - *buffer = memget(need); - if (*buffer == NULL) { - errno = ENOMEM; - return (-1); - } - - *len = need; - } - - strcpy(*buffer, ne->n_name); strcat(*buffer, fieldsep); - joinarray(ne->n_aliases, *buffer, COMMA) ; strcat(*buffer, fieldsep); - strcat(*buffer, nAddrType); strcat(*buffer, fieldsep); - strcat(*buffer, nNet); strcat(*buffer, fieldsep); - - return (0); -} - -/*% - * int irp_unmarshall_ne(struct netent *ne, char *buffer) - * - * notes: \li - * - * See note up top. - * - * return: \li - * - * 0 on success and -1 on failure. - * - */ - -int -irp_unmarshall_ne(struct netent *ne, char *buffer) { - char *p, *q; - int naddrtype; - long nnet; - int bits; - char *name = NULL; - char **aliases = NULL; - char tmpbuf[24]; - char *tb; - char fieldsep = ':'; - int myerrno = EINVAL; - - if (ne == NULL || buffer == NULL) { - goto error; - } - - p = buffer; - - /* n_name field */ - name = NULL; - if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) { - goto error; - } - - - /* n_aliases field. Aliases are separated by commas */ - q = strchr(p, fieldsep); - if (q == NULL) { - goto error; - } - aliases = splitarray(p, q, COMMA); - if (aliases == NULL) { - myerrno = errno; - goto error; - } - p = q + 1; - - - /* h_addrtype field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - if (strcmp(tmpbuf, "AF_INET") == 0) - naddrtype = AF_INET; - else if (strcmp(tmpbuf, "AF_INET6") == 0) - naddrtype = AF_INET6; - else - goto error; - - - /* n_net field */ - tb = tmpbuf; - if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL || - strlen(tb) == 0U) { - goto error; - } - bits = inet_net_pton(naddrtype, tmpbuf, &nnet, sizeof nnet); - if (bits < 0) { - goto error; - } - nnet = ntohl(nnet); - - ne->n_name = name; - ne->n_aliases = aliases; - ne->n_addrtype = naddrtype; - ne->n_net = nnet; - - return (0); - - error: - errno = myerrno; - - if (name != NULL) free(name); - free_array(aliases, 0); - - return (-1); -} - - -/* ------------------------- struct netent ------------------------- */ - - -/* =========================================================================== */ - -/*% - * static char ** splitarray(const char *buffer, const char *buffend, char delim) - * - * notes: \li - * - * Split a delim separated astring. Not allowed - * to have two delims next to each other. BUFFER points to begining of - * string, BUFFEND points to one past the end of the string - * (i.e. points at where the null byte would be if null - * terminated). - * - * return: \li - * - * Returns a malloced array of pointers, each pointer pointing to a - * malloced string. If BUFEER is an empty string, then return values is - * array of 1 pointer that is NULL. Returns NULL on failure. - * - */ - -static char ** -splitarray(const char *buffer, const char *buffend, char delim) { - const char *p, *q; - int count = 0; - char **arr = NULL; - char **aptr; - - if (buffend < buffer) - return (NULL); - else if (buffend > buffer && *buffer == delim) - return (NULL); - else if (buffend > buffer && *(buffend - 1) == delim) - return (NULL); - - /* count the number of field and make sure none are empty */ - if (buffend > buffer + 1) { - for (count = 1, q = buffer ; q != buffend ; q++) { - if (*q == delim) { - if (q > buffer && (*(q - 1) == delim)) { - errno = EINVAL; - return (NULL); - } - count++; - } - } - } - - if (count > 0) { - count++ ; /*%< for NULL at end */ - aptr = arr = malloc(count * sizeof (char *)); - if (aptr == NULL) { - errno = ENOMEM; - return (NULL); - } - - memset(arr, 0x0, count * sizeof (char *)); - for (p = buffer ; p < buffend ; p++) { - for (q = p ; *q != delim && q != buffend ; q++) - /* nothing */; - *aptr = strndup(p, q - p); - - p = q; - aptr++; - } - *aptr = NULL; - } else { - arr = malloc(sizeof (char *)); - if (arr == NULL) { - errno = ENOMEM; - return (NULL); - } - - *arr = NULL; - } - - return (arr); -} - -/*% - * static size_t joinlength(char * const *argv) - * - * return: \li - * - * the number of bytes in all the arrays pointed at - * by argv, including their null bytes(which will usually be turned - * into commas). - * - * - */ - -static size_t -joinlength(char * const *argv) { - int len = 0; - - while (argv && *argv) { - len += (strlen(*argv) + 1); - argv++; - } - - return (len); -} - -/*% - * int joinarray(char * const *argv, char *buffer, char delim) - * - * notes: \li - * - * Copy all the ARGV strings into the end of BUFFER - * separating them with DELIM. BUFFER is assumed to have - * enough space to hold everything and to be already null-terminated. - * - * return: \li - * - * 0 unless argv or buffer is NULL. - * - * - */ - -static int -joinarray(char * const *argv, char *buffer, char delim) { - char * const *p; - char sep[2]; - - if (argv == NULL || buffer == NULL) { - errno = EINVAL; - return (-1); - } - - sep[0] = delim; - sep[1] = 0x0; - - for (p = argv ; *p != NULL ; p++) { - strcat(buffer, *p); - if (*(p + 1) != NULL) { - strcat(buffer, sep); - } - } - - return (0); -} - -/*% - * static char * getfield(char **res, size_t reslen, char **ptr, char delim) - * - * notes: \li - * - * Stores in *RES, which is a buffer of length RESLEN, a - * copy of the bytes from *PTR up to and including the first - * instance of DELIM. If *RES is NULL, then it will be - * assigned a malloced buffer to hold the copy. *PTR is - * modified to point at the found delimiter. - * - * return: \li - * - * If there was no delimiter, then NULL is returned, - * otherewise *RES is returned. - * - */ - -static char * -getfield(char **res, size_t reslen, char **ptr, char delim) { - char *q; - - if (res == NULL || ptr == NULL || *ptr == NULL) { - errno = EINVAL; - return (NULL); - } - - q = strchr(*ptr, delim); - - if (q == NULL) { - errno = EINVAL; - return (NULL); - } else { - if (*res == NULL) { - *res = strndup(*ptr, q - *ptr); - } else { - if ((size_t)(q - *ptr + 1) > reslen) { /*%< to big for res */ - errno = EINVAL; - return (NULL); - } else { - strncpy(*res, *ptr, q - *ptr); - (*res)[q - *ptr] = 0x0; - } - } - *ptr = q + 1; - } - - return (*res); -} - - - - - -#ifndef HAVE_STRNDUP -/* - * static char * strndup(const char *str, size_t len) - * - * notes: \li - * - * like strdup, except do len bytes instead of the whole string. Always - * null-terminates. - * - * return: \li - * - * The newly malloced string. - * - */ - -static char * -strndup(const char *str, size_t len) { - char *p = malloc(len + 1); - - if (p == NULL) - return (NULL); - strncpy(p, str, len); - p[len] = 0x0; - return (p); -} -#endif - -#if WANT_MAIN - -/*% - * static int strcmp_nws(const char *a, const char *b) - * - * notes: \li - * - * do a strcmp, except uneven lengths of whitespace compare the same - * - * return: \li - * - */ - -static int -strcmp_nws(const char *a, const char *b) { - while (*a && *b) { - if (isspace(*a) && isspace(*b)) { - do { - a++; - } while (isspace(*a)); - do { - b++; - } while (isspace(*b)); - } - if (*a < *b) - return (-1); - else if (*a > *b) - return (1); - - a++; - b++;; - } - - if (*a == *b) - return (0); - else if (*a > *b) - return (1); - else - return (-1); -} - -#endif - -/*% - * static void free_array(char **argv, size_t entries) - * - * notes: \li - * - * Free argv and each of the pointers inside it. The end of - * the array is when a NULL pointer is found inside. If - * entries is > 0, then NULL pointers inside the array do - * not indicate the end of the array. - * - */ - -static void -free_array(char **argv, size_t entries) { - char **p = argv; - int useEntries = (entries > 0U); - - if (argv == NULL) - return; - - while ((useEntries && entries > 0U) || *p) { - if (*p) - free(*p); - p++; - if (useEntries) - entries--; - } - free(argv); -} - - - - - -/* ************************************************** */ - -#if WANT_MAIN - -/*% takes an option to indicate what sort of marshalling(read the code) and - an argument. If the argument looks like a marshalled buffer(has a ':' - embedded) then it's unmarshalled and the remarshalled and the new string - is compared to the old one. -*/ - -int -main(int argc, char **argv) { - char buffer[1024]; - char *b = &buffer[0]; - size_t len = sizeof buffer; - char option; - - if (argc < 2 || argv[1][0] != '-') - exit(1); - - option = argv[1][1]; - argv++; - argc--; - - -#if 0 - { - char buff[10]; - char *p = argv[1], *q = &buff[0]; - - while (getfield(&q, sizeof buff, &p, ':') != NULL) { - printf("field: \"%s\"\n", q); - p++; - } - printf("p is now \"%s\"\n", p); - } -#endif - -#if 0 - { - char **x = splitarray(argv[1], argv[1] + strlen(argv[1]), - argv[2][0]); - char **p; - - if (x == NULL) - printf("split failed\n"); - - for (p = x ; p != NULL && *p != NULL ; p++) { - printf("\"%s\"\n", *p); - } - } -#endif - -#if 1 - switch(option) { - case 'n': { - struct nwent ne; - int i; - - if (strchr(argv[1], ':') != NULL) { - if (irp_unmarshall_nw(&ne, argv[1]) != 0) { - printf("Unmarhsalling failed\n"); - exit(1); - } - - printf("Name: \"%s\"\n", ne.n_name); - printf("Aliases:"); - for (i = 0 ; ne.n_aliases[i] != NULL ; i++) - printf("\n\t\"%s\"", ne.n_aliases[i]); - printf("\nAddrtype: %s\n", ADDR_T_STR(ne.n_addrtype)); - inet_net_ntop(ne.n_addrtype, ne.n_addr, ne.n_length, - buffer, sizeof buffer); - printf("Net: \"%s\"\n", buffer); - *((long*)ne.n_addr) = htonl(*((long*)ne.n_addr)); - inet_net_ntop(ne.n_addrtype, ne.n_addr, ne.n_length, - buffer, sizeof buffer); - printf("Corrected Net: \"%s\"\n", buffer); - } else { - struct netent *np1 = getnetbyname(argv[1]); - ne.n_name = np1->n_name; - ne.n_aliases = np1->n_aliases; - ne.n_addrtype = np1->n_addrtype; - ne.n_addr = &np1->n_net; - ne.n_length = (IN_CLASSA(np1->n_net) ? - 8 : - (IN_CLASSB(np1->n_net) ? - 16 : - (IN_CLASSC(np1->n_net) ? - 24 : -1))); - np1->n_net = htonl(np1->n_net); - if (irp_marshall_nw(&ne, &b, &len) != 0) { - printf("Marshalling failed\n"); - } - printf("%s\n", b); - } - break; - } - - - case 'r': { - char **hosts, **users, **domains; - size_t entries; - int i; - char *buff; - size_t size; - char *ngname; - - if (strchr(argv[1], '(') != NULL) { - if (irp_unmarshall_ng(&ngname, &entries, - &hosts, &users, &domains, - argv[1]) != 0) { - printf("unmarshall failed\n"); - exit(1); - } - -#define STRVAL(x) (x == NULL ? "*" : x) - - printf("%s {\n", ngname); - for (i = 0 ; i < entries ; i++) - printf("\t\"%s\" : \"%s\" : \"%s\"\n", - STRVAL(hosts[i]), - STRVAL(users[i]), - STRVAL(domains[i])); - printf("}\n\n\n"); - - - irp_marshall_ng_start(ngname, NULL, &size); - for (i = 0 ; i < entries ; i++) - irp_marshall_ng_next(hosts[i], users[i], - domains[i], NULL, &size); - irp_marshall_ng_end(NULL, &size); - - buff = malloc(size); - - irp_marshall_ng_start(ngname, buff, &size); - for (i = 0 ; i < entries ; i++) { - if (irp_marshall_ng_next(hosts[i], users[i], - domains[i], buff, - &size) != 0) - printf("next marshalling failed.\n"); - } - irp_marshall_ng_end(buff, &size); - - if (strcmp_nws(argv[1], buff) != 0) { - printf("compare failed:\n\t%s\n\t%s\n", - buffer, argv[1]); - } else { - printf("compare ok\n"); - } - } else { - char *h, *u, *d, *buff; - size_t size; - - /* run through two times. First to figure out how - much of a buffer we need. Second to do the - actual marshalling */ - - setnetgrent(argv[1]); - irp_marshall_ng_start(argv[1], NULL, &size); - while (getnetgrent(&h, &u, &d) == 1) - irp_marshall_ng_next(h, u, d, NULL, &size); - irp_marshall_ng_end(NULL, &size); - endnetgrent(argv[1]); - - buff = malloc(size); - - setnetgrent(argv[1]); - if (irp_marshall_ng_start(argv[1], buff, &size) != 0) - printf("Marshalling start failed\n"); - - while (getnetgrent(&h, &u, &d) == 1) { - if (irp_marshall_ng_next(h, u, d, buff, &size) - != 0) { - printf("Marshalling failed\n"); - } - } - - irp_marshall_ng_end(buff, &size); - endnetgrent(); - - printf("success: %s\n", buff); - } - break; - } - - - - case 'h': { - struct hostent he, *hp; - int i; - - - if (strchr(argv[1], '@') != NULL) { - if (irp_unmarshall_ho(&he, argv[1]) != 0) { - printf("unmarshall failed\n"); - exit(1); - } - - printf("Host: \"%s\"\nAliases:", he.h_name); - for (i = 0 ; he.h_aliases[i] != NULL ; i++) - printf("\n\t\t\"%s\"", he.h_aliases[i]); - printf("\nAddr Type: \"%s\"\n", - ADDR_T_STR(he.h_addrtype)); - printf("Length: %d\nAddresses:", he.h_length); - for (i = 0 ; he.h_addr_list[i] != 0 ; i++) { - inet_ntop(he.h_addrtype, he.h_addr_list[i], - buffer, sizeof buffer); - printf("\n\t\"%s\"\n", buffer); - } - printf("\n\n"); - - irp_marshall_ho(&he, &b, &len); - if (strcmp(argv[1], buffer) != 0) { - printf("compare failed:\n\t\"%s\"\n\t\"%s\"\n", - buffer, argv[1]); - } else { - printf("compare ok\n"); - } - } else { - if ((hp = gethostbyname(argv[1])) == NULL) { - perror("gethostbyname"); - printf("\"%s\"\n", argv[1]); - exit(1); - } - - if (irp_marshall_ho(hp, &b, &len) != 0) { - printf("irp_marshall_ho failed\n"); - exit(1); - } - - printf("success: \"%s\"\n", buffer); - } - break; - } - - - case 's': { - struct servent *sv; - struct servent sv1; - - if (strchr(argv[1], ':') != NULL) { - sv = &sv1; - memset(sv, 0xef, sizeof (struct servent)); - if (irp_unmarshall_sv(sv, argv[1]) != 0) { - printf("unmarshall failed\n"); - - } - - irp_marshall_sv(sv, &b, &len); - if (strcmp(argv[1], buffer) != 0) { - printf("compare failed:\n\t\"%s\"\n\t\"%s\"\n", - buffer, argv[1]); - } else { - printf("compare ok\n"); - } - } else { - if ((sv = getservbyname(argv[1], argv[2])) == NULL) { - perror("getservent"); - exit(1); - } - - if (irp_marshall_sv(sv, &b, &len) != 0) { - printf("irp_marshall_sv failed\n"); - exit(1); - } - - printf("success: \"%s\"\n", buffer); - } - break; - } - - case 'g': { - struct group *gr; - struct group gr1; - - if (strchr(argv[1], ':') != NULL) { - gr = &gr1; - memset(gr, 0xef, sizeof (struct group)); - if (irp_unmarshall_gr(gr, argv[1]) != 0) { - printf("unmarshall failed\n"); - - } - - irp_marshall_gr(gr, &b, &len); - if (strcmp(argv[1], buffer) != 0) { - printf("compare failed:\n\t\"%s\"\n\t\"%s\"\n", - buffer, argv[1]); - } else { - printf("compare ok\n"); - } - } else { - if ((gr = getgrnam(argv[1])) == NULL) { - perror("getgrnam"); - exit(1); - } - - if (irp_marshall_gr(gr, &b, &len) != 0) { - printf("irp_marshall_gr failed\n"); - exit(1); - } - - printf("success: \"%s\"\n", buffer); - } - break; - } - - - case 'p': { - struct passwd *pw; - struct passwd pw1; - - if (strchr(argv[1], ':') != NULL) { - pw = &pw1; - memset(pw, 0xef, sizeof (*pw)); - if (irp_unmarshall_pw(pw, argv[1]) != 0) { - printf("unmarshall failed\n"); - exit(1); - } - - printf("User: \"%s\"\nPasswd: \"%s\"\nUid: %ld\nGid: %ld\n", - pw->pw_name, pw->pw_passwd, (long)pw->pw_uid, - (long)pw->pw_gid); - printf("Class: \"%s\"\nChange: %ld\nGecos: \"%s\"\n", - pw->pw_class, (long)pw->pw_change, pw->pw_gecos); - printf("Shell: \"%s\"\nDirectory: \"%s\"\n", - pw->pw_shell, pw->pw_dir); - - pw = getpwnam(pw->pw_name); - irp_marshall_pw(pw, &b, &len); - if (strcmp(argv[1], buffer) != 0) { - printf("compare failed:\n\t\"%s\"\n\t\"%s\"\n", - buffer, argv[1]); - } else { - printf("compare ok\n"); - } - } else { - if ((pw = getpwnam(argv[1])) == NULL) { - perror("getpwnam"); - exit(1); - } - - if (irp_marshall_pw(pw, &b, &len) != 0) { - printf("irp_marshall_pw failed\n"); - exit(1); - } - - printf("success: \"%s\"\n", buffer); - } - break; - } - - default: - printf("Wrong option: %c\n", option); - break; - } - -#endif - - return (0); -} - -#endif - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irs_data.c b/contrib/bind9/lib/bind/irs/irs_data.c deleted file mode 100644 index ed94614..0000000 --- a/contrib/bind9/lib/bind/irs/irs_data.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: irs_data.c,v 1.7.18.5 2007/08/27 03:34:24 marka Exp $"; -#endif - -#include "port_before.h" - -#ifndef __BIND_NOSTATIC - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <resolv.h> -#include <stdio.h> -#include <string.h> -#include <isc/memcluster.h> - -#ifdef DO_PTHREADS -#include <pthread.h> -#endif - -#include <irs.h> -#include <stdlib.h> - -#include "port_after.h" - -#include "irs_data.h" -#undef _res -#if !(__GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) -#undef h_errno -extern int h_errno; -#endif - -extern struct __res_state _res; - -#ifdef DO_PTHREADS -static pthread_key_t key; -static int once = 0; -#else -static struct net_data *net_data; -#endif - -void -irs_destroy(void) { -#ifndef DO_PTHREADS - if (net_data != NULL) - net_data_destroy(net_data); - net_data = NULL; -#endif -} - -void -net_data_destroy(void *p) { - struct net_data *net_data = p; - - res_ndestroy(net_data->res); - if (net_data->gr != NULL) { - (*net_data->gr->close)(net_data->gr); - net_data->gr = NULL; - } - if (net_data->pw != NULL) { - (*net_data->pw->close)(net_data->pw); - net_data->pw = NULL; - } - if (net_data->sv != NULL) { - (*net_data->sv->close)(net_data->sv); - net_data->sv = NULL; - } - if (net_data->pr != NULL) { - (*net_data->pr->close)(net_data->pr); - net_data->pr = NULL; - } - if (net_data->ho != NULL) { - (*net_data->ho->close)(net_data->ho); - net_data->ho = NULL; - } - if (net_data->nw != NULL) { - (*net_data->nw->close)(net_data->nw); - net_data->nw = NULL; - } - if (net_data->ng != NULL) { - (*net_data->ng->close)(net_data->ng); - net_data->ng = NULL; - } - if (net_data->ho_data != NULL) { - free(net_data->ho_data); - net_data->ho_data = NULL; - } - if (net_data->nw_data != NULL) { - free(net_data->nw_data); - net_data->nw_data = NULL; - } - - (*net_data->irs->close)(net_data->irs); - memput(net_data, sizeof *net_data); -} - -/*% - * applications that need a specific config file other than - * _PATH_IRS_CONF should call net_data_init directly rather than letting - * the various wrapper functions make the first call. - brister - */ - -struct net_data * -net_data_init(const char *conf_file) { -#ifdef DO_PTHREADS -#ifndef LIBBIND_MUTEX_INITIALIZER -#define LIBBIND_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER -#endif - static pthread_mutex_t keylock = LIBBIND_MUTEX_INITIALIZER; - struct net_data *net_data; - - if (!once) { - if (pthread_mutex_lock(&keylock) != 0) - return (NULL); - if (!once) { - if (pthread_key_create(&key, net_data_destroy) != 0) { - (void)pthread_mutex_unlock(&keylock); - return (NULL); - } - once = 1; - } - if (pthread_mutex_unlock(&keylock) != 0) - return (NULL); - } - net_data = pthread_getspecific(key); -#endif - - if (net_data == NULL) { - net_data = net_data_create(conf_file); - if (net_data == NULL) - return (NULL); -#ifdef DO_PTHREADS - if (pthread_setspecific(key, net_data) != 0) { - net_data_destroy(net_data); - return (NULL); - } -#endif - } - - return (net_data); -} - -struct net_data * -net_data_create(const char *conf_file) { - struct net_data *net_data; - - net_data = memget(sizeof (struct net_data)); - if (net_data == NULL) - return (NULL); - memset(net_data, 0, sizeof (struct net_data)); - - if ((net_data->irs = irs_gen_acc("", conf_file)) == NULL) { - memput(net_data, sizeof (struct net_data)); - return (NULL); - } -#ifndef DO_PTHREADS - (*net_data->irs->res_set)(net_data->irs, &_res, NULL); -#endif - - net_data->res = (*net_data->irs->res_get)(net_data->irs); - if (net_data->res == NULL) { - (*net_data->irs->close)(net_data->irs); - memput(net_data, sizeof (struct net_data)); - return (NULL); - } - - if ((net_data->res->options & RES_INIT) == 0U && - res_ninit(net_data->res) == -1) { - (*net_data->irs->close)(net_data->irs); - memput(net_data, sizeof (struct net_data)); - return (NULL); - } - - return (net_data); -} - -void -net_data_minimize(struct net_data *net_data) { - res_nclose(net_data->res); -} - -#ifdef _REENTRANT -struct __res_state * -__res_state(void) { - /* NULL param here means use the default config file. */ - struct net_data *net_data = net_data_init(NULL); - if (net_data && net_data->res) - return (net_data->res); - - return (&_res); -} -#else -#ifdef __linux -struct __res_state * -__res_state(void) { - return (&_res); -} -#endif -#endif - -int * -__h_errno(void) { - /* NULL param here means use the default config file. */ - struct net_data *net_data = net_data_init(NULL); - if (net_data && net_data->res) - return (&net_data->res->res_h_errno); -#if !(__GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) - return(&_res.res_h_errno); -#else - return (&h_errno); -#endif -} - -void -__h_errno_set(struct __res_state *res, int err) { - - -#if (__GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) - res->res_h_errno = err; -#else - h_errno = res->res_h_errno = err; -#endif -} - -#endif /*__BIND_NOSTATIC*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irs_data.h b/contrib/bind9/lib/bind/irs/irs_data.h deleted file mode 100644 index c1ee3dd..0000000 --- a/contrib/bind9/lib/bind/irs/irs_data.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: irs_data.h,v 1.2.18.1 2005/04/27 05:01:01 sra Exp $ - */ - -#ifndef __BIND_NOSTATIC - -#define net_data_init __net_data_init - -struct net_data { - struct irs_acc * irs; - - struct irs_gr * gr; - struct irs_pw * pw; - struct irs_sv * sv; - struct irs_pr * pr; - struct irs_ho * ho; - struct irs_nw * nw; - struct irs_ng * ng; - - struct group * gr_last; - struct passwd * pw_last; - struct servent * sv_last; - struct protoent * pr_last; - struct netent * nw_last; /*%< should have been ne_last */ - struct nwent * nww_last; - struct hostent * ho_last; - - unsigned int gr_stayopen :1; - unsigned int pw_stayopen :1; - unsigned int sv_stayopen :1; - unsigned int pr_stayopen :1; - unsigned int ho_stayopen :1; - unsigned int nw_stayopen :1; - - void * nw_data; - void * ho_data; - - struct __res_state * res; /*%< for gethostent.c */ -}; - -extern struct net_data * net_data_init(const char *conf_file); -extern void net_data_minimize(struct net_data *); - -#endif /*__BIND_NOSTATIC*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/irs_p.h b/contrib/bind9/lib/bind/irs/irs_p.h deleted file mode 100644 index bc1817b..0000000 --- a/contrib/bind9/lib/bind/irs/irs_p.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: irs_p.h,v 1.2.18.1 2005/04/27 05:01:01 sra Exp $ - */ - -#ifndef _IRS_P_H_INCLUDED -#define _IRS_P_H_INCLUDED - -#include <stdio.h> - -#include "pathnames.h" - -#define IRS_SV_MAXALIASES 35 - -struct lcl_sv { - FILE * fp; - char line[BUFSIZ+1]; - struct servent serv; - char * serv_aliases[IRS_SV_MAXALIASES]; -}; - -#define irs_nul_ng __irs_nul_ng -#define map_v4v6_address __map_v4v6_address -#define make_group_list __make_group_list -#define irs_lclsv_fnxt __irs_lclsv_fnxt - -extern void map_v4v6_address(const char *src, char *dst); -extern int make_group_list(struct irs_gr *, const char *, - gid_t, gid_t *, int *); -extern struct irs_ng * irs_nul_ng(struct irs_acc *); -extern struct servent * irs_lclsv_fnxt(struct lcl_sv *); - -#endif - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/lcl.c b/contrib/bind9/lib/bind/irs/lcl.c deleted file mode 100644 index 930c87e..0000000 --- a/contrib/bind9/lib/bind/irs/lcl.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: lcl.c,v 1.3.18.1 2005/04/27 05:01:02 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <stdlib.h> -#include <errno.h> -#include <string.h> - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <isc/memcluster.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "lcl_p.h" - -/* Forward. */ - -static void lcl_close(struct irs_acc *); -static struct __res_state * lcl_res_get(struct irs_acc *); -static void lcl_res_set(struct irs_acc *, struct __res_state *, - void (*)(void *)); - -/* Public */ - -struct irs_acc * -irs_lcl_acc(const char *options) { - struct irs_acc *acc; - struct lcl_p *lcl; - - UNUSED(options); - - if (!(acc = memget(sizeof *acc))) { - errno = ENOMEM; - return (NULL); - } - memset(acc, 0x5e, sizeof *acc); - if (!(lcl = memget(sizeof *lcl))) { - errno = ENOMEM; - free(acc); - return (NULL); - } - memset(lcl, 0x5e, sizeof *lcl); - lcl->res = NULL; - lcl->free_res = NULL; - acc->private = lcl; -#ifdef WANT_IRS_GR - acc->gr_map = irs_lcl_gr; -#else - acc->gr_map = NULL; -#endif -#ifdef WANT_IRS_PW - acc->pw_map = irs_lcl_pw; -#else - acc->pw_map = NULL; -#endif - acc->sv_map = irs_lcl_sv; - acc->pr_map = irs_lcl_pr; - acc->ho_map = irs_lcl_ho; - acc->nw_map = irs_lcl_nw; - acc->ng_map = irs_lcl_ng; - acc->res_get = lcl_res_get; - acc->res_set = lcl_res_set; - acc->close = lcl_close; - return (acc); -} - -/* Methods */ -static struct __res_state * -lcl_res_get(struct irs_acc *this) { - struct lcl_p *lcl = (struct lcl_p *)this->private; - - if (lcl->res == NULL) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (res == NULL) - return (NULL); - memset(res, 0, sizeof *res); - lcl_res_set(this, res, free); - } - - if ((lcl->res->options & RES_INIT) == 0U && - res_ninit(lcl->res) < 0) - return (NULL); - - return (lcl->res); -} - -static void -lcl_res_set(struct irs_acc *this, struct __res_state *res, - void (*free_res)(void *)) { - struct lcl_p *lcl = (struct lcl_p *)this->private; - - if (lcl->res && lcl->free_res) { - res_nclose(lcl->res); - (*lcl->free_res)(lcl->res); - } - - lcl->res = res; - lcl->free_res = free_res; -} - -static void -lcl_close(struct irs_acc *this) { - struct lcl_p *lcl = (struct lcl_p *)this->private; - - if (lcl) { - if (lcl->free_res) - (*lcl->free_res)(lcl->res); - memput(lcl, sizeof *lcl); - } - memput(this, sizeof *this); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/lcl_gr.c b/contrib/bind9/lib/bind/irs/lcl_gr.c deleted file mode 100644 index f17410c..0000000 --- a/contrib/bind9/lib/bind/irs/lcl_gr.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (c) 1989, 1993, 1995 - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: lcl_gr.c,v 1.2.18.1 2005/04/27 05:01:02 sra Exp $"; -/* from getgrent.c 8.2 (Berkeley) 3/21/94"; */ -/* from BSDI Id: getgrent.c,v 2.8 1996/05/28 18:15:14 bostic Exp $ */ -#endif /* LIBC_SCCS and not lint */ - -/* extern */ - -#include "port_before.h" - -#ifndef WANT_IRS_PW -static int __bind_irs_gr_unneeded; -#else - -#include <sys/param.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <errno.h> -#include <fcntl.h> -#include <grp.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <irs.h> -#include <isc/memcluster.h> - -#include "irs_p.h" -#include "lcl_p.h" -#include "irp_p.h" - -#include "port_after.h" - - -/* Types. */ - -struct pvt { - FILE * fp; - /*%< - * Need space to store the entries read from the group file. - * The members list also needs space per member, and the - * strings making up the user names must be allocated - * somewhere. Rather than doing lots of small allocations, - * we keep one buffer and resize it as needed. - */ - struct group group; - size_t nmemb; /*%< Malloc'd max index of gr_mem[]. */ - char * membuf; - size_t membufsize; -}; - -/* Forward. */ - -static void gr_close(struct irs_gr *); -static struct group * gr_next(struct irs_gr *); -static struct group * gr_byname(struct irs_gr *, const char *); -static struct group * gr_bygid(struct irs_gr *, gid_t); -static void gr_rewind(struct irs_gr *); -static void gr_minimize(struct irs_gr *); - -static int grstart(struct pvt *); -static char * grnext(struct pvt *); -static struct group * grscan(struct irs_gr *, int, gid_t, const char *); - -/* Portability. */ - -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif - -/* Public. */ - -struct irs_gr * -irs_lcl_gr(struct irs_acc *this) { - struct irs_gr *gr; - struct pvt *pvt; - - UNUSED(this); - - if (!(gr = memget(sizeof *gr))) { - errno = ENOMEM; - return (NULL); - } - memset(gr, 0x5e, sizeof *gr); - if (!(pvt = memget(sizeof *pvt))) { - memput(gr, sizeof *gr); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - gr->private = pvt; - gr->close = gr_close; - gr->next = gr_next; - gr->byname = gr_byname; - gr->bygid = gr_bygid; - gr->rewind = gr_rewind; - gr->list = make_group_list; - gr->minimize = gr_minimize; - gr->res_get = NULL; - gr->res_set = NULL; - return (gr); -} - -/* Methods. */ - -static void -gr_close(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp) - (void)fclose(pvt->fp); - if (pvt->group.gr_mem) - free(pvt->group.gr_mem); - if (pvt->membuf) - free(pvt->membuf); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct group * -gr_next(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->fp && !grstart(pvt)) - return (NULL); - return (grscan(this, 0, 0, NULL)); -} - -static struct group * -gr_byname(struct irs_gr *this, const char *name) { - if (!grstart((struct pvt *)this->private)) - return (NULL); - return (grscan(this, 1, 0, name)); -} - -static struct group * -gr_bygid(struct irs_gr *this, gid_t gid) { - if (!grstart((struct pvt *)this->private)) - return (NULL); - return (grscan(this, 1, gid, NULL)); -} - -static void -gr_rewind(struct irs_gr *this) { - (void) grstart((struct pvt *)this->private); -} - -static void -gr_minimize(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp != NULL) { - (void)fclose(pvt->fp); - pvt->fp = NULL; - } -} - -/* Private. */ - -static int -grstart(struct pvt *pvt) { - if (pvt->fp) { - if (fseek(pvt->fp, 0L, SEEK_SET) == 0) - return (1); - (void)fclose(pvt->fp); - } - if (!(pvt->fp = fopen(_PATH_GROUP, "r"))) - return (0); - if (fcntl(fileno(pvt->fp), F_SETFD, 1) < 0) { - fclose(pvt->fp); - return (0); - } - return (1); -} - -#define INITIAL_NMEMB 30 /*%< about 120 bytes */ -#define INITIAL_BUFSIZ (INITIAL_NMEMB * 8) /*%< about 240 bytes */ -static char * -grnext(struct pvt *pvt) { - char *w, *e; - int ch; - - /* Make sure we have a buffer. */ - if (pvt->membuf == NULL) { - pvt->membuf = malloc(INITIAL_BUFSIZ); - if (pvt->membuf == NULL) { - enomem: - errno = ENOMEM; - return (NULL); - } - pvt->membufsize = INITIAL_BUFSIZ; - } - - /* Read until EOF or EOL. */ - w = pvt->membuf; - e = pvt->membuf + pvt->membufsize; - while ((ch = fgetc(pvt->fp)) != EOF && ch != '\n') { - /* Make sure we have room for this character and a \0. */ - if (w + 1 == e) { - size_t o = w - pvt->membuf; - size_t n = pvt->membufsize * 2; - char *t = realloc(pvt->membuf, n); - - if (t == NULL) - goto enomem; - pvt->membuf = t; - pvt->membufsize = n; - w = pvt->membuf + o; - e = pvt->membuf + pvt->membufsize; - } - /* Store it. */ - *w++ = (char)ch; - } - - /* Hitting EOF on the first character really does mean EOF. */ - if (w == pvt->membuf && ch == EOF) { - errno = ENOENT; - return (NULL); - } - - /* Last line of /etc/group need not end with \n; we don't care. */ - *w = '\0'; - return (pvt->membuf); -} - -static struct group * -grscan(struct irs_gr *this, int search, gid_t gid, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - size_t n; - char *bp, **m, *p; - - /* Read lines until we find one that matches our search criteria. */ - for (;;) { - if ((bp = grnext(pvt)) == NULL) - return (NULL); - - /* Optimize the usual case of searching for a name. */ - pvt->group.gr_name = strsep(&bp, ":"); - if (search && name != NULL && - strcmp(pvt->group.gr_name, name) != 0) - continue; - if (bp == NULL || *bp == '\0') - goto corrupt; - - /* Skip past the password field. */ - pvt->group.gr_passwd = strsep(&bp, ":"); - if (bp == NULL || *bp == '\0') - goto corrupt; - - /* Checking for a gid. */ - if ((p = strsep(&bp, ":")) == NULL) - continue; - /* - * Unlike the tests above, the test below is supposed to be - * testing 'p' and not 'bp', in case you think it's a typo. - */ - if (p == NULL || *p == '\0') { - corrupt: - /* warning: corrupted %s file!", _PATH_GROUP */ - continue; - } - pvt->group.gr_gid = atoi(p); - if (search && name == NULL && (gid_t)pvt->group.gr_gid != gid) - continue; - - /* We want this record. */ - break; - } - - /* - * Count commas to find out how many members there might be. - * Note that commas separate, so if there is one comma there - * can be two members (group:*:id:user1,user2). Add another - * to account for the NULL terminator. As above, allocate - * largest of INITIAL_NMEMB, or 2*n. - */ - n = 1; - if (bp != NULL) - for (n = 2, p = bp; (p = strpbrk(p, ", ")) != NULL; ++n) - p += strspn(p, ", "); - if (n > pvt->nmemb || pvt->group.gr_mem == NULL) { - if ((n *= 2) < INITIAL_NMEMB) - n = INITIAL_NMEMB; - if ((m = realloc(pvt->group.gr_mem, n * sizeof *m)) == NULL) - return (NULL); - pvt->group.gr_mem = m; - pvt->nmemb = n; - } - - /* Set the name pointers. */ - for (m = pvt->group.gr_mem; (p = strsep(&bp, ", ")) != NULL;) - if (p[0] != '\0') - *m++ = p; - *m = NULL; - - return (&pvt->group); -} - -#endif /* WANT_IRS_GR */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/lcl_ho.c b/contrib/bind9/lib/bind/irs/lcl_ho.c deleted file mode 100644 index 9534ee6..0000000 --- a/contrib/bind9/lib/bind/irs/lcl_ho.c +++ /dev/null @@ -1,578 +0,0 @@ -/* - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* from gethostnamadr.c 8.1 (Berkeley) 6/4/93 */ -/* BIND Id: gethnamaddr.c,v 8.15 1996/05/22 04:56:30 vixie Exp $ */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: lcl_ho.c,v 1.3.18.2 2006/03/10 00:20:08 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports. */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <irs.h> -#include <isc/memcluster.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "dns_p.h" -#include "lcl_p.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) sprintf x -#endif - -/* Definitions. */ - -#define MAXALIASES 35 -#define MAXADDRS 35 -#define Max(a,b) ((a) > (b) ? (a) : (b)) - -#if PACKETSZ > 1024 -#define MAXPACKET PACKETSZ -#else -#define MAXPACKET 1024 -#endif - -struct pvt { - FILE * fp; - struct hostent host; - char * h_addr_ptrs[MAXADDRS + 1]; - char * host_aliases[MAXALIASES]; - char hostbuf[8*1024]; - u_char host_addr[16]; /*%< IPv4 or IPv6 */ - struct __res_state *res; - void (*free_res)(void *); -}; - -typedef union { - int32_t al; - char ac; -} align; - -static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; -static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; - -/* Forward. */ - -static void ho_close(struct irs_ho *this); -static struct hostent * ho_byname(struct irs_ho *this, const char *name); -static struct hostent * ho_byname2(struct irs_ho *this, const char *name, - int af); -static struct hostent * ho_byaddr(struct irs_ho *this, const void *addr, - int len, int af); -static struct hostent * ho_next(struct irs_ho *this); -static void ho_rewind(struct irs_ho *this); -static void ho_minimize(struct irs_ho *this); -static struct __res_state * ho_res_get(struct irs_ho *this); -static void ho_res_set(struct irs_ho *this, - struct __res_state *res, - void (*free_res)(void *)); -static struct addrinfo * ho_addrinfo(struct irs_ho *this, const char *name, - const struct addrinfo *pai); - -static size_t ns_namelen(const char *); -static int init(struct irs_ho *this); - -/* Portability. */ - -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif - -/* Public. */ - -struct irs_ho * -irs_lcl_ho(struct irs_acc *this) { - struct irs_ho *ho; - struct pvt *pvt; - - UNUSED(this); - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - if (!(ho = memget(sizeof *ho))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(ho, 0x5e, sizeof *ho); - ho->private = pvt; - ho->close = ho_close; - ho->byname = ho_byname; - ho->byname2 = ho_byname2; - ho->byaddr = ho_byaddr; - ho->next = ho_next; - ho->rewind = ho_rewind; - ho->minimize = ho_minimize; - ho->res_get = ho_res_get; - ho->res_set = ho_res_set; - ho->addrinfo = ho_addrinfo; - return (ho); -} - -/* Methods. */ - -static void -ho_close(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - ho_minimize(this); - if (pvt->fp) - (void) fclose(pvt->fp); - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct hostent * -ho_byname(struct irs_ho *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *hp; - - if (init(this) == -1) - return (NULL); - - if (pvt->res->options & RES_USE_INET6) { - hp = ho_byname2(this, name, AF_INET6); - if (hp) - return (hp); - } - return (ho_byname2(this, name, AF_INET)); -} - -static struct hostent * -ho_byname2(struct irs_ho *this, const char *name, int af) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *hp; - char **hap; - size_t n; - - if (init(this) == -1) - return (NULL); - - ho_rewind(this); - n = ns_namelen(name); - while ((hp = ho_next(this)) != NULL) { - size_t nn; - - if (hp->h_addrtype != af) - continue; - nn = ns_namelen(hp->h_name); - if (strncasecmp(hp->h_name, name, Max(n, nn)) == 0) - goto found; - for (hap = hp->h_aliases; *hap; hap++) { - nn = ns_namelen(*hap); - if (strncasecmp(*hap, name, Max(n, nn)) == 0) - goto found; - } - } - found: - if (!hp) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - return (NULL); - } - RES_SET_H_ERRNO(pvt->res, NETDB_SUCCESS); - return (hp); -} - -static struct hostent * -ho_byaddr(struct irs_ho *this, const void *addr, int len, int af) { - struct pvt *pvt = (struct pvt *)this->private; - const u_char *uaddr = addr; - struct hostent *hp; - int size; - - if (init(this) == -1) - return (NULL); - - if (af == AF_INET6 && len == IN6ADDRSZ && - (!memcmp(uaddr, mapped, sizeof mapped) || - !memcmp(uaddr, tunnelled, sizeof tunnelled))) { - /* Unmap. */ - addr = (const u_char *)addr + sizeof mapped; - uaddr += sizeof mapped; - af = AF_INET; - len = INADDRSZ; - } - switch (af) { - case AF_INET: - size = INADDRSZ; - break; - case AF_INET6: - size = IN6ADDRSZ; - break; - default: - errno = EAFNOSUPPORT; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - if (size > len) { - errno = EINVAL; - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - - /* - * Do the search. - */ - ho_rewind(this); - while ((hp = ho_next(this)) != NULL) { - char **hap; - - for (hap = hp->h_addr_list; *hap; hap++) { - const u_char *taddr = (const u_char *)*hap; - int taf = hp->h_addrtype; - int tlen = hp->h_length; - - if (taf == AF_INET6 && tlen == IN6ADDRSZ && - (!memcmp(taddr, mapped, sizeof mapped) || - !memcmp(taddr, tunnelled, sizeof tunnelled))) { - /* Unmap. */ - taddr += sizeof mapped; - taf = AF_INET; - tlen = INADDRSZ; - } - if (taf == af && tlen == len && - !memcmp(taddr, uaddr, tlen)) - goto found; - } - } - found: - if (!hp) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - return (NULL); - } - RES_SET_H_ERRNO(pvt->res, NETDB_SUCCESS); - return (hp); -} - -static struct hostent * -ho_next(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - char *cp, **q, *p; - char *bufp, *ndbuf, *dbuf = NULL; - int c, af, len, bufsiz, offset; - - if (init(this) == -1) - return (NULL); - - if (!pvt->fp) - ho_rewind(this); - if (!pvt->fp) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - bufp = pvt->hostbuf; - bufsiz = sizeof pvt->hostbuf; - offset = 0; - again: - if (!(p = fgets(bufp + offset, bufsiz - offset, pvt->fp))) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - if (dbuf) - free(dbuf); - return (NULL); - } - if (!strchr(p, '\n') && !feof(pvt->fp)) { -#define GROWBUF 1024 - /* allocate space for longer line */ - if (dbuf == NULL) { - if ((ndbuf = malloc(bufsiz + GROWBUF)) != NULL) - strcpy(ndbuf, bufp); - } else - ndbuf = realloc(dbuf, bufsiz + GROWBUF); - if (ndbuf) { - dbuf = ndbuf; - bufp = dbuf; - bufsiz += GROWBUF; - offset = strlen(dbuf); - } else { - /* allocation failed; skip this long line */ - while ((c = getc(pvt->fp)) != EOF) - if (c == '\n') - break; - if (c != EOF) - ungetc(c, pvt->fp); - } - goto again; - } - - p -= offset; - offset = 0; - - if (*p == '#') - goto again; - if ((cp = strpbrk(p, "#\n")) != NULL) - *cp = '\0'; - if (!(cp = strpbrk(p, " \t"))) - goto again; - *cp++ = '\0'; - if (inet_pton(AF_INET6, p, pvt->host_addr) > 0) { - af = AF_INET6; - len = IN6ADDRSZ; - } else if (inet_aton(p, (struct in_addr *)pvt->host_addr) > 0) { - if (pvt->res->options & RES_USE_INET6) { - map_v4v6_address((char*)pvt->host_addr, - (char*)pvt->host_addr); - af = AF_INET6; - len = IN6ADDRSZ; - } else { - af = AF_INET; - len = INADDRSZ; - } - } else { - goto again; - } - pvt->h_addr_ptrs[0] = (char *)pvt->host_addr; - pvt->h_addr_ptrs[1] = NULL; - pvt->host.h_addr_list = pvt->h_addr_ptrs; - pvt->host.h_length = len; - pvt->host.h_addrtype = af; - while (*cp == ' ' || *cp == '\t') - cp++; - pvt->host.h_name = cp; - q = pvt->host.h_aliases = pvt->host_aliases; - if ((cp = strpbrk(cp, " \t")) != NULL) - *cp++ = '\0'; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &pvt->host_aliases[MAXALIASES - 1]) - *q++ = cp; - if ((cp = strpbrk(cp, " \t")) != NULL) - *cp++ = '\0'; - } - *q = NULL; - if (dbuf) - free(dbuf); - RES_SET_H_ERRNO(pvt->res, NETDB_SUCCESS); - return (&pvt->host); -} - -static void -ho_rewind(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp) { - if (fseek(pvt->fp, 0L, SEEK_SET) == 0) - return; - (void)fclose(pvt->fp); - } - if (!(pvt->fp = fopen(_PATH_HOSTS, "r"))) - return; - if (fcntl(fileno(pvt->fp), F_SETFD, 1) < 0) { - (void)fclose(pvt->fp); - pvt->fp = NULL; - } -} - -static void -ho_minimize(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp != NULL) { - (void)fclose(pvt->fp); - pvt->fp = NULL; - } - if (pvt->res) - res_nclose(pvt->res); -} - -static struct __res_state * -ho_res_get(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - ho_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -ho_res_set(struct irs_ho *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; -} - -struct lcl_res_target { - struct lcl_res_target *next; - int family; -}; - -/* XXX */ -extern struct addrinfo *hostent2addrinfo __P((struct hostent *, - const struct addrinfo *pai)); - -static struct addrinfo * -ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai) -{ - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *hp; - struct lcl_res_target q, q2, *p; - struct addrinfo sentinel, *cur; - - memset(&q, 0, sizeof(q2)); - memset(&q2, 0, sizeof(q2)); - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - - switch(pai->ai_family) { - case AF_UNSPEC: /*%< INET6 then INET4 */ - q.family = AF_INET6; - q.next = &q2; - q2.family = AF_INET; - break; - case AF_INET6: - q.family = AF_INET6; - break; - case AF_INET: - q.family = AF_INET; - break; - default: - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); /*%< ??? */ - return(NULL); - } - - for (p = &q; p; p = p->next) { - struct addrinfo *ai; - - hp = (*this->byname2)(this, name, p->family); - if (hp == NULL) { - /* byname2 should've set an appropriate error */ - continue; - } - if ((hp->h_name == NULL) || (hp->h_name[0] == 0) || - (hp->h_addr_list[0] == NULL)) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - continue; - } - - ai = hostent2addrinfo(hp, pai); - if (ai) { - cur->ai_next = ai; - while (cur->ai_next) - cur = cur->ai_next; - } - } - - if (sentinel.ai_next == NULL) - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - - return(sentinel.ai_next); -} - -/* Private. */ - -static size_t -ns_namelen(const char *s) { - int i; - - for (i = strlen(s); i > 0 && s[i-1] == '.'; i--) - (void)NULL; - return ((size_t) i); -} - -static int -init(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res && !ho_res_get(this)) - return (-1); - if (((pvt->res->options & RES_INIT) == 0U) && - res_ninit(pvt->res) == -1) - return (-1); - return (0); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/lcl_ng.c b/contrib/bind9/lib/bind/irs/lcl_ng.c deleted file mode 100644 index 3a9f3fa..0000000 --- a/contrib/bind9/lib/bind/irs/lcl_ng.c +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: lcl_ng.c,v 1.2.18.1 2005/04/27 05:01:02 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <irs.h> -#include <isc/memcluster.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "lcl_p.h" - -/* Definitions */ - -#define NG_HOST 0 /*%< Host name */ -#define NG_USER 1 /*%< User name */ -#define NG_DOM 2 /*%< and Domain name */ -#define LINSIZ 1024 /*%< Length of netgroup file line */ -/* - * XXX Warning XXX - * This code is a hack-and-slash special. It realy needs to be - * rewritten with things like strdup, and realloc in mind. - * More reasonable data structures would not be a bad thing. - */ - -/*% - * Static Variables and functions used by setnetgrent(), getnetgrent() and - * endnetgrent(). - * - * There are two linked lists: - * \li linelist is just used by setnetgrent() to parse the net group file via. - * parse_netgrp() - * \li netgrp is the list of entries for the current netgroup - */ -struct linelist { - struct linelist *l_next; /*%< Chain ptr. */ - int l_parsed; /*%< Flag for cycles */ - char * l_groupname; /*%< Name of netgroup */ - char * l_line; /*%< Netgroup entrie(s) to be parsed */ -}; - -struct ng_old_struct { - struct ng_old_struct *ng_next; /*%< Chain ptr */ - char * ng_str[3]; /*%< Field pointers, see below */ -}; - -struct pvt { - FILE *fp; - struct linelist *linehead; - struct ng_old_struct *nextgrp; - struct { - struct ng_old_struct *gr; - char *grname; - } grouphead; -}; - -/* Forward */ - -static void ng_rewind(struct irs_ng *, const char*); -static void ng_close(struct irs_ng *); -static int ng_next(struct irs_ng *, const char **, - const char **, const char **); -static int ng_test(struct irs_ng *, const char *, - const char *, const char *, - const char *); -static void ng_minimize(struct irs_ng *); - -static int parse_netgrp(struct irs_ng *, const char*); -static struct linelist *read_for_group(struct irs_ng *, const char *); -static void freelists(struct irs_ng *); - -/* Public */ - -struct irs_ng * -irs_lcl_ng(struct irs_acc *this) { - struct irs_ng *ng; - struct pvt *pvt; - - UNUSED(this); - - if (!(ng = memget(sizeof *ng))) { - errno = ENOMEM; - return (NULL); - } - memset(ng, 0x5e, sizeof *ng); - if (!(pvt = memget(sizeof *pvt))) { - memput(ng, sizeof *ng); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - ng->private = pvt; - ng->close = ng_close; - ng->next = ng_next; - ng->test = ng_test; - ng->rewind = ng_rewind; - ng->minimize = ng_minimize; - return (ng); -} - -/* Methods */ - -static void -ng_close(struct irs_ng *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp != NULL) - fclose(pvt->fp); - freelists(this); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -/*% - * Parse the netgroup file looking for the netgroup and build the list - * of netgrp structures. Let parse_netgrp() and read_for_group() do - * most of the work. - */ -static void -ng_rewind(struct irs_ng *this, const char *group) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp != NULL && fseek(pvt->fp, SEEK_CUR, 0L) == -1) { - fclose(pvt->fp); - pvt->fp = NULL; - } - - if (pvt->fp == NULL || pvt->grouphead.gr == NULL || - strcmp(group, pvt->grouphead.grname)) { - freelists(this); - if (pvt->fp != NULL) - fclose(pvt->fp); - pvt->fp = fopen(_PATH_NETGROUP, "r"); - if (pvt->fp != NULL) { - if (parse_netgrp(this, group)) - freelists(this); - if (!(pvt->grouphead.grname = strdup(group))) - freelists(this); - fclose(pvt->fp); - pvt->fp = NULL; - } - } - pvt->nextgrp = pvt->grouphead.gr; -} - -/*% - * Get the next netgroup off the list. - */ -static int -ng_next(struct irs_ng *this, const char **host, const char **user, - const char **domain) -{ - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->nextgrp) { - *host = pvt->nextgrp->ng_str[NG_HOST]; - *user = pvt->nextgrp->ng_str[NG_USER]; - *domain = pvt->nextgrp->ng_str[NG_DOM]; - pvt->nextgrp = pvt->nextgrp->ng_next; - return (1); - } - return (0); -} - -/*% - * Search for a match in a netgroup. - */ -static int -ng_test(struct irs_ng *this, const char *name, - const char *host, const char *user, const char *domain) -{ - const char *ng_host, *ng_user, *ng_domain; - - ng_rewind(this, name); - while (ng_next(this, &ng_host, &ng_user, &ng_domain)) - if ((host == NULL || ng_host == NULL || - !strcmp(host, ng_host)) && - (user == NULL || ng_user == NULL || - !strcmp(user, ng_user)) && - (domain == NULL || ng_domain == NULL || - !strcmp(domain, ng_domain))) { - freelists(this); - return (1); - } - freelists(this); - return (0); -} - -static void -ng_minimize(struct irs_ng *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp != NULL) { - (void)fclose(pvt->fp); - pvt->fp = NULL; - } -} - -/* Private */ - -/*% - * endnetgrent() - cleanup - */ -static void -freelists(struct irs_ng *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct linelist *lp, *olp; - struct ng_old_struct *gp, *ogp; - - lp = pvt->linehead; - while (lp) { - olp = lp; - lp = lp->l_next; - free(olp->l_groupname); - free(olp->l_line); - free((char *)olp); - } - pvt->linehead = NULL; - if (pvt->grouphead.grname) { - free(pvt->grouphead.grname); - pvt->grouphead.grname = NULL; - } - gp = pvt->grouphead.gr; - while (gp) { - ogp = gp; - gp = gp->ng_next; - if (ogp->ng_str[NG_HOST]) - free(ogp->ng_str[NG_HOST]); - if (ogp->ng_str[NG_USER]) - free(ogp->ng_str[NG_USER]); - if (ogp->ng_str[NG_DOM]) - free(ogp->ng_str[NG_DOM]); - free((char *)ogp); - } - pvt->grouphead.gr = NULL; -} - -/*% - * Parse the netgroup file setting up the linked lists. - */ -static int -parse_netgrp(struct irs_ng *this, const char *group) { - struct pvt *pvt = (struct pvt *)this->private; - char *spos, *epos; - int len, strpos; - char *pos, *gpos; - struct ng_old_struct *grp; - struct linelist *lp = pvt->linehead; - - /* - * First, see if the line has already been read in. - */ - while (lp) { - if (!strcmp(group, lp->l_groupname)) - break; - lp = lp->l_next; - } - if (lp == NULL && - (lp = read_for_group(this, group)) == NULL) - return (1); - if (lp->l_parsed) { - /*fprintf(stderr, "Cycle in netgroup %s\n", lp->l_groupname);*/ - return (1); - } else - lp->l_parsed = 1; - pos = lp->l_line; - while (*pos != '\0') { - if (*pos == '(') { - if (!(grp = malloc(sizeof (struct ng_old_struct)))) { - freelists(this); - errno = ENOMEM; - return (1); - } - memset(grp, 0, sizeof (struct ng_old_struct)); - grp->ng_next = pvt->grouphead.gr; - pvt->grouphead.gr = grp; - pos++; - gpos = strsep(&pos, ")"); - for (strpos = 0; strpos < 3; strpos++) { - if ((spos = strsep(&gpos, ","))) { - while (*spos == ' ' || *spos == '\t') - spos++; - if ((epos = strpbrk(spos, " \t"))) { - *epos = '\0'; - len = epos - spos; - } else - len = strlen(spos); - if (len > 0) { - if(!(grp->ng_str[strpos] - = (char *) - malloc(len + 1))) { - freelists(this); - return (1); - } - memcpy(grp->ng_str[strpos], - spos, - len + 1); - } - } else - goto errout; - } - } else { - spos = strsep(&pos, ", \t"); - if (spos != NULL && parse_netgrp(this, spos)) { - freelists(this); - return (1); - } - } - if (pos == NULL) - break; - while (*pos == ' ' || *pos == ',' || *pos == '\t') - pos++; - } - return (0); - errout: - /*fprintf(stderr, "Bad netgroup %s at ..%s\n", lp->l_groupname, - spos);*/ - return (1); -} - -/*% - * Read the netgroup file and save lines until the line for the netgroup - * is found. Return 1 if eof is encountered. - */ -static struct linelist * -read_for_group(struct irs_ng *this, const char *group) { - struct pvt *pvt = (struct pvt *)this->private; - char *pos, *spos, *linep = NULL, *olinep; - int len, olen, cont; - struct linelist *lp; - char line[LINSIZ + 1]; - - while (fgets(line, LINSIZ, pvt->fp) != NULL) { - pos = line; - if (*pos == '#') - continue; - while (*pos == ' ' || *pos == '\t') - pos++; - spos = pos; - while (*pos != ' ' && *pos != '\t' && *pos != '\n' && - *pos != '\0') - pos++; - len = pos - spos; - while (*pos == ' ' || *pos == '\t') - pos++; - if (*pos != '\n' && *pos != '\0') { - if (!(lp = malloc(sizeof (*lp)))) { - freelists(this); - return (NULL); - } - lp->l_parsed = 0; - if (!(lp->l_groupname = malloc(len + 1))) { - free(lp); - freelists(this); - return (NULL); - } - memcpy(lp->l_groupname, spos, len); - *(lp->l_groupname + len) = '\0'; - len = strlen(pos); - olen = 0; - olinep = NULL; - - /* - * Loop around handling line continuations. - */ - do { - if (*(pos + len - 1) == '\n') - len--; - if (*(pos + len - 1) == '\\') { - len--; - cont = 1; - } else - cont = 0; - if (len > 0) { - if (!(linep = malloc(olen + len + 1))){ - if (olen > 0) - free(olinep); - free(lp->l_groupname); - free(lp); - freelists(this); - errno = ENOMEM; - return (NULL); - } - if (olen > 0) { - memcpy(linep, olinep, olen); - free(olinep); - } - memcpy(linep + olen, pos, len); - olen += len; - *(linep + olen) = '\0'; - olinep = linep; - } - if (cont) { - if (fgets(line, LINSIZ, pvt->fp)) { - pos = line; - len = strlen(pos); - } else - cont = 0; - } - } while (cont); - lp->l_line = linep; - lp->l_next = pvt->linehead; - pvt->linehead = lp; - - /* - * If this is the one we wanted, we are done. - */ - if (!strcmp(lp->l_groupname, group)) - return (lp); - } - } - return (NULL); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/lcl_nw.c b/contrib/bind9/lib/bind/irs/lcl_nw.c deleted file mode 100644 index 2804946..0000000 --- a/contrib/bind9/lib/bind/irs/lcl_nw.c +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright (c) 1989, 1993, 1995 - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: lcl_nw.c,v 1.3.18.1 2005/04/27 05:01:02 sra Exp $"; -/* from getgrent.c 8.2 (Berkeley) 3/21/94"; */ -/* from BSDI Id: getgrent.c,v 2.8 1996/05/28 18:15:14 bostic Exp $ */ -#endif /* LIBC_SCCS and not lint */ - -/* Imports */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <fcntl.h> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <irs.h> -#include <isc/memcluster.h> - -#include "port_after.h" - -#include <isc/misc.h> -#include "irs_p.h" -#include "lcl_p.h" - -#define MAXALIASES 35 -#define MAXADDRSIZE 4 - -struct pvt { - FILE * fp; - char line[BUFSIZ+1]; - struct nwent net; - char * aliases[MAXALIASES]; - char addr[MAXADDRSIZE]; - struct __res_state * res; - void (*free_res)(void *); -}; - -/* Forward */ - -static void nw_close(struct irs_nw *); -static struct nwent * nw_byname(struct irs_nw *, const char *, int); -static struct nwent * nw_byaddr(struct irs_nw *, void *, int, int); -static struct nwent * nw_next(struct irs_nw *); -static void nw_rewind(struct irs_nw *); -static void nw_minimize(struct irs_nw *); -static struct __res_state * nw_res_get(struct irs_nw *this); -static void nw_res_set(struct irs_nw *this, - struct __res_state *res, - void (*free_res)(void *)); - -static int init(struct irs_nw *this); - -/* Portability. */ - -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif - -/* Public */ - -struct irs_nw * -irs_lcl_nw(struct irs_acc *this) { - struct irs_nw *nw; - struct pvt *pvt; - - UNUSED(this); - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - if (!(nw = memget(sizeof *nw))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(nw, 0x5e, sizeof *nw); - nw->private = pvt; - nw->close = nw_close; - nw->byname = nw_byname; - nw->byaddr = nw_byaddr; - nw->next = nw_next; - nw->rewind = nw_rewind; - nw->minimize = nw_minimize; - nw->res_get = nw_res_get; - nw->res_set = nw_res_set; - return (nw); -} - -/* Methods */ - -static void -nw_close(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - nw_minimize(this); - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - if (pvt->fp) - (void)fclose(pvt->fp); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct nwent * -nw_byaddr(struct irs_nw *this, void *net, int length, int type) { - struct nwent *p; - - if (init(this) == -1) - return(NULL); - - nw_rewind(this); - while ((p = nw_next(this)) != NULL) - if (p->n_addrtype == type && p->n_length == length) - if (bitncmp(p->n_addr, net, length) == 0) - break; - return (p); -} - -static struct nwent * -nw_byname(struct irs_nw *this, const char *name, int type) { - struct nwent *p; - char **ap; - - if (init(this) == -1) - return(NULL); - - nw_rewind(this); - while ((p = nw_next(this)) != NULL) { - if (ns_samename(p->n_name, name) == 1 && - p->n_addrtype == type) - break; - for (ap = p->n_aliases; *ap; ap++) - if ((ns_samename(*ap, name) == 1) && - (p->n_addrtype == type)) - goto found; - } - found: - return (p); -} - -static void -nw_rewind(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp) { - if (fseek(pvt->fp, 0L, SEEK_SET) == 0) - return; - (void)fclose(pvt->fp); - } - if (!(pvt->fp = fopen(_PATH_NETWORKS, "r"))) - return; - if (fcntl(fileno(pvt->fp), F_SETFD, 1) < 0) { - (void)fclose(pvt->fp); - pvt->fp = NULL; - } -} - -static struct nwent * -nw_next(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct nwent *ret = NULL; - char *p, *cp, **q; - char *bufp, *ndbuf, *dbuf = NULL; - int c, bufsiz, offset = 0; - - if (init(this) == -1) - return(NULL); - - if (pvt->fp == NULL) - nw_rewind(this); - if (pvt->fp == NULL) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - bufp = pvt->line; - bufsiz = sizeof(pvt->line); - - again: - p = fgets(bufp + offset, bufsiz - offset, pvt->fp); - if (p == NULL) - goto cleanup; - if (!strchr(p, '\n') && !feof(pvt->fp)) { -#define GROWBUF 1024 - /* allocate space for longer line */ - if (dbuf == NULL) { - if ((ndbuf = malloc(bufsiz + GROWBUF)) != NULL) - strcpy(ndbuf, bufp); - } else - ndbuf = realloc(dbuf, bufsiz + GROWBUF); - if (ndbuf) { - dbuf = ndbuf; - bufp = dbuf; - bufsiz += GROWBUF; - offset = strlen(dbuf); - } else { - /* allocation failed; skip this long line */ - while ((c = getc(pvt->fp)) != EOF) - if (c == '\n') - break; - if (c != EOF) - ungetc(c, pvt->fp); - } - goto again; - } - - p -= offset; - offset = 0; - - if (*p == '#') - goto again; - - cp = strpbrk(p, "#\n"); - if (cp != NULL) - *cp = '\0'; - pvt->net.n_name = p; - cp = strpbrk(p, " \t"); - if (cp == NULL) - goto again; - *cp++ = '\0'; - while (*cp == ' ' || *cp == '\t') - cp++; - p = strpbrk(cp, " \t"); - if (p != NULL) - *p++ = '\0'; - pvt->net.n_length = inet_net_pton(AF_INET, cp, pvt->addr, - sizeof pvt->addr); - if (pvt->net.n_length < 0) - goto again; - pvt->net.n_addrtype = AF_INET; - pvt->net.n_addr = pvt->addr; - q = pvt->net.n_aliases = pvt->aliases; - if (p != NULL) { - cp = p; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &pvt->aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - } - *q = NULL; - ret = &pvt->net; - - cleanup: - if (dbuf) - free(dbuf); - - return (ret); -} - -static void -nw_minimize(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res) - res_nclose(pvt->res); - if (pvt->fp != NULL) { - (void)fclose(pvt->fp); - pvt->fp = NULL; - } -} - -static struct __res_state * -nw_res_get(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - nw_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -nw_res_set(struct irs_nw *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; -} - -static int -init(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res && !nw_res_get(this)) - return (-1); - if (((pvt->res->options & RES_INIT) == 0U) && - res_ninit(pvt->res) == -1) - return (-1); - return (0); -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/lcl_p.h b/contrib/bind9/lib/bind/irs/lcl_p.h deleted file mode 100644 index 4e6bdc3..0000000 --- a/contrib/bind9/lib/bind/irs/lcl_p.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: lcl_p.h,v 1.2.18.1 2005/04/27 05:01:02 sra Exp $ - */ - -/*! \file - * \brief - * lcl_p.h - private include file for the local accessor functions. - */ - -#ifndef _LCL_P_H_INCLUDED -#define _LCL_P_H_INCLUDED - -/*% - * Object state. - */ -struct lcl_p { - struct __res_state * res; - void (*free_res) __P((void *)); -}; - -/* - * Externs. - */ - -extern struct irs_acc * irs_lcl_acc __P((const char *)); -extern struct irs_gr * irs_lcl_gr __P((struct irs_acc *)); -extern struct irs_pw * irs_lcl_pw __P((struct irs_acc *)); -extern struct irs_sv * irs_lcl_sv __P((struct irs_acc *)); -extern struct irs_pr * irs_lcl_pr __P((struct irs_acc *)); -extern struct irs_ho * irs_lcl_ho __P((struct irs_acc *)); -extern struct irs_nw * irs_lcl_nw __P((struct irs_acc *)); -extern struct irs_ng * irs_lcl_ng __P((struct irs_acc *)); - -#endif /*_LCL_P_H_INCLUDED*/ diff --git a/contrib/bind9/lib/bind/irs/lcl_pr.c b/contrib/bind9/lib/bind/irs/lcl_pr.c deleted file mode 100644 index 08c6da9..0000000 --- a/contrib/bind9/lib/bind/irs/lcl_pr.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (c) 1989, 1993, 1995 - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: lcl_pr.c,v 1.2.18.2 2006/03/10 00:20:08 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* extern */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> - -#include <irs.h> -#include <isc/memcluster.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "lcl_p.h" - -#ifndef _PATH_PROTOCOLS -#define _PATH_PROTOCOLS "/etc/protocols" -#endif -#define MAXALIASES 35 - -/* Types */ - -struct pvt { - FILE * fp; - char line[BUFSIZ+1]; - char * dbuf; - struct protoent proto; - char * proto_aliases[MAXALIASES]; -}; - -/* Forward */ - -static void pr_close(struct irs_pr *); -static struct protoent * pr_next(struct irs_pr *); -static struct protoent * pr_byname(struct irs_pr *, const char *); -static struct protoent * pr_bynumber(struct irs_pr *, int); -static void pr_rewind(struct irs_pr *); -static void pr_minimize(struct irs_pr *); - -/* Portability. */ - -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif - -/* Public */ - -struct irs_pr * -irs_lcl_pr(struct irs_acc *this) { - struct irs_pr *pr; - struct pvt *pvt; - - if (!(pr = memget(sizeof *pr))) { - errno = ENOMEM; - return (NULL); - } - if (!(pvt = memget(sizeof *pvt))) { - memput(pr, sizeof *this); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pr->private = pvt; - pr->close = pr_close; - pr->byname = pr_byname; - pr->bynumber = pr_bynumber; - pr->next = pr_next; - pr->rewind = pr_rewind; - pr->minimize = pr_minimize; - pr->res_get = NULL; - pr->res_set = NULL; - return (pr); -} - -/* Methods */ - -static void -pr_close(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp) - (void) fclose(pvt->fp); - if (pvt->dbuf) - free(pvt->dbuf); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct protoent * -pr_byname(struct irs_pr *this, const char *name) { - - struct protoent *p; - char **cp; - - pr_rewind(this); - while ((p = pr_next(this))) { - if (!strcmp(p->p_name, name)) - goto found; - for (cp = p->p_aliases; *cp; cp++) - if (!strcmp(*cp, name)) - goto found; - } - found: - return (p); -} - -static struct protoent * -pr_bynumber(struct irs_pr *this, int proto) { - struct protoent *p; - - pr_rewind(this); - while ((p = pr_next(this))) - if (p->p_proto == proto) - break; - return (p); -} - -static void -pr_rewind(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp) { - if (fseek(pvt->fp, 0L, SEEK_SET) == 0) - return; - (void)fclose(pvt->fp); - } - if (!(pvt->fp = fopen(_PATH_PROTOCOLS, "r" ))) - return; - if (fcntl(fileno(pvt->fp), F_SETFD, 1) < 0) { - (void)fclose(pvt->fp); - pvt->fp = NULL; - } -} - -static struct protoent * -pr_next(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - char *p, *cp, **q; - char *bufp, *ndbuf, *dbuf = NULL; - int c, bufsiz, offset; - - if (!pvt->fp) - pr_rewind(this); - if (!pvt->fp) - return (NULL); - if (pvt->dbuf) { - free(pvt->dbuf); - pvt->dbuf = NULL; - } - bufp = pvt->line; - bufsiz = BUFSIZ; - offset = 0; - again: - if ((p = fgets(bufp + offset, bufsiz - offset, pvt->fp)) == NULL) { - if (dbuf) - free(dbuf); - return (NULL); - } - if (!strchr(p, '\n') && !feof(pvt->fp)) { -#define GROWBUF 1024 - /* allocate space for longer line */ - if (dbuf == NULL) { - if ((ndbuf = malloc(bufsiz + GROWBUF)) != NULL) - strcpy(ndbuf, bufp); - } else - ndbuf = realloc(dbuf, bufsiz + GROWBUF); - if (ndbuf) { - dbuf = ndbuf; - bufp = dbuf; - bufsiz += GROWBUF; - offset = strlen(dbuf); - } else { - /* allocation failed; skip this long line */ - while ((c = getc(pvt->fp)) != EOF) - if (c == '\n') - break; - if (c != EOF) - ungetc(c, pvt->fp); - } - goto again; - } - - p -= offset; - offset = 0; - - if (*p == '#') - goto again; - cp = strpbrk(p, "#\n"); - if (cp != NULL) - *cp = '\0'; - pvt->proto.p_name = p; - cp = strpbrk(p, " \t"); - if (cp == NULL) - goto again; - *cp++ = '\0'; - while (*cp == ' ' || *cp == '\t') - cp++; - p = strpbrk(cp, " \t"); - if (p != NULL) - *p++ = '\0'; - pvt->proto.p_proto = atoi(cp); - q = pvt->proto.p_aliases = pvt->proto_aliases; - if (p != NULL) { - cp = p; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &pvt->proto_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - } - *q = NULL; - pvt->dbuf = dbuf; - return (&pvt->proto); -} - -static void -pr_minimize(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->fp != NULL) { - (void)fclose(pvt->fp); - pvt->fp = NULL; - } -} - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/lcl_pw.c b/contrib/bind9/lib/bind/irs/lcl_pw.c deleted file mode 100644 index 316057b..0000000 --- a/contrib/bind9/lib/bind/irs/lcl_pw.c +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (c) 1989, 1993, 1995 - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: lcl_pw.c,v 1.2.18.1 2005/04/27 05:01:03 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Extern */ - -#include "port_before.h" - -#ifndef WANT_IRS_PW -static int __bind_irs_pw_unneeded; -#else - -#include <sys/param.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <db.h> -#include <errno.h> -#include <fcntl.h> -#include <limits.h> -#include <pwd.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> -#include <utmp.h> -#include <unistd.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "lcl_p.h" - -/*! \file - * \brief - * The lookup techniques and data extraction code here must be kept - * in sync with that in `pwd_mkdb'. - */ - - -/* Types */ - -struct pvt { - struct passwd passwd; /*%< password structure */ - DB *pw_db; /*%< password database */ - int pw_keynum; /*%< key counter */ - int warned; - u_int max; - char * line; -}; - -/* Forward */ - -static void pw_close(struct irs_pw *); -static struct passwd * pw_next(struct irs_pw *); -static struct passwd * pw_byname(struct irs_pw *, const char *); -static struct passwd * pw_byuid(struct irs_pw *, uid_t); -static void pw_rewind(struct irs_pw *); -static void pw_minimize(struct irs_pw *); - -static int initdb(struct pvt *); -static int hashpw(struct irs_pw *, DBT *); - -/* Public */ -struct irs_pw * -irs_lcl_pw(struct irs_acc *this) { - struct irs_pw *pw; - struct pvt *pvt; - - UNUSED(this); - - if (!(pw = memget(sizeof *pw))) { - errno = ENOMEM; - return (NULL); - } - memset(pw, 0x5e, sizeof *pw); - if (!(pvt = memget(sizeof *pvt))) { - free(pw); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pw->private = pvt; - pw->close = pw_close; - pw->next = pw_next; - pw->byname = pw_byname; - pw->byuid = pw_byuid; - pw->rewind = pw_rewind; - pw->minimize = pw_minimize; - pw->res_get = NULL; - pw->res_set = NULL; - return (pw); -} - -/* Methods */ - -static void -pw_close(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->pw_db) { - (void)(pvt->pw_db->close)(pvt->pw_db); - pvt->pw_db = NULL; - } - if (pvt->line) - memput(pvt->line, pvt->max); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct passwd * -pw_next(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - DBT key; - char bf[sizeof(pvt->pw_keynum) + 1]; - - if (!initdb(pvt)) - return (NULL); - - ++pvt->pw_keynum; - bf[0] = _PW_KEYBYNUM; - memcpy(bf + 1, (char *)&pvt->pw_keynum, sizeof(pvt->pw_keynum)); - key.data = (u_char *)bf; - key.size = sizeof(pvt->pw_keynum) + 1; - return (hashpw(this, &key) ? &pvt->passwd : NULL); -} - -static struct passwd * -pw_byname(struct irs_pw *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - DBT key; - int len, rval; - char bf[UT_NAMESIZE + 1]; - - if (!initdb(pvt)) - return (NULL); - - bf[0] = _PW_KEYBYNAME; - len = strlen(name); - memcpy(bf + 1, name, MIN(len, UT_NAMESIZE)); - key.data = (u_char *)bf; - key.size = len + 1; - rval = hashpw(this, &key); - - return (rval ? &pvt->passwd : NULL); -} - - -static struct passwd * -pw_byuid(struct irs_pw *this, uid_t uid) { - struct pvt *pvt = (struct pvt *)this->private; - DBT key; - int keyuid, rval; - char bf[sizeof(keyuid) + 1]; - - if (!initdb(pvt)) - return (NULL); - - bf[0] = _PW_KEYBYUID; - keyuid = uid; - memcpy(bf + 1, &keyuid, sizeof(keyuid)); - key.data = (u_char *)bf; - key.size = sizeof(keyuid) + 1; - rval = hashpw(this, &key); - - return (rval ? &pvt->passwd : NULL); -} - -static void -pw_rewind(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pvt->pw_keynum = 0; -} - -static void -pw_minimize(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->pw_db != NULL) { - (void) (*pvt->pw_db->close)(pvt->pw_db); - pvt->pw_db = NULL; - } -} - -/* Private. */ - -static int -initdb(struct pvt *pvt) { - const char *p; - - if (pvt->pw_db) { - if (lseek((*pvt->pw_db->fd)(pvt->pw_db), 0L, SEEK_CUR) >= 0L) - return (1); - else - (void) (*pvt->pw_db->close)(pvt->pw_db); - } - pvt->pw_db = dbopen((p = _PATH_SMP_DB), O_RDONLY, 0, DB_HASH, NULL); - if (!pvt->pw_db) - pvt->pw_db = dbopen((p =_PATH_MP_DB), O_RDONLY, - 0, DB_HASH, NULL); - if (pvt->pw_db) - return (1); - if (!pvt->warned) { - syslog(LOG_ERR, "%s: %m", p); - pvt->warned++; - } - return (0); -} - -static int -hashpw(struct irs_pw *this, DBT *key) { - struct pvt *pvt = (struct pvt *)this->private; - char *p, *t, *l; - DBT data; - - if ((pvt->pw_db->get)(pvt->pw_db, key, &data, 0)) - return (0); - p = (char *)data.data; - if (data.size > pvt->max) { - size_t newlen = pvt->max + 1024; - char *p = memget(newlen); - if (p == NULL) { - return (0); - } - if (pvt->line != NULL) { - memcpy(p, pvt->line, pvt->max); - memput(pvt->line, pvt->max); - } - pvt->max = newlen; - pvt->line = p; - } - - /* THIS CODE MUST MATCH THAT IN pwd_mkdb. */ - t = pvt->line; - l = pvt->line + pvt->max; -#define EXPAND(e) if ((e = t) == NULL) return (0); else \ - do if (t >= l) return (0); while ((*t++ = *p++) != '\0') -#define SCALAR(v) if (t + sizeof v >= l) return (0); else \ - (memmove(&(v), p, sizeof v), p += sizeof v) - EXPAND(pvt->passwd.pw_name); - EXPAND(pvt->passwd.pw_passwd); - SCALAR(pvt->passwd.pw_uid); - SCALAR(pvt->passwd.pw_gid); - SCALAR(pvt->passwd.pw_change); - EXPAND(pvt->passwd.pw_class); - EXPAND(pvt->passwd.pw_gecos); - EXPAND(pvt->passwd.pw_dir); - EXPAND(pvt->passwd.pw_shell); - SCALAR(pvt->passwd.pw_expire); - return (1); -} - -#endif /* WANT_IRS_PW */ diff --git a/contrib/bind9/lib/bind/irs/lcl_sv.c b/contrib/bind9/lib/bind/irs/lcl_sv.c deleted file mode 100644 index 7675834..0000000 --- a/contrib/bind9/lib/bind/irs/lcl_sv.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright (c) 1989, 1993, 1995 - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: lcl_sv.c,v 1.3.18.1 2005/04/27 05:01:03 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* extern */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#ifdef IRS_LCL_SV_DB -#include <db.h> -#endif -#include <errno.h> -#include <fcntl.h> -#include <limits.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <irs.h> -#include <isc/memcluster.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "lcl_p.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -/* Types */ - -struct pvt { -#ifdef IRS_LCL_SV_DB - DB * dbh; - int dbf; -#endif - struct lcl_sv sv; -}; - -/* Forward */ - -static void sv_close(struct irs_sv*); -static struct servent * sv_next(struct irs_sv *); -static struct servent * sv_byname(struct irs_sv *, const char *, - const char *); -static struct servent * sv_byport(struct irs_sv *, int, const char *); -static void sv_rewind(struct irs_sv *); -static void sv_minimize(struct irs_sv *); -/*global*/ struct servent * irs_lclsv_fnxt(struct lcl_sv *); -#ifdef IRS_LCL_SV_DB -static struct servent * sv_db_rec(struct lcl_sv *, DBT *, DBT *); -#endif - -/* Portability */ - -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif - -/* Public */ - -struct irs_sv * -irs_lcl_sv(struct irs_acc *this) { - struct irs_sv *sv; - struct pvt *pvt; - - UNUSED(this); - - if ((sv = memget(sizeof *sv)) == NULL) { - errno = ENOMEM; - return (NULL); - } - memset(sv, 0x5e, sizeof *sv); - if ((pvt = memget(sizeof *pvt)) == NULL) { - memput(sv, sizeof *sv); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - sv->private = pvt; - sv->close = sv_close; - sv->next = sv_next; - sv->byname = sv_byname; - sv->byport = sv_byport; - sv->rewind = sv_rewind; - sv->minimize = sv_minimize; - sv->res_get = NULL; - sv->res_set = NULL; -#ifdef IRS_LCL_SV_DB - pvt->dbf = R_FIRST; -#endif - return (sv); -} - -/* Methods */ - -static void -sv_close(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - -#ifdef IRS_LCL_SV_DB - if (pvt->dbh != NULL) - (*pvt->dbh->close)(pvt->dbh); -#endif - if (pvt->sv.fp) - fclose(pvt->sv.fp); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct servent * -sv_byname(struct irs_sv *this, const char *name, const char *proto) { -#ifdef IRS_LCL_SV_DB - struct pvt *pvt = (struct pvt *)this->private; -#endif - struct servent *p; - char **cp; - - sv_rewind(this); -#ifdef IRS_LCL_SV_DB - if (pvt->dbh != NULL) { - DBT key, data; - - /* Note that (sizeof "/") == 2. */ - if ((strlen(name) + sizeof "/" + proto ? strlen(proto) : 0) - > sizeof pvt->sv.line) - goto try_local; - key.data = pvt->sv.line; - key.size = SPRINTF((pvt->sv.line, "%s/%s", name, - proto ? proto : "")) + 1; - if (proto != NULL) { - if ((*pvt->dbh->get)(pvt->dbh, &key, &data, 0) != 0) - return (NULL); - } else if ((*pvt->dbh->seq)(pvt->dbh, &key, &data, R_CURSOR) - != 0) - return (NULL); - return (sv_db_rec(&pvt->sv, &key, &data)); - } - try_local: -#endif - - while ((p = sv_next(this))) { - if (strcmp(name, p->s_name) == 0) - goto gotname; - for (cp = p->s_aliases; *cp; cp++) - if (strcmp(name, *cp) == 0) - goto gotname; - continue; - gotname: - if (proto == NULL || strcmp(p->s_proto, proto) == 0) - break; - } - return (p); -} - -static struct servent * -sv_byport(struct irs_sv *this, int port, const char *proto) { -#ifdef IRS_LCL_SV_DB - struct pvt *pvt = (struct pvt *)this->private; -#endif - struct servent *p; - - sv_rewind(this); -#ifdef IRS_LCL_SV_DB - if (pvt->dbh != NULL) { - DBT key, data; - u_short *ports; - - ports = (u_short *)pvt->sv.line; - ports[0] = 0; - ports[1] = port; - key.data = ports; - key.size = sizeof(u_short) * 2; - if (proto && *proto) { - strncpy((char *)ports + key.size, proto, - BUFSIZ - key.size); - key.size += strlen((char *)ports + key.size) + 1; - if ((*pvt->dbh->get)(pvt->dbh, &key, &data, 0) != 0) - return (NULL); - } else { - if ((*pvt->dbh->seq)(pvt->dbh, &key, &data, R_CURSOR) - != 0) - return (NULL); - } - return (sv_db_rec(&pvt->sv, &key, &data)); - } -#endif - while ((p = sv_next(this))) { - if (p->s_port != port) - continue; - if (proto == NULL || strcmp(p->s_proto, proto) == 0) - break; - } - return (p); -} - -static void -sv_rewind(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->sv.fp) { - if (fseek(pvt->sv.fp, 0L, SEEK_SET) == 0) - return; - (void)fclose(pvt->sv.fp); - pvt->sv.fp = NULL; - } -#ifdef IRS_LCL_SV_DB - pvt->dbf = R_FIRST; - if (pvt->dbh != NULL) - return; - pvt->dbh = dbopen(_PATH_SERVICES_DB, O_RDONLY,O_RDONLY,DB_BTREE, NULL); - if (pvt->dbh != NULL) { - if (fcntl((*pvt->dbh->fd)(pvt->dbh), F_SETFD, 1) < 0) { - (*pvt->dbh->close)(pvt->dbh); - pvt->dbh = NULL; - } - return; - } -#endif - if ((pvt->sv.fp = fopen(_PATH_SERVICES, "r")) == NULL) - return; - if (fcntl(fileno(pvt->sv.fp), F_SETFD, 1) < 0) { - (void)fclose(pvt->sv.fp); - pvt->sv.fp = NULL; - } -} - -static struct servent * -sv_next(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - -#ifdef IRS_LCL_SV_DB - if (pvt->dbh == NULL && pvt->sv.fp == NULL) -#else - if (pvt->sv.fp == NULL) -#endif - sv_rewind(this); - -#ifdef IRS_LCL_SV_DB - if (pvt->dbh != NULL) { - DBT key, data; - - while ((*pvt->dbh->seq)(pvt->dbh, &key, &data, pvt->dbf) == 0){ - pvt->dbf = R_NEXT; - if (((char *)key.data)[0]) - continue; - return (sv_db_rec(&pvt->sv, &key, &data)); - } - } -#endif - - if (pvt->sv.fp == NULL) - return (NULL); - return (irs_lclsv_fnxt(&pvt->sv)); -} - -static void -sv_minimize(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - -#ifdef IRS_LCL_SV_DB - if (pvt->dbh != NULL) { - (*pvt->dbh->close)(pvt->dbh); - pvt->dbh = NULL; - } -#endif - if (pvt->sv.fp != NULL) { - (void)fclose(pvt->sv.fp); - pvt->sv.fp = NULL; - } -} - -/* Quasipublic. */ - -struct servent * -irs_lclsv_fnxt(struct lcl_sv *sv) { - char *p, *cp, **q; - - again: - if ((p = fgets(sv->line, BUFSIZ, sv->fp)) == NULL) - return (NULL); - if (*p == '#') - goto again; - sv->serv.s_name = p; - while (*p && *p != '\n' && *p != ' ' && *p != '\t' && *p != '#') - ++p; - if (*p == '\0' || *p == '#' || *p == '\n') - goto again; - *p++ = '\0'; - while (*p == ' ' || *p == '\t') - p++; - if (*p == '\0' || *p == '#' || *p == '\n') - goto again; - sv->serv.s_port = htons((u_short)strtol(p, &cp, 10)); - if (cp == p || (*cp != '/' && *cp != ',')) - goto again; - p = cp + 1; - sv->serv.s_proto = p; - - q = sv->serv.s_aliases = sv->serv_aliases; - - while (*p && *p != '\n' && *p != ' ' && *p != '\t' && *p != '#') - ++p; - - while (*p == ' ' || *p == '\t') { - *p++ = '\0'; - while (*p == ' ' || *p == '\t') - ++p; - if (*p == '\0' || *p == '#' || *p == '\n') - break; - if (q < &sv->serv_aliases[IRS_SV_MAXALIASES - 1]) - *q++ = p; - while (*p && *p != '\n' && *p != ' ' && *p != '\t' && *p != '#') - ++p; - } - - *p = '\0'; - *q = NULL; - return (&sv->serv); -} - -/* Private. */ - -#ifdef IRS_LCL_SV_DB -static struct servent * -sv_db_rec(struct lcl_sv *sv, DBT *key, DBT *data) { - char *p, **q; - int n; - - p = data->data; - p[data->size - 1] = '\0'; /*%< should be, but we depend on it */ - if (((char *)key->data)[0] == '\0') { - if (key->size < sizeof(u_short)*2 || data->size < 2) - return (NULL); - sv->serv.s_port = ((u_short *)key->data)[1]; - n = strlen(p) + 1; - if ((size_t)n > sizeof(sv->line)) { - n = sizeof(sv->line); - } - memcpy(sv->line, p, n); - sv->serv.s_name = sv->line; - if ((sv->serv.s_proto = strchr(sv->line, '/')) != NULL) - *(sv->serv.s_proto)++ = '\0'; - p += n; - data->size -= n; - } else { - if (data->size < sizeof(u_short) + 1) - return (NULL); - if (key->size > sizeof(sv->line)) - key->size = sizeof(sv->line); - ((char *)key->data)[key->size - 1] = '\0'; - memcpy(sv->line, key->data, key->size); - sv->serv.s_name = sv->line; - if ((sv->serv.s_proto = strchr(sv->line, '/')) != NULL) - *(sv->serv.s_proto)++ = '\0'; - sv->serv.s_port = *(u_short *)data->data; - p += sizeof(u_short); - data->size -= sizeof(u_short); - } - q = sv->serv.s_aliases = sv->serv_aliases; - while (data->size > 0 && q < &sv->serv_aliases[IRS_SV_MAXALIASES - 1]) { - - *q++ = p; - n = strlen(p) + 1; - data->size -= n; - p += n; - } - *q = NULL; - return (&sv->serv); -} -#endif - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nis.c b/contrib/bind9/lib/bind/irs/nis.c deleted file mode 100644 index 62cc267..0000000 --- a/contrib/bind9/lib/bind/irs/nis.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nis.c,v 1.2.18.1 2005/04/27 05:01:03 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#ifdef WANT_IRS_NIS - -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <rpcsvc/yp_prot.h> -#include <rpcsvc/ypclnt.h> - -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -#include <sys/types.h> -#include <netinet/in.h> -#ifdef T_NULL -#undef T_NULL /* Silence re-definition warning of T_NULL. */ -#endif -#include <arpa/nameser.h> -#include <resolv.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "hesiod.h" -#include "nis_p.h" - -/* Forward */ - -static void nis_close(struct irs_acc *); -static struct __res_state * nis_res_get(struct irs_acc *); -static void nis_res_set(struct irs_acc *, struct __res_state *, - void (*)(void *)); - -/* Public */ - -struct irs_acc * -irs_nis_acc(const char *options) { - struct nis_p *nis; - struct irs_acc *acc; - char *domain; - - UNUSED(options); - - if (yp_get_default_domain(&domain) != 0) - return (NULL); - if (!(nis = memget(sizeof *nis))) { - errno = ENOMEM; - return (NULL); - } - memset(nis, 0, sizeof *nis); - if (!(acc = memget(sizeof *acc))) { - memput(nis, sizeof *nis); - errno = ENOMEM; - return (NULL); - } - memset(acc, 0x5e, sizeof *acc); - acc->private = nis; - nis->domain = strdup(domain); -#ifdef WANT_IRS_GR - acc->gr_map = irs_nis_gr; -#else - acc->gr_map = NULL; -#endif -#ifdef WANT_IRS_PW - acc->pw_map = irs_nis_pw; -#else - acc->pw_map = NULL; -#endif - acc->sv_map = irs_nis_sv; - acc->pr_map = irs_nis_pr; - acc->ho_map = irs_nis_ho; - acc->nw_map = irs_nis_nw; - acc->ng_map = irs_nis_ng; - acc->res_get = nis_res_get; - acc->res_set = nis_res_set; - acc->close = nis_close; - return (acc); -} - -/* Methods */ - -static struct __res_state * -nis_res_get(struct irs_acc *this) { - struct nis_p *nis = (struct nis_p *)this->private; - - if (nis->res == NULL) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (res == NULL) - return (NULL); - memset(res, 0, sizeof *res); - nis_res_set(this, res, free); - } - - if ((nis->res->options & RES_INIT) == 0 && - res_ninit(nis->res) < 0) - return (NULL); - - return (nis->res); -} - -static void -nis_res_set(struct irs_acc *this, struct __res_state *res, - void (*free_res)(void *)) { - struct nis_p *nis = (struct nis_p *)this->private; - - if (nis->res && nis->free_res) { - res_nclose(nis->res); - (*nis->free_res)(nis->res); - } - - nis->res = res; - nis->free_res = free_res; -} - -static void -nis_close(struct irs_acc *this) { - struct nis_p *nis = (struct nis_p *)this->private; - - if (nis->res && nis->free_res) - (*nis->free_res)(nis->res); - free(nis->domain); - memput(nis, sizeof *nis); - memput(this, sizeof *this); -} - -#endif /*WANT_IRS_NIS*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nis_gr.c b/contrib/bind9/lib/bind/irs/nis_gr.c deleted file mode 100644 index 9d4f15d..0000000 --- a/contrib/bind9/lib/bind/irs/nis_gr.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (c) 1989, 1993, 1995 - * 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. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996-1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nis_gr.c,v 1.3.18.1 2005/04/27 05:01:03 sra Exp $"; -/* from getgrent.c 8.2 (Berkeley) 3/21/94"; */ -/* from BSDI Id: getgrent.c,v 2.8 1996/05/28 18:15:14 bostic Exp $ */ -#endif /* LIBC_SCCS and not lint */ - -/* Imports */ - -#include "port_before.h" - -#if !defined(WANT_IRS_GR) || !defined(WANT_IRS_NIS) -static int __bind_irs_gr_unneeded; -#else - -#include <sys/param.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> -#include <isc/memcluster.h> - -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <rpcsvc/yp_prot.h> -#include <rpcsvc/ypclnt.h> - -#include <errno.h> -#include <grp.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <isc/memcluster.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "nis_p.h" - -/* Definitions */ - -struct pvt { - int needrewind; - char * nis_domain; - char * curkey_data; - int curkey_len; - char * curval_data; - int curval_len; - /*%< - * Need space to store the entries read from the group file. - * The members list also needs space per member, and the - * strings making up the user names must be allocated - * somewhere. Rather than doing lots of small allocations, - * we keep one buffer and resize it as needed. - */ - struct group group; - size_t nmemb; /*%< Malloc'd max index of gr_mem[]. */ - char * membuf; - size_t membufsize; -}; - -enum do_what { do_none = 0x0, do_key = 0x1, do_val = 0x2, do_all = 0x3 }; - -static /*const*/ char group_bygid[] = "group.bygid"; -static /*const*/ char group_byname[] = "group.byname"; - -/* Forward */ - -static void gr_close(struct irs_gr *); -static struct group * gr_next(struct irs_gr *); -static struct group * gr_byname(struct irs_gr *, const char *); -static struct group * gr_bygid(struct irs_gr *, gid_t); -static void gr_rewind(struct irs_gr *); -static void gr_minimize(struct irs_gr *); - -static struct group * makegroupent(struct irs_gr *); -static void nisfree(struct pvt *, enum do_what); - -/* Public */ - -struct irs_gr * -irs_nis_gr(struct irs_acc *this) { - struct irs_gr *gr; - struct pvt *pvt; - - if (!(gr = memget(sizeof *gr))) { - errno = ENOMEM; - return (NULL); - } - memset(gr, 0x5e, sizeof *gr); - if (!(pvt = memget(sizeof *pvt))) { - memput(gr, sizeof *gr); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->needrewind = 1; - pvt->nis_domain = ((struct nis_p *)this->private)->domain; - gr->private = pvt; - gr->close = gr_close; - gr->next = gr_next; - gr->byname = gr_byname; - gr->bygid = gr_bygid; - gr->rewind = gr_rewind; - gr->list = make_group_list; - gr->minimize = gr_minimize; - gr->res_get = NULL; - gr->res_set = NULL; - return (gr); -} - -/* Methods */ - -static void -gr_close(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->group.gr_mem) - free(pvt->group.gr_mem); - if (pvt->membuf) - free(pvt->membuf); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct group * -gr_next(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct group *rval; - int r; - - do { - if (pvt->needrewind) { - nisfree(pvt, do_all); - r = yp_first(pvt->nis_domain, group_byname, - &pvt->curkey_data, &pvt->curkey_len, - &pvt->curval_data, &pvt->curval_len); - pvt->needrewind = 0; - } else { - char *newkey_data; - int newkey_len; - - nisfree(pvt, do_val); - r = yp_next(pvt->nis_domain, group_byname, - pvt->curkey_data, pvt->curkey_len, - &newkey_data, &newkey_len, - &pvt->curval_data, &pvt->curval_len); - nisfree(pvt, do_key); - pvt->curkey_data = newkey_data; - pvt->curkey_len = newkey_len; - } - if (r != 0) { - errno = ENOENT; - return (NULL); - } - rval = makegroupent(this); - } while (rval == NULL); - return (rval); -} - -static struct group * -gr_byname(struct irs_gr *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - int r; - - nisfree(pvt, do_val); - r = yp_match(pvt->nis_domain, group_byname, name, strlen(name), - &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - errno = ENOENT; - return (NULL); - } - return (makegroupent(this)); -} - -static struct group * -gr_bygid(struct irs_gr *this, gid_t gid) { - struct pvt *pvt = (struct pvt *)this->private; - char tmp[sizeof "4294967295"]; - int r; - - nisfree(pvt, do_val); - (void) sprintf(tmp, "%u", (unsigned int)gid); - r = yp_match(pvt->nis_domain, group_bygid, tmp, strlen(tmp), - &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - errno = ENOENT; - return (NULL); - } - return (makegroupent(this)); -} - -static void -gr_rewind(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pvt->needrewind = 1; -} - -static void -gr_minimize(struct irs_gr *this) { - UNUSED(this); - /* NOOP */ -} - -/* Private */ - -static struct group * -makegroupent(struct irs_gr *this) { - struct pvt *pvt = (struct pvt *)this->private; - unsigned int num_members = 0; - char *cp, **new; - u_long t; - - if (pvt->group.gr_mem) { - free(pvt->group.gr_mem); - pvt->group.gr_mem = NULL; - pvt->nmemb = 0; - } - if (pvt->membuf) - free(pvt->membuf); - pvt->membuf = pvt->curval_data; - pvt->curval_data = NULL; - - cp = pvt->membuf; - pvt->group.gr_name = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->group.gr_passwd = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - errno = 0; - t = strtoul(cp, NULL, 10); - if (errno == ERANGE) - goto cleanup; - pvt->group.gr_gid = (gid_t) t; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - cp++; - - if (*cp && cp[strlen(cp)-1] == '\n') - cp[strlen(cp)-1] = '\0'; - - /* - * Parse the members out. - */ - while (*cp) { - if (num_members+1 >= pvt->nmemb || pvt->group.gr_mem == NULL) { - pvt->nmemb += 10; - new = realloc(pvt->group.gr_mem, - pvt->nmemb * sizeof(char *)); - if (new == NULL) - goto cleanup; - pvt->group.gr_mem = new; - } - pvt->group.gr_mem[num_members++] = cp; - if (!(cp = strchr(cp, ','))) - break; - *cp++ = '\0'; - } - if (pvt->group.gr_mem == NULL) { - pvt->group.gr_mem = malloc(sizeof(char*)); - if (!pvt->group.gr_mem) - goto cleanup; - pvt->nmemb = 1; - } - pvt->group.gr_mem[num_members] = NULL; - - return (&pvt->group); - - cleanup: - if (pvt->group.gr_mem) { - free(pvt->group.gr_mem); - pvt->group.gr_mem = NULL; - pvt->nmemb = 0; - } - if (pvt->membuf) { - free(pvt->membuf); - pvt->membuf = NULL; - } - return (NULL); -} - -static void -nisfree(struct pvt *pvt, enum do_what do_what) { - if ((do_what & do_key) && pvt->curkey_data) { - free(pvt->curkey_data); - pvt->curkey_data = NULL; - } - if ((do_what & do_val) && pvt->curval_data) { - free(pvt->curval_data); - pvt->curval_data = NULL; - } -} - -#endif /* WANT_IRS_GR && WANT_IRS_NIS */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nis_ho.c b/contrib/bind9/lib/bind/irs/nis_ho.c deleted file mode 100644 index 7524279..0000000 --- a/contrib/bind9/lib/bind/irs/nis_ho.c +++ /dev/null @@ -1,535 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nis_ho.c,v 1.4.18.1 2005/04/27 05:01:03 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports */ - -#include "port_before.h" - -#ifndef WANT_IRS_NIS -static int __bind_irs_nis_unneeded; -#else - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#ifdef T_NULL -#undef T_NULL /* Silence re-definition warning of T_NULL. */ -#endif -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <rpcsvc/yp_prot.h> -#include <rpcsvc/ypclnt.h> - -#include <ctype.h> -#include <errno.h> -#include <stdlib.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "nis_p.h" - -/* Definitions */ - -#define MAXALIASES 35 -#define MAXADDRS 35 - -#if PACKETSZ > 1024 -#define MAXPACKET PACKETSZ -#else -#define MAXPACKET 1024 -#endif - -struct pvt { - int needrewind; - char * nis_domain; - char * curkey_data; - int curkey_len; - char * curval_data; - int curval_len; - struct hostent host; - char * h_addr_ptrs[MAXADDRS + 1]; - char * host_aliases[MAXALIASES + 1]; - char hostbuf[8*1024]; - u_char host_addr[16]; /*%< IPv4 or IPv6 */ - struct __res_state *res; - void (*free_res)(void *); -}; - -enum do_what { do_none = 0x0, do_key = 0x1, do_val = 0x2, do_all = 0x3 }; - -static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; -static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; -static /*const*/ char hosts_byname[] = "hosts.byname"; -static /*const*/ char hosts_byaddr[] = "hosts.byaddr"; -static /*const*/ char ipnode_byname[] = "ipnode.byname"; -static /*const*/ char ipnode_byaddr[] = "ipnode.byaddr"; -static /*const*/ char yp_multi[] = "YP_MULTI_"; - -/* Forwards */ - -static void ho_close(struct irs_ho *this); -static struct hostent * ho_byname(struct irs_ho *this, const char *name); -static struct hostent * ho_byname2(struct irs_ho *this, const char *name, - int af); -static struct hostent * ho_byaddr(struct irs_ho *this, const void *addr, - int len, int af); -static struct hostent * ho_next(struct irs_ho *this); -static void ho_rewind(struct irs_ho *this); -static void ho_minimize(struct irs_ho *this); -static struct __res_state * ho_res_get(struct irs_ho *this); -static void ho_res_set(struct irs_ho *this, - struct __res_state *res, - void (*free_res)(void *)); -static struct addrinfo * ho_addrinfo(struct irs_ho *this, const char *name, - const struct addrinfo *pai); - -static struct hostent * makehostent(struct irs_ho *this); -static void nisfree(struct pvt *, enum do_what); -static int init(struct irs_ho *this); - -/* Public */ - -struct irs_ho * -irs_nis_ho(struct irs_acc *this) { - struct irs_ho *ho; - struct pvt *pvt; - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - if (!(ho = memget(sizeof *ho))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(ho, 0x5e, sizeof *ho); - pvt->needrewind = 1; - pvt->nis_domain = ((struct nis_p *)this->private)->domain; - ho->private = pvt; - ho->close = ho_close; - ho->byname = ho_byname; - ho->byname2 = ho_byname2; - ho->byaddr = ho_byaddr; - ho->next = ho_next; - ho->rewind = ho_rewind; - ho->minimize = ho_minimize; - ho->res_set = ho_res_set; - ho->res_get = ho_res_get; - ho->addrinfo = ho_addrinfo; - return (ho); -} - -/* Methods */ - -static void -ho_close(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - ho_minimize(this); - nisfree(pvt, do_all); - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct hostent * -ho_byname(struct irs_ho *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *hp; - - if (init(this) == -1) - return (NULL); - - if (pvt->res->options & RES_USE_INET6) { - hp = ho_byname2(this, name, AF_INET6); - if (hp) - return (hp); - } - return (ho_byname2(this, name, AF_INET)); -} - -static struct hostent * -ho_byname2(struct irs_ho *this, const char *name, int af) { - struct pvt *pvt = (struct pvt *)this->private; - int r; - char *tmp; - - UNUSED(af); - - if (init(this) == -1) - return (NULL); - - nisfree(pvt, do_val); - - strcpy(pvt->hostbuf, yp_multi); - strncat(pvt->hostbuf, name, sizeof(pvt->hostbuf) - sizeof(yp_multi)); - pvt->hostbuf[sizeof(pvt->hostbuf) - 1] = '\0'; - for (r = sizeof(yp_multi) - 1; pvt->hostbuf[r] != '\0'; r++) - if (isupper((unsigned char)pvt->hostbuf[r])) - tolower(pvt->hostbuf[r]); - - tmp = pvt->hostbuf; - r = yp_match(pvt->nis_domain, ipnode_byname, tmp, - strlen(tmp), &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - tmp = pvt->hostbuf + sizeof(yp_multi) - 1; - r = yp_match(pvt->nis_domain, ipnode_byname, tmp, - strlen(tmp), &pvt->curval_data, &pvt->curval_len); - } - if (r != 0) { - tmp = pvt->hostbuf; - r = yp_match(pvt->nis_domain, hosts_byname, tmp, - strlen(tmp), &pvt->curval_data, &pvt->curval_len); - } - if (r != 0) { - tmp = pvt->hostbuf + sizeof(yp_multi) - 1; - r = yp_match(pvt->nis_domain, hosts_byname, tmp, - strlen(tmp), &pvt->curval_data, &pvt->curval_len); - } - if (r != 0) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - return (NULL); - } - return (makehostent(this)); -} - -static struct hostent * -ho_byaddr(struct irs_ho *this, const void *addr, int len, int af) { - struct pvt *pvt = (struct pvt *)this->private; - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"]; - const u_char *uaddr = addr; - int r; - - if (init(this) == -1) - return (NULL); - - if (af == AF_INET6 && len == IN6ADDRSZ && - (!memcmp(uaddr, mapped, sizeof mapped) || - !memcmp(uaddr, tunnelled, sizeof tunnelled))) { - /* Unmap. */ - addr = (const u_char *)addr + sizeof mapped; - uaddr += sizeof mapped; - af = AF_INET; - len = INADDRSZ; - } - if (inet_ntop(af, uaddr, tmp, sizeof tmp) == NULL) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - nisfree(pvt, do_val); - r = yp_match(pvt->nis_domain, ipnode_byaddr, tmp, strlen(tmp), - &pvt->curval_data, &pvt->curval_len); - if (r != 0) - r = yp_match(pvt->nis_domain, hosts_byaddr, tmp, strlen(tmp), - &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - return (NULL); - } - return (makehostent(this)); -} - -static struct hostent * -ho_next(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *rval; - int r; - - if (init(this) == -1) - return (NULL); - - do { - if (pvt->needrewind) { - nisfree(pvt, do_all); - r = yp_first(pvt->nis_domain, hosts_byaddr, - &pvt->curkey_data, &pvt->curkey_len, - &pvt->curval_data, &pvt->curval_len); - pvt->needrewind = 0; - } else { - char *newkey_data; - int newkey_len; - - nisfree(pvt, do_val); - r = yp_next(pvt->nis_domain, hosts_byaddr, - pvt->curkey_data, pvt->curkey_len, - &newkey_data, &newkey_len, - &pvt->curval_data, &pvt->curval_len); - nisfree(pvt, do_key); - pvt->curkey_data = newkey_data; - pvt->curkey_len = newkey_len; - } - if (r != 0) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - return (NULL); - } - rval = makehostent(this); - } while (rval == NULL); - return (rval); -} - -static void -ho_rewind(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pvt->needrewind = 1; -} - -static void -ho_minimize(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res) - res_nclose(pvt->res); -} - -static struct __res_state * -ho_res_get(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - ho_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -ho_res_set(struct irs_ho *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; -} - -struct nis_res_target { - struct nis_res_target *next; - int family; -}; - -/* XXX */ -extern struct addrinfo *hostent2addrinfo __P((struct hostent *, - const struct addrinfo *pai)); - -static struct addrinfo * -ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai) -{ - struct pvt *pvt = (struct pvt *)this->private; - struct hostent *hp; - struct nis_res_target q, q2, *p; - struct addrinfo sentinel, *cur; - - memset(&q, 0, sizeof(q2)); - memset(&q2, 0, sizeof(q2)); - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - - switch(pai->ai_family) { - case AF_UNSPEC: /*%< INET6 then INET4 */ - q.family = AF_INET6; - q.next = &q2; - q2.family = AF_INET; - break; - case AF_INET6: - q.family = AF_INET6; - break; - case AF_INET: - q.family = AF_INET; - break; - default: - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); /*%< ??? */ - return(NULL); - } - - for (p = &q; p; p = p->next) { - struct addrinfo *ai; - - hp = (*this->byname2)(this, name, p->family); - if (hp == NULL) { - /* byname2 should've set an appropriate error */ - continue; - } - if ((hp->h_name == NULL) || (hp->h_name[0] == 0) || - (hp->h_addr_list[0] == NULL)) { - RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); - continue; - } - ai = hostent2addrinfo(hp, pai); - if (ai) { - cur->ai_next = ai; - while (cur && cur->ai_next) - cur = cur->ai_next; - } - } - - if (sentinel.ai_next == NULL) - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - - return(sentinel.ai_next); -} - -/* Private */ - -/*% -ipnodes: -::1 localhost -127.0.0.1 localhost -1.2.3.4 FOO bar -1.2.6.4 FOO bar -1.2.6.5 host - -ipnodes.byname: -YP_MULTI_localhost ::1,127.0.0.1 localhost -YP_MULTI_foo 1.2.3.4,1.2.6.4 FOO bar -YP_MULTI_bar 1.2.3.4,1.2.6.4 FOO bar -host 1.2.6.5 host - -hosts.byname: -localhost 127.0.0.1 localhost -host 1.2.6.5 host -YP_MULTI_foo 1.2.3.4,1.2.6.4 FOO bar -YP_MULTI_bar 1.2.3.4,1.2.6.4 FOO bar -*/ - -static struct hostent * -makehostent(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - static const char spaces[] = " \t"; - char *cp, **q, *p, *comma, *ap; - int af = 0, len = 0; - int multi = 0; - int addr = 0; - - p = pvt->curval_data; - if ((cp = strpbrk(p, "#\n")) != NULL) - *cp = '\0'; - if (!(cp = strpbrk(p, spaces))) - return (NULL); - *cp++ = '\0'; - ap = pvt->hostbuf; - do { - if ((comma = strchr(p, ',')) != NULL) { - *comma++ = '\0'; - multi = 1; - } - if ((ap + IN6ADDRSZ) > (pvt->hostbuf + sizeof(pvt->hostbuf))) - break; - if ((pvt->res->options & RES_USE_INET6) && - inet_pton(AF_INET6, p, ap) > 0) { - af = AF_INET6; - len = IN6ADDRSZ; - } else if (inet_pton(AF_INET, p, pvt->host_addr) > 0) { - if (pvt->res->options & RES_USE_INET6) { - map_v4v6_address((char*)pvt->host_addr, ap); - af = AF_INET6; - len = IN6ADDRSZ; - } else { - af = AF_INET; - len = INADDRSZ; - } - } else { - if (!multi) - return (NULL); - continue; - } - if (addr < MAXADDRS) { - pvt->h_addr_ptrs[addr++] = ap; - pvt->h_addr_ptrs[addr] = NULL; - ap += len; - } - } while ((p = comma) != NULL); - if (ap == pvt->hostbuf) - return (NULL); - pvt->host.h_addr_list = pvt->h_addr_ptrs; - pvt->host.h_length = len; - pvt->host.h_addrtype = af; - cp += strspn(cp, spaces); - pvt->host.h_name = cp; - q = pvt->host.h_aliases = pvt->host_aliases; - if ((cp = strpbrk(cp, spaces)) != NULL) - *cp++ = '\0'; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &pvt->host_aliases[MAXALIASES]) - *q++ = cp; - if ((cp = strpbrk(cp, spaces)) != NULL) - *cp++ = '\0'; - } - *q = NULL; - RES_SET_H_ERRNO(pvt->res, NETDB_SUCCESS); - return (&pvt->host); -} - -static void -nisfree(struct pvt *pvt, enum do_what do_what) { - if ((do_what & do_key) && pvt->curkey_data) { - free(pvt->curkey_data); - pvt->curkey_data = NULL; - } - if ((do_what & do_val) && pvt->curval_data) { - free(pvt->curval_data); - pvt->curval_data = NULL; - } -} - -static int -init(struct irs_ho *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res && !ho_res_get(this)) - return (-1); - if (((pvt->res->options & RES_INIT) == 0) && - res_ninit(pvt->res) == -1) - return (-1); - return (0); -} -#endif /*WANT_IRS_NIS*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nis_ng.c b/contrib/bind9/lib/bind/irs/nis_ng.c deleted file mode 100644 index f2298b2..0000000 --- a/contrib/bind9/lib/bind/irs/nis_ng.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nis_ng.c,v 1.3.18.1 2005/04/27 05:01:03 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#ifndef WANT_IRS_NIS -static int __bind_irs_nis_unneeded; -#else - -#include <sys/types.h> -#include <netinet/in.h> -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <rpcsvc/yp_prot.h> -#include <rpcsvc/ypclnt.h> - -#include <isc/assertions.h> -#include <ctype.h> -#include <errno.h> -#include <netdb.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <netinet/in.h> -#ifdef T_NULL -#undef T_NULL /* Silence re-definition warning of T_NULL. */ -#endif -#include <arpa/nameser.h> -#include <resolv.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "nis_p.h" - -/* Definitions */ - -struct tmpgrp { - const char * name; - const char * host; - const char * user; - const char * domain; - struct tmpgrp * next; -}; - -struct pvt { - char * nis_domain; - struct tmpgrp * tmp; - struct tmpgrp * cur; - char * tmpgroup; -}; - -enum do_what { do_none = 0x0, do_key = 0x1, do_val = 0x2, do_all = 0x3 }; - -static /*const*/ char netgroup_map[] = "netgroup"; - -/* Forward */ - -static void ng_close(struct irs_ng *); -static int ng_next(struct irs_ng *, const char **, - const char **, const char **); -static int ng_test(struct irs_ng *, - const char *, const char *, - const char *, const char *); -static void ng_rewind(struct irs_ng *, const char *); -static void ng_minimize(struct irs_ng *); - -static void add_group_to_list(struct pvt *, const char *, int); -static void add_tuple_to_list(struct pvt *, const char *, char *); -static void tmpfree(struct pvt *); - -/* Public */ - -struct irs_ng * -irs_nis_ng(struct irs_acc *this) { - struct irs_ng *ng; - struct pvt *pvt; - - if (!(ng = memget(sizeof *ng))) { - errno = ENOMEM; - return (NULL); - } - memset(ng, 0x5e, sizeof *ng); - if (!(pvt = memget(sizeof *pvt))) { - memput(ng, sizeof *ng); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->nis_domain = ((struct nis_p *)this->private)->domain; - ng->private = pvt; - ng->close = ng_close; - ng->next = ng_next; - ng->test = ng_test; - ng->rewind = ng_rewind; - ng->minimize = ng_minimize; - return (ng); -} - -/* Methods */ - -static void -ng_close(struct irs_ng *this) { - struct pvt *pvt = (struct pvt *)this->private; - - tmpfree(pvt); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static int -ng_next(struct irs_ng *this, const char **host, const char **user, const char **domain) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->cur) - return (0); - *host = pvt->cur->host; - *user = pvt->cur->user; - *domain = pvt->cur->domain; - pvt->cur = pvt->cur->next; - return (1); -} - -static int -ng_test(struct irs_ng *this, const char *name, - const char *host, const char *user, const char *domain) -{ - struct pvt *pvt = (struct pvt *)this->private; - struct tmpgrp *cur; - - tmpfree(pvt); - add_group_to_list(pvt, name, strlen(name)); - for (cur = pvt->tmp; cur; cur = cur->next) { - if ((!host || !cur->host || !strcmp(host, cur->host)) && - (!user || !cur->user || !strcmp(user, cur->user)) && - (!domain || !cur->domain || !strcmp(domain, cur->domain))) - break; - } - tmpfree(pvt); - return ((cur == NULL) ? 0 : 1); -} - -static void -ng_rewind(struct irs_ng *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - - /* Either hand back or free the existing list. */ - if (pvt->tmpgroup) { - if (pvt->tmp && !strcmp(pvt->tmpgroup, name)) - goto reset; - tmpfree(pvt); - } - pvt->tmpgroup = strdup(name); - add_group_to_list(pvt, name, strlen(name)); - reset: - pvt->cur = pvt->tmp; -} - -static void -ng_minimize(struct irs_ng *this) { - UNUSED(this); - /* NOOP */ -} - -/* Private */ - -static void -add_group_to_list(struct pvt *pvt, const char *name, int len) { - char *vdata, *cp, *np; - struct tmpgrp *tmp; - int vlen, r; - char *nametmp; - - /* Don't add the same group to the list more than once. */ - for (tmp = pvt->tmp; tmp; tmp = tmp->next) - if (!strcmp(tmp->name, name)) - return; - - DE_CONST(name, nametmp); - r = yp_match(pvt->nis_domain, netgroup_map, nametmp, len, - &vdata, &vlen); - if (r == 0) { - cp = vdata; - if (*cp && cp[strlen(cp)-1] == '\n') - cp[strlen(cp)-1] = '\0'; - for ( ; cp; cp = np) { - np = strchr(cp, ' '); - if (np) - *np++ = '\0'; - if (*cp == '(') - add_tuple_to_list(pvt, name, cp); - else - add_group_to_list(pvt, cp, strlen(cp)); - } - free(vdata); - } -} - -static void -add_tuple_to_list(struct pvt *pvt, const char *name, char *cp) { - struct tmpgrp *tmp; - char *tp, *np; - - INSIST(*cp++ == '('); - - tmp = malloc(sizeof *tmp + strlen(name) + sizeof '\0' + - strlen(cp) - sizeof ')'); - if (!tmp) - return; - memset(tmp, 0, sizeof *tmp); - tp = ((char *)tmp) + sizeof *tmp; - - /* Name */ - strcpy(tp, name); - tmp->name = tp; - tp += strlen(tp) + 1; - - /* Host */ - if (!(np = strchr(cp, ','))) - goto cleanup; - *np++ = '\0'; - strcpy(tp, cp); - tmp->host = tp; - tp += strlen(tp) + 1; - cp = np; - - /* User */ - if (!(np = strchr(cp, ','))) - goto cleanup; - *np++ = '\0'; - strcpy(tp, cp); - tmp->user = tp; - tp += strlen(tp) + 1; - cp = np; - - /* Domain */ - if (!(np = strchr(cp, ')'))) - goto cleanup; - *np++ = '\0'; - strcpy(tp, cp); - tmp->domain = tp; - - /* - * Empty string in file means wildcard, but - * NULL string in return value means wildcard. - */ - if (!*tmp->host) - tmp->host = NULL; - if (!*tmp->user) - tmp->user = NULL; - if (!*tmp->domain) - tmp->domain = NULL; - - /* Add to list (LIFO). */ - tmp->next = pvt->tmp; - pvt->tmp = tmp; - return; - - cleanup: - free(tmp); -} - -static void -tmpfree(struct pvt *pvt) { - struct tmpgrp *cur, *next; - - if (pvt->tmpgroup) { - free(pvt->tmpgroup); - pvt->tmpgroup = NULL; - } - for (cur = pvt->tmp; cur; cur = next) { - next = cur->next; - free(cur); - } - pvt->tmp = NULL; -} - -#endif /*WANT_IRS_NIS*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nis_nw.c b/contrib/bind9/lib/bind/irs/nis_nw.c deleted file mode 100644 index 2fb50dc..0000000 --- a/contrib/bind9/lib/bind/irs/nis_nw.c +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nis_nw.c,v 1.3.18.1 2005/04/27 05:01:03 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports */ - -#include "port_before.h" - -#ifndef WANT_IRS_NIS -static int __bind_irs_nis_unneeded; -#else - -#include <sys/types.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#ifdef T_NULL -#undef T_NULL /* Silence re-definition warning of T_NULL. */ -#endif -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <rpcsvc/yp_prot.h> -#include <rpcsvc/ypclnt.h> - -#include <errno.h> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "nis_p.h" - -/* Definitions */ - -#define MAXALIASES 35 -#define MAXADDRSIZE 4 - -struct pvt { - int needrewind; - char * nis_domain; - char * curkey_data; - int curkey_len; - char * curval_data; - int curval_len; - - struct nwent nwent; - char * nwbuf; - - char * aliases[MAXALIASES + 1]; - u_char addr[MAXADDRSIZE]; - - struct __res_state * res; - void (*free_res)(void *); -}; - -enum do_what { do_none = 0x0, do_key = 0x1, do_val = 0x2, do_all = 0x3 }; - -static /*const*/ char networks_byname[] = "networks.byname"; -static /*const*/ char networks_byaddr[] = "networks.byaddr"; - -/* Forward */ - -static void nw_close(struct irs_nw *); -static struct nwent * nw_byname(struct irs_nw *, const char *, int); -static struct nwent * nw_byaddr(struct irs_nw *, void *, int, int); -static struct nwent * nw_next(struct irs_nw *); -static void nw_rewind(struct irs_nw *); -static void nw_minimize(struct irs_nw *); -static struct __res_state * nw_res_get(struct irs_nw *this); -static void nw_res_set(struct irs_nw *this, - struct __res_state *res, - void (*free_res)(void *)); - -static struct nwent * makenwent(struct irs_nw *this); -static void nisfree(struct pvt *, enum do_what); -static int init(struct irs_nw *this); - -/* Public */ - -struct irs_nw * -irs_nis_nw(struct irs_acc *this) { - struct irs_nw *nw; - struct pvt *pvt; - - if (!(pvt = memget(sizeof *pvt))) { - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - if (!(nw = memget(sizeof *nw))) { - memput(pvt, sizeof *pvt); - errno = ENOMEM; - return (NULL); - } - memset(nw, 0x5e, sizeof *nw); - pvt->needrewind = 1; - pvt->nis_domain = ((struct nis_p *)this->private)->domain; - nw->private = pvt; - nw->close = nw_close; - nw->byname = nw_byname; - nw->byaddr = nw_byaddr; - nw->next = nw_next; - nw->rewind = nw_rewind; - nw->minimize = nw_minimize; - nw->res_get = nw_res_get; - nw->res_set = nw_res_set; - return (nw); -} - -/* Methods */ - -static void -nw_close(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - nw_minimize(this); - if (pvt->res && pvt->free_res) - (*pvt->free_res)(pvt->res); - if (pvt->nwbuf) - free(pvt->nwbuf); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct nwent * -nw_byaddr(struct irs_nw *this, void *net, int length, int af) { - struct pvt *pvt = (struct pvt *)this->private; - char tmp[sizeof "255.255.255.255/32"], *t; - int r; - - if (init(this) == -1) - return (NULL); - - if (af != AF_INET) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = EAFNOSUPPORT; - return (NULL); - } - nisfree(pvt, do_val); - /* Try it with /CIDR first. */ - if (inet_net_ntop(AF_INET, net, length, tmp, sizeof tmp) == NULL) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - return (NULL); - } - r = yp_match(pvt->nis_domain, networks_byaddr, tmp, strlen(tmp), - &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - /* Give it a shot without the /CIDR. */ - if ((t = strchr(tmp, '/')) != NULL) { - *t = '\0'; - r = yp_match(pvt->nis_domain, networks_byaddr, - tmp, strlen(tmp), - &pvt->curval_data, &pvt->curval_len); - } - if (r != 0) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - return (NULL); - } - } - return (makenwent(this)); -} - -static struct nwent * -nw_byname(struct irs_nw *this, const char *name, int af) { - struct pvt *pvt = (struct pvt *)this->private; - int r; - char *tmp; - - if (init(this) == -1) - return (NULL); - - if (af != AF_INET) { - RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL); - errno = EAFNOSUPPORT; - return (NULL); - } - nisfree(pvt, do_val); - DE_CONST(name, tmp); - r = yp_match(pvt->nis_domain, networks_byname, tmp, - strlen(tmp), &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - return (NULL); - } - return (makenwent(this)); -} - -static void -nw_rewind(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pvt->needrewind = 1; -} - -static struct nwent * -nw_next(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct nwent *rval; - int r; - - if (init(this) == -1) - return (NULL); - - do { - if (pvt->needrewind) { - nisfree(pvt, do_all); - r = yp_first(pvt->nis_domain, networks_byaddr, - &pvt->curkey_data, &pvt->curkey_len, - &pvt->curval_data, &pvt->curval_len); - pvt->needrewind = 0; - } else { - char *newkey_data; - int newkey_len; - - nisfree(pvt, do_val); - r = yp_next(pvt->nis_domain, networks_byaddr, - pvt->curkey_data, pvt->curkey_len, - &newkey_data, &newkey_len, - &pvt->curval_data, &pvt->curval_len); - nisfree(pvt, do_key); - pvt->curkey_data = newkey_data; - pvt->curkey_len = newkey_len; - } - if (r != 0) { - RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND); - return (NULL); - } - rval = makenwent(this); - } while (rval == NULL); - return (rval); -} - -static void -nw_minimize(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res) - res_nclose(pvt->res); -} - -static struct __res_state * -nw_res_get(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res) { - struct __res_state *res; - res = (struct __res_state *)malloc(sizeof *res); - if (!res) { - errno = ENOMEM; - return (NULL); - } - memset(res, 0, sizeof *res); - nw_res_set(this, res, free); - } - - return (pvt->res); -} - -static void -nw_res_set(struct irs_nw *this, struct __res_state *res, - void (*free_res)(void *)) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->res && pvt->free_res) { - res_nclose(pvt->res); - (*pvt->free_res)(pvt->res); - } - - pvt->res = res; - pvt->free_res = free_res; -} - -/* Private */ - -static struct nwent * -makenwent(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - static const char spaces[] = " \t"; - char *t, *cp, **ap; - - if (pvt->nwbuf) - free(pvt->nwbuf); - pvt->nwbuf = pvt->curval_data; - pvt->curval_data = NULL; - - if ((cp = strpbrk(pvt->nwbuf, "#\n")) != NULL) - *cp = '\0'; - cp = pvt->nwbuf; - - /* Name */ - pvt->nwent.n_name = cp; - cp += strcspn(cp, spaces); - if (!*cp) - goto cleanup; - *cp++ = '\0'; - cp += strspn(cp, spaces); - - /* Network */ - pvt->nwent.n_addrtype = AF_INET; - t = cp + strcspn(cp, spaces); - if (*t) - *t++ = '\0'; - pvt->nwent.n_length = inet_net_pton(AF_INET, cp, - pvt->addr, sizeof pvt->addr); - if (pvt->nwent.n_length < 0) - goto cleanup; - pvt->nwent.n_addr = pvt->addr; - cp = t; - - /* Aliases */ - ap = pvt->nwent.n_aliases = pvt->aliases; - while (*cp) { - if (ap >= &pvt->aliases[MAXALIASES]) - break; - *ap++ = cp; - cp += strcspn(cp, spaces); - if (!*cp) - break; - *cp++ = '\0'; - cp += strspn(cp, spaces); - } - *ap = NULL; - - return (&pvt->nwent); - - cleanup: - if (pvt->nwbuf) { - free(pvt->nwbuf); - pvt->nwbuf = NULL; - } - return (NULL); -} - -static void -nisfree(struct pvt *pvt, enum do_what do_what) { - if ((do_what & do_key) && pvt->curkey_data) { - free(pvt->curkey_data); - pvt->curkey_data = NULL; - } - if ((do_what & do_val) && pvt->curval_data) { - free(pvt->curval_data); - pvt->curval_data = NULL; - } -} - -static int -init(struct irs_nw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (!pvt->res && !nw_res_get(this)) - return (-1); - if (((pvt->res->options & RES_INIT) == 0) && - res_ninit(pvt->res) == -1) - return (-1); - return (0); -} - -#endif /*WANT_IRS_NIS*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nis_p.h b/contrib/bind9/lib/bind/irs/nis_p.h deleted file mode 100644 index 9e7f26c..0000000 --- a/contrib/bind9/lib/bind/irs/nis_p.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: nis_p.h,v 1.2.18.1 2005/04/27 05:01:04 sra Exp $ - */ - -/*! \file - * \brief - * nis_p.h - private include file for the NIS functions. - */ - -/*% - * Object state. - */ -struct nis_p { - char * domain; - struct __res_state * res; - void (*free_res) __P((void *)); -}; - - -/* - * Methods. - */ - -extern struct irs_gr * irs_nis_gr __P((struct irs_acc *)); -extern struct irs_pw * irs_nis_pw __P((struct irs_acc *)); -extern struct irs_sv * irs_nis_sv __P((struct irs_acc *)); -extern struct irs_pr * irs_nis_pr __P((struct irs_acc *)); -extern struct irs_ho * irs_nis_ho __P((struct irs_acc *)); -extern struct irs_nw * irs_nis_nw __P((struct irs_acc *)); -extern struct irs_ng * irs_nis_ng __P((struct irs_acc *)); diff --git a/contrib/bind9/lib/bind/irs/nis_pr.c b/contrib/bind9/lib/bind/irs/nis_pr.c deleted file mode 100644 index 58ff84d..0000000 --- a/contrib/bind9/lib/bind/irs/nis_pr.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nis_pr.c,v 1.3.18.1 2005/04/27 05:01:04 sra Exp $"; -#endif - -/* Imports */ - -#include "port_before.h" - -#ifndef WANT_IRS_NIS -static int __bind_irs_nis_unneeded; -#else - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> -#ifdef T_NULL -#undef T_NULL /* Silence re-definition warning of T_NULL. */ -#endif -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <rpcsvc/yp_prot.h> -#include <rpcsvc/ypclnt.h> - -#include <stdio.h> -#include <string.h> -#include <netdb.h> -#include <ctype.h> -#include <stdlib.h> -#include <errno.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "nis_p.h" - -/* Definitions */ - -struct pvt { - int needrewind; - char * nis_domain; - char * curkey_data; - int curkey_len; - char * curval_data; - int curval_len; - struct protoent proto; - char * prbuf; -}; - -enum do_what { do_none = 0x0, do_key = 0x1, do_val = 0x2, do_all = 0x3 }; - -static /*const*/ char protocols_byname[] = "protocols.byname"; -static /*const*/ char protocols_bynumber[] = "protocols.bynumber"; - -/* Forward */ - -static void pr_close(struct irs_pr *); -static struct protoent * pr_byname(struct irs_pr *, const char *); -static struct protoent * pr_bynumber(struct irs_pr *, int); -static struct protoent * pr_next(struct irs_pr *); -static void pr_rewind(struct irs_pr *); -static void pr_minimize(struct irs_pr *); - -static struct protoent * makeprotoent(struct irs_pr *this); -static void nisfree(struct pvt *, enum do_what); - -/* Public */ - -struct irs_pr * -irs_nis_pr(struct irs_acc *this) { - struct irs_pr *pr; - struct pvt *pvt; - - if (!(pr = memget(sizeof *pr))) { - errno = ENOMEM; - return (NULL); - } - memset(pr, 0x5e, sizeof *pr); - if (!(pvt = memget(sizeof *pvt))) { - memput(pr, sizeof *pr); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->needrewind = 1; - pvt->nis_domain = ((struct nis_p *)this->private)->domain; - pr->private = pvt; - pr->byname = pr_byname; - pr->bynumber = pr_bynumber; - pr->next = pr_next; - pr->rewind = pr_rewind; - pr->close = pr_close; - pr->minimize = pr_minimize; - pr->res_get = NULL; - pr->res_set = NULL; - return (pr); -} - -/* Methods. */ - -static void -pr_close(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - nisfree(pvt, do_all); - if (pvt->proto.p_aliases) - free(pvt->proto.p_aliases); - if (pvt->prbuf) - free(pvt->prbuf); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct protoent * -pr_byname(struct irs_pr *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - int r; - char *tmp; - - nisfree(pvt, do_val); - DE_CONST(name, tmp); - r = yp_match(pvt->nis_domain, protocols_byname, tmp, - strlen(tmp), &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - errno = ENOENT; - return (NULL); - } - return (makeprotoent(this)); -} - -static struct protoent * -pr_bynumber(struct irs_pr *this, int num) { - struct pvt *pvt = (struct pvt *)this->private; - char tmp[sizeof "-4294967295"]; - int r; - - nisfree(pvt, do_val); - (void) sprintf(tmp, "%d", num); - r = yp_match(pvt->nis_domain, protocols_bynumber, tmp, strlen(tmp), - &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - errno = ENOENT; - return (NULL); - } - return (makeprotoent(this)); -} - -static struct protoent * -pr_next(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct protoent *rval; - int r; - - do { - if (pvt->needrewind) { - nisfree(pvt, do_all); - r = yp_first(pvt->nis_domain, protocols_bynumber, - &pvt->curkey_data, &pvt->curkey_len, - &pvt->curval_data, &pvt->curval_len); - pvt->needrewind = 0; - } else { - char *newkey_data; - int newkey_len; - - nisfree(pvt, do_val); - r = yp_next(pvt->nis_domain, protocols_bynumber, - pvt->curkey_data, pvt->curkey_len, - &newkey_data, &newkey_len, - &pvt->curval_data, &pvt->curval_len); - nisfree(pvt, do_key); - pvt->curkey_data = newkey_data; - pvt->curkey_len = newkey_len; - } - if (r != 0) { - errno = ENOENT; - return (NULL); - } - rval = makeprotoent(this); - } while (rval == NULL); - return (rval); -} - -static void -pr_rewind(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pvt->needrewind = 1; -} - -static void -pr_minimize(struct irs_pr *this) { - UNUSED(this); - /* NOOP */ -} - -/* Private */ - -static struct protoent * -makeprotoent(struct irs_pr *this) { - struct pvt *pvt = (struct pvt *)this->private; - char *p, **t; - int n, m; - - if (pvt->prbuf) - free(pvt->prbuf); - pvt->prbuf = pvt->curval_data; - pvt->curval_data = NULL; - - for (p = pvt->prbuf; *p && *p != '#';) - p++; - while (p > pvt->prbuf && isspace((unsigned char)(p[-1]))) - p--; - *p = '\0'; - - p = pvt->prbuf; - n = m = 0; - - pvt->proto.p_name = p; - while (*p && !isspace((unsigned char)*p)) - p++; - if (!*p) - return (NULL); - *p++ = '\0'; - - while (*p && isspace((unsigned char)*p)) - p++; - pvt->proto.p_proto = atoi(p); - while (*p && !isspace((unsigned char)*p)) - p++; - *p++ = '\0'; - - while (*p) { - if ((n + 1) >= m || !pvt->proto.p_aliases) { - m += 10; - t = realloc(pvt->proto.p_aliases, - m * sizeof(char *)); - if (!t) { - errno = ENOMEM; - goto cleanup; - } - pvt->proto.p_aliases = t; - } - pvt->proto.p_aliases[n++] = p; - while (*p && !isspace((unsigned char)*p)) - p++; - if (*p) - *p++ = '\0'; - } - if (!pvt->proto.p_aliases) - pvt->proto.p_aliases = malloc(sizeof(char *)); - if (!pvt->proto.p_aliases) - goto cleanup; - pvt->proto.p_aliases[n] = NULL; - return (&pvt->proto); - - cleanup: - if (pvt->proto.p_aliases) { - free(pvt->proto.p_aliases); - pvt->proto.p_aliases = NULL; - } - if (pvt->prbuf) { - free(pvt->prbuf); - pvt->prbuf = NULL; - } - return (NULL); -} - -static void -nisfree(struct pvt *pvt, enum do_what do_what) { - if ((do_what & do_key) && pvt->curkey_data) { - free(pvt->curkey_data); - pvt->curkey_data = NULL; - } - if ((do_what & do_val) && pvt->curval_data) { - free(pvt->curval_data); - pvt->curval_data = NULL; - } -} - -#endif /*WANT_IRS_NIS*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nis_pw.c b/contrib/bind9/lib/bind/irs/nis_pw.c deleted file mode 100644 index 02c6b42..0000000 --- a/contrib/bind9/lib/bind/irs/nis_pw.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nis_pw.c,v 1.3.18.1 2005/04/27 05:01:04 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports */ - -#include "port_before.h" - -#if !defined(WANT_IRS_PW) || !defined(WANT_IRS_NIS) -static int __bind_irs_pw_unneeded; -#else - -#include <sys/param.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> -#include <isc/memcluster.h> -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <rpcsvc/yp_prot.h> -#include <rpcsvc/ypclnt.h> - -#include <errno.h> -#include <fcntl.h> -#include <pwd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <isc/memcluster.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "nis_p.h" - -/* Definitions */ - -struct pvt { - int needrewind; - char * nis_domain; - char * curkey_data; - int curkey_len; - char * curval_data; - int curval_len; - struct passwd passwd; - char * pwbuf; -}; - -enum do_what { do_none = 0x0, do_key = 0x1, do_val = 0x2, do_all = 0x3 }; - -static /*const*/ char passwd_byname[] = "passwd.byname"; -static /*const*/ char passwd_byuid[] = "passwd.byuid"; - -/* Forward */ - -static void pw_close(struct irs_pw *); -static struct passwd * pw_next(struct irs_pw *); -static struct passwd * pw_byname(struct irs_pw *, const char *); -static struct passwd * pw_byuid(struct irs_pw *, uid_t); -static void pw_rewind(struct irs_pw *); -static void pw_minimize(struct irs_pw *); - -static struct passwd * makepasswdent(struct irs_pw *); -static void nisfree(struct pvt *, enum do_what); - -/* Public */ - -struct irs_pw * -irs_nis_pw(struct irs_acc *this) { - struct irs_pw *pw; - struct pvt *pvt; - - if (!(pw = memget(sizeof *pw))) { - errno = ENOMEM; - return (NULL); - } - memset(pw, 0x5e, sizeof *pw); - if (!(pvt = memget(sizeof *pvt))) { - memput(pw, sizeof *pw); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->needrewind = 1; - pvt->nis_domain = ((struct nis_p *)this->private)->domain; - pw->private = pvt; - pw->close = pw_close; - pw->next = pw_next; - pw->byname = pw_byname; - pw->byuid = pw_byuid; - pw->rewind = pw_rewind; - pw->minimize = pw_minimize; - pw->res_get = NULL; - pw->res_set = NULL; - return (pw); -} - -/* Methods */ - -static void -pw_close(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - if (pvt->pwbuf) - free(pvt->pwbuf); - nisfree(pvt, do_all); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct passwd * -pw_next(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct passwd *rval; - int r; - - do { - if (pvt->needrewind) { - nisfree(pvt, do_all); - r = yp_first(pvt->nis_domain, passwd_byname, - &pvt->curkey_data, &pvt->curkey_len, - &pvt->curval_data, &pvt->curval_len); - pvt->needrewind = 0; - } else { - char *newkey_data; - int newkey_len; - - nisfree(pvt, do_val); - r = yp_next(pvt->nis_domain, passwd_byname, - pvt->curkey_data, pvt->curkey_len, - &newkey_data, &newkey_len, - &pvt->curval_data, &pvt->curval_len); - nisfree(pvt, do_key); - pvt->curkey_data = newkey_data; - pvt->curkey_len = newkey_len; - } - if (r != 0) { - errno = ENOENT; - return (NULL); - } - rval = makepasswdent(this); - } while (rval == NULL); - return (rval); -} - -static struct passwd * -pw_byname(struct irs_pw *this, const char *name) { - struct pvt *pvt = (struct pvt *)this->private; - int r; - char *tmp; - - nisfree(pvt, do_val); - DE_CONST(name, tmp); - r = yp_match(pvt->nis_domain, passwd_byname, tmp, strlen(tmp), - &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - errno = ENOENT; - return (NULL); - } - return (makepasswdent(this)); -} - -static struct passwd * -pw_byuid(struct irs_pw *this, uid_t uid) { - struct pvt *pvt = (struct pvt *)this->private; - char tmp[sizeof "4294967295"]; - int r; - - nisfree(pvt, do_val); - (void) sprintf(tmp, "%u", (unsigned int)uid); - r = yp_match(pvt->nis_domain, passwd_byuid, tmp, strlen(tmp), - &pvt->curval_data, &pvt->curval_len); - if (r != 0) { - errno = ENOENT; - return (NULL); - } - return (makepasswdent(this)); -} - -static void -pw_rewind(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pvt->needrewind = 1; -} - -static void -pw_minimize(struct irs_pw *this) { - UNUSED(this); - /* NOOP */ -} - -/* Private */ - -static struct passwd * -makepasswdent(struct irs_pw *this) { - struct pvt *pvt = (struct pvt *)this->private; - char *cp; - - memset(&pvt->passwd, 0, sizeof pvt->passwd); - if (pvt->pwbuf) - free(pvt->pwbuf); - pvt->pwbuf = pvt->curval_data; - pvt->curval_data = NULL; - - cp = pvt->pwbuf; - pvt->passwd.pw_name = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; -#ifdef HAS_PW_CLASS - pvt->passwd.pw_class = cp; /*%< Needs to point at a \0. */ -#endif - *cp++ = '\0'; - - pvt->passwd.pw_passwd = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_uid = atoi(cp); - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_gid = atoi(cp); - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_gecos = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_dir = cp; - if (!(cp = strchr(cp, ':'))) - goto cleanup; - *cp++ = '\0'; - - pvt->passwd.pw_shell = cp; - - if ((cp = strchr(cp, '\n')) != NULL) - *cp = '\0'; - - return (&pvt->passwd); - - cleanup: - free(pvt->pwbuf); - pvt->pwbuf = NULL; - return (NULL); -} - -static void -nisfree(struct pvt *pvt, enum do_what do_what) { - if ((do_what & do_key) && pvt->curkey_data) { - free(pvt->curkey_data); - pvt->curkey_data = NULL; - } - if ((do_what & do_val) && pvt->curval_data) { - free(pvt->curval_data); - pvt->curval_data = NULL; - } -} - -#endif /* WANT_IRS_PW && WANT_IRS_NIS */ -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nis_sv.c b/contrib/bind9/lib/bind/irs/nis_sv.c deleted file mode 100644 index dd307f0..0000000 --- a/contrib/bind9/lib/bind/irs/nis_sv.c +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nis_sv.c,v 1.3.18.1 2005/04/27 05:01:04 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ - -/* Imports */ - -#include "port_before.h" - -#ifndef WANT_IRS_NIS -static int __bind_irs_nis_unneeded; -#else - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> -#include <sys/socket.h> -#ifdef T_NULL -#undef T_NULL /* Silence re-definition warning of T_NULL. */ -#endif -#include <rpc/rpc.h> -#include <rpc/xdr.h> -#include <rpcsvc/yp_prot.h> -#include <rpcsvc/ypclnt.h> - -#include <ctype.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/memcluster.h> -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "nis_p.h" - -/* Definitions */ - -struct pvt { - int needrewind; - char * nis_domain; - char * curkey_data; - int curkey_len; - char * curval_data; - int curval_len; - char line[BUFSIZ+1]; - struct servent serv; - char * svbuf; -}; - -enum do_what { do_none = 0x0, do_key = 0x1, do_val = 0x2, do_all = 0x3 }; - -static /*const*/ char services_byname[] = "services.byname"; - -/* Forward */ - -static void sv_close(struct irs_sv*); -static struct servent * sv_next(struct irs_sv *); -static struct servent * sv_byname(struct irs_sv *, const char *, - const char *); -static struct servent * sv_byport(struct irs_sv *, int, const char *); -static void sv_rewind(struct irs_sv *); -static void sv_minimize(struct irs_sv *); - -static struct servent * makeservent(struct irs_sv *this); -static void nisfree(struct pvt *, enum do_what); - -/* Public */ - -struct irs_sv * -irs_nis_sv(struct irs_acc *this) { - struct irs_sv *sv; - struct pvt *pvt; - - if (!(sv = memget(sizeof *sv))) { - errno = ENOMEM; - return (NULL); - } - memset(sv, 0x5e, sizeof *sv); - if (!(pvt = memget(sizeof *pvt))) { - memput(sv, sizeof *sv); - errno = ENOMEM; - return (NULL); - } - memset(pvt, 0, sizeof *pvt); - pvt->needrewind = 1; - pvt->nis_domain = ((struct nis_p *)this->private)->domain; - sv->private = pvt; - sv->close = sv_close; - sv->next = sv_next; - sv->byname = sv_byname; - sv->byport = sv_byport; - sv->rewind = sv_rewind; - sv->minimize = sv_minimize; - sv->res_get = NULL; - sv->res_set = NULL; - return (sv); -} - -/* Methods */ - -static void -sv_close(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - - nisfree(pvt, do_all); - if (pvt->serv.s_aliases) - free(pvt->serv.s_aliases); - if (pvt->svbuf) - free(pvt->svbuf); - memput(pvt, sizeof *pvt); - memput(this, sizeof *this); -} - -static struct servent * -sv_byname(struct irs_sv *this, const char *name, const char *proto) { - struct servent *serv; - char **sap; - - sv_rewind(this); - while ((serv = sv_next(this)) != NULL) { - if (proto != NULL && strcmp(proto, serv->s_proto)) - continue; - if (!strcmp(name, serv->s_name)) - break; - for (sap = serv->s_aliases; sap && *sap; sap++) - if (!strcmp(name, *sap)) - break; - } - return (serv); -} - -static struct servent * -sv_byport(struct irs_sv *this, int port, const char *proto) { - struct servent *serv; - - sv_rewind(this); - while ((serv = sv_next(this)) != NULL) { - if (proto != NULL && strcmp(proto, serv->s_proto)) - continue; - if (serv->s_port == port) - break; - } - return (serv); -} - -static void -sv_rewind(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - - pvt->needrewind = 1; -} - -static struct servent * -sv_next(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - struct servent *rval; - int r; - - do { - if (pvt->needrewind) { - nisfree(pvt, do_all); - r = yp_first(pvt->nis_domain, services_byname, - &pvt->curkey_data, &pvt->curkey_len, - &pvt->curval_data, &pvt->curval_len); - pvt->needrewind = 0; - } else { - char *newkey_data; - int newkey_len; - - nisfree(pvt, do_val); - r = yp_next(pvt->nis_domain, services_byname, - pvt->curkey_data, pvt->curkey_len, - &newkey_data, &newkey_len, - &pvt->curval_data, &pvt->curval_len); - nisfree(pvt, do_key); - pvt->curkey_data = newkey_data; - pvt->curkey_len = newkey_len; - } - if (r != 0) { - errno = ENOENT; - return (NULL); - } - rval = makeservent(this); - } while (rval == NULL); - return (rval); -} - -static void -sv_minimize(struct irs_sv *this) { - UNUSED(this); - /* NOOP */ -} - -/* Private */ - -static struct servent * -makeservent(struct irs_sv *this) { - struct pvt *pvt = (struct pvt *)this->private; - static const char spaces[] = " \t"; - char *p, **t; - int n, m; - - if (pvt->svbuf) - free(pvt->svbuf); - pvt->svbuf = pvt->curval_data; - pvt->curval_data = NULL; - - if (pvt->serv.s_aliases) { - free(pvt->serv.s_aliases); - pvt->serv.s_aliases = NULL; - } - - if ((p = strpbrk(pvt->svbuf, "#\n"))) - *p = '\0'; - - p = pvt->svbuf; - - pvt->serv.s_name = p; - p += strcspn(p, spaces); - if (!*p) - goto cleanup; - *p++ = '\0'; - p += strspn(p, spaces); - - pvt->serv.s_port = htons((u_short) atoi(p)); - pvt->serv.s_proto = NULL; - - while (*p && !isspace((unsigned char)*p)) - if (*p++ == '/') - pvt->serv.s_proto = p; - if (!pvt->serv.s_proto) - goto cleanup; - if (*p) { - *p++ = '\0'; - p += strspn(p, spaces); - } - - n = m = 0; - while (*p) { - if ((n + 1) >= m || !pvt->serv.s_aliases) { - m += 10; - t = realloc(pvt->serv.s_aliases, m * sizeof(char *)); - if (!t) { - errno = ENOMEM; - goto cleanup; - } - pvt->serv.s_aliases = t; - } - pvt->serv.s_aliases[n++] = p; - p += strcspn(p, spaces); - if (!*p) - break; - *p++ = '\0'; - p += strspn(p, spaces); - } - if (!pvt->serv.s_aliases) - pvt->serv.s_aliases = malloc(sizeof(char *)); - if (!pvt->serv.s_aliases) - goto cleanup; - pvt->serv.s_aliases[n] = NULL; - return (&pvt->serv); - - cleanup: - if (pvt->serv.s_aliases) { - free(pvt->serv.s_aliases); - pvt->serv.s_aliases = NULL; - } - if (pvt->svbuf) { - free(pvt->svbuf); - pvt->svbuf = NULL; - } - return (NULL); -} - -static void -nisfree(struct pvt *pvt, enum do_what do_what) { - if ((do_what & do_key) && pvt->curkey_data) { - free(pvt->curkey_data); - pvt->curkey_data = NULL; - } - if ((do_what & do_val) && pvt->curval_data) { - free(pvt->curval_data); - pvt->curval_data = NULL; - } -} - -#endif /*WANT_IRS_NIS*/ - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/nul_ng.c b/contrib/bind9/lib/bind/irs/nul_ng.c deleted file mode 100644 index fa9ec46..0000000 --- a/contrib/bind9/lib/bind/irs/nul_ng.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: nul_ng.c,v 1.2.18.1 2005/04/27 05:01:04 sra Exp $"; -#endif - -/*! \file - * \brief - * nul_ng.c - the netgroup accessor null map - */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <stdio.h> -#include <string.h> -#include <netdb.h> -#include <ctype.h> -#include <stdlib.h> -#include <errno.h> - -#include <irs.h> -#include <isc/memcluster.h> - -#include "port_after.h" - -#include "irs_p.h" -#include "hesiod.h" -#include "dns_p.h" - -/* Forward. */ - -static void ng_close(struct irs_ng *); -static int ng_next(struct irs_ng *, const char **, - const char **, const char **); -static int ng_test(struct irs_ng *, - const char *, const char *, - const char *, const char *); -static void ng_rewind(struct irs_ng *, const char *); -static void ng_minimize(struct irs_ng *); - -/* Public. */ - -struct irs_ng * -irs_nul_ng(struct irs_acc *this) { - struct irs_ng *ng; - - UNUSED(this); - - if (!(ng = memget(sizeof *ng))) { - errno = ENOMEM; - return (NULL); - } - memset(ng, 0x5e, sizeof *ng); - ng->private = NULL; - ng->close = ng_close; - ng->next = ng_next; - ng->test = ng_test; - ng->rewind = ng_rewind; - ng->minimize = ng_minimize; - return (ng); -} - -/* Methods. */ - -static void -ng_close(struct irs_ng *this) { - memput(this, sizeof *this); -} - -/* ARGSUSED */ -static int -ng_next(struct irs_ng *this, const char **host, const char **user, - const char **domain) -{ - UNUSED(this); - UNUSED(host); - UNUSED(user); - UNUSED(domain); - errno = ENOENT; - return (-1); -} - -static int -ng_test(struct irs_ng *this, const char *name, - const char *user, const char *host, const char *domain) -{ - UNUSED(this); - UNUSED(name); - UNUSED(user); - UNUSED(host); - UNUSED(domain); - errno = ENODEV; - return (-1); -} - -static void -ng_rewind(struct irs_ng *this, const char *netgroup) { - UNUSED(this); - UNUSED(netgroup); - /* NOOP */ -} - -static void -ng_minimize(struct irs_ng *this) { - UNUSED(this); - /* NOOP */ -} diff --git a/contrib/bind9/lib/bind/irs/pathnames.h b/contrib/bind9/lib/bind/irs/pathnames.h deleted file mode 100644 index c775de2..0000000 --- a/contrib/bind9/lib/bind/irs/pathnames.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -/* - * $Id: pathnames.h,v 1.2.18.1 2005/04/27 05:01:04 sra Exp $ - */ - -#ifndef _PATH_IRS_CONF -#define _PATH_IRS_CONF "/etc/irs.conf" -#endif - -#ifndef _PATH_NETWORKS -#define _PATH_NETWORKS "/etc/networks" -#endif - -#ifndef _PATH_GROUP -#define _PATH_GROUP "/etc/group" -#endif - -#ifndef _PATH_NETGROUP -#define _PATH_NETGROUP "/etc/netgroup" -#endif - -#ifndef _PATH_SERVICES -#define _PATH_SERVICES "/etc/services" -#endif - -#ifdef IRS_LCL_SV_DB -#ifndef _PATH_SERVICES_DB -#define _PATH_SERVICES_DB _PATH_SERVICES ".db" -#endif -#endif - -#ifndef _PATH_HESIOD_CONF -#define _PATH_HESIOD_CONF "/etc/hesiod.conf" -#endif - -/*! \file */ diff --git a/contrib/bind9/lib/bind/irs/util.c b/contrib/bind9/lib/bind/irs/util.c deleted file mode 100644 index 5c4cc28..0000000 --- a/contrib/bind9/lib/bind/irs/util.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * 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. - * - * 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: util.c,v 1.2.18.1 2005/04/27 05:01:05 sra Exp $"; -#endif - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -#include <ctype.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include <irs.h> - -#include "port_after.h" - -#include "irs_p.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) sprintf x -#endif - -void -map_v4v6_address(const char *src, char *dst) { - u_char *p = (u_char *)dst; - char tmp[NS_INADDRSZ]; - int i; - - /* Stash a temporary copy so our caller can update in place. */ - memcpy(tmp, src, NS_INADDRSZ); - /* Mark this ipv6 addr as a mapped ipv4. */ - for (i = 0; i < 10; i++) - *p++ = 0x00; - *p++ = 0xff; - *p++ = 0xff; - /* Retrieve the saved copy and we're done. */ - memcpy((void*)p, tmp, NS_INADDRSZ); -} - -int -make_group_list(struct irs_gr *this, const char *name, - gid_t basegid, gid_t *groups, int *ngroups) -{ - struct group *grp; - int i, ng; - int ret, maxgroups; - - ret = -1; - ng = 0; - maxgroups = *ngroups; - /* - * When installing primary group, duplicate it; - * the first element of groups is the effective gid - * and will be overwritten when a setgid file is executed. - */ - if (ng >= maxgroups) - goto done; - groups[ng++] = basegid; - if (ng >= maxgroups) - goto done; - groups[ng++] = basegid; - /* - * Scan the group file to find additional groups. - */ - (*this->rewind)(this); - while ((grp = (*this->next)(this)) != NULL) { - if ((gid_t)grp->gr_gid == basegid) - continue; - for (i = 0; grp->gr_mem[i]; i++) { - if (!strcmp(grp->gr_mem[i], name)) { - if (ng >= maxgroups) - goto done; - groups[ng++] = grp->gr_gid; - break; - } - } - } - ret = 0; - done: - *ngroups = ng; - return (ret); -} - -/*! \file */ |