diff options
author | cvs2svn <cvs2svn@FreeBSD.org> | 2006-10-24 14:25:50 +0000 |
---|---|---|
committer | cvs2svn <cvs2svn@FreeBSD.org> | 2006-10-24 14:25:50 +0000 |
commit | cd6e4b800cfbc6cb0c65fc8c2a563b3fdee3dad7 (patch) | |
tree | 1450488f85e42a84d19a1c8d978cb3a3547a38cc | |
parent | 7c35eabcb2ff31ab013324d5a4c3ff485c16ef32 (diff) |
This commit was manufactured by cvs2svn to create tagvendor/resolver/9.3.3RC2
'BIND_9_3_3_RC2'.
Notes
Notes:
svn path=/vendor/resolver/dist/; revision=163659
svn path=/vendor/resolver/9.3.3RC2/; revision=163660; tag=vendor/resolver/9.3.3RC2
44 files changed, 0 insertions, 13442 deletions
diff --git a/include/arpa/inet.h b/include/arpa/inet.h deleted file mode 100644 index 46caa49f5907..000000000000 --- a/include/arpa/inet.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * ++Copyright++ 1983, 1993 - * - - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -/* - * @(#)inet.h 8.1 (Berkeley) 6/2/93 - * $Id: inet.h,v 1.1.206.1 2004/03/09 08:33:30 marka Exp $ - */ - -#ifndef _INET_H_ -#define _INET_H_ - -/* External definitions for functions in inet(3) */ - -#include <sys/param.h> -#if (!defined(BSD)) || (BSD < 199306) -# include <sys/bitypes.h> -#else -# include <sys/types.h> -#endif -#include <sys/cdefs.h> - -#define inet_addr __inet_addr -#define inet_aton __inet_aton -#define inet_lnaof __inet_lnaof -#define inet_makeaddr __inet_makeaddr -#define inet_neta __inet_neta -#define inet_netof __inet_netof -#define inet_network __inet_network -#define inet_net_ntop __inet_net_ntop -#define inet_net_pton __inet_net_pton -#define inet_cidr_ntop __inet_cidr_ntop -#define inet_cidr_pton __inet_cidr_pton -#define inet_ntoa __inet_ntoa -#define inet_pton __inet_pton -#define inet_ntop __inet_ntop -#define inet_nsap_addr __inet_nsap_addr -#define inet_nsap_ntoa __inet_nsap_ntoa - -__BEGIN_DECLS -unsigned long inet_addr __P((const char *)); -int inet_aton __P((const char *, struct in_addr *)); -unsigned long inet_lnaof __P((struct in_addr)); -struct in_addr inet_makeaddr __P((u_long , u_long)); -char * inet_neta __P((u_long, char *, size_t)); -unsigned long inet_netof __P((struct in_addr)); -unsigned long inet_network __P((const char *)); -char *inet_net_ntop __P((int, const void *, int, char *, size_t)); -int inet_net_pton __P((int, const char *, void *, size_t)); -char *inet_cidr_ntop __P((int, const void *, int, char *, size_t)); -int inet_cidr_pton __P((int, const char *, void *, int *)); -/*const*/ char *inet_ntoa __P((struct in_addr)); -int inet_pton __P((int, const char *, void *)); -const char *inet_ntop __P((int, const void *, char *, size_t)); -u_int inet_nsap_addr __P((const char *, u_char *, int)); -char *inet_nsap_ntoa __P((int, const u_char *, char *)); -__END_DECLS - -#if defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED) -/* - * Macros for number representation conversion. - * - * netinet/in.h is another location for these macros - */ -#ifndef ntohl -#define ntohl(x) (x) -#define ntohs(x) (x) -#define htonl(x) (x) -#define htons(x) (x) -#endif -#endif - -#endif /* !_INET_H_ */ diff --git a/include/arpa/nameser.h b/include/arpa/nameser.h deleted file mode 100644 index 23db49871dcf..000000000000 --- a/include/arpa/nameser.h +++ /dev/null @@ -1,576 +0,0 @@ -/* - * Copyright (c) 1983, 1989, 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") - * 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: nameser.h,v 1.2.2.4.4.1 2004/03/09 08:33:30 marka Exp $ - */ - -#ifndef _ARPA_NAMESER_H_ -#define _ARPA_NAMESER_H_ - -#define BIND_4_COMPAT - -#include <sys/param.h> -#if (!defined(BSD)) || (BSD < 199306) -# include <sys/bitypes.h> -#else -# include <sys/types.h> -#endif -#include <sys/cdefs.h> - -/* - * Revision information. This is the release date in YYYYMMDD format. - * It can change every day so the right thing to do with it is use it - * in preprocessor commands such as "#if (__NAMESER > 19931104)". Do not - * compare for equality; rather, use it to determine whether your libbind.a - * contains a new enough lib/nameser/ to support the feature you need. - */ - -#define __NAMESER 19991006 /* New interface version stamp. */ - -/* - * Define constants based on RFC 883, RFC 1034, RFC 1035 - */ -#define NS_PACKETSZ 512 /* default UDP packet size */ -#define NS_MAXDNAME 1025 /* maximum domain name */ -#define NS_MAXMSG 65535 /* maximum message size */ -#define NS_MAXCDNAME 255 /* maximum compressed domain name */ -#define NS_MAXLABEL 63 /* maximum length of domain label */ -#define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */ -#define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */ -#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ -#define NS_INT32SZ 4 /* #/bytes of data in a u_int32_t */ -#define NS_INT16SZ 2 /* #/bytes of data in a u_int16_t */ -#define NS_INT8SZ 1 /* #/bytes of data in a u_int8_t */ -#define NS_INADDRSZ 4 /* IPv4 T_A */ -#define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */ -#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ -#define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ - -/* - * These can be expanded with synonyms, just keep ns_parse.c:ns_parserecord() - * in synch with it. - */ -typedef enum __ns_sect { - ns_s_qd = 0, /* Query: Question. */ - ns_s_zn = 0, /* Update: Zone. */ - ns_s_an = 1, /* Query: Answer. */ - ns_s_pr = 1, /* Update: Prerequisites. */ - ns_s_ns = 2, /* Query: Name servers. */ - ns_s_ud = 2, /* Update: Update. */ - ns_s_ar = 3, /* Query|Update: Additional records. */ - ns_s_max = 4 -} ns_sect; - -/* - * This is a message handle. It is caller allocated and has no dynamic data. - * This structure is intended to be opaque to all but ns_parse.c, thus the - * leading _'s on the member names. Use the accessor functions, not the _'s. - */ -typedef struct __ns_msg { - const u_char *_msg, *_eom; - u_int16_t _id, _flags, _counts[ns_s_max]; - const u_char *_sections[ns_s_max]; - ns_sect _sect; - int _rrnum; - const u_char *_msg_ptr; -} ns_msg; - -/* Private data structure - do not use from outside library. */ -struct _ns_flagdata { int mask, shift; }; -extern struct _ns_flagdata _ns_flagdata[]; - -/* Accessor macros - this is part of the public interface. */ - -#define ns_msg_id(handle) ((handle)._id + 0) -#define ns_msg_base(handle) ((handle)._msg + 0) -#define ns_msg_end(handle) ((handle)._eom + 0) -#define ns_msg_size(handle) ((handle)._eom - (handle)._msg) -#define ns_msg_count(handle, section) ((handle)._counts[section] + 0) - -/* - * This is a parsed record. It is caller allocated and has no dynamic data. - */ -typedef struct __ns_rr { - char name[NS_MAXDNAME]; - u_int16_t type; - u_int16_t rr_class; - u_int32_t ttl; - u_int16_t rdlength; - const u_char * rdata; -} ns_rr; - -/* Accessor macros - this is part of the public interface. */ -#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".") -#define ns_rr_type(rr) ((ns_type)((rr).type + 0)) -#define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0)) -#define ns_rr_ttl(rr) ((rr).ttl + 0) -#define ns_rr_rdlen(rr) ((rr).rdlength + 0) -#define ns_rr_rdata(rr) ((rr).rdata + 0) - -/* - * These don't have to be in the same order as in the packet flags word, - * and they can even overlap in some cases, but they will need to be kept - * in synch with ns_parse.c:ns_flagdata[]. - */ -typedef enum __ns_flag { - ns_f_qr, /* Question/Response. */ - ns_f_opcode, /* Operation code. */ - ns_f_aa, /* Authoritative Answer. */ - ns_f_tc, /* Truncation occurred. */ - ns_f_rd, /* Recursion Desired. */ - ns_f_ra, /* Recursion Available. */ - ns_f_z, /* MBZ. */ - ns_f_ad, /* Authentic Data (DNSSEC). */ - ns_f_cd, /* Checking Disabled (DNSSEC). */ - ns_f_rcode, /* Response code. */ - ns_f_max -} ns_flag; - -/* - * Currently defined opcodes. - */ -typedef enum __ns_opcode { - ns_o_query = 0, /* Standard query. */ - ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */ - ns_o_status = 2, /* Name server status query (unsupported). */ - /* Opcode 3 is undefined/reserved. */ - ns_o_notify = 4, /* Zone change notification. */ - ns_o_update = 5, /* Zone update message. */ - ns_o_max = 6 -} ns_opcode; - -/* - * Currently defined response codes. - */ -typedef enum __ns_rcode { - ns_r_noerror = 0, /* No error occurred. */ - ns_r_formerr = 1, /* Format error. */ - ns_r_servfail = 2, /* Server failure. */ - ns_r_nxdomain = 3, /* Name error. */ - ns_r_notimpl = 4, /* Unimplemented. */ - ns_r_refused = 5, /* Operation refused. */ - /* these are for BIND_UPDATE */ - ns_r_yxdomain = 6, /* Name exists */ - ns_r_yxrrset = 7, /* RRset exists */ - ns_r_nxrrset = 8, /* RRset does not exist */ - ns_r_notauth = 9, /* Not authoritative for zone */ - ns_r_notzone = 10, /* Zone of record different from zone section */ - ns_r_max = 11, - /* The following are EDNS extended rcodes */ - ns_r_badvers = 16, - /* The following are TSIG errors */ - ns_r_badsig = 16, - ns_r_badkey = 17, - ns_r_badtime = 18 -} ns_rcode; - -/* BIND_UPDATE */ -typedef enum __ns_update_operation { - ns_uop_delete = 0, - ns_uop_add = 1, - ns_uop_max = 2 -} ns_update_operation; - -/* - * This structure is used for TSIG authenticated messages - */ -struct ns_tsig_key { - char name[NS_MAXDNAME], alg[NS_MAXDNAME]; - unsigned char *data; - int len; -}; -typedef struct ns_tsig_key ns_tsig_key; - -/* - * This structure is used for TSIG authenticated TCP messages - */ -struct ns_tcp_tsig_state { - int counter; - struct dst_key *key; - void *ctx; - unsigned char sig[NS_PACKETSZ]; - int siglen; -}; -typedef struct ns_tcp_tsig_state ns_tcp_tsig_state; - -#define NS_TSIG_FUDGE 300 -#define NS_TSIG_TCP_COUNT 100 -#define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT" - -#define NS_TSIG_ERROR_NO_TSIG -10 -#define NS_TSIG_ERROR_NO_SPACE -11 -#define NS_TSIG_ERROR_FORMERR -12 - -/* - * Currently defined type values for resources and queries. - */ -typedef enum __ns_type { - ns_t_invalid = 0, /* Cookie. */ - ns_t_a = 1, /* Host address. */ - ns_t_ns = 2, /* Authoritative server. */ - ns_t_md = 3, /* Mail destination. */ - ns_t_mf = 4, /* Mail forwarder. */ - ns_t_cname = 5, /* Canonical name. */ - ns_t_soa = 6, /* Start of authority zone. */ - ns_t_mb = 7, /* Mailbox domain name. */ - ns_t_mg = 8, /* Mail group member. */ - ns_t_mr = 9, /* Mail rename name. */ - ns_t_null = 10, /* Null resource record. */ - ns_t_wks = 11, /* Well known service. */ - ns_t_ptr = 12, /* Domain name pointer. */ - ns_t_hinfo = 13, /* Host information. */ - ns_t_minfo = 14, /* Mailbox information. */ - ns_t_mx = 15, /* Mail routing information. */ - ns_t_txt = 16, /* Text strings. */ - ns_t_rp = 17, /* Responsible person. */ - ns_t_afsdb = 18, /* AFS cell database. */ - ns_t_x25 = 19, /* X_25 calling address. */ - ns_t_isdn = 20, /* ISDN calling address. */ - ns_t_rt = 21, /* Router. */ - ns_t_nsap = 22, /* NSAP address. */ - ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ - ns_t_sig = 24, /* Security signature. */ - ns_t_key = 25, /* Security key. */ - ns_t_px = 26, /* X.400 mail mapping. */ - ns_t_gpos = 27, /* Geographical position (withdrawn). */ - ns_t_aaaa = 28, /* Ip6 Address. */ - ns_t_loc = 29, /* Location Information. */ - ns_t_nxt = 30, /* Next domain (security). */ - ns_t_eid = 31, /* Endpoint identifier. */ - ns_t_nimloc = 32, /* Nimrod Locator. */ - ns_t_srv = 33, /* Server Selection. */ - ns_t_atma = 34, /* ATM Address */ - ns_t_naptr = 35, /* Naming Authority PoinTeR */ - ns_t_kx = 36, /* Key Exchange */ - ns_t_cert = 37, /* Certification record */ - ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ - ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ - ns_t_sink = 40, /* Kitchen sink (experimentatl) */ - ns_t_opt = 41, /* EDNS0 option (meta-RR) */ - ns_t_apl = 42, /* Address prefix list (RFC 3123) */ - ns_t_tkey = 249, /* Transaction key */ - ns_t_tsig = 250, /* Transaction signature. */ - ns_t_ixfr = 251, /* Incremental zone transfer. */ - ns_t_axfr = 252, /* Transfer zone of authority. */ - ns_t_mailb = 253, /* Transfer mailbox records. */ - ns_t_maila = 254, /* Transfer mail agent records. */ - ns_t_any = 255, /* Wildcard match. */ - ns_t_zxfr = 256, /* BIND-specific, nonstandard. */ - ns_t_max = 65536 -} ns_type; - -/* Exclusively a QTYPE? (not also an RTYPE) */ -#define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \ - (t) == ns_t_mailb || (t) == ns_t_maila) -/* Some kind of meta-RR? (not a QTYPE, but also not an RTYPE) */ -#define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt) -/* Exclusively an RTYPE? (not also a QTYPE or a meta-RR) */ -#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t)) -#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr) -#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \ - (t) == ns_t_zxfr) - -/* - * Values for class field - */ -typedef enum __ns_class { - ns_c_invalid = 0, /* Cookie. */ - ns_c_in = 1, /* Internet. */ - ns_c_2 = 2, /* unallocated/unsupported. */ - ns_c_chaos = 3, /* MIT Chaos-net. */ - ns_c_hs = 4, /* MIT Hesiod. */ - /* Query class values which do not appear in resource records */ - ns_c_none = 254, /* for prereq. sections in update requests */ - ns_c_any = 255, /* Wildcard match. */ - ns_c_max = 65536 -} ns_class; - -/* DNSSEC constants. */ - -typedef enum __ns_key_types { - ns_kt_rsa = 1, /* key type RSA/MD5 */ - ns_kt_dh = 2, /* Diffie Hellman */ - ns_kt_dsa = 3, /* Digital Signature Standard (MANDATORY) */ - ns_kt_private = 254 /* Private key type starts with OID */ -} ns_key_types; - -typedef enum __ns_cert_types { - cert_t_pkix = 1, /* PKIX (X.509v3) */ - cert_t_spki = 2, /* SPKI */ - cert_t_pgp = 3, /* PGP */ - cert_t_url = 253, /* URL private type */ - cert_t_oid = 254 /* OID private type */ -} ns_cert_types; - -/* Flags field of the KEY RR rdata. */ -#define NS_KEY_TYPEMASK 0xC000 /* Mask for "type" bits */ -#define NS_KEY_TYPE_AUTH_CONF 0x0000 /* Key usable for both */ -#define NS_KEY_TYPE_CONF_ONLY 0x8000 /* Key usable for confidentiality */ -#define NS_KEY_TYPE_AUTH_ONLY 0x4000 /* Key usable for authentication */ -#define NS_KEY_TYPE_NO_KEY 0xC000 /* No key usable for either; no key */ -/* The type bits can also be interpreted independently, as single bits: */ -#define NS_KEY_NO_AUTH 0x8000 /* Key unusable for authentication */ -#define NS_KEY_NO_CONF 0x4000 /* Key unusable for confidentiality */ -#define NS_KEY_RESERVED2 0x2000 /* Security is *mandatory* if bit=0 */ -#define NS_KEY_EXTENDED_FLAGS 0x1000 /* reserved - must be zero */ -#define NS_KEY_RESERVED4 0x0800 /* reserved - must be zero */ -#define NS_KEY_RESERVED5 0x0400 /* reserved - must be zero */ -#define NS_KEY_NAME_TYPE 0x0300 /* these bits determine the type */ -#define NS_KEY_NAME_USER 0x0000 /* key is assoc. with user */ -#define NS_KEY_NAME_ENTITY 0x0200 /* key is assoc. with entity eg host */ -#define NS_KEY_NAME_ZONE 0x0100 /* key is zone key */ -#define NS_KEY_NAME_RESERVED 0x0300 /* reserved meaning */ -#define NS_KEY_RESERVED8 0x0080 /* reserved - must be zero */ -#define NS_KEY_RESERVED9 0x0040 /* reserved - must be zero */ -#define NS_KEY_RESERVED10 0x0020 /* reserved - must be zero */ -#define NS_KEY_RESERVED11 0x0010 /* reserved - must be zero */ -#define NS_KEY_SIGNATORYMASK 0x000F /* key can sign RR's of same name */ -#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \ - NS_KEY_RESERVED4 | \ - NS_KEY_RESERVED5 | \ - NS_KEY_RESERVED8 | \ - NS_KEY_RESERVED9 | \ - NS_KEY_RESERVED10 | \ - NS_KEY_RESERVED11 ) -#define NS_KEY_RESERVED_BITMASK2 0xFFFF /* no bits defined here */ - -/* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */ -#define NS_ALG_MD5RSA 1 /* MD5 with RSA */ -#define NS_ALG_DH 2 /* Diffie Hellman KEY */ -#define NS_ALG_DSA 3 /* DSA KEY */ -#define NS_ALG_DSS NS_ALG_DSA -#define NS_ALG_EXPIRE_ONLY 253 /* No alg, no security */ -#define NS_ALG_PRIVATE_OID 254 /* Key begins with OID giving alg */ - -/* Protocol values */ -/* value 0 is reserved */ -#define NS_KEY_PROT_TLS 1 -#define NS_KEY_PROT_EMAIL 2 -#define NS_KEY_PROT_DNSSEC 3 -#define NS_KEY_PROT_IPSEC 4 -#define NS_KEY_PROT_ANY 255 - -/* Signatures */ -#define NS_MD5RSA_MIN_BITS 512 /* Size of a mod or exp in bits */ -#define NS_MD5RSA_MAX_BITS 4096 - /* Total of binary mod and exp */ -#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3) - /* Max length of text sig block */ -#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4) -#define NS_MD5RSA_MIN_SIZE ((NS_MD5RSA_MIN_BITS+7)/8) -#define NS_MD5RSA_MAX_SIZE ((NS_MD5RSA_MAX_BITS+7)/8) - -#define NS_DSA_SIG_SIZE 41 -#define NS_DSA_MIN_SIZE 213 -#define NS_DSA_MAX_BYTES 405 - -/* Offsets into SIG record rdata to find various values */ -#define NS_SIG_TYPE 0 /* Type flags */ -#define NS_SIG_ALG 2 /* Algorithm */ -#define NS_SIG_LABELS 3 /* How many labels in name */ -#define NS_SIG_OTTL 4 /* Original TTL */ -#define NS_SIG_EXPIR 8 /* Expiration time */ -#define NS_SIG_SIGNED 12 /* Signature time */ -#define NS_SIG_FOOT 16 /* Key footprint */ -#define NS_SIG_SIGNER 18 /* Domain name of who signed it */ - -/* How RR types are represented as bit-flags in NXT records */ -#define NS_NXT_BITS 8 -#define NS_NXT_BIT_SET( n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS))) -#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS))) -#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS))) -#define NS_NXT_MAX 127 - -/* - * EDNS0 extended flags, host order. - */ -#define NS_OPT_DNSSEC_OK 0x8000U - -/* - * Inline versions of get/put short/long. Pointer is advanced. - */ -#define NS_GET16(s, cp) do { \ - register const u_char *t_cp = (const u_char *)(cp); \ - (s) = ((u_int16_t)t_cp[0] << 8) \ - | ((u_int16_t)t_cp[1]) \ - ; \ - (cp) += NS_INT16SZ; \ -} while (0) - -#define NS_GET32(l, cp) do { \ - register const u_char *t_cp = (const u_char *)(cp); \ - (l) = ((u_int32_t)t_cp[0] << 24) \ - | ((u_int32_t)t_cp[1] << 16) \ - | ((u_int32_t)t_cp[2] << 8) \ - | ((u_int32_t)t_cp[3]) \ - ; \ - (cp) += NS_INT32SZ; \ -} while (0) - -#define NS_PUT16(s, cp) do { \ - register u_int16_t t_s = (u_int16_t)(s); \ - register u_char *t_cp = (u_char *)(cp); \ - *t_cp++ = t_s >> 8; \ - *t_cp = t_s; \ - (cp) += NS_INT16SZ; \ -} while (0) - -#define NS_PUT32(l, cp) do { \ - register u_int32_t t_l = (u_int32_t)(l); \ - register u_char *t_cp = (u_char *)(cp); \ - *t_cp++ = t_l >> 24; \ - *t_cp++ = t_l >> 16; \ - *t_cp++ = t_l >> 8; \ - *t_cp = t_l; \ - (cp) += NS_INT32SZ; \ -} while (0) - -/* - * ANSI C identifier hiding for bind's lib/nameser. - */ -#define ns_msg_getflag __ns_msg_getflag -#define ns_get16 __ns_get16 -#define ns_get32 __ns_get32 -#define ns_put16 __ns_put16 -#define ns_put32 __ns_put32 -#define ns_initparse __ns_initparse -#define ns_skiprr __ns_skiprr -#define ns_parserr __ns_parserr -#define ns_sprintrr __ns_sprintrr -#define ns_sprintrrf __ns_sprintrrf -#define ns_format_ttl __ns_format_ttl -#define ns_parse_ttl __ns_parse_ttl -#define ns_datetosecs __ns_datetosecs -#define ns_name_ntol __ns_name_ntol -#define ns_name_ntop __ns_name_ntop -#define ns_name_pton __ns_name_pton -#define ns_name_unpack __ns_name_unpack -#define ns_name_pack __ns_name_pack -#define ns_name_compress __ns_name_compress -#define ns_name_uncompress __ns_name_uncompress -#define ns_name_skip __ns_name_skip -#define ns_name_rollback __ns_name_rollback -#define ns_sign __ns_sign -#define ns_sign2 __ns_sign2 -#define ns_sign_tcp __ns_sign_tcp -#define ns_sign_tcp2 __ns_sign_tcp2 -#define ns_sign_tcp_init __ns_sign_tcp_init -#define ns_find_tsig __ns_find_tsig -#define ns_verify __ns_verify -#define ns_verify_tcp __ns_verify_tcp -#define ns_verify_tcp_init __ns_verify_tcp_init -#define ns_samedomain __ns_samedomain -#define ns_subdomain __ns_subdomain -#define ns_makecanon __ns_makecanon -#define ns_samename __ns_samename - -__BEGIN_DECLS -int ns_msg_getflag __P((ns_msg, int)); -u_int ns_get16 __P((const u_char *)); -u_long ns_get32 __P((const u_char *)); -void ns_put16 __P((u_int, u_char *)); -void ns_put32 __P((u_long, u_char *)); -int ns_initparse __P((const u_char *, int, ns_msg *)); -int ns_skiprr __P((const u_char *, const u_char *, ns_sect, int)); -int ns_parserr __P((ns_msg *, ns_sect, int, ns_rr *)); -int ns_sprintrr __P((const ns_msg *, const ns_rr *, - const char *, const char *, char *, size_t)); -int ns_sprintrrf __P((const u_char *, size_t, const char *, - ns_class, ns_type, u_long, const u_char *, - size_t, const char *, const char *, - char *, size_t)); -int ns_format_ttl __P((u_long, char *, size_t)); -int ns_parse_ttl __P((const char *, u_long *)); -u_int32_t ns_datetosecs __P((const char *cp, int *errp)); -int ns_name_ntol __P((const u_char *, u_char *, size_t)); -int ns_name_ntop __P((const u_char *, char *, size_t)); -int ns_name_pton __P((const char *, u_char *, size_t)); -int ns_name_unpack __P((const u_char *, const u_char *, - const u_char *, u_char *, size_t)); -int ns_name_pack __P((const u_char *, u_char *, int, - const u_char **, const u_char **)); -int ns_name_uncompress __P((const u_char *, const u_char *, - const u_char *, char *, size_t)); -int ns_name_compress __P((const char *, u_char *, size_t, - const u_char **, const u_char **)); -int ns_name_skip __P((const u_char **, const u_char *)); -void ns_name_rollback __P((const u_char *, const u_char **, - const u_char **)); -int ns_sign __P((u_char *, int *, int, int, void *, - const u_char *, int, u_char *, int *, time_t)); -int ns_sign2 __P((u_char *, int *, int, int, void *, - const u_char *, int, u_char *, int *, time_t, - u_char **, u_char **)); -int ns_sign_tcp __P((u_char *, int *, int, int, - ns_tcp_tsig_state *, int)); -int ns_sign_tcp2 __P((u_char *, int *, int, int, - ns_tcp_tsig_state *, int, - u_char **, u_char **)); -int ns_sign_tcp_init __P((void *, const u_char *, int, - ns_tcp_tsig_state *)); -u_char *ns_find_tsig __P((u_char *, u_char *)); -int ns_verify __P((u_char *, int *, void *, - const u_char *, int, u_char *, int *, - time_t *, int)); -int ns_verify_tcp __P((u_char *, int *, ns_tcp_tsig_state *, int)); -int ns_verify_tcp_init __P((void *, const u_char *, int, - ns_tcp_tsig_state *)); -int ns_samedomain __P((const char *, const char *)); -int ns_subdomain __P((const char *, const char *)); -int ns_makecanon __P((const char *, char *, size_t)); -int ns_samename __P((const char *, const char *)); -__END_DECLS - -#ifdef BIND_4_COMPAT -#include <arpa/nameser_compat.h> -#endif - -#endif /* !_ARPA_NAMESER_H_ */ diff --git a/include/arpa/nameser_compat.h b/include/arpa/nameser_compat.h deleted file mode 100644 index 464f12e13aa5..000000000000 --- a/include/arpa/nameser_compat.h +++ /dev/null @@ -1,232 +0,0 @@ -/* Copyright (c) 1983, 1989 - * 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. - */ - -/* - * from nameser.h 8.1 (Berkeley) 6/2/93 - * $Id: nameser_compat.h,v 1.1.2.3.4.2 2004/07/01 04:43:41 marka Exp $ - */ - -#ifndef _ARPA_NAMESER_COMPAT_ -#define _ARPA_NAMESER_COMPAT_ - -#define __BIND 19950621 /* (DEAD) interface version stamp. */ - -#ifndef BYTE_ORDER -#if (BSD >= 199103) -# include <machine/endian.h> -#else -#ifdef __linux -# include <endian.h> -#else -#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */ -#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */ -#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp)*/ - -#if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \ - defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \ - defined(__alpha__) || defined(__alpha) || \ - (defined(__Lynx__) && defined(__x86__)) -#define BYTE_ORDER LITTLE_ENDIAN -#endif - -#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \ - defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \ - defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\ - defined(apollo) || defined(__convex__) || defined(_CRAY) || \ - defined(__hppa) || defined(__hp9000) || \ - defined(__hp9000s300) || defined(__hp9000s700) || \ - defined(__hp3000s900) || defined(__hpux) || defined(MPE) || \ - defined (BIT_ZERO_ON_LEFT) || defined(m68k) || defined(__sparc) || \ - (defined(__Lynx__) && \ - (defined(__68k__) || defined(__sparc__) || defined(__powerpc__))) -#define BYTE_ORDER BIG_ENDIAN -#endif -#endif /* __linux */ -#endif /* BSD */ -#endif /* BYTE_ORDER */ - -#if !defined(BYTE_ORDER) || \ - (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \ - BYTE_ORDER != PDP_ENDIAN) - /* you must determine what the correct bit order is for - * your compiler - the next line is an intentional error - * which will force your compiles to bomb until you fix - * the above macros. - */ - error "Undefined or invalid BYTE_ORDER"; -#endif - -/* - * Structure for query header. The order of the fields is machine- and - * compiler-dependent, depending on the byte/bit order and the layout - * of bit fields. We use bit fields only in int variables, as this - * is all ANSI requires. This requires a somewhat confusing rearrangement. - */ - -typedef struct { - unsigned id :16; /* query identification number */ -#if BYTE_ORDER == BIG_ENDIAN - /* fields in third byte */ - unsigned qr: 1; /* response flag */ - unsigned opcode: 4; /* purpose of message */ - unsigned aa: 1; /* authoritive answer */ - unsigned tc: 1; /* truncated message */ - unsigned rd: 1; /* recursion desired */ - /* fields in fourth byte */ - unsigned ra: 1; /* recursion available */ - unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned ad: 1; /* authentic data from named */ - unsigned cd: 1; /* checking disabled by resolver */ - unsigned rcode :4; /* response code */ -#endif -#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN - /* fields in third byte */ - unsigned rd :1; /* recursion desired */ - unsigned tc :1; /* truncated message */ - unsigned aa :1; /* authoritive answer */ - unsigned opcode :4; /* purpose of message */ - unsigned qr :1; /* response flag */ - /* fields in fourth byte */ - unsigned rcode :4; /* response code */ - unsigned cd: 1; /* checking disabled by resolver */ - unsigned ad: 1; /* authentic data from named */ - unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned ra :1; /* recursion available */ -#endif - /* remaining bytes */ - unsigned qdcount :16; /* number of question entries */ - unsigned ancount :16; /* number of answer entries */ - unsigned nscount :16; /* number of authority entries */ - unsigned arcount :16; /* number of resource entries */ -} HEADER; - -#define PACKETSZ NS_PACKETSZ -#define MAXDNAME NS_MAXDNAME -#define MAXCDNAME NS_MAXCDNAME -#define MAXLABEL NS_MAXLABEL -#define HFIXEDSZ NS_HFIXEDSZ -#define QFIXEDSZ NS_QFIXEDSZ -#define RRFIXEDSZ NS_RRFIXEDSZ -#define INT32SZ NS_INT32SZ -#define INT16SZ NS_INT16SZ -#define INT8SZ NS_INT8SZ -#define INADDRSZ NS_INADDRSZ -#define IN6ADDRSZ NS_IN6ADDRSZ -#define INDIR_MASK NS_CMPRSFLGS -#define NAMESERVER_PORT NS_DEFAULTPORT - -#define S_ZONE ns_s_zn -#define S_PREREQ ns_s_pr -#define S_UPDATE ns_s_ud -#define S_ADDT ns_s_ar - -#define QUERY ns_o_query -#define IQUERY ns_o_iquery -#define STATUS ns_o_status -#define NS_NOTIFY_OP ns_o_notify -#define NS_UPDATE_OP ns_o_update - -#define NOERROR ns_r_noerror -#define FORMERR ns_r_formerr -#define SERVFAIL ns_r_servfail -#define NXDOMAIN ns_r_nxdomain -#define NOTIMP ns_r_notimpl -#define REFUSED ns_r_refused -#define YXDOMAIN ns_r_yxdomain -#define YXRRSET ns_r_yxrrset -#define NXRRSET ns_r_nxrrset -#define NOTAUTH ns_r_notauth -#define NOTZONE ns_r_notzone -/*#define BADSIG ns_r_badsig*/ -/*#define BADKEY ns_r_badkey*/ -/*#define BADTIME ns_r_badtime*/ - - -#define DELETE ns_uop_delete -#define ADD ns_uop_add - -#define T_A ns_t_a -#define T_NS ns_t_ns -#define T_MD ns_t_md -#define T_MF ns_t_mf -#define T_CNAME ns_t_cname -#define T_SOA ns_t_soa -#define T_MB ns_t_mb -#define T_MG ns_t_mg -#define T_MR ns_t_mr -#define T_NULL ns_t_null -#define T_WKS ns_t_wks -#define T_PTR ns_t_ptr -#define T_HINFO ns_t_hinfo -#define T_MINFO ns_t_minfo -#define T_MX ns_t_mx -#define T_TXT ns_t_txt -#define T_RP ns_t_rp -#define T_AFSDB ns_t_afsdb -#define T_X25 ns_t_x25 -#define T_ISDN ns_t_isdn -#define T_RT ns_t_rt -#define T_NSAP ns_t_nsap -#define T_NSAP_PTR ns_t_nsap_ptr -#define T_SIG ns_t_sig -#define T_KEY ns_t_key -#define T_PX ns_t_px -#define T_GPOS ns_t_gpos -#define T_AAAA ns_t_aaaa -#define T_LOC ns_t_loc -#define T_NXT ns_t_nxt -#define T_EID ns_t_eid -#define T_NIMLOC ns_t_nimloc -#define T_SRV ns_t_srv -#define T_ATMA ns_t_atma -#define T_NAPTR ns_t_naptr -#define T_A6 ns_t_a6 -#define T_TSIG ns_t_tsig -#define T_IXFR ns_t_ixfr -#define T_AXFR ns_t_axfr -#define T_MAILB ns_t_mailb -#define T_MAILA ns_t_maila -#define T_ANY ns_t_any - -#define C_IN ns_c_in -#define C_CHAOS ns_c_chaos -#define C_HS ns_c_hs -/* BIND_UPDATE */ -#define C_NONE ns_c_none -#define C_ANY ns_c_any - -#define GETSHORT NS_GET16 -#define GETLONG NS_GET32 -#define PUTSHORT NS_PUT16 -#define PUTLONG NS_PUT32 - -#endif /* _ARPA_NAMESER_COMPAT_ */ diff --git a/include/res_update.h b/include/res_update.h deleted file mode 100644 index 07a37f34c264..000000000000 --- a/include/res_update.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1999 by Internet Software Consortium, Inc. - * - * 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: res_update.h,v 1.1.206.1 2004/03/09 08:33:29 marka Exp $ - */ - -#ifndef __RES_UPDATE_H -#define __RES_UPDATE_H - -#include <sys/types.h> -#include <arpa/nameser.h> -#include <isc/list.h> -#include <resolv.h> - -/* - * This RR-like structure is particular to UPDATE. - */ -struct ns_updrec { - LINK(struct ns_updrec) r_link, r_glink; - ns_sect r_section; /* ZONE/PREREQUISITE/UPDATE */ - char * r_dname; /* owner of the RR */ - ns_class r_class; /* class number */ - ns_type r_type; /* type number */ - u_int32_t r_ttl; /* time to live */ - u_char * r_data; /* rdata fields as text string */ - u_int r_size; /* size of r_data field */ - int r_opcode; /* type of operation */ - /* following fields for private use by the resolver/server routines */ - struct databuf *r_dp; /* databuf to process */ - struct databuf *r_deldp; /* databuf's deleted/overwritten */ - u_int r_zone; /* zone number on server */ -}; -typedef struct ns_updrec ns_updrec; -typedef LIST(ns_updrec) ns_updque; - -#define res_mkupdate __res_mkupdate -#define res_update __res_update -#define res_mkupdrec __res_mkupdrec -#define res_freeupdrec __res_freeupdrec -#define res_nmkupdate __res_nmkupdate -#define res_nupdate __res_nupdate - -int res_mkupdate __P((ns_updrec *, u_char *, int)); -int res_update __P((ns_updrec *)); -ns_updrec * res_mkupdrec __P((int, const char *, u_int, u_int, u_long)); -void res_freeupdrec __P((ns_updrec *)); -int res_nmkupdate __P((res_state, ns_updrec *, u_char *, int)); -int res_nupdate __P((res_state, ns_updrec *, ns_tsig_key *)); - -#endif /*__RES_UPDATE_H*/ diff --git a/include/resolv.h b/include/resolv.h deleted file mode 100644 index 87a95200bb95..000000000000 --- a/include/resolv.h +++ /dev/null @@ -1,506 +0,0 @@ -/* - * Copyright (c) 1983, 1987, 1989 - * 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. - */ - -/* - * @(#)resolv.h 8.1 (Berkeley) 6/2/93 - * $Id: resolv.h,v 1.7.2.11.4.3 2005/08/25 04:44:13 marka Exp $ - */ - -#ifndef _RESOLV_H_ -#define _RESOLV_H_ - -#include <sys/param.h> -#if (!defined(BSD)) || (BSD < 199306) -# include <sys/bitypes.h> -#else -# include <sys/types.h> -#endif -#include <sys/cdefs.h> -#include <sys/socket.h> -#include <stdio.h> -#include <arpa/nameser.h> - -/* - * Revision information. This is the release date in YYYYMMDD format. - * It can change every day so the right thing to do with it is use it - * in preprocessor commands such as "#if (__RES > 19931104)". Do not - * compare for equality; rather, use it to determine whether your resolver - * is new enough to contain a certain feature. - */ - -#define __RES 20030124 - -/* - * This used to be defined in res_query.c, now it's in herror.c. - * [XXX no it's not. It's in irs/irs_data.c] - * It was - * never extern'd by any *.h file before it was placed here. For thread - * aware programs, the last h_errno value set is stored in res->h_errno. - * - * XXX: There doesn't seem to be a good reason for exposing RES_SET_H_ERRNO - * (and __h_errno_set) to the public via <resolv.h>. - * XXX: __h_errno_set is really part of IRS, not part of the resolver. - * If somebody wants to build and use a resolver that doesn't use IRS, - * what do they do? Perhaps something like - * #ifdef WANT_IRS - * # define RES_SET_H_ERRNO(r,x) __h_errno_set(r,x) - * #else - * # define RES_SET_H_ERRNO(r,x) (h_errno = (r)->res_h_errno = (x)) - * #endif - */ - -#define RES_SET_H_ERRNO(r,x) __h_errno_set(r,x) -struct __res_state; /* forward */ -__BEGIN_DECLS -void __h_errno_set(struct __res_state *res, int err); -__END_DECLS - -/* - * Resolver configuration file. - * Normally not present, but may contain the address of the - * initial name server(s) to query and the domain search list. - */ - -#ifndef _PATH_RESCONF -#define _PATH_RESCONF "/etc/resolv.conf" -#endif - -typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error } - res_sendhookact; - -#ifndef __PMT -#if defined(__STDC__) || defined(__cplusplus) -#define __PMT(args) args -#else -#define __PMT(args) () -#endif -#endif - -typedef res_sendhookact (*res_send_qhook)__PMT((struct sockaddr * const *, - const u_char **, int *, - u_char *, int, int *)); - -typedef res_sendhookact (*res_send_rhook)__PMT((const struct sockaddr *, - const u_char *, int, u_char *, - int, int *)); - -struct res_sym { - int number; /* Identifying number, like T_MX */ - const char * name; /* Its symbolic name, like "MX" */ - const char * humanname; /* Its fun name, like "mail exchanger" */ -}; - -/* - * Global defines and variables for resolver stub. - */ -#define MAXNS 3 /* max # name servers we'll track */ -#define MAXDFLSRCH 3 /* # default domain levels to try */ -#define MAXDNSRCH 6 /* max # domains in search path */ -#define LOCALDOMAINPARTS 2 /* min levels in name that is "local" */ - -#define RES_TIMEOUT 5 /* min. seconds between retries */ -#define MAXRESOLVSORT 10 /* number of net to sort on */ -#define RES_MAXNDOTS 15 /* should reflect bit field size */ -#define RES_MAXRETRANS 30 /* only for resolv.conf/RES_OPTIONS */ -#define RES_MAXRETRY 5 /* only for resolv.conf/RES_OPTIONS */ -#define RES_DFLRETRY 2 /* Default #/tries. */ -#define RES_MAXTIME 65535 /* Infinity, in milliseconds. */ - -struct __res_state_ext; - -struct __res_state { - int retrans; /* retransmission time interval */ - int retry; /* number of times to retransmit */ -#ifdef sun - u_int options; /* option flags - see below. */ -#else - u_long options; /* option flags - see below. */ -#endif - int nscount; /* number of name servers */ - struct sockaddr_in - nsaddr_list[MAXNS]; /* address of name server */ -#define nsaddr nsaddr_list[0] /* for backward compatibility */ - u_short id; /* current message id */ - char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */ - char defdname[256]; /* default domain (deprecated) */ -#ifdef sun - u_int pfcode; /* RES_PRF_ flags - see below. */ -#else - u_long pfcode; /* RES_PRF_ flags - see below. */ -#endif - unsigned ndots:4; /* threshold for initial abs. query */ - unsigned nsort:4; /* number of elements in sort_list[] */ - char unused[3]; - struct { - struct in_addr addr; - u_int32_t mask; - } sort_list[MAXRESOLVSORT]; - res_send_qhook qhook; /* query hook */ - res_send_rhook rhook; /* response hook */ - int res_h_errno; /* last one set for this context */ - int _vcsock; /* PRIVATE: for res_send VC i/o */ - u_int _flags; /* PRIVATE: see below */ - u_int _pad; /* make _u 64 bit aligned */ - union { - /* On an 32-bit arch this means 512b total. */ - char pad[72 - 4*sizeof (int) - 2*sizeof (void *)]; - struct { - u_int16_t nscount; - u_int16_t nstimes[MAXNS]; /* ms. */ - int nssocks[MAXNS]; - struct __res_state_ext *ext; /* extention for IPv6 */ - } _ext; - } _u; -}; - -typedef struct __res_state *res_state; - -union res_sockaddr_union { - struct sockaddr_in sin; -#ifdef IN6ADDR_ANY_INIT - struct sockaddr_in6 sin6; -#endif -#ifdef ISC_ALIGN64 - int64_t __align64; /* 64bit alignment */ -#else - int32_t __align32; /* 32bit alignment */ -#endif - char __space[128]; /* max size */ -}; - -/* - * Resolver flags (used to be discrete per-module statics ints). - */ -#define RES_F_VC 0x00000001 /* socket is TCP */ -#define RES_F_CONN 0x00000002 /* socket is connected */ -#define RES_F_EDNS0ERR 0x00000004 /* EDNS0 caused errors */ -#define RES_F__UNUSED 0x00000008 /* (unused) */ -#define RES_F_LASTMASK 0x000000F0 /* ordinal server of last res_nsend */ -#define RES_F_LASTSHIFT 4 /* bit position of LASTMASK "flag" */ -#define RES_GETLAST(res) (((res)._flags & RES_F_LASTMASK) >> RES_F_LASTSHIFT) - -/* res_findzonecut2() options */ -#define RES_EXHAUSTIVE 0x00000001 /* always do all queries */ -#define RES_IPV4ONLY 0x00000002 /* IPv4 only */ -#define RES_IPV6ONLY 0x00000004 /* IPv6 only */ - -/* - * Resolver options (keep these in synch with res_debug.c, please) - */ -#define RES_INIT 0x00000001 /* address initialized */ -#define RES_DEBUG 0x00000002 /* print debug messages */ -#define RES_AAONLY 0x00000004 /* authoritative answers only (!IMPL)*/ -#define RES_USEVC 0x00000008 /* use virtual circuit */ -#define RES_PRIMARY 0x00000010 /* query primary server only (!IMPL) */ -#define RES_IGNTC 0x00000020 /* ignore trucation errors */ -#define RES_RECURSE 0x00000040 /* recursion desired */ -#define RES_DEFNAMES 0x00000080 /* use default domain name */ -#define RES_STAYOPEN 0x00000100 /* Keep TCP socket open */ -#define RES_DNSRCH 0x00000200 /* search up local domain tree */ -#define RES_INSECURE1 0x00000400 /* type 1 security disabled */ -#define RES_INSECURE2 0x00000800 /* type 2 security disabled */ -#define RES_NOALIASES 0x00001000 /* shuts off HOSTALIASES feature */ -#define RES_USE_INET6 0x00002000 /* use/map IPv6 in gethostbyname() */ -#define RES_ROTATE 0x00004000 /* rotate ns list after each query */ -#define RES_NOCHECKNAME 0x00008000 /* do not check names for sanity. */ -#define RES_KEEPTSIG 0x00010000 /* do not strip TSIG records */ -#define RES_BLAST 0x00020000 /* blast all recursive servers */ -#define RES_NOTLDQUERY 0x00100000 /* don't unqualified name as a tld */ -#define RES_USE_DNSSEC 0x00200000 /* use DNSSEC using OK bit in OPT */ -/* #define RES_DEBUG2 0x00400000 */ /* nslookup internal */ -/* KAME extensions: use higher bit to avoid conflict with ISC use */ -#define RES_USE_DNAME 0x10000000 /* use DNAME */ -#define RES_USE_EDNS0 0x40000000 /* use EDNS0 if configured */ -#define RES_NO_NIBBLE2 0x80000000 /* disable alternate nibble lookup */ - -#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | \ - RES_DNSRCH | RES_NO_NIBBLE2) - -/* - * Resolver "pfcode" values. Used by dig. - */ -#define RES_PRF_STATS 0x00000001 -#define RES_PRF_UPDATE 0x00000002 -#define RES_PRF_CLASS 0x00000004 -#define RES_PRF_CMD 0x00000008 -#define RES_PRF_QUES 0x00000010 -#define RES_PRF_ANS 0x00000020 -#define RES_PRF_AUTH 0x00000040 -#define RES_PRF_ADD 0x00000080 -#define RES_PRF_HEAD1 0x00000100 -#define RES_PRF_HEAD2 0x00000200 -#define RES_PRF_TTLID 0x00000400 -#define RES_PRF_HEADX 0x00000800 -#define RES_PRF_QUERY 0x00001000 -#define RES_PRF_REPLY 0x00002000 -#define RES_PRF_INIT 0x00004000 -#define RES_PRF_TRUNC 0x00008000 -/* 0x00010000 */ - -/* Things involving an internal (static) resolver context. */ -#ifdef _REENTRANT -__BEGIN_DECLS -extern struct __res_state *__res_state(void); -__END_DECLS -#define _res (*__res_state()) -#else -#ifdef __linux -__BEGIN_DECLS -extern struct __res_state * __res_state(void); -__END_DECLS -#endif -#ifndef __BIND_NOSTATIC -extern struct __res_state _res; -#endif -#endif - -#ifndef __BIND_NOSTATIC -#define fp_nquery __fp_nquery -#define fp_query __fp_query -#define hostalias __hostalias -#define p_query __p_query -#define res_close __res_close -#define res_init __res_init -#define res_isourserver __res_isourserver -#define res_mkquery __res_mkquery -#define res_query __res_query -#define res_querydomain __res_querydomain -#define res_search __res_search -#define res_send __res_send -#define res_sendsigned __res_sendsigned - -__BEGIN_DECLS -void fp_nquery __P((const u_char *, int, FILE *)); -void fp_query __P((const u_char *, FILE *)); -const char * hostalias __P((const char *)); -void p_query __P((const u_char *)); -void res_close __P((void)); -int res_init __P((void)); -int res_isourserver __P((const struct sockaddr_in *)); -int res_mkquery __P((int, const char *, int, int, const u_char *, - int, const u_char *, u_char *, int)); -int res_query __P((const char *, int, int, u_char *, int)); -int res_querydomain __P((const char *, const char *, int, int, - u_char *, int)); -int res_search __P((const char *, int, int, u_char *, int)); -int res_send __P((const u_char *, int, u_char *, int)); -int res_sendsigned __P((const u_char *, int, ns_tsig_key *, - u_char *, int)); -__END_DECLS -#endif - -#if !defined(SHARED_LIBBIND) || defined(LIB) -/* - * If libbind is a shared object (well, DLL anyway) - * these externs break the linker when resolv.h is - * included by a lib client (like named) - * Make them go away if a client is including this - * - */ -extern const struct res_sym __p_key_syms[]; -extern const struct res_sym __p_cert_syms[]; -extern const struct res_sym __p_class_syms[]; -extern const struct res_sym __p_type_syms[]; -extern const struct res_sym __p_rcode_syms[]; -#endif /* SHARED_LIBBIND */ - -#define b64_ntop __b64_ntop -#define b64_pton __b64_pton -#define dn_comp __dn_comp -#define dn_count_labels __dn_count_labels -#define dn_expand __dn_expand -#define dn_skipname __dn_skipname -#define fp_resstat __fp_resstat -#define loc_aton __loc_aton -#define loc_ntoa __loc_ntoa -#define p_cdname __p_cdname -#define p_cdnname __p_cdnname -#define p_class __p_class -#define p_fqname __p_fqname -#define p_fqnname __p_fqnname -#define p_option __p_option -#define p_secstodate __p_secstodate -#define p_section __p_section -#define p_time __p_time -#define p_type __p_type -#define p_rcode __p_rcode -#define p_sockun __p_sockun -#define putlong __putlong -#define putshort __putshort -#define res_dnok __res_dnok -#define res_findzonecut __res_findzonecut -#define res_findzonecut2 __res_findzonecut2 -#define res_hnok __res_hnok -#define res_hostalias __res_hostalias -#define res_mailok __res_mailok -#define res_nameinquery __res_nameinquery -#define res_nclose __res_nclose -#define res_ninit __res_ninit -#define res_nmkquery __res_nmkquery -#define res_pquery __res_pquery -#define res_nquery __res_nquery -#define res_nquerydomain __res_nquerydomain -#define res_nsearch __res_nsearch -#define res_nsend __res_nsend -#define res_nsendsigned __res_nsendsigned -#define res_nisourserver __res_nisourserver -#define res_ownok __res_ownok -#define res_queriesmatch __res_queriesmatch -#define res_randomid __res_randomid -#define sym_ntop __sym_ntop -#define sym_ntos __sym_ntos -#define sym_ston __sym_ston -#define res_nopt __res_nopt -#define res_ndestroy __res_ndestroy -#define res_nametoclass __res_nametoclass -#define res_nametotype __res_nametotype -#define res_setservers __res_setservers -#define res_getservers __res_getservers -#define res_buildprotolist __res_buildprotolist -#define res_destroyprotolist __res_destroyprotolist -#define res_destroyservicelist __res_destroyservicelist -#define res_get_nibblesuffix __res_get_nibblesuffix -#define res_get_nibblesuffix2 __res_get_nibblesuffix2 -#define res_ourserver_p __res_ourserver_p -#define res_protocolname __res_protocolname -#define res_protocolnumber __res_protocolnumber -#define res_send_setqhook __res_send_setqhook -#define res_send_setrhook __res_send_setrhook -#define res_servicename __res_servicename -#define res_servicenumber __res_servicenumber -__BEGIN_DECLS -int res_hnok __P((const char *)); -int res_ownok __P((const char *)); -int res_mailok __P((const char *)); -int res_dnok __P((const char *)); -int sym_ston __P((const struct res_sym *, const char *, int *)); -const char * sym_ntos __P((const struct res_sym *, int, int *)); -const char * sym_ntop __P((const struct res_sym *, int, int *)); -int b64_ntop __P((u_char const *, size_t, char *, size_t)); -int b64_pton __P((char const *, u_char *, size_t)); -int loc_aton __P((const char *, u_char *)); -const char * loc_ntoa __P((const u_char *, char *)); -int dn_skipname __P((const u_char *, const u_char *)); -void putlong __P((u_int32_t, u_char *)); -void putshort __P((u_int16_t, u_char *)); -#ifndef __ultrix__ -u_int16_t _getshort __P((const u_char *)); -u_int32_t _getlong __P((const u_char *)); -#endif -const char * p_class __P((int)); -const char * p_time __P((u_int32_t)); -const char * p_type __P((int)); -const char * p_rcode __P((int)); -const char * p_sockun __P((union res_sockaddr_union, char *, size_t)); -const u_char * p_cdnname __P((const u_char *, const u_char *, int, FILE *)); -const u_char * p_cdname __P((const u_char *, const u_char *, FILE *)); -const u_char * p_fqnname __P((const u_char *, const u_char *, - int, char *, int)); -const u_char * p_fqname __P((const u_char *, const u_char *, FILE *)); -const char * p_option __P((u_long)); -char * p_secstodate __P((u_long)); -int dn_count_labels __P((const char *)); -int dn_comp __P((const char *, u_char *, int, - u_char **, u_char **)); -int dn_expand __P((const u_char *, const u_char *, const u_char *, - char *, int)); -u_int res_randomid __P((void)); -int res_nameinquery __P((const char *, int, int, const u_char *, - const u_char *)); -int res_queriesmatch __P((const u_char *, const u_char *, - const u_char *, const u_char *)); -const char * p_section __P((int, int)); -/* Things involving a resolver context. */ -int res_ninit __P((res_state)); -int res_nisourserver __P((const res_state, - const struct sockaddr_in *)); -void fp_resstat __P((const res_state, FILE *)); -void res_pquery __P((const res_state, const u_char *, int, FILE *)); -const char * res_hostalias __P((const res_state, const char *, - char *, size_t)); -int res_nquery __P((res_state, const char *, int, int, - u_char *, int)); -int res_nsearch __P((res_state, const char *, int, int, u_char *, - int)); -int res_nquerydomain __P((res_state, const char *, const char *, - int, int, u_char *, int)); -int res_nmkquery __P((res_state, int, const char *, int, int, - const u_char *, int, const u_char *, - u_char *, int)); -int res_nsend __P((res_state, const u_char *, int, u_char *, int)); -int res_nsendsigned __P((res_state, const u_char *, int, - ns_tsig_key *, u_char *, int)); -int res_findzonecut __P((res_state, const char *, ns_class, int, - char *, size_t, struct in_addr *, int)); -int res_findzonecut2 __P((res_state, const char *, ns_class, int, - char *, size_t, - union res_sockaddr_union *, int)); -void res_nclose __P((res_state)); -int res_nopt __P((res_state, int, u_char *, int, int)); -void res_send_setqhook __P((res_send_qhook)); -void res_send_setrhook __P((res_send_rhook)); -int __res_vinit __P((res_state, int)); -void res_destroyservicelist __P((void)); -const char * res_servicename __P((u_int16_t, const char *)); -const char * res_protocolname __P((int)); -void res_destroyprotolist __P((void)); -void res_buildprotolist __P((void)); -const char * res_get_nibblesuffix __P((res_state)); -const char * res_get_nibblesuffix2 __P((res_state)); -void res_ndestroy __P((res_state)); -u_int16_t res_nametoclass __P((const char *, int *)); -u_int16_t res_nametotype __P((const char *, int *)); -void res_setservers __P((res_state, - const union res_sockaddr_union *, int)); -int res_getservers __P((res_state, - union res_sockaddr_union *, int)); -__END_DECLS - -#endif /* !_RESOLV_H_ */ diff --git a/lib/libc/include/isc/eventlib.h b/lib/libc/include/isc/eventlib.h deleted file mode 100644 index 033b3123d7cc..000000000000 --- a/lib/libc/include/isc/eventlib.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1995-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. - */ - -/* eventlib.h - exported interfaces for eventlib - * vix 09sep95 [initial] - * - * $Id: eventlib.h,v 1.1.2.1.4.2 2005/07/28 07:43:18 marka Exp $ - */ - -#ifndef _EVENTLIB_H -#define _EVENTLIB_H - -#include <sys/types.h> -#include <sys/uio.h> -#include <sys/time.h> -#include <stdio.h> - -#ifndef __P -# define __EVENTLIB_P_DEFINED -# ifdef __STDC__ -# define __P(x) x -# else -# define __P(x) () -# endif -#endif - -/* In the absence of branded types... */ -typedef struct { void *opaque; } evConnID; -typedef struct { void *opaque; } evFileID; -typedef struct { void *opaque; } evStreamID; -typedef struct { void *opaque; } evTimerID; -typedef struct { void *opaque; } evWaitID; -typedef struct { void *opaque; } evContext; -typedef struct { void *opaque; } evEvent; - -#define evInitID(id) ((id)->opaque = NULL) -#define evTestID(id) ((id).opaque != NULL) - -typedef void (*evConnFunc)__P((evContext, void *, int, const void *, int, - const void *, int)); -typedef void (*evFileFunc)__P((evContext, void *, int, int)); -typedef void (*evStreamFunc)__P((evContext, void *, int, int)); -typedef void (*evTimerFunc)__P((evContext, void *, - struct timespec, struct timespec)); -typedef void (*evWaitFunc)__P((evContext, void *, const void *)); - -typedef struct { unsigned char mask[256/8]; } evByteMask; -#define EV_BYTEMASK_BYTE(b) ((b) / 8) -#define EV_BYTEMASK_MASK(b) (1 << ((b) % 8)) -#define EV_BYTEMASK_SET(bm, b) \ - ((bm).mask[EV_BYTEMASK_BYTE(b)] |= EV_BYTEMASK_MASK(b)) -#define EV_BYTEMASK_CLR(bm, b) \ - ((bm).mask[EV_BYTEMASK_BYTE(b)] &= ~EV_BYTEMASK_MASK(b)) -#define EV_BYTEMASK_TST(bm, b) \ - ((bm).mask[EV_BYTEMASK_BYTE(b)] & EV_BYTEMASK_MASK(b)) - -#define EV_POLL 1 -#define EV_WAIT 2 -#define EV_NULL 4 - -#define EV_READ 1 -#define EV_WRITE 2 -#define EV_EXCEPT 4 - -#define EV_WASNONBLOCKING 8 /* Internal library use. */ - -/* eventlib.c */ -#define evCreate __evCreate -#define evSetDebug __evSetDebug -#define evDestroy __evDestroy -#define evGetNext __evGetNext -#define evDispatch __evDispatch -#define evDrop __evDrop -#define evMainLoop __evMainLoop -#define evHighestFD __evHighestFD -#define evGetOption __evGetOption -#define evSetOption __evSetOption - -int evCreate __P((evContext *)); -void evSetDebug __P((evContext, int, FILE *)); -int evDestroy __P((evContext)); -int evGetNext __P((evContext, evEvent *, int)); -int evDispatch __P((evContext, evEvent)); -void evDrop __P((evContext, evEvent)); -int evMainLoop __P((evContext)); -int evHighestFD __P((evContext)); -int evGetOption __P((evContext *, const char *, int *)); -int evSetOption __P((evContext *, const char *, int)); - -/* ev_connects.c */ -#define evListen __evListen -#define evConnect __evConnect -#define evCancelConn __evCancelConn -#define evHold __evHold -#define evUnhold __evUnhold -#define evTryAccept __evTryAccept - -int evListen __P((evContext, int, int, evConnFunc, void *, evConnID *)); -int evConnect __P((evContext, int, const void *, int, - evConnFunc, void *, evConnID *)); -int evCancelConn __P((evContext, evConnID)); -int evHold __P((evContext, evConnID)); -int evUnhold __P((evContext, evConnID)); -int evTryAccept __P((evContext, evConnID, int *)); - -/* ev_files.c */ -#define evSelectFD __evSelectFD -#define evDeselectFD __evDeselectFD - -int evSelectFD __P((evContext, int, int, evFileFunc, void *, evFileID *)); -int evDeselectFD __P((evContext, evFileID)); - -/* ev_streams.c */ -#define evConsIovec __evConsIovec -#define evWrite __evWrite -#define evRead __evRead -#define evTimeRW __evTimeRW -#define evUntimeRW __evUntimeRW -#define evCancelRW __evCancelRW - -struct iovec evConsIovec __P((void *, size_t)); -int evWrite __P((evContext, int, const struct iovec *, int, - evStreamFunc func, void *, evStreamID *)); -int evRead __P((evContext, int, const struct iovec *, int, - evStreamFunc func, void *, evStreamID *)); -int evTimeRW __P((evContext, evStreamID, evTimerID timer)); -int evUntimeRW __P((evContext, evStreamID)); -int evCancelRW __P((evContext, evStreamID)); - -/* ev_timers.c */ -#define evConsTime __evConsTime -#define evAddTime __evAddTime -#define evSubTime __evSubTime -#define evCmpTime __evCmpTime -#define evTimeSpec __evTimeSpec -#define evTimeVal __evTimeVal - -#define evNowTime __evNowTime -#define evUTCTime __evUTCTime -#define evLastEventTime __evLastEventTime -#define evSetTimer __evSetTimer -#define evClearTimer __evClearTimer -#define evConfigTimer __evConfigTimer -#define evResetTimer __evResetTimer -#define evSetIdleTimer __evSetIdleTimer -#define evClearIdleTimer __evClearIdleTimer -#define evResetIdleTimer __evResetIdleTimer -#define evTouchIdleTimer __evTouchIdleTimer - -struct timespec evConsTime __P((time_t sec, long nsec)); -struct timespec evAddTime __P((struct timespec, struct timespec)); -struct timespec evSubTime __P((struct timespec, struct timespec)); -struct timespec evNowTime __P((void)); -struct timespec evUTCTime __P((void)); -struct timespec evLastEventTime __P((evContext)); -struct timespec evTimeSpec __P((struct timeval)); -struct timeval evTimeVal __P((struct timespec)); -int evCmpTime __P((struct timespec, struct timespec)); -int evSetTimer __P((evContext, evTimerFunc, void *, struct timespec, - struct timespec, evTimerID *)); -int evClearTimer __P((evContext, evTimerID)); -int evConfigTimer __P((evContext, evTimerID, const char *param, - int value)); -int evResetTimer __P((evContext, evTimerID, evTimerFunc, void *, - struct timespec, struct timespec)); -int evSetIdleTimer __P((evContext, evTimerFunc, void *, struct timespec, - evTimerID *)); -int evClearIdleTimer __P((evContext, evTimerID)); -int evResetIdleTimer __P((evContext, evTimerID, evTimerFunc, void *, - struct timespec)); -int evTouchIdleTimer __P((evContext, evTimerID)); - -/* ev_waits.c */ -#define evWaitFor __evWaitFor -#define evDo __evDo -#define evUnwait __evUnwait -#define evDefer __evDefer - -int evWaitFor __P((evContext, const void *, evWaitFunc, void *, evWaitID *)); -int evDo __P((evContext, const void *)); -int evUnwait __P((evContext, evWaitID)); -int evDefer __P((evContext, evWaitFunc, void *)); - -#ifdef __EVENTLIB_P_DEFINED -# undef __P -#endif - -#endif /*_EVENTLIB_H*/ diff --git a/lib/libc/include/isc/list.h b/lib/libc/include/isc/list.h deleted file mode 100644 index ad574ac2b587..000000000000 --- a/lib/libc/include/isc/list.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1997,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. - */ - -#ifndef LIST_H -#define LIST_H 1 -#include <isc/assertions.h> - -#define LIST(type) struct { type *head, *tail; } -#define INIT_LIST(list) \ - do { (list).head = NULL; (list).tail = NULL; } while (0) - -#define LINK(type) struct { type *prev, *next; } -#define INIT_LINK_TYPE(elt, link, type) \ - do { \ - (elt)->link.prev = (type *)(-1); \ - (elt)->link.next = (type *)(-1); \ - } while (0) -#define INIT_LINK(elt, link) \ - INIT_LINK_TYPE(elt, link, void) -#define LINKED(elt, link) ((void *)((elt)->link.prev) != (void *)(-1)) - -#define HEAD(list) ((list).head) -#define TAIL(list) ((list).tail) -#define EMPTY(list) ((list).head == NULL) - -#define PREPEND(list, elt, link) \ - do { \ - INSIST(!LINKED(elt, link));\ - if ((list).head != NULL) \ - (list).head->link.prev = (elt); \ - else \ - (list).tail = (elt); \ - (elt)->link.prev = NULL; \ - (elt)->link.next = (list).head; \ - (list).head = (elt); \ - } while (0) - -#define APPEND(list, elt, link) \ - do { \ - INSIST(!LINKED(elt, link));\ - if ((list).tail != NULL) \ - (list).tail->link.next = (elt); \ - else \ - (list).head = (elt); \ - (elt)->link.prev = (list).tail; \ - (elt)->link.next = NULL; \ - (list).tail = (elt); \ - } while (0) - -#define UNLINK_TYPE(list, elt, link, type) \ - do { \ - INSIST(LINKED(elt, link));\ - if ((elt)->link.next != NULL) \ - (elt)->link.next->link.prev = (elt)->link.prev; \ - else \ - (list).tail = (elt)->link.prev; \ - if ((elt)->link.prev != NULL) \ - (elt)->link.prev->link.next = (elt)->link.next; \ - else \ - (list).head = (elt)->link.next; \ - INIT_LINK_TYPE(elt, link, type); \ - } while (0) -#define UNLINK(list, elt, link) \ - UNLINK_TYPE(list, elt, link, void) - -#define PREV(elt, link) ((elt)->link.prev) -#define NEXT(elt, link) ((elt)->link.next) - -#define INSERT_BEFORE(list, before, elt, link) \ - do { \ - INSIST(!LINKED(elt, link));\ - if ((before)->link.prev == NULL) \ - PREPEND(list, elt, link); \ - else { \ - (elt)->link.prev = (before)->link.prev; \ - (before)->link.prev = (elt); \ - (elt)->link.prev->link.next = (elt); \ - (elt)->link.next = (before); \ - } \ - } while (0) - -#define INSERT_AFTER(list, after, elt, link) \ - do { \ - INSIST(!LINKED(elt, link));\ - if ((after)->link.next == NULL) \ - APPEND(list, elt, link); \ - else { \ - (elt)->link.next = (after)->link.next; \ - (after)->link.next = (elt); \ - (elt)->link.next->link.prev = (elt); \ - (elt)->link.prev = (after); \ - } \ - } while (0) - -#define ENQUEUE(list, elt, link) APPEND(list, elt, link) -#define DEQUEUE(list, elt, link) UNLINK(list, elt, link) - -#endif /* LIST_H */ diff --git a/lib/libc/include/resolv_mt.h b/lib/libc/include/resolv_mt.h deleted file mode 100644 index 27963a12077a..000000000000 --- a/lib/libc/include/resolv_mt.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _RESOLV_MT_H -#define _RESOLV_MT_H - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -/* Access functions for the libresolv private interface */ - -int __res_enable_mt(void); -int __res_disable_mt(void); - -/* Per-thread context */ - -typedef struct { -int no_hosts_fallback_private; -int retry_save; -int retry_private; -char inet_nsap_ntoa_tmpbuf[255*3]; -char sym_ntos_unname[20]; -char sym_ntop_unname[20]; -char p_option_nbuf[40]; -char p_time_nbuf[40]; -char precsize_ntoa_retbuf[sizeof "90000000.00"]; -char loc_ntoa_tmpbuf[sizeof -"1000 60 60.000 N 1000 60 60.000 W -12345678.00m 90000000.00m 90000000.00m 90000000.00m"]; -char p_secstodate_output[15]; -} mtctxres_t; - -/* Thread-specific data (TSD) */ - -mtctxres_t *___mtctxres(void); -#define mtctxres (___mtctxres()) - -/* Various static data that should be TSD */ - -#define sym_ntos_unname (mtctxres->sym_ntos_unname) -#define sym_ntop_unname (mtctxres->sym_ntop_unname) -#define inet_nsap_ntoa_tmpbuf (mtctxres->inet_nsap_ntoa_tmpbuf) -#define p_option_nbuf (mtctxres->p_option_nbuf) -#define p_time_nbuf (mtctxres->p_time_nbuf) -#define precsize_ntoa_retbuf (mtctxres->precsize_ntoa_retbuf) -#define loc_ntoa_tmpbuf (mtctxres->loc_ntoa_tmpbuf) -#define p_secstodate_output (mtctxres->p_secstodate_output) - -#endif /* _RESOLV_MT_H */ diff --git a/lib/libc/inet/inet_addr.c b/lib/libc/inet/inet_addr.c deleted file mode 100644 index b967dc22039c..000000000000 --- a/lib/libc/inet/inet_addr.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 1983, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Copyright (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 sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93"; -static const char rcsid[] = "$Id: inet_addr.c,v 1.2.206.2 2004/03/17 00:29:45 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/param.h> - -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <ctype.h> - -#include "port_after.h" - -/* - * Ascii internet address interpretation routine. - * The value returned is in network order. - */ -u_long -inet_addr(const char *cp) { - struct in_addr val; - - if (inet_aton(cp, &val)) - return (val.s_addr); - return (INADDR_NONE); -} - -/* - * Check whether "cp" is a valid ascii representation - * of an Internet address and convert to a binary address. - * Returns 1 if the address is valid, 0 if not. - * This replaces inet_addr, the return value from which - * cannot distinguish between failure and a local broadcast address. - */ -int -inet_aton(const char *cp, struct in_addr *addr) { - u_long val; - int base, n; - char c; - u_int8_t parts[4]; - u_int8_t *pp = parts; - int digit; - - c = *cp; - for (;;) { - /* - * Collect number up to ``.''. - * Values are specified as for C: - * 0x=hex, 0=octal, isdigit=decimal. - */ - if (!isdigit((unsigned char)c)) - return (0); - val = 0; base = 10; digit = 0; - if (c == '0') { - c = *++cp; - if (c == 'x' || c == 'X') - base = 16, c = *++cp; - else { - base = 8; - digit = 1 ; - } - } - for (;;) { - if (isascii(c) && isdigit((unsigned char)c)) { - if (base == 8 && (c == '8' || c == '9')) - return (0); - val = (val * base) + (c - '0'); - c = *++cp; - digit = 1; - } else if (base == 16 && isascii(c) && - isxdigit((unsigned char)c)) { - val = (val << 4) | - (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); - c = *++cp; - digit = 1; - } else - break; - } - if (c == '.') { - /* - * Internet format: - * a.b.c.d - * a.b.c (with c treated as 16 bits) - * a.b (with b treated as 24 bits) - */ - if (pp >= parts + 3 || val > 0xffU) - return (0); - *pp++ = val; - c = *++cp; - } else - break; - } - /* - * Check for trailing characters. - */ - if (c != '\0' && (!isascii(c) || !isspace((unsigned char)c))) - return (0); - /* - * Did we get a valid digit? - */ - if (!digit) - return (0); - /* - * Concoct the address according to - * the number of parts specified. - */ - n = pp - parts + 1; - switch (n) { - case 1: /* a -- 32 bits */ - break; - - case 2: /* a.b -- 8.24 bits */ - if (val > 0xffffffU) - return (0); - val |= parts[0] << 24; - break; - - case 3: /* a.b.c -- 8.8.16 bits */ - if (val > 0xffffU) - return (0); - val |= (parts[0] << 24) | (parts[1] << 16); - break; - - case 4: /* a.b.c.d -- 8.8.8.8 bits */ - if (val > 0xffU) - return (0); - val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - break; - } - if (addr != NULL) - addr->s_addr = htonl(val); - return (1); -} diff --git a/lib/libc/inet/inet_cidr_ntop.c b/lib/libc/inet/inet_cidr_ntop.c deleted file mode 100644 index 192cf1e752ef..000000000000 --- a/lib/libc/inet/inet_cidr_ntop.c +++ /dev/null @@ -1,261 +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: inet_cidr_ntop.c,v 1.1.2.1.8.3 2005/11/03 23:08:40 marka Exp $"; -#endif - -#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 <errno.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -static char * inet_cidr_ntop_ipv4 __P((const u_char *src, int bits, - char *dst, size_t size)); -static char * inet_cidr_ntop_ipv6 __P((const u_char *src, int bits, - char *dst, size_t size)); - -/* - * char * - * inet_cidr_ntop(af, src, bits, dst, size) - * convert network address from network to presentation format. - * "src"'s size is determined from its "af". - * return: - * pointer to dst, or NULL if an error occurred (check errno). - * note: - * 192.5.5.1/28 has a nonzero host part, which means it isn't a network - * as called for by inet_net_ntop() but it can be a host address with - * an included netmask. - * author: - * Paul Vixie (ISC), October 1998 - */ -char * -inet_cidr_ntop(int af, const void *src, int bits, char *dst, size_t size) { - switch (af) { - case AF_INET: - return (inet_cidr_ntop_ipv4(src, bits, dst, size)); - case AF_INET6: - return (inet_cidr_ntop_ipv6(src, bits, dst, size)); - default: - errno = EAFNOSUPPORT; - return (NULL); - } -} - -static int -decoct(const u_char *src, int bytes, char *dst, size_t size) { - char *odst = dst; - char *t; - int b; - - for (b = 1; b <= bytes; b++) { - if (size < sizeof "255.") - return (0); - t = dst; - dst += SPRINTF((dst, "%u", *src++)); - if (b != bytes) { - *dst++ = '.'; - *dst = '\0'; - } - size -= (size_t)(dst - t); - } - return (dst - odst); -} - -/* - * static char * - * inet_cidr_ntop_ipv4(src, bits, dst, size) - * convert IPv4 network address from network to presentation format. - * "src"'s size is determined from its "af". - * return: - * pointer to dst, or NULL if an error occurred (check errno). - * note: - * network byte order assumed. this means 192.5.5.240/28 has - * 0b11110000 in its fourth octet. - * author: - * Paul Vixie (ISC), October 1998 - */ -static char * -inet_cidr_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size) { - char *odst = dst; - size_t len = 4; - size_t b; - size_t bytes; - - if ((bits < -1) || (bits > 32)) { - errno = EINVAL; - return (NULL); - } - - /* Find number of significant bytes in address. */ - if (bits == -1) - len = 4; - else - for (len = 1, b = 1 ; b < 4U; b++) - if (*(src + b)) - len = b + 1; - - /* Format whole octets plus nonzero trailing octets. */ - bytes = (((bits <= 0) ? 1 : bits) + 7) / 8; - if (len > bytes) - bytes = len; - b = decoct(src, bytes, dst, size); - if (b == 0U) - goto emsgsize; - dst += b; - size -= b; - - if (bits != -1) { - /* Format CIDR /width. */ - if (size < sizeof "/32") - goto emsgsize; - dst += SPRINTF((dst, "/%u", bits)); - } - - return (odst); - - emsgsize: - errno = EMSGSIZE; - return (NULL); -} - -static char * -inet_cidr_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size) { - /* - * Note that int32_t and int16_t need only be "at least" large enough - * to contain a value of the specified size. On some systems, like - * Crays, there is no such thing as an integer variable with 16 bits. - * Keep this in mind if you think this function should have been coded - * to use pointer overlays. All the world's not a VAX. - */ - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255/128"]; - char *tp; - struct { int base, len; } best, cur; - u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; - int i; - - if ((bits < -1) || (bits > 128)) { - errno = EINVAL; - return (NULL); - } - - /* - * Preprocess: - * Copy the input (bytewise) array into a wordwise array. - * Find the longest run of 0x00's in src[] for :: shorthanding. - */ - memset(words, '\0', sizeof words); - for (i = 0; i < NS_IN6ADDRSZ; i++) - words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); - best.base = -1; - best.len = 0; - cur.base = -1; - cur.len = 0; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - if (words[i] == 0) { - if (cur.base == -1) - cur.base = i, cur.len = 1; - else - cur.len++; - } else { - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - cur.base = -1; - } - } - } - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - } - if (best.base != -1 && best.len < 2) - best.base = -1; - - /* - * Format the result. - */ - tp = tmp; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - /* Are we inside the best run of 0x00's? */ - if (best.base != -1 && i >= best.base && - i < (best.base + best.len)) { - if (i == best.base) - *tp++ = ':'; - continue; - } - /* Are we following an initial run of 0x00s or any real hex? */ - if (i != 0) - *tp++ = ':'; - /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && (best.len == 6 || - (best.len == 7 && words[7] != 0x0001) || - (best.len == 5 && words[5] == 0xffff))) { - int n; - - if (src[15] || bits == -1 || bits > 120) - n = 4; - else if (src[14] || bits > 112) - n = 3; - else - n = 2; - n = decoct(src+12, n, tp, sizeof tmp - (tp - tmp)); - if (n == 0) { - errno = EMSGSIZE; - return (NULL); - } - tp += strlen(tp); - break; - } - tp += SPRINTF((tp, "%x", words[i])); - } - - /* Was it a trailing run of 0x00's? */ - if (best.base != -1 && (best.base + best.len) == - (NS_IN6ADDRSZ / NS_INT16SZ)) - *tp++ = ':'; - *tp = '\0'; - - if (bits != -1) - tp += SPRINTF((tp, "/%u", bits)); - - /* - * Check for overflow, copy, and we're done. - */ - if ((size_t)(tp - tmp) > size) { - errno = EMSGSIZE; - return (NULL); - } - strcpy(dst, tmp); - return (dst); -} diff --git a/lib/libc/inet/inet_cidr_pton.c b/lib/libc/inet/inet_cidr_pton.c deleted file mode 100644 index 5bfef71ba721..000000000000 --- a/lib/libc/inet/inet_cidr_pton.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: inet_cidr_pton.c,v 1.2.2.1.8.2 2004/03/17 00:29:46 marka Exp $"; -#endif - -#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 <isc/assertions.h> -#include <ctype.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -static int inet_cidr_pton_ipv4 __P((const char *src, u_char *dst, - int *bits, int ipv6)); -static int inet_cidr_pton_ipv6 __P((const char *src, u_char *dst, - int *bits)); - -static int getbits(const char *, int ipv6); - -/* - * int - * inet_cidr_pton(af, src, dst, *bits) - * convert network address from presentation to network format. - * accepts inet_pton()'s input for this "af" plus trailing "/CIDR". - * "dst" is assumed large enough for its "af". "bits" is set to the - * /CIDR prefix length, which can have defaults (like /32 for IPv4). - * return: - * -1 if an error occurred (inspect errno; ENOENT means bad format). - * 0 if successful conversion occurred. - * note: - * 192.5.5.1/28 has a nonzero host part, which means it isn't a network - * as called for by inet_net_pton() but it can be a host address with - * an included netmask. - * author: - * Paul Vixie (ISC), October 1998 - */ -int -inet_cidr_pton(int af, const char *src, void *dst, int *bits) { - switch (af) { - case AF_INET: - return (inet_cidr_pton_ipv4(src, dst, bits, 0)); - case AF_INET6: - return (inet_cidr_pton_ipv6(src, dst, bits)); - default: - errno = EAFNOSUPPORT; - return (-1); - } -} - -static const char digits[] = "0123456789"; - -static int -inet_cidr_pton_ipv4(const char *src, u_char *dst, int *pbits, int ipv6) { - const u_char *odst = dst; - int n, ch, tmp, bits; - size_t size = 4; - - /* Get the mantissa. */ - while (ch = *src++, (isascii(ch) && isdigit(ch))) { - tmp = 0; - do { - n = strchr(digits, ch) - digits; - INSIST(n >= 0 && n <= 9); - tmp *= 10; - tmp += n; - if (tmp > 255) - goto enoent; - } while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); - if (size-- == 0U) - goto emsgsize; - *dst++ = (u_char) tmp; - if (ch == '\0' || ch == '/') - break; - if (ch != '.') - goto enoent; - } - - /* Get the prefix length if any. */ - bits = -1; - if (ch == '/' && dst > odst) { - bits = getbits(src, ipv6); - if (bits == -2) - goto enoent; - } else if (ch != '\0') - goto enoent; - - /* Prefix length can default to /32 only if all four octets spec'd. */ - if (bits == -1) { - if (dst - odst == 4) - bits = ipv6 ? 128 : 32; - else - goto enoent; - } - - /* If nothing was written to the destination, we found no address. */ - if (dst == odst) - goto enoent; - - /* If prefix length overspecifies mantissa, life is bad. */ - if (((bits - (ipv6 ? 96 : 0)) / 8) > (dst - odst)) - goto enoent; - - /* Extend address to four octets. */ - while (size-- > 0U) - *dst++ = 0; - - *pbits = bits; - return (0); - - enoent: - errno = ENOENT; - return (-1); - - emsgsize: - errno = EMSGSIZE; - return (-1); -} - -static int -inet_cidr_pton_ipv6(const char *src, u_char *dst, int *pbits) { - static const char xdigits_l[] = "0123456789abcdef", - xdigits_u[] = "0123456789ABCDEF"; - u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; - const char *xdigits, *curtok; - int ch, saw_xdigit; - u_int val; - int bits; - - memset((tp = tmp), '\0', NS_IN6ADDRSZ); - endp = tp + NS_IN6ADDRSZ; - colonp = NULL; - /* Leading :: requires some special handling. */ - if (*src == ':') - if (*++src != ':') - return (0); - curtok = src; - saw_xdigit = 0; - val = 0; - bits = -1; - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) - pch = strchr((xdigits = xdigits_u), ch); - if (pch != NULL) { - val <<= 4; - val |= (pch - xdigits); - if (val > 0xffff) - return (0); - saw_xdigit = 1; - continue; - } - if (ch == ':') { - curtok = src; - if (!saw_xdigit) { - if (colonp) - return (0); - colonp = tp; - continue; - } else if (*src == '\0') { - return (0); - } - if (tp + NS_INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - saw_xdigit = 0; - val = 0; - continue; - } - if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && - inet_cidr_pton_ipv4(curtok, tp, &bits, 1) == 0) { - tp += NS_INADDRSZ; - saw_xdigit = 0; - break; /* '\0' was seen by inet_pton4(). */ - } - if (ch == '/') { - bits = getbits(src, 1); - if (bits == -2) - goto enoent; - break; - } - goto enoent; - } - if (saw_xdigit) { - if (tp + NS_INT16SZ > endp) - goto emsgsize; - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - } - if (colonp != NULL) { - /* - * Since some memmove()'s erroneously fail to handle - * overlapping regions, we'll do the shift by hand. - */ - const int n = tp - colonp; - int i; - - if (tp == endp) - goto enoent; - for (i = 1; i <= n; i++) { - endp[- i] = colonp[n - i]; - colonp[n - i] = 0; - } - tp = endp; - } - - memcpy(dst, tmp, NS_IN6ADDRSZ); - - *pbits = bits; - return (0); - - enoent: - errno = ENOENT; - return (-1); - - emsgsize: - errno = EMSGSIZE; - return (-1); -} - -static int -getbits(const char *src, int ipv6) { - int bits = 0; - char *cp, ch; - - if (*src == '\0') /* syntax */ - return (-2); - do { - ch = *src++; - cp = strchr(digits, ch); - if (cp == NULL) /* syntax */ - return (-2); - bits *= 10; - bits += cp - digits; - if (bits == 0 && *src != '\0') /* no leading zeros */ - return (-2); - if (bits > (ipv6 ? 128 : 32)) /* range error */ - return (-2); - } while (*src != '\0'); - - return (bits); -} diff --git a/lib/libc/inet/inet_lnaof.c b/lib/libc/inet/inet_lnaof.c deleted file mode 100644 index 97b80cffdb5b..000000000000 --- a/lib/libc/inet/inet_lnaof.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 1983, 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)inet_lnaof.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/param.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include "port_after.h" - -/* - * Return the local network address portion of an - * internet address; handles class a/b/c network - * number formats. - */ -u_long -inet_lnaof(in) - struct in_addr in; -{ - register u_long i = ntohl(in.s_addr); - - if (IN_CLASSA(i)) - return ((i)&IN_CLASSA_HOST); - else if (IN_CLASSB(i)) - return ((i)&IN_CLASSB_HOST); - else - return ((i)&IN_CLASSC_HOST); -} diff --git a/lib/libc/inet/inet_makeaddr.c b/lib/libc/inet/inet_makeaddr.c deleted file mode 100644 index 6e4ecc37ccab..000000000000 --- a/lib/libc/inet/inet_makeaddr.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 1983, 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)inet_makeaddr.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/param.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include "port_after.h" - -/* - * Formulate an Internet address from network + host. Used in - * building addresses stored in the ifnet structure. - */ -struct in_addr -inet_makeaddr(net, host) - u_long net, host; -{ - struct in_addr a; - - if (net < 128U) - a.s_addr = (net << IN_CLASSA_NSHIFT) | (host & IN_CLASSA_HOST); - else if (net < 65536U) - a.s_addr = (net << IN_CLASSB_NSHIFT) | (host & IN_CLASSB_HOST); - else if (net < 16777216L) - a.s_addr = (net << IN_CLASSC_NSHIFT) | (host & IN_CLASSC_HOST); - else - a.s_addr = net | host; - a.s_addr = htonl(a.s_addr); - return (a); -} diff --git a/lib/libc/inet/inet_net_ntop.c b/lib/libc/inet/inet_net_ntop.c deleted file mode 100644 index f508629d617a..000000000000 --- a/lib/libc/inet/inet_net_ntop.c +++ /dev/null @@ -1,277 +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: inet_net_ntop.c,v 1.1.2.1.8.1 2004/03/09 08:33:32 marka Exp $"; -#endif - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -static char * inet_net_ntop_ipv4 __P((const u_char *src, int bits, - char *dst, size_t size)); -static char * inet_net_ntop_ipv6 __P((const u_char *src, int bits, - char *dst, size_t size)); - -/* - * char * - * inet_net_ntop(af, src, bits, dst, size) - * convert network number from network to presentation format. - * generates CIDR style result always. - * return: - * pointer to dst, or NULL if an error occurred (check errno). - * author: - * Paul Vixie (ISC), July 1996 - */ -char * -inet_net_ntop(af, src, bits, dst, size) - int af; - const void *src; - int bits; - char *dst; - size_t size; -{ - switch (af) { - case AF_INET: - return (inet_net_ntop_ipv4(src, bits, dst, size)); - case AF_INET6: - return (inet_net_ntop_ipv6(src, bits, dst, size)); - default: - errno = EAFNOSUPPORT; - return (NULL); - } -} - -/* - * static char * - * inet_net_ntop_ipv4(src, bits, dst, size) - * convert IPv4 network number from network to presentation format. - * generates CIDR style result always. - * return: - * pointer to dst, or NULL if an error occurred (check errno). - * note: - * network byte order assumed. this means 192.5.5.240/28 has - * 0b11110000 in its fourth octet. - * author: - * Paul Vixie (ISC), July 1996 - */ -static char * -inet_net_ntop_ipv4(src, bits, dst, size) - const u_char *src; - int bits; - char *dst; - size_t size; -{ - char *odst = dst; - char *t; - u_int m; - int b; - - if (bits < 0 || bits > 32) { - errno = EINVAL; - return (NULL); - } - - if (bits == 0) { - if (size < sizeof "0") - goto emsgsize; - *dst++ = '0'; - size--; - *dst = '\0'; - } - - /* Format whole octets. */ - for (b = bits / 8; b > 0; b--) { - if (size <= sizeof "255.") - goto emsgsize; - t = dst; - dst += SPRINTF((dst, "%u", *src++)); - if (b > 1) { - *dst++ = '.'; - *dst = '\0'; - } - size -= (size_t)(dst - t); - } - - /* Format partial octet. */ - b = bits % 8; - if (b > 0) { - if (size <= sizeof ".255") - goto emsgsize; - t = dst; - if (dst != odst) - *dst++ = '.'; - m = ((1 << b) - 1) << (8 - b); - dst += SPRINTF((dst, "%u", *src & m)); - size -= (size_t)(dst - t); - } - - /* Format CIDR /width. */ - if (size <= sizeof "/32") - goto emsgsize; - dst += SPRINTF((dst, "/%u", bits)); - return (odst); - - emsgsize: - errno = EMSGSIZE; - return (NULL); -} - -/* - * static char * - * inet_net_ntop_ipv6(src, bits, fakebits, dst, size) - * convert IPv6 network number from network to presentation format. - * generates CIDR style result always. Picks the shortest representation - * unless the IP is really IPv4. - * always prints specified number of bits (bits). - * return: - * pointer to dst, or NULL if an error occurred (check errno). - * note: - * network byte order assumed. this means 192.5.5.240/28 has - * 0x11110000 in its fourth octet. - * author: - * Vadim Kogan (UCB), June 2001 - * Original version (IPv4) by Paul Vixie (ISC), July 1996 - */ - -static char * -inet_net_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size) { - u_int m; - int b; - int p; - int zero_s, zero_l, tmp_zero_s, tmp_zero_l; - int i; - int is_ipv4 = 0; - unsigned char inbuf[16]; - char outbuf[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")]; - char *cp; - int words; - u_char *s; - - if (bits < 0 || bits > 128) { - errno = EINVAL; - return (NULL); - } - - cp = outbuf; - - if (bits == 0) { - *cp++ = ':'; - *cp++ = ':'; - *cp = '\0'; - } else { - /* Copy src to private buffer. Zero host part. */ - p = (bits + 7) / 8; - memcpy(inbuf, src, p); - memset(inbuf + p, 0, 16 - p); - b = bits % 8; - if (b != 0) { - m = ~0 << (8 - b); - inbuf[p-1] &= m; - } - - s = inbuf; - - /* how many words need to be displayed in output */ - words = (bits + 15) / 16; - if (words == 1) - words = 2; - - /* Find the longest substring of zero's */ - zero_s = zero_l = tmp_zero_s = tmp_zero_l = 0; - for (i = 0; i < (words * 2); i += 2) { - if ((s[i] | s[i+1]) == 0) { - if (tmp_zero_l == 0) - tmp_zero_s = i / 2; - tmp_zero_l++; - } else { - if (tmp_zero_l && zero_l < tmp_zero_l) { - zero_s = tmp_zero_s; - zero_l = tmp_zero_l; - tmp_zero_l = 0; - } - } - } - - if (tmp_zero_l && zero_l < tmp_zero_l) { - zero_s = tmp_zero_s; - zero_l = tmp_zero_l; - } - - if (zero_l != words && zero_s == 0 && ((zero_l == 6) || - ((zero_l == 5 && s[10] == 0xff && s[11] == 0xff) || - ((zero_l == 7 && s[14] != 0 && s[15] != 1))))) - is_ipv4 = 1; - - /* Format whole words. */ - for (p = 0; p < words; p++) { - if (zero_l != 0 && p >= zero_s && p < zero_s + zero_l) { - /* Time to skip some zeros */ - if (p == zero_s) - *cp++ = ':'; - if (p == words - 1) - *cp++ = ':'; - s++; - s++; - continue; - } - - if (is_ipv4 && p > 5 ) { - *cp++ = (p == 6) ? ':' : '.'; - cp += SPRINTF((cp, "%u", *s++)); - /* we can potentially drop the last octet */ - if (p != 7 || bits > 120) { - *cp++ = '.'; - cp += SPRINTF((cp, "%u", *s++)); - } - } else { - if (cp != outbuf) - *cp++ = ':'; - cp += SPRINTF((cp, "%x", *s * 256 + s[1])); - s += 2; - } - } - } - /* Format CIDR /width. */ - SPRINTF((cp, "/%u", bits)); - if (strlen(outbuf) + 1 > size) - goto emsgsize; - strcpy(dst, outbuf); - - return (dst); - -emsgsize: - errno = EMSGSIZE; - return (NULL); -} diff --git a/lib/libc/inet/inet_net_pton.c b/lib/libc/inet/inet_net_pton.c deleted file mode 100644 index abecfc79cd2c..000000000000 --- a/lib/libc/inet/inet_net_pton.c +++ /dev/null @@ -1,405 +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: inet_net_pton.c,v 1.4.2.1.8.2 2004/03/17 00:29:47 marka Exp $"; -#endif - -#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 <isc/assertions.h> -#include <ctype.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -/* - * static int - * inet_net_pton_ipv4(src, dst, size) - * convert IPv4 network number from presentation to network format. - * accepts hex octets, hex strings, decimal octets, and /CIDR. - * "size" is in bytes and describes "dst". - * return: - * number of bits, either imputed classfully or specified with /CIDR, - * or -1 if some failure occurred (check errno). ENOENT means it was - * not an IPv4 network specification. - * note: - * network byte order assumed. this means 192.5.5.240/28 has - * 0b11110000 in its fourth octet. - * author: - * Paul Vixie (ISC), June 1996 - */ -static int -inet_net_pton_ipv4(const char *src, u_char *dst, size_t size) { - static const char xdigits[] = "0123456789abcdef"; - static const char digits[] = "0123456789"; - int n, ch, tmp = 0, dirty, bits; - const u_char *odst = dst; - - ch = *src++; - if (ch == '0' && (src[0] == 'x' || src[0] == 'X') - && isascii((unsigned char)(src[1])) - && isxdigit((unsigned char)(src[1]))) { - /* Hexadecimal: Eat nybble string. */ - if (size <= 0U) - goto emsgsize; - dirty = 0; - src++; /* skip x or X. */ - while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) { - if (isupper(ch)) - ch = tolower(ch); - n = strchr(xdigits, ch) - xdigits; - INSIST(n >= 0 && n <= 15); - if (dirty == 0) - tmp = n; - else - tmp = (tmp << 4) | n; - if (++dirty == 2) { - if (size-- <= 0U) - goto emsgsize; - *dst++ = (u_char) tmp; - dirty = 0; - } - } - if (dirty) { /* Odd trailing nybble? */ - if (size-- <= 0U) - goto emsgsize; - *dst++ = (u_char) (tmp << 4); - } - } else if (isascii(ch) && isdigit(ch)) { - /* Decimal: eat dotted digit string. */ - for (;;) { - tmp = 0; - do { - n = strchr(digits, ch) - digits; - INSIST(n >= 0 && n <= 9); - tmp *= 10; - tmp += n; - if (tmp > 255) - goto enoent; - } while ((ch = *src++) != '\0' && - isascii(ch) && isdigit(ch)); - if (size-- <= 0U) - goto emsgsize; - *dst++ = (u_char) tmp; - if (ch == '\0' || ch == '/') - break; - if (ch != '.') - goto enoent; - ch = *src++; - if (!isascii(ch) || !isdigit(ch)) - goto enoent; - } - } else - goto enoent; - - bits = -1; - if (ch == '/' && isascii((unsigned char)(src[0])) && - isdigit((unsigned char)(src[0])) && dst > odst) { - /* CIDR width specifier. Nothing can follow it. */ - ch = *src++; /* Skip over the /. */ - bits = 0; - do { - n = strchr(digits, ch) - digits; - INSIST(n >= 0 && n <= 9); - bits *= 10; - bits += n; - } while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); - if (ch != '\0') - goto enoent; - if (bits > 32) - goto emsgsize; - } - - /* Firey death and destruction unless we prefetched EOS. */ - if (ch != '\0') - goto enoent; - - /* If nothing was written to the destination, we found no address. */ - if (dst == odst) - goto enoent; - /* If no CIDR spec was given, infer width from net class. */ - if (bits == -1) { - if (*odst >= 240) /* Class E */ - bits = 32; - else if (*odst >= 224) /* Class D */ - bits = 8; - else if (*odst >= 192) /* Class C */ - bits = 24; - else if (*odst >= 128) /* Class B */ - bits = 16; - else /* Class A */ - bits = 8; - /* If imputed mask is narrower than specified octets, widen. */ - if (bits < ((dst - odst) * 8)) - bits = (dst - odst) * 8; - /* - * If there are no additional bits specified for a class D - * address adjust bits to 4. - */ - if (bits == 8 && *odst == 224) - bits = 4; - } - /* Extend network to cover the actual mask. */ - while (bits > ((dst - odst) * 8)) { - if (size-- <= 0U) - goto emsgsize; - *dst++ = '\0'; - } - return (bits); - - enoent: - errno = ENOENT; - return (-1); - - emsgsize: - errno = EMSGSIZE; - return (-1); -} - -static int -getbits(const char *src, int *bitsp) { - static const char digits[] = "0123456789"; - int n; - int val; - char ch; - - val = 0; - n = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - pch = strchr(digits, ch); - if (pch != NULL) { - if (n++ != 0 && val == 0) /* no leading zeros */ - return (0); - val *= 10; - val += (pch - digits); - if (val > 128) /* range */ - return (0); - continue; - } - return (0); - } - if (n == 0) - return (0); - *bitsp = val; - return (1); -} - -static int -getv4(const char *src, u_char *dst, int *bitsp) { - static const char digits[] = "0123456789"; - u_char *odst = dst; - int n; - u_int val; - char ch; - - val = 0; - n = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - pch = strchr(digits, ch); - if (pch != NULL) { - if (n++ != 0 && val == 0) /* no leading zeros */ - return (0); - val *= 10; - val += (pch - digits); - if (val > 255) /* range */ - return (0); - continue; - } - if (ch == '.' || ch == '/') { - if (dst - odst > 3) /* too many octets? */ - return (0); - *dst++ = val; - if (ch == '/') - return (getbits(src, bitsp)); - val = 0; - n = 0; - continue; - } - return (0); - } - if (n == 0) - return (0); - if (dst - odst > 3) /* too many octets? */ - return (0); - *dst++ = val; - return (1); -} - -static int -inet_net_pton_ipv6(const char *src, u_char *dst, size_t size) { - static const char xdigits_l[] = "0123456789abcdef", - xdigits_u[] = "0123456789ABCDEF"; - u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; - const char *xdigits, *curtok; - int ch, saw_xdigit; - u_int val; - int digits; - int bits; - size_t bytes; - int words; - int ipv4; - - memset((tp = tmp), '\0', NS_IN6ADDRSZ); - endp = tp + NS_IN6ADDRSZ; - colonp = NULL; - /* Leading :: requires some special handling. */ - if (*src == ':') - if (*++src != ':') - goto enoent; - curtok = src; - saw_xdigit = 0; - val = 0; - digits = 0; - bits = -1; - ipv4 = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) - pch = strchr((xdigits = xdigits_u), ch); - if (pch != NULL) { - val <<= 4; - val |= (pch - xdigits); - if (++digits > 4) - goto enoent; - saw_xdigit = 1; - continue; - } - if (ch == ':') { - curtok = src; - if (!saw_xdigit) { - if (colonp) - goto enoent; - colonp = tp; - continue; - } else if (*src == '\0') - goto enoent; - if (tp + NS_INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - saw_xdigit = 0; - digits = 0; - val = 0; - continue; - } - if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && - getv4(curtok, tp, &bits) > 0) { - tp += NS_INADDRSZ; - saw_xdigit = 0; - ipv4 = 1; - break; /* '\0' was seen by inet_pton4(). */ - } - if (ch == '/' && getbits(src, &bits) > 0) - break; - goto enoent; - } - if (saw_xdigit) { - if (tp + NS_INT16SZ > endp) - goto enoent; - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - } - if (bits == -1) - bits = 128; - - words = (bits + 15) / 16; - if (words < 2) - words = 2; - if (ipv4) - words = 8; - endp = tmp + 2 * words; - - if (colonp != NULL) { - /* - * Since some memmove()'s erroneously fail to handle - * overlapping regions, we'll do the shift by hand. - */ - const int n = tp - colonp; - int i; - - if (tp == endp) - goto enoent; - for (i = 1; i <= n; i++) { - endp[- i] = colonp[n - i]; - colonp[n - i] = 0; - } - tp = endp; - } - if (tp != endp) - goto enoent; - - bytes = (bits + 7) / 8; - if (bytes > size) - goto emsgsize; - memcpy(dst, tmp, bytes); - return (bits); - - enoent: - errno = ENOENT; - return (-1); - - emsgsize: - errno = EMSGSIZE; - return (-1); -} - -/* - * int - * inet_net_pton(af, src, dst, size) - * convert network number from presentation to network format. - * accepts hex octets, hex strings, decimal octets, and /CIDR. - * "size" is in bytes and describes "dst". - * return: - * number of bits, either imputed classfully or specified with /CIDR, - * or -1 if some failure occurred (check errno). ENOENT means it was - * not a valid network specification. - * author: - * Paul Vixie (ISC), June 1996 - */ -int -inet_net_pton(int af, const char *src, void *dst, size_t size) { - switch (af) { - case AF_INET: - return (inet_net_pton_ipv4(src, dst, size)); - case AF_INET6: - return (inet_net_pton_ipv6(src, dst, size)); - default: - errno = EAFNOSUPPORT; - return (-1); - } -} diff --git a/lib/libc/inet/inet_neta.c b/lib/libc/inet/inet_neta.c deleted file mode 100644 index 325b7ce814e3..000000000000 --- a/lib/libc/inet/inet_neta.c +++ /dev/null @@ -1,87 +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: inet_neta.c,v 1.1.206.1 2004/03/09 08:33:33 marka Exp $"; -#endif - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <errno.h> -#include <stdio.h> -#include <string.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -/* - * char * - * inet_neta(src, dst, size) - * format a u_long network number into presentation format. - * return: - * pointer to dst, or NULL if an error occurred (check errno). - * note: - * format of ``src'' is as for inet_network(). - * author: - * Paul Vixie (ISC), July 1996 - */ -char * -inet_neta(src, dst, size) - u_long src; - char *dst; - size_t size; -{ - char *odst = dst; - char *tp; - - while (src & 0xffffffff) { - u_char b = (src & 0xff000000) >> 24; - - src <<= 8; - if (b) { - if (size < sizeof "255.") - goto emsgsize; - tp = dst; - dst += SPRINTF((dst, "%u", b)); - if (src != 0L) { - *dst++ = '.'; - *dst = '\0'; - } - size -= (size_t)(dst - tp); - } - } - if (dst == odst) { - if (size < sizeof "0.0.0.0") - goto emsgsize; - strcpy(dst, "0.0.0.0"); - } - return (odst); - - emsgsize: - errno = EMSGSIZE; - return (NULL); -} diff --git a/lib/libc/inet/inet_netof.c b/lib/libc/inet/inet_netof.c deleted file mode 100644 index e887530088a1..000000000000 --- a/lib/libc/inet/inet_netof.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 1983, 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)inet_netof.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/param.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include "port_after.h" - -/* - * Return the network number from an internet - * address; handles class a/b/c network #'s. - */ -u_long -inet_netof(in) - struct in_addr in; -{ - register u_long i = ntohl(in.s_addr); - - if (IN_CLASSA(i)) - return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT); - else if (IN_CLASSB(i)) - return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT); - else - return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); -} diff --git a/lib/libc/inet/inet_network.c b/lib/libc/inet/inet_network.c deleted file mode 100644 index aaa50c831578..000000000000 --- a/lib/libc/inet/inet_network.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 1983, 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)inet_network.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <ctype.h> - -#include "port_after.h" - -/* - * Internet network address interpretation routine. - * The library routines call this routine to interpret - * network numbers. - */ -u_long -inet_network(cp) - register const char *cp; -{ - register u_long val, base, n, i; - register char c; - u_long parts[4], *pp = parts; - int digit; - -again: - val = 0; base = 10; digit = 0; - if (*cp == '0') - digit = 1, base = 8, cp++; - if (*cp == 'x' || *cp == 'X') - base = 16, cp++; - while ((c = *cp) != 0) { - if (isdigit((unsigned char)c)) { - if (base == 8U && (c == '8' || c == '9')) - return (INADDR_NONE); - val = (val * base) + (c - '0'); - cp++; - digit = 1; - continue; - } - if (base == 16U && isxdigit((unsigned char)c)) { - val = (val << 4) + - (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); - cp++; - digit = 1; - continue; - } - break; - } - if (!digit) - return (INADDR_NONE); - if (*cp == '.') { - if (pp >= parts + 4 || val > 0xffU) - return (INADDR_NONE); - *pp++ = val, cp++; - goto again; - } - if (*cp && !isspace(*cp&0xff)) - return (INADDR_NONE); - *pp++ = val; - n = pp - parts; - if (n > 4U) - return (INADDR_NONE); - for (val = 0, i = 0; i < n; i++) { - val <<= 8; - val |= parts[i] & 0xff; - } - return (val); -} diff --git a/lib/libc/inet/inet_ntoa.c b/lib/libc/inet/inet_ntoa.c deleted file mode 100644 index 7fad4b8902a4..000000000000 --- a/lib/libc/inet/inet_ntoa.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 1983, 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)inet_ntoa.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: inet_ntoa.c,v 1.1 2001/03/29 06:31:38 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <stdio.h> -#include <string.h> - -#include "port_after.h" - -/* - * Convert network-format internet address - * to base 256 d.d.d.d representation. - */ -/*const*/ char * -inet_ntoa(struct in_addr in) { - static char ret[18]; - - strcpy(ret, "[inet_ntoa error]"); - (void) inet_ntop(AF_INET, &in, ret, sizeof ret); - return (ret); -} diff --git a/lib/libc/inet/inet_ntop.c b/lib/libc/inet/inet_ntop.c deleted file mode 100644 index cd502ab75862..000000000000 --- a/lib/libc/inet/inet_ntop.c +++ /dev/null @@ -1,205 +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: inet_ntop.c,v 1.1.2.1.8.2 2005/11/03 23:08:40 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/param.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 <stdio.h> -#include <string.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -/* - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -static const char *inet_ntop4 __P((const u_char *src, char *dst, size_t size)); -static const char *inet_ntop6 __P((const u_char *src, char *dst, size_t size)); - -/* char * - * inet_ntop(af, src, dst, size) - * convert a network format address to presentation format. - * return: - * pointer to presentation format address (`dst'), or NULL (see errno). - * author: - * Paul Vixie, 1996. - */ -const char * -inet_ntop(af, src, dst, size) - int af; - const void *src; - char *dst; - size_t size; -{ - switch (af) { - case AF_INET: - return (inet_ntop4(src, dst, size)); - case AF_INET6: - return (inet_ntop6(src, dst, size)); - default: - errno = EAFNOSUPPORT; - return (NULL); - } - /* NOTREACHED */ -} - -/* const char * - * inet_ntop4(src, dst, size) - * format an IPv4 address - * return: - * `dst' (as a const) - * notes: - * (1) uses no statics - * (2) takes a u_char* not an in_addr as input - * author: - * Paul Vixie, 1996. - */ -static const char * -inet_ntop4(src, dst, size) - const u_char *src; - char *dst; - size_t size; -{ - static const char fmt[] = "%u.%u.%u.%u"; - char tmp[sizeof "255.255.255.255"]; - - if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) >= size) { - errno = ENOSPC; - return (NULL); - } - strcpy(dst, tmp); - return (dst); -} - -/* const char * - * inet_ntop6(src, dst, size) - * convert IPv6 binary address into presentation (printable) format - * author: - * Paul Vixie, 1996. - */ -static const char * -inet_ntop6(src, dst, size) - const u_char *src; - char *dst; - size_t size; -{ - /* - * Note that int32_t and int16_t need only be "at least" large enough - * to contain a value of the specified size. On some systems, like - * Crays, there is no such thing as an integer variable with 16 bits. - * Keep this in mind if you think this function should have been coded - * to use pointer overlays. All the world's not a VAX. - */ - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; - struct { int base, len; } best, cur; - u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; - int i; - - /* - * Preprocess: - * Copy the input (bytewise) array into a wordwise array. - * Find the longest run of 0x00's in src[] for :: shorthanding. - */ - memset(words, '\0', sizeof words); - for (i = 0; i < NS_IN6ADDRSZ; i++) - words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); - best.base = -1; - best.len = 0; - cur.base = -1; - cur.len = 0; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - if (words[i] == 0) { - if (cur.base == -1) - cur.base = i, cur.len = 1; - else - cur.len++; - } else { - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - cur.base = -1; - } - } - } - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - } - if (best.base != -1 && best.len < 2) - best.base = -1; - - /* - * Format the result. - */ - tp = tmp; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - /* Are we inside the best run of 0x00's? */ - if (best.base != -1 && i >= best.base && - i < (best.base + best.len)) { - if (i == best.base) - *tp++ = ':'; - continue; - } - /* Are we following an initial run of 0x00s or any real hex? */ - if (i != 0) - *tp++ = ':'; - /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && (best.len == 6 || - (best.len == 7 && words[7] != 0x0001) || - (best.len == 5 && words[5] == 0xffff))) { - if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) - return (NULL); - tp += strlen(tp); - break; - } - tp += SPRINTF((tp, "%x", words[i])); - } - /* Was it a trailing run of 0x00's? */ - if (best.base != -1 && (best.base + best.len) == - (NS_IN6ADDRSZ / NS_INT16SZ)) - *tp++ = ':'; - *tp++ = '\0'; - - /* - * Check for overflow, copy, and we're done. - */ - if ((size_t)(tp - tmp) > size) { - errno = ENOSPC; - return (NULL); - } - strcpy(dst, tmp); - return (dst); -} diff --git a/lib/libc/inet/inet_pton.c b/lib/libc/inet/inet_pton.c deleted file mode 100644 index f18a7b64fde2..000000000000 --- a/lib/libc/inet/inet_pton.c +++ /dev/null @@ -1,221 +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: inet_pton.c,v 1.2.206.2 2005/07/28 07:43:18 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" -#include <sys/param.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#include <string.h> -#include <errno.h> -#include "port_after.h" - -/* - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -static int inet_pton4 __P((const char *src, u_char *dst)); -static int inet_pton6 __P((const char *src, u_char *dst)); - -/* int - * inet_pton(af, src, dst) - * convert from presentation format (which usually means ASCII printable) - * to network format (which is usually some kind of binary format). - * return: - * 1 if the address was valid for the specified address family - * 0 if the address wasn't valid (`dst' is untouched in this case) - * -1 if some other error occurred (`dst' is untouched in this case, too) - * author: - * Paul Vixie, 1996. - */ -int -inet_pton(af, src, dst) - int af; - const char *src; - void *dst; -{ - switch (af) { - case AF_INET: - return (inet_pton4(src, dst)); - case AF_INET6: - return (inet_pton6(src, dst)); - default: - errno = EAFNOSUPPORT; - return (-1); - } - /* NOTREACHED */ -} - -/* int - * inet_pton4(src, dst) - * like inet_aton() but without all the hexadecimal and shorthand. - * return: - * 1 if `src' is a valid dotted quad, else 0. - * notice: - * does not touch `dst' unless it's returning 1. - * author: - * Paul Vixie, 1996. - */ -static int -inet_pton4(src, dst) - const char *src; - u_char *dst; -{ - static const char digits[] = "0123456789"; - int saw_digit, octets, ch; - u_char tmp[NS_INADDRSZ], *tp; - - saw_digit = 0; - octets = 0; - *(tp = tmp) = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr(digits, ch)) != NULL) { - u_int new = *tp * 10 + (pch - digits); - - if (saw_digit && *tp == 0) - return (0); - if (new > 255) - return (0); - *tp = new; - if (!saw_digit) { - if (++octets > 4) - return (0); - saw_digit = 1; - } - } else if (ch == '.' && saw_digit) { - if (octets == 4) - return (0); - *++tp = 0; - saw_digit = 0; - } else - return (0); - } - if (octets < 4) - return (0); - memcpy(dst, tmp, NS_INADDRSZ); - return (1); -} - -/* int - * inet_pton6(src, dst) - * convert presentation level address to network order binary form. - * return: - * 1 if `src' is a valid [RFC1884 2.2] address, else 0. - * notice: - * (1) does not touch `dst' unless it's returning 1. - * (2) :: in a full address is silently ignored. - * credit: - * inspired by Mark Andrews. - * author: - * Paul Vixie, 1996. - */ -static int -inet_pton6(src, dst) - const char *src; - u_char *dst; -{ - static const char xdigits_l[] = "0123456789abcdef", - xdigits_u[] = "0123456789ABCDEF"; - u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; - const char *xdigits, *curtok; - int ch, seen_xdigits; - u_int val; - - memset((tp = tmp), '\0', NS_IN6ADDRSZ); - endp = tp + NS_IN6ADDRSZ; - colonp = NULL; - /* Leading :: requires some special handling. */ - if (*src == ':') - if (*++src != ':') - return (0); - curtok = src; - seen_xdigits = 0; - val = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) - pch = strchr((xdigits = xdigits_u), ch); - if (pch != NULL) { - val <<= 4; - val |= (pch - xdigits); - if (++seen_xdigits > 4) - return (0); - continue; - } - if (ch == ':') { - curtok = src; - if (!seen_xdigits) { - if (colonp) - return (0); - colonp = tp; - continue; - } else if (*src == '\0') { - return (0); - } - if (tp + NS_INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - seen_xdigits = 0; - val = 0; - continue; - } - if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && - inet_pton4(curtok, tp) > 0) { - tp += NS_INADDRSZ; - seen_xdigits = 0; - break; /* '\0' was seen by inet_pton4(). */ - } - return (0); - } - if (seen_xdigits) { - if (tp + NS_INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - } - if (colonp != NULL) { - /* - * Since some memmove()'s erroneously fail to handle - * overlapping regions, we'll do the shift by hand. - */ - const int n = tp - colonp; - int i; - - if (tp == endp) - return (0); - for (i = 1; i <= n; i++) { - endp[- i] = colonp[n - i]; - colonp[n - i] = 0; - } - tp = endp; - } - if (tp != endp) - return (0); - memcpy(dst, tmp, NS_IN6ADDRSZ); - return (1); -} diff --git a/lib/libc/inet/nsap_addr.c b/lib/libc/inet/nsap_addr.c deleted file mode 100644 index a4b98e7c4a09..000000000000 --- a/lib/libc/inet/nsap_addr.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: nsap_addr.c,v 1.2.206.2 2005/07/28 07:43:18 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#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 <resolv.h> -#include <resolv_mt.h> - -#include "port_after.h" - -static char -xtob(int c) { - return (c - (((c >= '0') && (c <= '9')) ? '0' : '7')); -} - -u_int -inet_nsap_addr(const char *ascii, u_char *binary, int maxlen) { - u_char c, nib; - u_int len = 0; - - if (ascii[0] != '0' || (ascii[1] != 'x' && ascii[1] != 'X')) - return (0); - ascii += 2; - - while ((c = *ascii++) != '\0' && len < (u_int)maxlen) { - if (c == '.' || c == '+' || c == '/') - continue; - if (!isascii(c)) - return (0); - if (islower(c)) - c = toupper(c); - if (isxdigit(c)) { - nib = xtob(c); - c = *ascii++; - if (c != '\0') { - c = toupper(c); - if (isxdigit(c)) { - *binary++ = (nib << 4) | xtob(c); - len++; - } else - return (0); - } - else - return (0); - } - else - return (0); - } - return (len); -} - -char * -inet_nsap_ntoa(int binlen, const u_char *binary, char *ascii) { - int nib; - int i; - char *tmpbuf = inet_nsap_ntoa_tmpbuf; - char *start; - - if (ascii) - start = ascii; - else { - ascii = tmpbuf; - start = tmpbuf; - } - - *ascii++ = '0'; - *ascii++ = 'x'; - - if (binlen > 255) - binlen = 255; - - for (i = 0; i < binlen; i++) { - nib = *binary >> 4; - *ascii++ = nib + (nib < 10 ? '0' : '7'); - nib = *binary++ & 0x0f; - *ascii++ = nib + (nib < 10 ? '0' : '7'); - if (((i % 2) == 0 && (i + 1) < binlen)) - *ascii++ = '.'; - } - *ascii = '\0'; - return (start); -} diff --git a/lib/libc/isc/ev_streams.c b/lib/libc/isc/ev_streams.c deleted file mode 100644 index 64e88b0c00d6..000000000000 --- a/lib/libc/isc/ev_streams.c +++ /dev/null @@ -1,306 +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. - */ - -/* ev_streams.c - implement asynch stream file IO for the eventlib - * vix 04mar96 [initial] - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: ev_streams.c,v 1.2.206.2 2004/03/17 00:29:51 marka Exp $"; -#endif - -#include "port_before.h" -#include "fd_setsize.h" - -#include <sys/types.h> -#include <sys/uio.h> - -#include <errno.h> - -#include <isc/eventlib.h> -#include <isc/assertions.h> -#include "eventlib_p.h" - -#include "port_after.h" - -static int copyvec(evStream *str, const struct iovec *iov, int iocnt); -static void consume(evStream *str, size_t bytes); -static void done(evContext opaqueCtx, evStream *str); -static void writable(evContext opaqueCtx, void *uap, int fd, int evmask); -static void readable(evContext opaqueCtx, void *uap, int fd, int evmask); - -struct iovec -evConsIovec(void *buf, size_t cnt) { - struct iovec ret; - - memset(&ret, 0xf5, sizeof ret); - ret.iov_base = buf; - ret.iov_len = cnt; - return (ret); -} - -int -evWrite(evContext opaqueCtx, int fd, const struct iovec *iov, int iocnt, - evStreamFunc func, void *uap, evStreamID *id) -{ - evContext_p *ctx = opaqueCtx.opaque; - evStream *new; - int save; - - OKNEW(new); - new->func = func; - new->uap = uap; - new->fd = fd; - new->flags = 0; - if (evSelectFD(opaqueCtx, fd, EV_WRITE, writable, new, &new->file) < 0) - goto free; - if (copyvec(new, iov, iocnt) < 0) - goto free; - new->prevDone = NULL; - new->nextDone = NULL; - if (ctx->streams != NULL) - ctx->streams->prev = new; - new->prev = NULL; - new->next = ctx->streams; - ctx->streams = new; - if (id != NULL) - id->opaque = new; - return (0); - free: - save = errno; - FREE(new); - errno = save; - return (-1); -} - -int -evRead(evContext opaqueCtx, int fd, const struct iovec *iov, int iocnt, - evStreamFunc func, void *uap, evStreamID *id) -{ - evContext_p *ctx = opaqueCtx.opaque; - evStream *new; - int save; - - OKNEW(new); - new->func = func; - new->uap = uap; - new->fd = fd; - new->flags = 0; - if (evSelectFD(opaqueCtx, fd, EV_READ, readable, new, &new->file) < 0) - goto free; - if (copyvec(new, iov, iocnt) < 0) - goto free; - new->prevDone = NULL; - new->nextDone = NULL; - if (ctx->streams != NULL) - ctx->streams->prev = new; - new->prev = NULL; - new->next = ctx->streams; - ctx->streams = new; - if (id) - id->opaque = new; - return (0); - free: - save = errno; - FREE(new); - errno = save; - return (-1); -} - -int -evTimeRW(evContext opaqueCtx, evStreamID id, evTimerID timer) /*ARGSUSED*/ { - evStream *str = id.opaque; - - UNUSED(opaqueCtx); - - str->timer = timer; - str->flags |= EV_STR_TIMEROK; - return (0); -} - -int -evUntimeRW(evContext opaqueCtx, evStreamID id) /*ARGSUSED*/ { - evStream *str = id.opaque; - - UNUSED(opaqueCtx); - - str->flags &= ~EV_STR_TIMEROK; - return (0); -} - -int -evCancelRW(evContext opaqueCtx, evStreamID id) { - evContext_p *ctx = opaqueCtx.opaque; - evStream *old = id.opaque; - - /* - * The streams list is doubly threaded. First, there's ctx->streams - * that's used by evDestroy() to find and cancel all streams. Second, - * there's ctx->strDone (head) and ctx->strLast (tail) which thread - * through the potentially smaller number of "IO completed" streams, - * used in evGetNext() to avoid scanning the entire list. - */ - - /* Unlink from ctx->streams. */ - if (old->prev != NULL) - old->prev->next = old->next; - else - ctx->streams = old->next; - if (old->next != NULL) - old->next->prev = old->prev; - - /* - * If 'old' is on the ctx->strDone list, remove it. Update - * ctx->strLast if necessary. - */ - if (old->prevDone == NULL && old->nextDone == NULL) { - /* - * Either 'old' is the only item on the done list, or it's - * not on the done list. If the former, then we unlink it - * from the list. If the latter, we leave the list alone. - */ - if (ctx->strDone == old) { - ctx->strDone = NULL; - ctx->strLast = NULL; - } - } else { - if (old->prevDone != NULL) - old->prevDone->nextDone = old->nextDone; - else - ctx->strDone = old->nextDone; - if (old->nextDone != NULL) - old->nextDone->prevDone = old->prevDone; - else - ctx->strLast = old->prevDone; - } - - /* Deallocate the stream. */ - if (old->file.opaque) - evDeselectFD(opaqueCtx, old->file); - memput(old->iovOrig, sizeof (struct iovec) * old->iovOrigCount); - FREE(old); - return (0); -} - -/* Copy a scatter/gather vector and initialize a stream handler's IO. */ -static int -copyvec(evStream *str, const struct iovec *iov, int iocnt) { - int i; - - str->iovOrig = (struct iovec *)memget(sizeof(struct iovec) * iocnt); - if (str->iovOrig == NULL) { - errno = ENOMEM; - return (-1); - } - str->ioTotal = 0; - for (i = 0; i < iocnt; i++) { - str->iovOrig[i] = iov[i]; - str->ioTotal += iov[i].iov_len; - } - str->iovOrigCount = iocnt; - str->iovCur = str->iovOrig; - str->iovCurCount = str->iovOrigCount; - str->ioDone = 0; - return (0); -} - -/* Pull off or truncate lead iovec(s). */ -static void -consume(evStream *str, size_t bytes) { - while (bytes > 0U) { - if (bytes < (size_t)str->iovCur->iov_len) { - str->iovCur->iov_len -= bytes; - str->iovCur->iov_base = (void *) - ((u_char *)str->iovCur->iov_base + bytes); - str->ioDone += bytes; - bytes = 0; - } else { - bytes -= str->iovCur->iov_len; - str->ioDone += str->iovCur->iov_len; - str->iovCur++; - str->iovCurCount--; - } - } -} - -/* Add a stream to Done list and deselect the FD. */ -static void -done(evContext opaqueCtx, evStream *str) { - evContext_p *ctx = opaqueCtx.opaque; - - if (ctx->strLast != NULL) { - str->prevDone = ctx->strLast; - ctx->strLast->nextDone = str; - ctx->strLast = str; - } else { - INSIST(ctx->strDone == NULL); - ctx->strDone = ctx->strLast = str; - } - evDeselectFD(opaqueCtx, str->file); - str->file.opaque = NULL; - /* evDrop() will call evCancelRW() on us. */ -} - -/* Dribble out some bytes on the stream. (Called by evDispatch().) */ -static void -writable(evContext opaqueCtx, void *uap, int fd, int evmask) { - evStream *str = uap; - int bytes; - - UNUSED(evmask); - - bytes = writev(fd, str->iovCur, str->iovCurCount); - if (bytes > 0) { - if ((str->flags & EV_STR_TIMEROK) != 0) - evTouchIdleTimer(opaqueCtx, str->timer); - consume(str, bytes); - } else { - if (bytes < 0 && errno != EINTR) { - str->ioDone = -1; - str->ioErrno = errno; - } - } - if (str->ioDone == -1 || str->ioDone == str->ioTotal) - done(opaqueCtx, str); -} - -/* Scoop up some bytes from the stream. (Called by evDispatch().) */ -static void -readable(evContext opaqueCtx, void *uap, int fd, int evmask) { - evStream *str = uap; - int bytes; - - UNUSED(evmask); - - bytes = readv(fd, str->iovCur, str->iovCurCount); - if (bytes > 0) { - if ((str->flags & EV_STR_TIMEROK) != 0) - evTouchIdleTimer(opaqueCtx, str->timer); - consume(str, bytes); - } else { - if (bytes == 0) - str->ioDone = 0; - else { - if (errno != EINTR) { - str->ioDone = -1; - str->ioErrno = errno; - } - } - } - if (str->ioDone <= 0 || str->ioDone == str->ioTotal) - done(opaqueCtx, str); -} diff --git a/lib/libc/isc/ev_timers.c b/lib/libc/isc/ev_timers.c deleted file mode 100644 index 11433fbffa2f..000000000000 --- a/lib/libc/isc/ev_timers.c +++ /dev/null @@ -1,497 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1995-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. - */ - -/* ev_timers.c - implement timers for the eventlib - * vix 09sep95 [initial] - */ - -#if !defined(LINT) && !defined(CODECENTER) -static const char rcsid[] = "$Id: ev_timers.c,v 1.2.2.1.4.5 2004/03/17 02:39:13 marka Exp $"; -#endif - -/* Import. */ - -#include "port_before.h" -#include "fd_setsize.h" - -#include <errno.h> - -#include <isc/assertions.h> -#include <isc/eventlib.h> -#include "eventlib_p.h" - -#include "port_after.h" - -/* Constants. */ - -#define MILLION 1000000 -#define BILLION 1000000000 - -/* Forward. */ - -static int due_sooner(void *, void *); -static void set_index(void *, int); -static void free_timer(void *, void *); -static void print_timer(void *, void *); -static void idle_timeout(evContext, void *, struct timespec, struct timespec); - -/* Private type. */ - -typedef struct { - evTimerFunc func; - void * uap; - struct timespec lastTouched; - struct timespec max_idle; - evTimer * timer; -} idle_timer; - -/* Public. */ - -struct timespec -evConsTime(time_t sec, long nsec) { - struct timespec x; - - x.tv_sec = sec; - x.tv_nsec = nsec; - return (x); -} - -struct timespec -evAddTime(struct timespec addend1, struct timespec addend2) { - struct timespec x; - - x.tv_sec = addend1.tv_sec + addend2.tv_sec; - x.tv_nsec = addend1.tv_nsec + addend2.tv_nsec; - if (x.tv_nsec >= BILLION) { - x.tv_sec++; - x.tv_nsec -= BILLION; - } - return (x); -} - -struct timespec -evSubTime(struct timespec minuend, struct timespec subtrahend) { - struct timespec x; - - x.tv_sec = minuend.tv_sec - subtrahend.tv_sec; - if (minuend.tv_nsec >= subtrahend.tv_nsec) - x.tv_nsec = minuend.tv_nsec - subtrahend.tv_nsec; - else { - x.tv_nsec = BILLION - subtrahend.tv_nsec + minuend.tv_nsec; - x.tv_sec--; - } - return (x); -} - -int -evCmpTime(struct timespec a, struct timespec b) { - long x = a.tv_sec - b.tv_sec; - - if (x == 0L) - x = a.tv_nsec - b.tv_nsec; - return (x < 0L ? (-1) : x > 0L ? (1) : (0)); -} - -struct timespec -evNowTime() { - struct timeval now; -#ifdef CLOCK_REALTIME - struct timespec tsnow; - int m = CLOCK_REALTIME; - -#ifdef CLOCK_MONOTONIC - if (__evOptMonoTime) - m = CLOCK_MONOTONIC; -#endif - if (clock_gettime(m, &tsnow) == 0) - return (tsnow); -#endif - if (gettimeofday(&now, NULL) < 0) - return (evConsTime(0, 0)); - return (evTimeSpec(now)); -} - -struct timespec -evUTCTime() { - struct timeval now; -#ifdef CLOCK_REALTIME - struct timespec tsnow; - if (clock_gettime(CLOCK_REALTIME, &tsnow) == 0) - return (tsnow); -#endif - if (gettimeofday(&now, NULL) < 0) - return (evConsTime(0, 0)); - return (evTimeSpec(now)); -} - -struct timespec -evLastEventTime(evContext opaqueCtx) { - evContext_p *ctx = opaqueCtx.opaque; - - return (ctx->lastEventTime); -} - -struct timespec -evTimeSpec(struct timeval tv) { - struct timespec ts; - - ts.tv_sec = tv.tv_sec; - ts.tv_nsec = tv.tv_usec * 1000; - return (ts); -} - -struct timeval -evTimeVal(struct timespec ts) { - struct timeval tv; - - tv.tv_sec = ts.tv_sec; - tv.tv_usec = ts.tv_nsec / 1000; - return (tv); -} - -int -evSetTimer(evContext opaqueCtx, - evTimerFunc func, - void *uap, - struct timespec due, - struct timespec inter, - evTimerID *opaqueID -) { - evContext_p *ctx = opaqueCtx.opaque; - evTimer *id; - - evPrintf(ctx, 1, -"evSetTimer(ctx %p, func %p, uap %p, due %ld.%09ld, inter %ld.%09ld)\n", - ctx, func, uap, - (long)due.tv_sec, due.tv_nsec, - (long)inter.tv_sec, inter.tv_nsec); - -#ifdef __hpux - /* - * tv_sec and tv_nsec are unsigned. - */ - if (due.tv_nsec >= BILLION) - EV_ERR(EINVAL); - - if (inter.tv_nsec >= BILLION) - EV_ERR(EINVAL); -#else - if (due.tv_sec < 0 || due.tv_nsec < 0 || due.tv_nsec >= BILLION) - EV_ERR(EINVAL); - - if (inter.tv_sec < 0 || inter.tv_nsec < 0 || inter.tv_nsec >= BILLION) - EV_ERR(EINVAL); -#endif - - /* due={0,0} is a magic cookie meaning "now." */ - if (due.tv_sec == (time_t)0 && due.tv_nsec == 0L) - due = evNowTime(); - - /* Allocate and fill. */ - OKNEW(id); - id->func = func; - id->uap = uap; - id->due = due; - id->inter = inter; - - if (heap_insert(ctx->timers, id) < 0) - return (-1); - - /* Remember the ID if the caller provided us a place for it. */ - if (opaqueID) - opaqueID->opaque = id; - - if (ctx->debug > 7) { - evPrintf(ctx, 7, "timers after evSetTimer:\n"); - (void) heap_for_each(ctx->timers, print_timer, (void *)ctx); - } - - return (0); -} - -int -evClearTimer(evContext opaqueCtx, evTimerID id) { - evContext_p *ctx = opaqueCtx.opaque; - evTimer *del = id.opaque; - - if (ctx->cur != NULL && - ctx->cur->type == Timer && - ctx->cur->u.timer.this == del) { - evPrintf(ctx, 8, "deferring delete of timer (executing)\n"); - /* - * Setting the interval to zero ensures that evDrop() will - * clean up the timer. - */ - del->inter = evConsTime(0, 0); - return (0); - } - - if (heap_element(ctx->timers, del->index) != del) - EV_ERR(ENOENT); - - if (heap_delete(ctx->timers, del->index) < 0) - return (-1); - FREE(del); - - if (ctx->debug > 7) { - evPrintf(ctx, 7, "timers after evClearTimer:\n"); - (void) heap_for_each(ctx->timers, print_timer, (void *)ctx); - } - - return (0); -} - -int -evConfigTimer(evContext opaqueCtx, - evTimerID id, - const char *param, - int value -) { - evContext_p *ctx = opaqueCtx.opaque; - evTimer *timer = id.opaque; - int result=0; - - UNUSED(value); - - if (heap_element(ctx->timers, timer->index) != timer) - EV_ERR(ENOENT); - - if (strcmp(param, "rate") == 0) - timer->mode |= EV_TMR_RATE; - else if (strcmp(param, "interval") == 0) - timer->mode &= ~EV_TMR_RATE; - else - EV_ERR(EINVAL); - - return (result); -} - -int -evResetTimer(evContext opaqueCtx, - evTimerID id, - evTimerFunc func, - void *uap, - struct timespec due, - struct timespec inter -) { - evContext_p *ctx = opaqueCtx.opaque; - evTimer *timer = id.opaque; - struct timespec old_due; - int result=0; - - if (heap_element(ctx->timers, timer->index) != timer) - EV_ERR(ENOENT); - -#ifdef __hpux - /* - * tv_sec and tv_nsec are unsigned. - */ - if (due.tv_nsec >= BILLION) - EV_ERR(EINVAL); - - if (inter.tv_nsec >= BILLION) - EV_ERR(EINVAL); -#else - if (due.tv_sec < 0 || due.tv_nsec < 0 || due.tv_nsec >= BILLION) - EV_ERR(EINVAL); - - if (inter.tv_sec < 0 || inter.tv_nsec < 0 || inter.tv_nsec >= BILLION) - EV_ERR(EINVAL); -#endif - - old_due = timer->due; - - timer->func = func; - timer->uap = uap; - timer->due = due; - timer->inter = inter; - - switch (evCmpTime(due, old_due)) { - case -1: - result = heap_increased(ctx->timers, timer->index); - break; - case 0: - result = 0; - break; - case 1: - result = heap_decreased(ctx->timers, timer->index); - break; - } - - if (ctx->debug > 7) { - evPrintf(ctx, 7, "timers after evResetTimer:\n"); - (void) heap_for_each(ctx->timers, print_timer, (void *)ctx); - } - - return (result); -} - -int -evSetIdleTimer(evContext opaqueCtx, - evTimerFunc func, - void *uap, - struct timespec max_idle, - evTimerID *opaqueID -) { - evContext_p *ctx = opaqueCtx.opaque; - idle_timer *tt; - - /* Allocate and fill. */ - OKNEW(tt); - tt->func = func; - tt->uap = uap; - tt->lastTouched = ctx->lastEventTime; - tt->max_idle = max_idle; - - if (evSetTimer(opaqueCtx, idle_timeout, tt, - evAddTime(ctx->lastEventTime, max_idle), - max_idle, opaqueID) < 0) { - FREE(tt); - return (-1); - } - - tt->timer = opaqueID->opaque; - - return (0); -} - -int -evClearIdleTimer(evContext opaqueCtx, evTimerID id) { - evTimer *del = id.opaque; - idle_timer *tt = del->uap; - - FREE(tt); - return (evClearTimer(opaqueCtx, id)); -} - -int -evResetIdleTimer(evContext opaqueCtx, - evTimerID opaqueID, - evTimerFunc func, - void *uap, - struct timespec max_idle -) { - evContext_p *ctx = opaqueCtx.opaque; - evTimer *timer = opaqueID.opaque; - idle_timer *tt = timer->uap; - - tt->func = func; - tt->uap = uap; - tt->lastTouched = ctx->lastEventTime; - tt->max_idle = max_idle; - - return (evResetTimer(opaqueCtx, opaqueID, idle_timeout, tt, - evAddTime(ctx->lastEventTime, max_idle), - max_idle)); -} - -int -evTouchIdleTimer(evContext opaqueCtx, evTimerID id) { - evContext_p *ctx = opaqueCtx.opaque; - evTimer *t = id.opaque; - idle_timer *tt = t->uap; - - tt->lastTouched = ctx->lastEventTime; - - return (0); -} - -/* Public to the rest of eventlib. */ - -heap_context -evCreateTimers(const evContext_p *ctx) { - - UNUSED(ctx); - - return (heap_new(due_sooner, set_index, 2048)); -} - -void -evDestroyTimers(const evContext_p *ctx) { - (void) heap_for_each(ctx->timers, free_timer, NULL); - (void) heap_free(ctx->timers); -} - -/* Private. */ - -static int -due_sooner(void *a, void *b) { - evTimer *a_timer, *b_timer; - - a_timer = a; - b_timer = b; - return (evCmpTime(a_timer->due, b_timer->due) < 0); -} - -static void -set_index(void *what, int index) { - evTimer *timer; - - timer = what; - timer->index = index; -} - -static void -free_timer(void *what, void *uap) { - evTimer *t = what; - - UNUSED(uap); - - FREE(t); -} - -static void -print_timer(void *what, void *uap) { - evTimer *cur = what; - evContext_p *ctx = uap; - - cur = what; - evPrintf(ctx, 7, - " func %p, uap %p, due %ld.%09ld, inter %ld.%09ld\n", - cur->func, cur->uap, - (long)cur->due.tv_sec, cur->due.tv_nsec, - (long)cur->inter.tv_sec, cur->inter.tv_nsec); -} - -static void -idle_timeout(evContext opaqueCtx, - void *uap, - struct timespec due, - struct timespec inter -) { - evContext_p *ctx = opaqueCtx.opaque; - idle_timer *this = uap; - struct timespec idle; - - UNUSED(due); - UNUSED(inter); - - idle = evSubTime(ctx->lastEventTime, this->lastTouched); - if (evCmpTime(idle, this->max_idle) >= 0) { - (this->func)(opaqueCtx, this->uap, this->timer->due, - this->max_idle); - /* - * Setting the interval to zero will cause the timer to - * be cleaned up in evDrop(). - */ - this->timer->inter = evConsTime(0, 0); - FREE(this); - } else { - /* evDrop() will reschedule the timer. */ - this->timer->inter = evSubTime(this->max_idle, idle); - } -} diff --git a/lib/libc/isc/eventlib_p.h b/lib/libc/isc/eventlib_p.h deleted file mode 100644 index b95741d7aff3..000000000000 --- a/lib/libc/isc/eventlib_p.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (c) 2005 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1995-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. - */ - -/* eventlib_p.h - private interfaces for eventlib - * vix 09sep95 [initial] - * - * $Id: eventlib_p.h,v 1.3.2.1.4.3 2005/07/28 07:43:20 marka Exp $ - */ - -#ifndef _EVENTLIB_P_H -#define _EVENTLIB_P_H - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <sys/un.h> - -#define EVENTLIB_DEBUG 1 - -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/heap.h> -#include <isc/list.h> -#include <isc/memcluster.h> - -#define EV_MASK_ALL (EV_READ | EV_WRITE | EV_EXCEPT) -#define EV_ERR(e) return (errno = (e), -1) -#define OK(x) if ((x) < 0) EV_ERR(errno); else (void)NULL - -#define NEW(p) if (((p) = memget(sizeof *(p))) != NULL) \ - FILL(p); \ - else \ - (void)NULL; -#define OKNEW(p) if (!((p) = memget(sizeof *(p)))) { \ - errno = ENOMEM; \ - return (-1); \ - } else \ - FILL(p) -#define FREE(p) memput((p), sizeof *(p)) - -#if EVENTLIB_DEBUG -#define FILL(p) memset((p), 0xF5, sizeof *(p)) -#else -#define FILL(p) -#endif - -#ifdef USE_POLL -#ifdef HAVE_STROPTS_H -#include <stropts.h> -#endif -#include <poll.h> -#endif /* USE_POLL */ - -typedef struct evConn { - evConnFunc func; - void * uap; - int fd; - int flags; -#define EV_CONN_LISTEN 0x0001 /* Connection is a listener. */ -#define EV_CONN_SELECTED 0x0002 /* evSelectFD(conn->file). */ -#define EV_CONN_BLOCK 0x0004 /* Listener fd was blocking. */ - evFileID file; - struct evConn * prev; - struct evConn * next; -} evConn; - -typedef struct evAccept { - int fd; - union { - struct sockaddr sa; - struct sockaddr_in in; -#ifndef NO_SOCKADDR_UN - struct sockaddr_un un; -#endif - } la; - ISC_SOCKLEN_T lalen; - union { - struct sockaddr sa; - struct sockaddr_in in; -#ifndef NO_SOCKADDR_UN - struct sockaddr_un un; -#endif - } ra; - ISC_SOCKLEN_T ralen; - int ioErrno; - evConn * conn; - LINK(struct evAccept) link; -} evAccept; - -typedef struct evFile { - evFileFunc func; - void * uap; - int fd; - int eventmask; - int preemptive; - struct evFile * prev; - struct evFile * next; - struct evFile * fdprev; - struct evFile * fdnext; -} evFile; - -typedef struct evStream { - evStreamFunc func; - void * uap; - evFileID file; - evTimerID timer; - int flags; -#define EV_STR_TIMEROK 0x0001 /* IFF timer valid. */ - int fd; - struct iovec * iovOrig; - int iovOrigCount; - struct iovec * iovCur; - int iovCurCount; - int ioTotal; - int ioDone; - int ioErrno; - struct evStream *prevDone, *nextDone; - struct evStream *prev, *next; -} evStream; - -typedef struct evTimer { - evTimerFunc func; - void * uap; - struct timespec due, inter; - int index; - int mode; -#define EV_TMR_RATE 1 -} evTimer; - -typedef struct evWait { - evWaitFunc func; - void * uap; - const void * tag; - struct evWait * next; -} evWait; - -typedef struct evWaitList { - evWait * first; - evWait * last; - struct evWaitList * prev; - struct evWaitList * next; -} evWaitList; - -typedef struct evEvent_p { - enum { Accept, File, Stream, Timer, Wait, Free, Null } type; - union { - struct { evAccept *this; } accept; - struct { evFile *this; int eventmask; } file; - struct { evStream *this; } stream; - struct { evTimer *this; } timer; - struct { evWait *this; } wait; - struct { struct evEvent_p *next; } free; - struct { const void *placeholder; } null; - } u; -} evEvent_p; - -#ifdef USE_POLL -typedef struct { - void *ctx; /* pointer to the evContext_p */ - uint32_t type; /* READ, WRITE, EXCEPT, nonblk */ - uint32_t result; /* 1 => revents, 0 => events */ -} __evEmulMask; - -#define emulMaskInit(ctx, field, ev, lastnext) \ - ctx->field.ctx = ctx; \ - ctx->field.type = ev; \ - ctx->field.result = lastnext; - -extern short *__fd_eventfield(int fd, __evEmulMask *maskp); -extern short __poll_event(__evEmulMask *maskp); -extern void __fd_clr(int fd, __evEmulMask *maskp); -extern void __fd_set(int fd, __evEmulMask *maskp); - -#undef FD_ZERO -#define FD_ZERO(maskp) - -#undef FD_SET -#define FD_SET(fd, maskp) \ - __fd_set(fd, maskp) - -#undef FD_CLR -#define FD_CLR(fd, maskp) \ - __fd_clr(fd, maskp) - -#undef FD_ISSET -#define FD_ISSET(fd, maskp) \ - ((*__fd_eventfield(fd, maskp) & __poll_event(maskp)) != 0) - -#endif /* USE_POLL */ - -typedef struct { - /* Global. */ - const evEvent_p *cur; - /* Debugging. */ - int debug; - FILE *output; - /* Connections. */ - evConn *conns; - LIST(evAccept) accepts; - /* Files. */ - evFile *files, *fdNext; -#ifndef USE_POLL - fd_set rdLast, rdNext; - fd_set wrLast, wrNext; - fd_set exLast, exNext; - fd_set nonblockBefore; - int fdMax, fdCount, highestFD; - evFile *fdTable[FD_SETSIZE]; -#else - struct pollfd *pollfds; /* Allocated as needed */ - evFile **fdTable; /* Ditto */ - int maxnfds; /* # elements in above */ - int firstfd; /* First active fd */ - int fdMax; /* Last active fd */ - int fdCount; /* # fd:s with I/O */ - int highestFD; /* max fd allowed by OS */ - __evEmulMask rdLast, rdNext; - __evEmulMask wrLast, wrNext; - __evEmulMask exLast, exNext; - __evEmulMask nonblockBefore; -#endif /* USE_POLL */ -#ifdef EVENTLIB_TIME_CHECKS - struct timespec lastSelectTime; - int lastFdCount; -#endif - /* Streams. */ - evStream *streams; - evStream *strDone, *strLast; - /* Timers. */ - struct timespec lastEventTime; - heap_context timers; - /* Waits. */ - evWaitList *waitLists; - evWaitList waitDone; -} evContext_p; - -/* eventlib.c */ -#define evPrintf __evPrintf -void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...) - ISC_FORMAT_PRINTF(3, 4); - -#ifdef USE_POLL -extern int evPollfdRealloc(evContext_p *ctx, int pollfd_chunk_size, int fd); -#endif /* USE_POLL */ - -/* ev_timers.c */ -#define evCreateTimers __evCreateTimers -heap_context evCreateTimers(const evContext_p *); -#define evDestroyTimers __evDestroyTimers -void evDestroyTimers(const evContext_p *); - -/* ev_waits.c */ -#define evFreeWait __evFreeWait -evWait *evFreeWait(evContext_p *ctx, evWait *old); - -/* Global options */ -extern int __evOptMonoTime; - -#endif /*_EVENTLIB_P_H*/ diff --git a/lib/libc/nameser/ns_name.c b/lib/libc/nameser/ns_name.c deleted file mode 100644 index 5ac91e3da94a..000000000000 --- a/lib/libc/nameser/ns_name.c +++ /dev/null @@ -1,963 +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. - */ - -#ifndef lint -static const char rcsid[] = "$Id: ns_name.c,v 1.3.2.4.4.2 2004/05/04 03:27:47 marka Exp $"; -#endif - -#include "port_before.h" - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <resolv.h> -#include <string.h> -#include <ctype.h> -#include <stdlib.h> -#include <limits.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -#define NS_TYPE_ELT 0x40 /* EDNS0 extended label type */ -#define DNS_LABELTYPE_BITSTRING 0x41 - -/* Data. */ - -static const char digits[] = "0123456789"; - -static const char digitvalue[256] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*16*/ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*32*/ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*48*/ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /*64*/ - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*80*/ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*96*/ - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*112*/ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*128*/ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*256*/ -}; - -/* Forward. */ - -static int special(int); -static int printable(int); -static int dn_find(const u_char *, const u_char *, - const u_char * const *, - const u_char * const *); -static int encode_bitsring(const char **, const char *, - unsigned char **, unsigned char **, - unsigned const char *); -static int labellen(const u_char *); -static int decode_bitstring(const unsigned char **, - char *, const char *); - -/* Public. */ - -/* - * ns_name_ntop(src, dst, dstsiz) - * Convert an encoded domain name to printable ascii as per RFC1035. - * return: - * Number of bytes written to buffer, or -1 (with errno set) - * notes: - * The root is returned as "." - * All other domains are returned in non absolute form - */ -int -ns_name_ntop(const u_char *src, char *dst, size_t dstsiz) -{ - const u_char *cp; - char *dn, *eom; - u_char c; - u_int n; - int l; - - cp = src; - dn = dst; - eom = dst + dstsiz; - - while ((n = *cp++) != 0) { - if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) { - /* Some kind of compression pointer. */ - errno = EMSGSIZE; - return (-1); - } - if (dn != dst) { - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '.'; - } - if ((l = labellen(cp - 1)) < 0) { - errno = EMSGSIZE; /* XXX */ - return(-1); - } - if (dn + l >= eom) { - errno = EMSGSIZE; - return (-1); - } - if ((n & NS_CMPRSFLGS) == NS_TYPE_ELT) { - int m; - - if (n != DNS_LABELTYPE_BITSTRING) { - /* XXX: labellen should reject this case */ - errno = EINVAL; - return(-1); - } - if ((m = decode_bitstring(&cp, dn, eom)) < 0) - { - errno = EMSGSIZE; - return(-1); - } - dn += m; - continue; - } - for ((void)NULL; l > 0; l--) { - c = *cp++; - if (special(c)) { - if (dn + 1 >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '\\'; - *dn++ = (char)c; - } else if (!printable(c)) { - if (dn + 3 >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '\\'; - *dn++ = digits[c / 100]; - *dn++ = digits[(c % 100) / 10]; - *dn++ = digits[c % 10]; - } else { - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = (char)c; - } - } - } - if (dn == dst) { - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '.'; - } - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '\0'; - return (dn - dst); -} - -/* - * ns_name_pton(src, dst, dstsiz) - * Convert a ascii string into an encoded domain name as per RFC1035. - * return: - * -1 if it fails - * 1 if string was fully qualified - * 0 is string was not fully qualified - * notes: - * Enforces label and domain length limits. - */ - -int -ns_name_pton(const char *src, u_char *dst, size_t dstsiz) -{ - u_char *label, *bp, *eom; - int c, n, escaped, e = 0; - char *cp; - - escaped = 0; - bp = dst; - eom = dst + dstsiz; - label = bp++; - - while ((c = *src++) != 0) { - if (escaped) { - if (c == '[') { /* start a bit string label */ - if ((cp = strchr(src, ']')) == NULL) { - errno = EINVAL; /* ??? */ - return(-1); - } - if ((e = encode_bitsring(&src, cp + 2, - &label, &bp, eom)) - != 0) { - errno = e; - return(-1); - } - escaped = 0; - label = bp++; - if ((c = *src++) == 0) - goto done; - else if (c != '.') { - errno = EINVAL; - return(-1); - } - continue; - } - else if ((cp = strchr(digits, c)) != NULL) { - n = (cp - digits) * 100; - if ((c = *src++) == 0 || - (cp = strchr(digits, c)) == NULL) { - errno = EMSGSIZE; - return (-1); - } - n += (cp - digits) * 10; - if ((c = *src++) == 0 || - (cp = strchr(digits, c)) == NULL) { - errno = EMSGSIZE; - return (-1); - } - n += (cp - digits); - if (n > 255) { - errno = EMSGSIZE; - return (-1); - } - c = n; - } - escaped = 0; - } else if (c == '\\') { - escaped = 1; - continue; - } else if (c == '.') { - c = (bp - label - 1); - if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */ - errno = EMSGSIZE; - return (-1); - } - if (label >= eom) { - errno = EMSGSIZE; - return (-1); - } - *label = c; - /* Fully qualified ? */ - if (*src == '\0') { - if (c != 0) { - if (bp >= eom) { - errno = EMSGSIZE; - return (-1); - } - *bp++ = '\0'; - } - if ((bp - dst) > MAXCDNAME) { - errno = EMSGSIZE; - return (-1); - } - return (1); - } - if (c == 0 || *src == '.') { - errno = EMSGSIZE; - return (-1); - } - label = bp++; - continue; - } - if (bp >= eom) { - errno = EMSGSIZE; - return (-1); - } - *bp++ = (u_char)c; - } - c = (bp - label - 1); - if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */ - errno = EMSGSIZE; - return (-1); - } - done: - if (label >= eom) { - errno = EMSGSIZE; - return (-1); - } - *label = c; - if (c != 0) { - if (bp >= eom) { - errno = EMSGSIZE; - return (-1); - } - *bp++ = 0; - } - if ((bp - dst) > MAXCDNAME) { /* src too big */ - errno = EMSGSIZE; - return (-1); - } - return (0); -} - -/* - * ns_name_ntol(src, dst, dstsiz) - * Convert a network strings labels into all lowercase. - * return: - * Number of bytes written to buffer, or -1 (with errno set) - * notes: - * Enforces label and domain length limits. - */ - -int -ns_name_ntol(const u_char *src, u_char *dst, size_t dstsiz) -{ - const u_char *cp; - u_char *dn, *eom; - u_char c; - u_int n; - int l; - - cp = src; - dn = dst; - eom = dst + dstsiz; - - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - while ((n = *cp++) != 0) { - if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) { - /* Some kind of compression pointer. */ - errno = EMSGSIZE; - return (-1); - } - *dn++ = n; - if ((l = labellen(cp - 1)) < 0) { - errno = EMSGSIZE; - return (-1); - } - if (dn + l >= eom) { - errno = EMSGSIZE; - return (-1); - } - for ((void)NULL; l > 0; l--) { - c = *cp++; - if (isupper(c)) - *dn++ = tolower(c); - else - *dn++ = c; - } - } - *dn++ = '\0'; - return (dn - dst); -} - -/* - * ns_name_unpack(msg, eom, src, dst, dstsiz) - * Unpack a domain name from a message, source may be compressed. - * return: - * -1 if it fails, or consumed octets if it succeeds. - */ -int -ns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src, - u_char *dst, size_t dstsiz) -{ - const u_char *srcp, *dstlim; - u_char *dstp; - int n, len, checked, l; - - len = -1; - checked = 0; - dstp = dst; - srcp = src; - dstlim = dst + dstsiz; - if (srcp < msg || srcp >= eom) { - errno = EMSGSIZE; - return (-1); - } - /* Fetch next label in domain name. */ - while ((n = *srcp++) != 0) { - /* Check for indirection. */ - switch (n & NS_CMPRSFLGS) { - case 0: - case NS_TYPE_ELT: - /* Limit checks. */ - if ((l = labellen(srcp - 1)) < 0) { - errno = EMSGSIZE; - return(-1); - } - if (dstp + l + 1 >= dstlim || srcp + l >= eom) { - errno = EMSGSIZE; - return (-1); - } - checked += l + 1; - *dstp++ = n; - memcpy(dstp, srcp, l); - dstp += l; - srcp += l; - break; - - case NS_CMPRSFLGS: - if (srcp >= eom) { - errno = EMSGSIZE; - return (-1); - } - if (len < 0) - len = srcp - src + 1; - srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff)); - if (srcp < msg || srcp >= eom) { /* Out of range. */ - errno = EMSGSIZE; - return (-1); - } - checked += 2; - /* - * Check for loops in the compressed name; - * if we've looked at the whole message, - * there must be a loop. - */ - if (checked >= eom - msg) { - errno = EMSGSIZE; - return (-1); - } - break; - - default: - errno = EMSGSIZE; - return (-1); /* flag error */ - } - } - *dstp = '\0'; - if (len < 0) - len = srcp - src; - return (len); -} - -/* - * ns_name_pack(src, dst, dstsiz, dnptrs, lastdnptr) - * Pack domain name 'domain' into 'comp_dn'. - * return: - * Size of the compressed name, or -1. - * notes: - * 'dnptrs' is an array of pointers to previous compressed names. - * dnptrs[0] is a pointer to the beginning of the message. The array - * ends with NULL. - * 'lastdnptr' is a pointer to the end of the array pointed to - * by 'dnptrs'. - * Side effects: - * The list of pointers in dnptrs is updated for labels inserted into - * the message as we compress the name. If 'dnptr' is NULL, we don't - * try to compress names. If 'lastdnptr' is NULL, we don't update the - * list. - */ -int -ns_name_pack(const u_char *src, u_char *dst, int dstsiz, - const u_char **dnptrs, const u_char **lastdnptr) -{ - u_char *dstp; - const u_char **cpp, **lpp, *eob, *msg; - const u_char *srcp; - int n, l, first = 1; - - srcp = src; - dstp = dst; - eob = dstp + dstsiz; - lpp = cpp = NULL; - if (dnptrs != NULL) { - if ((msg = *dnptrs++) != NULL) { - for (cpp = dnptrs; *cpp != NULL; cpp++) - (void)NULL; - lpp = cpp; /* end of list to search */ - } - } else - msg = NULL; - - /* make sure the domain we are about to add is legal */ - l = 0; - do { - int l0; - - n = *srcp; - if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) { - errno = EMSGSIZE; - return (-1); - } - if ((l0 = labellen(srcp)) < 0) { - errno = EINVAL; - return(-1); - } - l += l0 + 1; - if (l > MAXCDNAME) { - errno = EMSGSIZE; - return (-1); - } - srcp += l0 + 1; - } while (n != 0); - - /* from here on we need to reset compression pointer array on error */ - srcp = src; - do { - /* Look to see if we can use pointers. */ - n = *srcp; - if (n != 0 && msg != NULL) { - l = dn_find(srcp, msg, (const u_char * const *)dnptrs, - (const u_char * const *)lpp); - if (l >= 0) { - if (dstp + 1 >= eob) { - goto cleanup; - } - *dstp++ = (l >> 8) | NS_CMPRSFLGS; - *dstp++ = l % 256; - return (dstp - dst); - } - /* Not found, save it. */ - if (lastdnptr != NULL && cpp < lastdnptr - 1 && - (dstp - msg) < 0x4000 && first) { - *cpp++ = dstp; - *cpp = NULL; - first = 0; - } - } - /* copy label to buffer */ - if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) { - /* Should not happen. */ - goto cleanup; - } - n = labellen(srcp); - if (dstp + 1 + n >= eob) { - goto cleanup; - } - memcpy(dstp, srcp, n + 1); - srcp += n + 1; - dstp += n + 1; - } while (n != 0); - - if (dstp > eob) { -cleanup: - if (msg != NULL) - *lpp = NULL; - errno = EMSGSIZE; - return (-1); - } - return (dstp - dst); -} - -/* - * ns_name_uncompress(msg, eom, src, dst, dstsiz) - * Expand compressed domain name to presentation format. - * return: - * Number of bytes read out of `src', or -1 (with errno set). - * note: - * Root domain returns as "." not "". - */ -int -ns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src, - char *dst, size_t dstsiz) -{ - u_char tmp[NS_MAXCDNAME]; - int n; - - if ((n = ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1) - return (-1); - if (ns_name_ntop(tmp, dst, dstsiz) == -1) - return (-1); - return (n); -} - -/* - * ns_name_compress(src, dst, dstsiz, dnptrs, lastdnptr) - * Compress a domain name into wire format, using compression pointers. - * return: - * Number of bytes consumed in `dst' or -1 (with errno set). - * notes: - * 'dnptrs' is an array of pointers to previous compressed names. - * dnptrs[0] is a pointer to the beginning of the message. - * The list ends with NULL. 'lastdnptr' is a pointer to the end of the - * array pointed to by 'dnptrs'. Side effect is to update the list of - * pointers for labels inserted into the message as we compress the name. - * If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr' - * is NULL, we don't update the list. - */ -int -ns_name_compress(const char *src, u_char *dst, size_t dstsiz, - const u_char **dnptrs, const u_char **lastdnptr) -{ - u_char tmp[NS_MAXCDNAME]; - - if (ns_name_pton(src, tmp, sizeof tmp) == -1) - return (-1); - return (ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr)); -} - -/* - * Reset dnptrs so that there are no active references to pointers at or - * after src. - */ -void -ns_name_rollback(const u_char *src, const u_char **dnptrs, - const u_char **lastdnptr) -{ - while (dnptrs < lastdnptr && *dnptrs != NULL) { - if (*dnptrs >= src) { - *dnptrs = NULL; - break; - } - dnptrs++; - } -} - -/* - * ns_name_skip(ptrptr, eom) - * Advance *ptrptr to skip over the compressed name it points at. - * return: - * 0 on success, -1 (with errno set) on failure. - */ -int -ns_name_skip(const u_char **ptrptr, const u_char *eom) -{ - const u_char *cp; - u_int n; - int l; - - cp = *ptrptr; - while (cp < eom && (n = *cp++) != 0) { - /* Check for indirection. */ - switch (n & NS_CMPRSFLGS) { - case 0: /* normal case, n == len */ - cp += n; - continue; - case NS_TYPE_ELT: /* EDNS0 extended label */ - if ((l = labellen(cp - 1)) < 0) { - errno = EMSGSIZE; /* XXX */ - return(-1); - } - cp += l; - continue; - case NS_CMPRSFLGS: /* indirection */ - cp++; - break; - default: /* illegal type */ - errno = EMSGSIZE; - return (-1); - } - break; - } - if (cp > eom) { - errno = EMSGSIZE; - return (-1); - } - *ptrptr = cp; - return (0); -} - -/* Private. */ - -/* - * special(ch) - * Thinking in noninternationalized USASCII (per the DNS spec), - * is this characted special ("in need of quoting") ? - * return: - * boolean. - */ -static int -special(int ch) { - switch (ch) { - case 0x22: /* '"' */ - case 0x2E: /* '.' */ - case 0x3B: /* ';' */ - case 0x5C: /* '\\' */ - case 0x28: /* '(' */ - case 0x29: /* ')' */ - /* Special modifiers in zone files. */ - case 0x40: /* '@' */ - case 0x24: /* '$' */ - return (1); - default: - return (0); - } -} - -/* - * printable(ch) - * Thinking in noninternationalized USASCII (per the DNS spec), - * is this character visible and not a space when printed ? - * return: - * boolean. - */ -static int -printable(int ch) { - return (ch > 0x20 && ch < 0x7f); -} - -/* - * Thinking in noninternationalized USASCII (per the DNS spec), - * convert this character to lower case if it's upper case. - */ -static int -mklower(int ch) { - if (ch >= 0x41 && ch <= 0x5A) - return (ch + 0x20); - return (ch); -} - -/* - * dn_find(domain, msg, dnptrs, lastdnptr) - * Search for the counted-label name in an array of compressed names. - * return: - * offset from msg if found, or -1. - * notes: - * dnptrs is the pointer to the first name on the list, - * not the pointer to the start of the message. - */ -static int -dn_find(const u_char *domain, const u_char *msg, - const u_char * const *dnptrs, - const u_char * const *lastdnptr) -{ - const u_char *dn, *cp, *sp; - const u_char * const *cpp; - u_int n; - - for (cpp = dnptrs; cpp < lastdnptr; cpp++) { - sp = *cpp; - /* - * terminate search on: - * root label - * compression pointer - * unusable offset - */ - while (*sp != 0 && (*sp & NS_CMPRSFLGS) == 0 && - (sp - msg) < 0x4000) { - dn = domain; - cp = sp; - while ((n = *cp++) != 0) { - /* - * check for indirection - */ - switch (n & NS_CMPRSFLGS) { - case 0: /* normal case, n == len */ - n = labellen(cp - 1); /* XXX */ - - if (n != *dn++) - goto next; - - for ((void)NULL; n > 0; n--) - if (mklower(*dn++) != - mklower(*cp++)) - goto next; - /* Is next root for both ? */ - if (*dn == '\0' && *cp == '\0') - return (sp - msg); - if (*dn) - continue; - goto next; - case NS_CMPRSFLGS: /* indirection */ - cp = msg + (((n & 0x3f) << 8) | *cp); - break; - - default: /* illegal type */ - errno = EMSGSIZE; - return (-1); - } - } - next: ; - sp += *sp + 1; - } - } - errno = ENOENT; - return (-1); -} - -static int -decode_bitstring(const unsigned char **cpp, char *dn, const char *eom) -{ - const unsigned char *cp = *cpp; - char *beg = dn, tc; - int b, blen, plen, i; - - if ((blen = (*cp & 0xff)) == 0) - blen = 256; - plen = (blen + 3) / 4; - plen += sizeof("\\[x/]") + (blen > 99 ? 3 : (blen > 9) ? 2 : 1); - if (dn + plen >= eom) - return(-1); - - cp++; - i = SPRINTF((dn, "\\[x")); - if (i < 0) - return (-1); - dn += i; - for (b = blen; b > 7; b -= 8, cp++) { - i = SPRINTF((dn, "%02x", *cp & 0xff)); - if (i < 0) - return (-1); - dn += i; - } - if (b > 4) { - tc = *cp++; - i = SPRINTF((dn, "%02x", tc & (0xff << (8 - b)))); - if (i < 0) - return (-1); - dn += i; - } else if (b > 0) { - tc = *cp++; - i = SPRINTF((dn, "%1x", - ((tc >> 4) & 0x0f) & (0x0f << (4 - b)))); - if (i < 0) - return (-1); - dn += i; - } - i = SPRINTF((dn, "/%d]", blen)); - if (i < 0) - return (-1); - dn += i; - - *cpp = cp; - return(dn - beg); -} - -static int -encode_bitsring(const char **bp, const char *end, unsigned char **labelp, - unsigned char ** dst, unsigned const char *eom) -{ - int afterslash = 0; - const char *cp = *bp; - unsigned char *tp; - char c; - const char *beg_blen; - char *end_blen = NULL; - int value = 0, count = 0, tbcount = 0, blen = 0; - - beg_blen = end_blen = NULL; - - /* a bitstring must contain at least 2 characters */ - if (end - cp < 2) - return(EINVAL); - - /* XXX: currently, only hex strings are supported */ - if (*cp++ != 'x') - return(EINVAL); - if (!isxdigit((*cp) & 0xff)) /* reject '\[x/BLEN]' */ - return(EINVAL); - - for (tp = *dst + 1; cp < end && tp < eom; cp++) { - switch((c = *cp)) { - case ']': /* end of the bitstring */ - if (afterslash) { - if (beg_blen == NULL) - return(EINVAL); - blen = (int)strtol(beg_blen, &end_blen, 10); - if (*end_blen != ']') - return(EINVAL); - } - if (count) - *tp++ = ((value << 4) & 0xff); - cp++; /* skip ']' */ - goto done; - case '/': - afterslash = 1; - break; - default: - if (afterslash) { - if (!isdigit(c&0xff)) - return(EINVAL); - if (beg_blen == NULL) { - - if (c == '0') { - /* blen never begings with 0 */ - return(EINVAL); - } - beg_blen = cp; - } - } else { - if (!isxdigit(c&0xff)) - return(EINVAL); - value <<= 4; - value += digitvalue[(int)c]; - count += 4; - tbcount += 4; - if (tbcount > 256) - return(EINVAL); - if (count == 8) { - *tp++ = value; - count = 0; - } - } - break; - } - } - done: - if (cp >= end || tp >= eom) - return(EMSGSIZE); - - /* - * bit length validation: - * If a <length> is present, the number of digits in the <bit-data> - * MUST be just sufficient to contain the number of bits specified - * by the <length>. If there are insignificant bits in a final - * hexadecimal or octal digit, they MUST be zero. - * RFC 2673, Section 3.2. - */ - if (blen > 0) { - int traillen; - - if (((blen + 3) & ~3) != tbcount) - return(EINVAL); - traillen = tbcount - blen; /* between 0 and 3 */ - if (((value << (8 - traillen)) & 0xff) != 0) - return(EINVAL); - } - else - blen = tbcount; - if (blen == 256) - blen = 0; - - /* encode the type and the significant bit fields */ - **labelp = DNS_LABELTYPE_BITSTRING; - **dst = blen; - - *bp = cp; - *dst = tp; - - return(0); -} - -static int -labellen(const u_char *lp) -{ - int bitlen; - u_char l = *lp; - - if ((l & NS_CMPRSFLGS) == NS_CMPRSFLGS) { - /* should be avoided by the caller */ - return(-1); - } - - if ((l & NS_CMPRSFLGS) == NS_TYPE_ELT) { - if (l == DNS_LABELTYPE_BITSTRING) { - if ((bitlen = *(lp + 1)) == 0) - bitlen = 256; - return((bitlen + 7 ) / 8 + 1); - } - return(-1); /* unknwon ELT */ - } - return(l); -} diff --git a/lib/libc/nameser/ns_netint.c b/lib/libc/nameser/ns_netint.c deleted file mode 100644 index 15fc93e40e95..000000000000 --- a/lib/libc/nameser/ns_netint.c +++ /dev/null @@ -1,56 +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. - */ - -#ifndef lint -static const char rcsid[] = "$Id: ns_netint.c,v 1.1.206.1 2004/03/09 08:33:44 marka Exp $"; -#endif - -/* Import. */ - -#include "port_before.h" - -#include <arpa/nameser.h> - -#include "port_after.h" - -/* Public. */ - -u_int -ns_get16(const u_char *src) { - u_int dst; - - NS_GET16(dst, src); - return (dst); -} - -u_long -ns_get32(const u_char *src) { - u_long dst; - - NS_GET32(dst, src); - return (dst); -} - -void -ns_put16(u_int src, u_char *dst) { - NS_PUT16(src, dst); -} - -void -ns_put32(u_long src, u_char *dst) { - NS_PUT32(src, dst); -} diff --git a/lib/libc/nameser/ns_parse.c b/lib/libc/nameser/ns_parse.c deleted file mode 100644 index 19a6f51b2db1..000000000000 --- a/lib/libc/nameser/ns_parse.c +++ /dev/null @@ -1,209 +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. - */ - -#ifndef lint -static const char rcsid[] = "$Id: ns_parse.c,v 1.3.2.1.4.3 2005/10/11 00:48:16 marka Exp $"; -#endif - -/* Import. */ - -#include "port_before.h" - -#include <sys/types.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <resolv.h> -#include <string.h> - -#include "port_after.h" - -/* Forward. */ - -static void setsection(ns_msg *msg, ns_sect sect); - -/* Macros. */ - -#ifndef SOLARIS2 -#define RETERR(err) do { errno = (err); return (-1); } while (0) -#else -#define RETERR(err) \ - do { errno = (err); if (errno == errno) return (-1); } while (0) -#endif - -/* Public. */ - -/* These need to be in the same order as the nres.h:ns_flag enum. */ -struct _ns_flagdata _ns_flagdata[16] = { - { 0x8000, 15 }, /* qr. */ - { 0x7800, 11 }, /* opcode. */ - { 0x0400, 10 }, /* aa. */ - { 0x0200, 9 }, /* tc. */ - { 0x0100, 8 }, /* rd. */ - { 0x0080, 7 }, /* ra. */ - { 0x0040, 6 }, /* z. */ - { 0x0020, 5 }, /* ad. */ - { 0x0010, 4 }, /* cd. */ - { 0x000f, 0 }, /* rcode. */ - { 0x0000, 0 }, /* expansion (1/6). */ - { 0x0000, 0 }, /* expansion (2/6). */ - { 0x0000, 0 }, /* expansion (3/6). */ - { 0x0000, 0 }, /* expansion (4/6). */ - { 0x0000, 0 }, /* expansion (5/6). */ - { 0x0000, 0 }, /* expansion (6/6). */ -}; - -int ns_msg_getflag(ns_msg handle, int flag) { - return(((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift); -} - -int -ns_skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count) { - const u_char *optr = ptr; - - for ((void)NULL; count > 0; count--) { - int b, rdlength; - - b = dn_skipname(ptr, eom); - if (b < 0) - RETERR(EMSGSIZE); - ptr += b/*Name*/ + NS_INT16SZ/*Type*/ + NS_INT16SZ/*Class*/; - if (section != ns_s_qd) { - if (ptr + NS_INT32SZ + NS_INT16SZ > eom) - RETERR(EMSGSIZE); - ptr += NS_INT32SZ/*TTL*/; - NS_GET16(rdlength, ptr); - ptr += rdlength/*RData*/; - } - } - if (ptr > eom) - RETERR(EMSGSIZE); - return (ptr - optr); -} - -int -ns_initparse(const u_char *msg, int msglen, ns_msg *handle) { - const u_char *eom = msg + msglen; - int i; - - memset(handle, 0x5e, sizeof *handle); - handle->_msg = msg; - handle->_eom = eom; - if (msg + NS_INT16SZ > eom) - RETERR(EMSGSIZE); - NS_GET16(handle->_id, msg); - if (msg + NS_INT16SZ > eom) - RETERR(EMSGSIZE); - NS_GET16(handle->_flags, msg); - for (i = 0; i < ns_s_max; i++) { - if (msg + NS_INT16SZ > eom) - RETERR(EMSGSIZE); - NS_GET16(handle->_counts[i], msg); - } - for (i = 0; i < ns_s_max; i++) - if (handle->_counts[i] == 0) - handle->_sections[i] = NULL; - else { - int b = ns_skiprr(msg, eom, (ns_sect)i, - handle->_counts[i]); - - if (b < 0) - return (-1); - handle->_sections[i] = msg; - msg += b; - } - if (msg != eom) - RETERR(EMSGSIZE); - setsection(handle, ns_s_max); - return (0); -} - -int -ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) { - int b; - int tmp; - - /* Make section right. */ - tmp = section; - if (tmp < 0 || section >= ns_s_max) - RETERR(ENODEV); - if (section != handle->_sect) - setsection(handle, section); - - /* Make rrnum right. */ - if (rrnum == -1) - rrnum = handle->_rrnum; - if (rrnum < 0 || rrnum >= handle->_counts[(int)section]) - RETERR(ENODEV); - if (rrnum < handle->_rrnum) - setsection(handle, section); - if (rrnum > handle->_rrnum) { - b = ns_skiprr(handle->_msg_ptr, handle->_eom, section, - rrnum - handle->_rrnum); - - if (b < 0) - return (-1); - handle->_msg_ptr += b; - handle->_rrnum = rrnum; - } - - /* Do the parse. */ - b = dn_expand(handle->_msg, handle->_eom, - handle->_msg_ptr, rr->name, NS_MAXDNAME); - if (b < 0) - return (-1); - handle->_msg_ptr += b; - if (handle->_msg_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom) - RETERR(EMSGSIZE); - NS_GET16(rr->type, handle->_msg_ptr); - NS_GET16(rr->rr_class, handle->_msg_ptr); - if (section == ns_s_qd) { - rr->ttl = 0; - rr->rdlength = 0; - rr->rdata = NULL; - } else { - if (handle->_msg_ptr + NS_INT32SZ + NS_INT16SZ > handle->_eom) - RETERR(EMSGSIZE); - NS_GET32(rr->ttl, handle->_msg_ptr); - NS_GET16(rr->rdlength, handle->_msg_ptr); - if (handle->_msg_ptr + rr->rdlength > handle->_eom) - RETERR(EMSGSIZE); - rr->rdata = handle->_msg_ptr; - handle->_msg_ptr += rr->rdlength; - } - if (++handle->_rrnum > handle->_counts[(int)section]) - setsection(handle, (ns_sect)((int)section + 1)); - - /* All done. */ - return (0); -} - -/* Private. */ - -static void -setsection(ns_msg *msg, ns_sect sect) { - msg->_sect = sect; - if (sect == ns_s_max) { - msg->_rrnum = -1; - msg->_msg_ptr = NULL; - } else { - msg->_rrnum = 0; - msg->_msg_ptr = msg->_sections[(int)sect]; - } -} diff --git a/lib/libc/nameser/ns_print.c b/lib/libc/nameser/ns_print.c deleted file mode 100644 index cb61cb1add30..000000000000 --- a/lib/libc/nameser/ns_print.c +++ /dev/null @@ -1,898 +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. - */ - -#ifndef lint -static const char rcsid[] = "$Id: ns_print.c,v 1.3.2.1.4.7 2004/09/16 07:01:12 marka Exp $"; -#endif - -/* Import. */ - -#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 <isc/assertions.h> -#include <isc/dst.h> -#include <errno.h> -#include <resolv.h> -#include <string.h> -#include <ctype.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -/* Forward. */ - -static size_t prune_origin(const char *name, const char *origin); -static int charstr(const u_char *rdata, const u_char *edata, - char **buf, size_t *buflen); -static int addname(const u_char *msg, size_t msglen, - const u_char **p, const char *origin, - char **buf, size_t *buflen); -static void addlen(size_t len, char **buf, size_t *buflen); -static int addstr(const char *src, size_t len, - char **buf, size_t *buflen); -static int addtab(size_t len, size_t target, int spaced, - char **buf, size_t *buflen); - -/* Macros. */ - -#define T(x) \ - do { \ - if ((x) < 0) \ - return (-1); \ - } while (0) - -/* Public. */ - -/* - * int - * ns_sprintrr(handle, rr, name_ctx, origin, buf, buflen) - * Convert an RR to presentation format. - * return: - * Number of characters written to buf, or -1 (check errno). - */ -int -ns_sprintrr(const ns_msg *handle, const ns_rr *rr, - const char *name_ctx, const char *origin, - char *buf, size_t buflen) -{ - int n; - - n = ns_sprintrrf(ns_msg_base(*handle), ns_msg_size(*handle), - ns_rr_name(*rr), ns_rr_class(*rr), ns_rr_type(*rr), - ns_rr_ttl(*rr), ns_rr_rdata(*rr), ns_rr_rdlen(*rr), - name_ctx, origin, buf, buflen); - return (n); -} - -/* - * int - * ns_sprintrrf(msg, msglen, name, class, type, ttl, rdata, rdlen, - * name_ctx, origin, buf, buflen) - * Convert the fields of an RR into presentation format. - * return: - * Number of characters written to buf, or -1 (check errno). - */ -int -ns_sprintrrf(const u_char *msg, size_t msglen, - const char *name, ns_class class, ns_type type, - u_long ttl, const u_char *rdata, size_t rdlen, - const char *name_ctx, const char *origin, - char *buf, size_t buflen) -{ - const char *obuf = buf; - const u_char *edata = rdata + rdlen; - int spaced = 0; - - const char *comment; - char tmp[100]; - int len, x; - - /* - * Owner. - */ - if (name_ctx != NULL && ns_samename(name_ctx, name) == 1) { - T(addstr("\t\t\t", 3, &buf, &buflen)); - } else { - len = prune_origin(name, origin); - if (*name == '\0') { - goto root; - } else if (len == 0) { - T(addstr("@\t\t\t", 4, &buf, &buflen)); - } else { - T(addstr(name, len, &buf, &buflen)); - /* Origin not used or not root, and no trailing dot? */ - if (((origin == NULL || origin[0] == '\0') || - (origin[0] != '.' && origin[1] != '\0' && - name[len] == '\0')) && name[len - 1] != '.') { - root: - T(addstr(".", 1, &buf, &buflen)); - len++; - } - T(spaced = addtab(len, 24, spaced, &buf, &buflen)); - } - } - - /* - * TTL, Class, Type. - */ - T(x = ns_format_ttl(ttl, buf, buflen)); - addlen(x, &buf, &buflen); - len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type))); - T(addstr(tmp, len, &buf, &buflen)); - T(spaced = addtab(x + len, 16, spaced, &buf, &buflen)); - - /* - * RData. - */ - switch (type) { - case ns_t_a: - if (rdlen != (size_t)NS_INADDRSZ) - goto formerr; - (void) inet_ntop(AF_INET, rdata, buf, buflen); - addlen(strlen(buf), &buf, &buflen); - break; - - case ns_t_cname: - case ns_t_mb: - case ns_t_mg: - case ns_t_mr: - case ns_t_ns: - case ns_t_ptr: - case ns_t_dname: - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - break; - - case ns_t_hinfo: - case ns_t_isdn: - /* First word. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - T(addstr(" ", 1, &buf, &buflen)); - - - /* Second word, optional in ISDN records. */ - if (type == ns_t_isdn && rdata == edata) - break; - - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - break; - - case ns_t_soa: { - u_long t; - - /* Server name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - - /* Administrator name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" (\n", 3, &buf, &buflen)); - spaced = 0; - - if ((edata - rdata) != 5*NS_INT32SZ) - goto formerr; - - /* Serial number. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - len = SPRINTF((tmp, "%lu", t)); - T(addstr(tmp, len, &buf, &buflen)); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; serial\n", 9, &buf, &buflen)); - spaced = 0; - - /* Refresh interval. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - T(len = ns_format_ttl(t, buf, buflen)); - addlen(len, &buf, &buflen); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; refresh\n", 10, &buf, &buflen)); - spaced = 0; - - /* Retry interval. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - T(len = ns_format_ttl(t, buf, buflen)); - addlen(len, &buf, &buflen); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; retry\n", 8, &buf, &buflen)); - spaced = 0; - - /* Expiry. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - T(len = ns_format_ttl(t, buf, buflen)); - addlen(len, &buf, &buflen); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; expiry\n", 9, &buf, &buflen)); - spaced = 0; - - /* Minimum TTL. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - T(len = ns_format_ttl(t, buf, buflen)); - addlen(len, &buf, &buflen); - T(addstr(" )", 2, &buf, &buflen)); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; minimum\n", 10, &buf, &buflen)); - - break; - } - - case ns_t_mx: - case ns_t_afsdb: - case ns_t_rt: { - u_int t; - - if (rdlen < (size_t)NS_INT16SZ) - goto formerr; - - /* Priority. */ - t = ns_get16(rdata); - rdata += NS_INT16SZ; - len = SPRINTF((tmp, "%u ", t)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Target. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - break; - } - - case ns_t_px: { - u_int t; - - if (rdlen < (size_t)NS_INT16SZ) - goto formerr; - - /* Priority. */ - t = ns_get16(rdata); - rdata += NS_INT16SZ; - len = SPRINTF((tmp, "%u ", t)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Name1. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - - /* Name2. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - break; - } - - case ns_t_x25: - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - break; - - case ns_t_txt: - while (rdata < edata) { - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - if (rdata < edata) - T(addstr(" ", 1, &buf, &buflen)); - } - break; - - case ns_t_nsap: { - char t[2+255*3]; - - (void) inet_nsap_ntoa(rdlen, rdata, t); - T(addstr(t, strlen(t), &buf, &buflen)); - break; - } - - case ns_t_aaaa: - if (rdlen != (size_t)NS_IN6ADDRSZ) - goto formerr; - (void) inet_ntop(AF_INET6, rdata, buf, buflen); - addlen(strlen(buf), &buf, &buflen); - break; - - case ns_t_loc: { - char t[255]; - - /* XXX protocol format checking? */ - (void) loc_ntoa(rdata, t); - T(addstr(t, strlen(t), &buf, &buflen)); - break; - } - - case ns_t_naptr: { - u_int order, preference; - char t[50]; - - if (rdlen < 2U*NS_INT16SZ) - goto formerr; - - /* Order, Precedence. */ - order = ns_get16(rdata); rdata += NS_INT16SZ; - preference = ns_get16(rdata); rdata += NS_INT16SZ; - len = SPRINTF((t, "%u %u ", order, preference)); - T(addstr(t, len, &buf, &buflen)); - - /* Flags. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - T(addstr(" ", 1, &buf, &buflen)); - - /* Service. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - T(addstr(" ", 1, &buf, &buflen)); - - /* Regexp. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len < 0) - return (-1); - if (len == 0) - goto formerr; - rdata += len; - T(addstr(" ", 1, &buf, &buflen)); - - /* Server. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - break; - } - - case ns_t_srv: { - u_int priority, weight, port; - char t[50]; - - if (rdlen < 3U*NS_INT16SZ) - goto formerr; - - /* Priority, Weight, Port. */ - priority = ns_get16(rdata); rdata += NS_INT16SZ; - weight = ns_get16(rdata); rdata += NS_INT16SZ; - port = ns_get16(rdata); rdata += NS_INT16SZ; - len = SPRINTF((t, "%u %u %u ", priority, weight, port)); - T(addstr(t, len, &buf, &buflen)); - - /* Server. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - break; - } - - case ns_t_minfo: - case ns_t_rp: - /* Name1. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - - /* Name2. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - break; - - case ns_t_wks: { - int n, lcnt; - - if (rdlen < 1U + NS_INT32SZ) - goto formerr; - - /* Address. */ - (void) inet_ntop(AF_INET, rdata, buf, buflen); - addlen(strlen(buf), &buf, &buflen); - rdata += NS_INADDRSZ; - - /* Protocol. */ - len = SPRINTF((tmp, " %u ( ", *rdata)); - T(addstr(tmp, len, &buf, &buflen)); - rdata += NS_INT8SZ; - - /* Bit map. */ - n = 0; - lcnt = 0; - while (rdata < edata) { - u_int c = *rdata++; - do { - if (c & 0200) { - if (lcnt == 0) { - T(addstr("\n\t\t\t\t", 5, - &buf, &buflen)); - lcnt = 10; - spaced = 0; - } - len = SPRINTF((tmp, "%d ", n)); - T(addstr(tmp, len, &buf, &buflen)); - lcnt--; - } - c <<= 1; - } while (++n & 07); - } - T(addstr(")", 1, &buf, &buflen)); - - break; - } - - case ns_t_key: { - char base64_key[NS_MD5RSA_MAX_BASE64]; - u_int keyflags, protocol, algorithm, key_id; - const char *leader; - int n; - - if (rdlen < 0U + NS_INT16SZ + NS_INT8SZ + NS_INT8SZ) - goto formerr; - - /* Key flags, Protocol, Algorithm. */ - key_id = dst_s_dns_key_id(rdata, edata-rdata); - keyflags = ns_get16(rdata); rdata += NS_INT16SZ; - protocol = *rdata++; - algorithm = *rdata++; - len = SPRINTF((tmp, "0x%04x %u %u", - keyflags, protocol, algorithm)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Public key data. */ - len = b64_ntop(rdata, edata - rdata, - base64_key, sizeof base64_key); - if (len < 0) - goto formerr; - if (len > 15) { - T(addstr(" (", 2, &buf, &buflen)); - leader = "\n\t\t"; - spaced = 0; - } else - leader = " "; - for (n = 0; n < len; n += 48) { - T(addstr(leader, strlen(leader), &buf, &buflen)); - T(addstr(base64_key + n, MIN(len - n, 48), - &buf, &buflen)); - } - if (len > 15) - T(addstr(" )", 2, &buf, &buflen)); - n = SPRINTF((tmp, " ; key_tag= %u", key_id)); - T(addstr(tmp, n, &buf, &buflen)); - - break; - } - - case ns_t_sig: { - char base64_key[NS_MD5RSA_MAX_BASE64]; - u_int type, algorithm, labels, footprint; - const char *leader; - u_long t; - int n; - - if (rdlen < 22U) - goto formerr; - - /* Type covered, Algorithm, Label count, Original TTL. */ - type = ns_get16(rdata); rdata += NS_INT16SZ; - algorithm = *rdata++; - labels = *rdata++; - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%s %d %d %lu ", - p_type(type), algorithm, labels, t)); - T(addstr(tmp, len, &buf, &buflen)); - if (labels > (u_int)dn_count_labels(name)) - goto formerr; - - /* Signature expiry. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%s ", p_secstodate(t))); - T(addstr(tmp, len, &buf, &buflen)); - - /* Time signed. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%s ", p_secstodate(t))); - T(addstr(tmp, len, &buf, &buflen)); - - /* Signature Footprint. */ - footprint = ns_get16(rdata); rdata += NS_INT16SZ; - len = SPRINTF((tmp, "%u ", footprint)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Signer's name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - /* Signature. */ - len = b64_ntop(rdata, edata - rdata, - base64_key, sizeof base64_key); - if (len > 15) { - T(addstr(" (", 2, &buf, &buflen)); - leader = "\n\t\t"; - spaced = 0; - } else - leader = " "; - if (len < 0) - goto formerr; - for (n = 0; n < len; n += 48) { - T(addstr(leader, strlen(leader), &buf, &buflen)); - T(addstr(base64_key + n, MIN(len - n, 48), - &buf, &buflen)); - } - if (len > 15) - T(addstr(" )", 2, &buf, &buflen)); - break; - } - - case ns_t_nxt: { - int n, c; - - /* Next domain name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - /* Type bit map. */ - n = edata - rdata; - for (c = 0; c < n*8; c++) - if (NS_NXT_BIT_ISSET(c, rdata)) { - len = SPRINTF((tmp, " %s", p_type(c))); - T(addstr(tmp, len, &buf, &buflen)); - } - break; - } - - case ns_t_cert: { - u_int c_type, key_tag, alg; - int n; - unsigned int siz; - char base64_cert[8192], tmp[40]; - const char *leader; - - c_type = ns_get16(rdata); rdata += NS_INT16SZ; - key_tag = ns_get16(rdata); rdata += NS_INT16SZ; - alg = (u_int) *rdata++; - - len = SPRINTF((tmp, "%d %d %d ", c_type, key_tag, alg)); - T(addstr(tmp, len, &buf, &buflen)); - siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */ - if (siz > sizeof(base64_cert) * 3/4) { - const char *str = "record too long to print"; - T(addstr(str, strlen(str), &buf, &buflen)); - } - else { - len = b64_ntop(rdata, edata-rdata, base64_cert, siz); - - if (len < 0) - goto formerr; - else if (len > 15) { - T(addstr(" (", 2, &buf, &buflen)); - leader = "\n\t\t"; - spaced = 0; - } - else - leader = " "; - - for (n = 0; n < len; n += 48) { - T(addstr(leader, strlen(leader), - &buf, &buflen)); - T(addstr(base64_cert + n, MIN(len - n, 48), - &buf, &buflen)); - } - if (len > 15) - T(addstr(" )", 2, &buf, &buflen)); - } - break; - } - - case ns_t_tkey: { - /* KJD - need to complete this */ - u_long t; - int mode, err, keysize; - - /* Algorithm name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - - /* Inception. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%s ", p_secstodate(t))); - T(addstr(tmp, len, &buf, &buflen)); - - /* Experation. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%s ", p_secstodate(t))); - T(addstr(tmp, len, &buf, &buflen)); - - /* Mode , Error, Key Size. */ - /* Priority, Weight, Port. */ - mode = ns_get16(rdata); rdata += NS_INT16SZ; - err = ns_get16(rdata); rdata += NS_INT16SZ; - keysize = ns_get16(rdata); rdata += NS_INT16SZ; - len = SPRINTF((tmp, "%u %u %u ", mode, err, keysize)); - T(addstr(tmp, len, &buf, &buflen)); - - /* XXX need to dump key, print otherdata length & other data */ - break; - } - - case ns_t_tsig: { - /* BEW - need to complete this */ - int n; - - T(len = addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - rdata += 8; /* time */ - n = ns_get16(rdata); rdata += INT16SZ; - rdata += n; /* sig */ - n = ns_get16(rdata); rdata += INT16SZ; /* original id */ - sprintf(buf, "%d", ns_get16(rdata)); - rdata += INT16SZ; - addlen(strlen(buf), &buf, &buflen); - break; - } - - case ns_t_a6: { - struct in6_addr a; - int pbyte, pbit; - - /* prefix length */ - if (rdlen == 0U) goto formerr; - len = SPRINTF((tmp, "%d ", *rdata)); - T(addstr(tmp, len, &buf, &buflen)); - pbit = *rdata; - if (pbit > 128) goto formerr; - pbyte = (pbit & ~7) / 8; - rdata++; - - /* address suffix: provided only when prefix len != 128 */ - if (pbit < 128) { - if (rdata + pbyte >= edata) goto formerr; - memset(&a, 0, sizeof(a)); - memcpy(&a.s6_addr[pbyte], rdata, sizeof(a) - pbyte); - (void) inet_ntop(AF_INET6, &a, buf, buflen); - addlen(strlen(buf), &buf, &buflen); - rdata += sizeof(a) - pbyte; - } - - /* prefix name: provided only when prefix len > 0 */ - if (pbit == 0) - break; - if (rdata >= edata) goto formerr; - T(addstr(" ", 1, &buf, &buflen)); - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - break; - } - - case ns_t_opt: { - len = SPRINTF((tmp, "%u bytes", class)); - T(addstr(tmp, len, &buf, &buflen)); - break; - } - - default: - comment = "unknown RR type"; - goto hexify; - } - return (buf - obuf); - formerr: - comment = "RR format error"; - hexify: { - int n, m; - char *p; - - len = SPRINTF((tmp, "\\# %u%s\t; %s", (unsigned)(edata - rdata), - rdlen != 0U ? " (" : "", comment)); - T(addstr(tmp, len, &buf, &buflen)); - while (rdata < edata) { - p = tmp; - p += SPRINTF((p, "\n\t")); - spaced = 0; - n = MIN(16, edata - rdata); - for (m = 0; m < n; m++) - p += SPRINTF((p, "%02x ", rdata[m])); - T(addstr(tmp, p - tmp, &buf, &buflen)); - if (n < 16) { - T(addstr(")", 1, &buf, &buflen)); - T(addtab(p - tmp + 1, 48, spaced, &buf, &buflen)); - } - p = tmp; - p += SPRINTF((p, "; ")); - for (m = 0; m < n; m++) - *p++ = (isascii(rdata[m]) && isprint(rdata[m])) - ? rdata[m] - : '.'; - T(addstr(tmp, p - tmp, &buf, &buflen)); - rdata += n; - } - return (buf - obuf); - } -} - -/* Private. */ - -/* - * size_t - * prune_origin(name, origin) - * Find out if the name is at or under the current origin. - * return: - * Number of characters in name before start of origin, - * or length of name if origin does not match. - * notes: - * This function should share code with samedomain(). - */ -static size_t -prune_origin(const char *name, const char *origin) { - const char *oname = name; - - while (*name != '\0') { - if (origin != NULL && ns_samename(name, origin) == 1) - return (name - oname - (name > oname)); - while (*name != '\0') { - if (*name == '\\') { - name++; - /* XXX need to handle \nnn form. */ - if (*name == '\0') - break; - } else if (*name == '.') { - name++; - break; - } - name++; - } - } - return (name - oname); -} - -/* - * int - * charstr(rdata, edata, buf, buflen) - * Format a <character-string> into the presentation buffer. - * return: - * Number of rdata octets consumed - * 0 for protocol format error - * -1 for output buffer error - * side effects: - * buffer is advanced on success. - */ -static int -charstr(const u_char *rdata, const u_char *edata, char **buf, size_t *buflen) { - const u_char *odata = rdata; - size_t save_buflen = *buflen; - char *save_buf = *buf; - - if (addstr("\"", 1, buf, buflen) < 0) - goto enospc; - if (rdata < edata) { - int n = *rdata; - - if (rdata + 1 + n <= edata) { - rdata++; - while (n-- > 0) { - if (strchr("\n\"\\", *rdata) != NULL) - if (addstr("\\", 1, buf, buflen) < 0) - goto enospc; - if (addstr((const char *)rdata, 1, - buf, buflen) < 0) - goto enospc; - rdata++; - } - } - } - if (addstr("\"", 1, buf, buflen) < 0) - goto enospc; - return (rdata - odata); - enospc: - errno = ENOSPC; - *buf = save_buf; - *buflen = save_buflen; - return (-1); -} - -static int -addname(const u_char *msg, size_t msglen, - const u_char **pp, const char *origin, - char **buf, size_t *buflen) -{ - size_t newlen, save_buflen = *buflen; - char *save_buf = *buf; - int n; - - n = dn_expand(msg, msg + msglen, *pp, *buf, *buflen); - if (n < 0) - goto enospc; /* Guess. */ - newlen = prune_origin(*buf, origin); - if (**buf == '\0') { - goto root; - } else if (newlen == 0U) { - /* Use "@" instead of name. */ - if (newlen + 2 > *buflen) - goto enospc; /* No room for "@\0". */ - (*buf)[newlen++] = '@'; - (*buf)[newlen] = '\0'; - } else { - if (((origin == NULL || origin[0] == '\0') || - (origin[0] != '.' && origin[1] != '\0' && - (*buf)[newlen] == '\0')) && (*buf)[newlen - 1] != '.') { - /* No trailing dot. */ - root: - if (newlen + 2 > *buflen) - goto enospc; /* No room for ".\0". */ - (*buf)[newlen++] = '.'; - (*buf)[newlen] = '\0'; - } - } - *pp += n; - addlen(newlen, buf, buflen); - **buf = '\0'; - return (newlen); - enospc: - errno = ENOSPC; - *buf = save_buf; - *buflen = save_buflen; - return (-1); -} - -static void -addlen(size_t len, char **buf, size_t *buflen) { - INSIST(len <= *buflen); - *buf += len; - *buflen -= len; -} - -static int -addstr(const char *src, size_t len, char **buf, size_t *buflen) { - if (len >= *buflen) { - errno = ENOSPC; - return (-1); - } - memcpy(*buf, src, len); - addlen(len, buf, buflen); - **buf = '\0'; - return (0); -} - -static int -addtab(size_t len, size_t target, int spaced, char **buf, size_t *buflen) { - size_t save_buflen = *buflen; - char *save_buf = *buf; - int t; - - if (spaced || len >= target - 1) { - T(addstr(" ", 2, buf, buflen)); - spaced = 1; - } else { - for (t = (target - len - 1) / 8; t >= 0; t--) - if (addstr("\t", 1, buf, buflen) < 0) { - *buflen = save_buflen; - *buf = save_buf; - return (-1); - } - spaced = 0; - } - return (spaced); -} diff --git a/lib/libc/nameser/ns_samedomain.c b/lib/libc/nameser/ns_samedomain.c deleted file mode 100644 index d4ca550a7ae3..000000000000 --- a/lib/libc/nameser/ns_samedomain.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1995,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. - */ - -#ifndef lint -static const char rcsid[] = "$Id: ns_samedomain.c,v 1.1.2.2.4.2 2004/03/16 12:34:17 marka Exp $"; -#endif - -#include "port_before.h" - -#include <sys/types.h> -#include <arpa/nameser.h> -#include <errno.h> -#include <string.h> - -#include "port_after.h" - -/* - * int - * ns_samedomain(a, b) - * Check whether a name belongs to a domain. - * Inputs: - * a - the domain whose ancestory is being verified - * b - the potential ancestor we're checking against - * Return: - * boolean - is a at or below b? - * Notes: - * Trailing dots are first removed from name and domain. - * Always compare complete subdomains, not only whether the - * domain name is the trailing string of the given name. - * - * "host.foobar.top" lies in "foobar.top" and in "top" and in "" - * but NOT in "bar.top" - */ - -int -ns_samedomain(const char *a, const char *b) { - size_t la, lb; - int diff, i, escaped; - const char *cp; - - la = strlen(a); - lb = strlen(b); - - /* Ignore a trailing label separator (i.e. an unescaped dot) in 'a'. */ - if (la != 0U && a[la - 1] == '.') { - escaped = 0; - /* Note this loop doesn't get executed if la==1. */ - for (i = la - 2; i >= 0; i--) - if (a[i] == '\\') { - if (escaped) - escaped = 0; - else - escaped = 1; - } else - break; - if (!escaped) - la--; - } - - /* Ignore a trailing label separator (i.e. an unescaped dot) in 'b'. */ - if (lb != 0U && b[lb - 1] == '.') { - escaped = 0; - /* note this loop doesn't get executed if lb==1 */ - for (i = lb - 2; i >= 0; i--) - if (b[i] == '\\') { - if (escaped) - escaped = 0; - else - escaped = 1; - } else - break; - if (!escaped) - lb--; - } - - /* lb == 0 means 'b' is the root domain, so 'a' must be in 'b'. */ - if (lb == 0U) - return (1); - - /* 'b' longer than 'a' means 'a' can't be in 'b'. */ - if (lb > la) - return (0); - - /* 'a' and 'b' being equal at this point indicates sameness. */ - if (lb == la) - return (strncasecmp(a, b, lb) == 0); - - /* Ok, we know la > lb. */ - - diff = la - lb; - - /* - * If 'a' is only 1 character longer than 'b', then it can't be - * a subdomain of 'b' (because of the need for the '.' label - * separator). - */ - if (diff < 2) - return (0); - - /* - * If the character before the last 'lb' characters of 'b' - * isn't '.', then it can't be a match (this lets us avoid - * having "foobar.com" match "bar.com"). - */ - if (a[diff - 1] != '.') - return (0); - - /* - * We're not sure about that '.', however. It could be escaped - * and thus not a really a label separator. - */ - escaped = 0; - for (i = diff - 2; i >= 0; i--) - if (a[i] == '\\') { - if (escaped) - escaped = 0; - else - escaped = 1; - } else - break; - if (escaped) - return (0); - - /* Now compare aligned trailing substring. */ - cp = a + diff; - return (strncasecmp(cp, b, lb) == 0); -} - -/* - * int - * ns_subdomain(a, b) - * is "a" a subdomain of "b"? - */ -int -ns_subdomain(const char *a, const char *b) { - return (ns_samename(a, b) != 1 && ns_samedomain(a, b)); -} - -/* - * int - * ns_makecanon(src, dst, dstsize) - * make a canonical copy of domain name "src" - * notes: - * foo -> foo. - * foo. -> foo. - * foo.. -> foo. - * foo\. -> foo\.. - * foo\\. -> foo\\. - */ - -int -ns_makecanon(const char *src, char *dst, size_t dstsize) { - size_t n = strlen(src); - - if (n + sizeof "." > dstsize) { /* Note: sizeof == 2 */ - errno = EMSGSIZE; - return (-1); - } - strcpy(dst, src); - while (n >= 1U && dst[n - 1] == '.') /* Ends in "." */ - if (n >= 2U && dst[n - 2] == '\\' && /* Ends in "\." */ - (n < 3U || dst[n - 3] != '\\')) /* But not "\\." */ - break; - else - dst[--n] = '\0'; - dst[n++] = '.'; - dst[n] = '\0'; - return (0); -} - -/* - * int - * ns_samename(a, b) - * determine whether domain name "a" is the same as domain name "b" - * return: - * -1 on error - * 0 if names differ - * 1 if names are the same - */ - -int -ns_samename(const char *a, const char *b) { - char ta[NS_MAXDNAME], tb[NS_MAXDNAME]; - - if (ns_makecanon(a, ta, sizeof ta) < 0 || - ns_makecanon(b, tb, sizeof tb) < 0) - return (-1); - if (strcasecmp(ta, tb) == 0) - return (1); - else - return (0); -} diff --git a/lib/libc/nameser/ns_ttl.c b/lib/libc/nameser/ns_ttl.c deleted file mode 100644 index 4d18d3f281db..000000000000 --- a/lib/libc/nameser/ns_ttl.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. - */ - -#ifndef lint -static const char rcsid[] = "$Id: ns_ttl.c,v 1.1.206.2 2005/07/28 07:43:21 marka Exp $"; -#endif - -/* Import. */ - -#include "port_before.h" - -#include <arpa/nameser.h> - -#include <ctype.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) ((size_t)sprintf x) -#endif - -/* Forward. */ - -static int fmt1(int t, char s, char **buf, size_t *buflen); - -/* Macros. */ - -#define T(x) if ((x) < 0) return (-1); else (void)NULL - -/* Public. */ - -int -ns_format_ttl(u_long src, char *dst, size_t dstlen) { - char *odst = dst; - int secs, mins, hours, days, weeks, x; - char *p; - - secs = src % 60; src /= 60; - mins = src % 60; src /= 60; - hours = src % 24; src /= 24; - days = src % 7; src /= 7; - weeks = src; src = 0; - - x = 0; - if (weeks) { - T(fmt1(weeks, 'W', &dst, &dstlen)); - x++; - } - if (days) { - T(fmt1(days, 'D', &dst, &dstlen)); - x++; - } - if (hours) { - T(fmt1(hours, 'H', &dst, &dstlen)); - x++; - } - if (mins) { - T(fmt1(mins, 'M', &dst, &dstlen)); - x++; - } - if (secs || !(weeks || days || hours || mins)) { - T(fmt1(secs, 'S', &dst, &dstlen)); - x++; - } - - if (x > 1) { - int ch; - - for (p = odst; (ch = *p) != '\0'; p++) - if (isascii(ch) && isupper(ch)) - *p = tolower(ch); - } - - return (dst - odst); -} - -int -ns_parse_ttl(const char *src, u_long *dst) { - u_long ttl, tmp; - int ch, digits, dirty; - - ttl = 0; - tmp = 0; - digits = 0; - dirty = 0; - while ((ch = *src++) != '\0') { - if (!isascii(ch) || !isprint(ch)) - goto einval; - if (isdigit(ch)) { - tmp *= 10; - tmp += (ch - '0'); - digits++; - continue; - } - if (digits == 0) - goto einval; - if (islower(ch)) - ch = toupper(ch); - switch (ch) { - case 'W': tmp *= 7; - case 'D': tmp *= 24; - case 'H': tmp *= 60; - case 'M': tmp *= 60; - case 'S': break; - default: goto einval; - } - ttl += tmp; - tmp = 0; - digits = 0; - dirty = 1; - } - if (digits > 0) { - if (dirty) - goto einval; - else - ttl += tmp; - } else if (!dirty) - goto einval; - *dst = ttl; - return (0); - - einval: - errno = EINVAL; - return (-1); -} - -/* Private. */ - -static int -fmt1(int t, char s, char **buf, size_t *buflen) { - char tmp[50]; - size_t len; - - len = SPRINTF((tmp, "%d%c", t, s)); - if (len + 1 > *buflen) - return (-1); - strcpy(*buf, tmp); - *buf += len; - *buflen -= len; - return (0); -} diff --git a/lib/libc/resolv/herror.c b/lib/libc/resolv/herror.c deleted file mode 100644 index 58807e9678e0..000000000000 --- a/lib/libc/resolv/herror.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 1987, 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. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)herror.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: herror.c,v 1.2.206.1 2004/03/09 08:33:54 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/uio.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> - -#include <netdb.h> -#include <resolv.h> -#include <string.h> -#include <unistd.h> -#include <irs.h> - -#include "port_after.h" - -const char *h_errlist[] = { - "Resolver Error 0 (no error)", - "Unknown host", /* 1 HOST_NOT_FOUND */ - "Host name lookup failure", /* 2 TRY_AGAIN */ - "Unknown server error", /* 3 NO_RECOVERY */ - "No address associated with name", /* 4 NO_ADDRESS */ -}; -int h_nerr = { sizeof h_errlist / sizeof h_errlist[0] }; - -#if !(__GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) -#undef h_errno -int h_errno; -#endif - -/* - * herror -- - * print the error indicated by the h_errno value. - */ -void -herror(const char *s) { - struct iovec iov[4], *v = iov; - char *t; - - if (s != NULL && *s != '\0') { - DE_CONST(s, t); - v->iov_base = t; - v->iov_len = strlen(t); - v++; - DE_CONST(": ", t); - v->iov_base = t; - v->iov_len = 2; - v++; - } - DE_CONST(hstrerror(*__h_errno()), t); - v->iov_base = t; - v->iov_len = strlen(v->iov_base); - v++; - DE_CONST("\n", t); - v->iov_base = t; - v->iov_len = 1; - writev(STDERR_FILENO, iov, (v - iov) + 1); -} - -/* - * hstrerror -- - * return the string associated with a given "host" errno value. - */ -const char * -hstrerror(int err) { - if (err < 0) - return ("Resolver internal error"); - else if (err < h_nerr) - return (h_errlist[err]); - return ("Unknown resolver error"); -} diff --git a/lib/libc/resolv/mtctxres.c b/lib/libc/resolv/mtctxres.c deleted file mode 100644 index f33cf11e3f42..000000000000 --- a/lib/libc/resolv/mtctxres.c +++ /dev/null @@ -1,128 +0,0 @@ -#include <port_before.h> -#ifdef DO_PTHREADS -#include <pthread.h> -#endif -#include <errno.h> -#include <netdb.h> -#include <stdlib.h> -#include <string.h> -#include <resolv_mt.h> -#include <irs.h> -#include <port_after.h> - -#ifdef DO_PTHREADS -static pthread_key_t key; -static int mt_key_initialized = 0; - -static int __res_init_ctx(void); -static void __res_destroy_ctx(void *); - -#if defined(sun) && !defined(__GNUC__) -#pragma init (_mtctxres_init) -#endif -#endif - -static mtctxres_t sharedctx; - -#ifdef DO_PTHREADS -/* - * Initialize the TSD key. By doing this at library load time, we're - * implicitly running without interference from other threads, so there's - * no need for locking. - */ -static void -_mtctxres_init(void) { - int pthread_keycreate_ret; - - pthread_keycreate_ret = pthread_key_create(&key, __res_destroy_ctx); - if (pthread_keycreate_ret == 0) - mt_key_initialized = 1; -} -#endif - -/* - * To support binaries that used the private MT-safe interface in - * Solaris 8, we still need to provide the __res_enable_mt() - * and __res_disable_mt() entry points. They're do-nothing routines. - */ -int -__res_enable_mt(void) { - return (-1); -} - -int -__res_disable_mt(void) { - return (0); -} - -#ifdef DO_PTHREADS -static int -__res_init_ctx(void) { - - mtctxres_t *mt; - int ret; - - - if (pthread_getspecific(key) != 0) { - /* Already exists */ - return (0); - } - - if ((mt = malloc(sizeof (mtctxres_t))) == 0) { - errno = ENOMEM; - return (-1); - } - - memset(mt, 0, sizeof (mtctxres_t)); - - if ((ret = pthread_setspecific(key, mt)) != 0) { - free(mt); - errno = ret; - return (-1); - } - - return (0); -} - -static void -__res_destroy_ctx(void *value) { - - mtctxres_t *mt = (mtctxres_t *)value; - - if (mt != 0) - free(mt); -} -#endif - -mtctxres_t * -___mtctxres(void) { -#ifdef DO_PTHREADS - mtctxres_t *mt; - - /* - * This if clause should only be executed if we are linking - * statically. When linked dynamically _mtctxres_init() should - * be called at binding time due the #pragma above. - */ - if (!mt_key_initialized) { - static pthread_mutex_t keylock = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock(&keylock); - _mtctxres_init(); - pthread_mutex_unlock(&keylock); - } - - /* - * If we have already been called in this thread return the existing - * context. Otherwise recreat a new context and return it. If - * that fails return a global context. - */ - if (mt_key_initialized) { - if (((mt = pthread_getspecific(key)) != 0) || - (__res_init_ctx() == 0 && - (mt = pthread_getspecific(key)) != 0)) { - return (mt); - } - } -#endif - return (&sharedctx); -} diff --git a/lib/libc/resolv/res_comp.c b/lib/libc/resolv/res_comp.c deleted file mode 100644 index 8cc99a762884..000000000000 --- a/lib/libc/resolv/res_comp.c +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Copyright (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 sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: res_comp.c,v 1.1.2.1.4.2 2005/07/28 07:43:22 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" -#include <sys/types.h> -#include <sys/param.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <ctype.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include "port_after.h" - -/* - * Expand compressed domain name 'src' to full domain name. - * 'msg' is a pointer to the begining of the message, - * 'eom' points to the first location after the message, - * 'dst' is a pointer to a buffer of size 'dstsiz' for the result. - * Return size of compressed name or -1 if there was an error. - */ -int -dn_expand(const u_char *msg, const u_char *eom, const u_char *src, - char *dst, int dstsiz) -{ - int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz); - - if (n > 0 && dst[0] == '.') - dst[0] = '\0'; - return (n); -} - -/* - * Pack domain name 'exp_dn' in presentation form into 'comp_dn'. - * Return the size of the compressed name or -1. - * 'length' is the size of the array pointed to by 'comp_dn'. - */ -int -dn_comp(const char *src, u_char *dst, int dstsiz, - u_char **dnptrs, u_char **lastdnptr) -{ - return (ns_name_compress(src, dst, (size_t)dstsiz, - (const u_char **)dnptrs, - (const u_char **)lastdnptr)); -} - -/* - * Skip over a compressed domain name. Return the size or -1. - */ -int -dn_skipname(const u_char *ptr, const u_char *eom) { - const u_char *saveptr = ptr; - - if (ns_name_skip(&ptr, eom) == -1) - return (-1); - return (ptr - saveptr); -} - -/* - * Verify that a domain name uses an acceptable character set. - */ - -/* - * Note the conspicuous absence of ctype macros in these definitions. On - * non-ASCII hosts, we can't depend on string literals or ctype macros to - * tell us anything about network-format data. The rest of the BIND system - * is not careful about this, but for some reason, we're doing it right here. - */ -#define PERIOD 0x2e -#define hyphenchar(c) ((c) == 0x2d) -#define bslashchar(c) ((c) == 0x5c) -#define periodchar(c) ((c) == PERIOD) -#define asterchar(c) ((c) == 0x2a) -#define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \ - || ((c) >= 0x61 && (c) <= 0x7a)) -#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39) - -#define borderchar(c) (alphachar(c) || digitchar(c)) -#define middlechar(c) (borderchar(c) || hyphenchar(c)) -#define domainchar(c) ((c) > 0x20 && (c) < 0x7f) - -int -res_hnok(const char *dn) { - int pch = PERIOD, ch = *dn++; - - while (ch != '\0') { - int nch = *dn++; - - if (periodchar(ch)) { - (void)NULL; - } else if (periodchar(pch)) { - if (!borderchar(ch)) - return (0); - } else if (periodchar(nch) || nch == '\0') { - if (!borderchar(ch)) - return (0); - } else { - if (!middlechar(ch)) - return (0); - } - pch = ch, ch = nch; - } - return (1); -} - -/* - * hostname-like (A, MX, WKS) owners can have "*" as their first label - * but must otherwise be as a host name. - */ -int -res_ownok(const char *dn) { - if (asterchar(dn[0])) { - if (periodchar(dn[1])) - return (res_hnok(dn+2)); - if (dn[1] == '\0') - return (1); - } - return (res_hnok(dn)); -} - -/* - * SOA RNAMEs and RP RNAMEs can have any printable character in their first - * label, but the rest of the name has to look like a host name. - */ -int -res_mailok(const char *dn) { - int ch, escaped = 0; - - /* "." is a valid missing representation */ - if (*dn == '\0') - return (1); - - /* otherwise <label>.<hostname> */ - while ((ch = *dn++) != '\0') { - if (!domainchar(ch)) - return (0); - if (!escaped && periodchar(ch)) - break; - if (escaped) - escaped = 0; - else if (bslashchar(ch)) - escaped = 1; - } - if (periodchar(ch)) - return (res_hnok(dn)); - return (0); -} - -/* - * This function is quite liberal, since RFC 1034's character sets are only - * recommendations. - */ -int -res_dnok(const char *dn) { - int ch; - - while ((ch = *dn++) != '\0') - if (!domainchar(ch)) - return (0); - return (1); -} - -#ifdef BIND_4_COMPAT -/* - * This module must export the following externally-visible symbols: - * ___putlong - * ___putshort - * __getlong - * __getshort - * Note that one _ comes from C and the others come from us. - */ - -#ifdef SOLARIS2 -#ifdef __putlong -#undef __putlong -#endif -#ifdef __putshort -#undef __putshort -#endif -#pragma weak putlong = __putlong -#pragma weak putshort = __putshort -#endif /* SOLARIS2 */ - -void __putlong(u_int32_t src, u_char *dst) { ns_put32(src, dst); } -void __putshort(u_int16_t src, u_char *dst) { ns_put16(src, dst); } -#ifndef __ultrix__ -u_int32_t _getlong(const u_char *src) { return (ns_get32(src)); } -u_int16_t _getshort(const u_char *src) { return (ns_get16(src)); } -#endif /*__ultrix__*/ -#endif /*BIND_4_COMPAT*/ diff --git a/lib/libc/resolv/res_data.c b/lib/libc/resolv/res_data.c deleted file mode 100644 index 204e03d685f4..000000000000 --- a/lib/libc/resolv/res_data.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1995-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: res_data.c,v 1.1.206.2 2004/03/16 12:34:18 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/time.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <ctype.h> -#include <netdb.h> -#include <resolv.h> -#include <res_update.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "port_after.h" -#undef _res - -const char *_res_opcodes[] = { - "QUERY", - "IQUERY", - "CQUERYM", - "CQUERYU", /* experimental */ - "NOTIFY", /* experimental */ - "UPDATE", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "ZONEINIT", - "ZONEREF", -}; - -#ifdef BIND_UPDATE -const char *_res_sectioncodes[] = { - "ZONE", - "PREREQUISITES", - "UPDATE", - "ADDITIONAL", -}; -#endif - -#ifndef __BIND_NOSTATIC -struct __res_state _res -# if defined(__BIND_RES_TEXT) - = { RES_TIMEOUT, } /* Motorola, et al. */ -# endif - ; - -/* Proto. */ - -int res_ourserver_p(const res_state, const struct sockaddr_in *); - -int -res_init(void) { - extern int __res_vinit(res_state, int); - - /* - * These three fields used to be statically initialized. This made - * it hard to use this code in a shared library. It is necessary, - * now that we're doing dynamic initialization here, that we preserve - * the old semantics: if an application modifies one of these three - * fields of _res before res_init() is called, res_init() will not - * alter them. Of course, if an application is setting them to - * _zero_ before calling res_init(), hoping to override what used - * to be the static default, we can't detect it and unexpected results - * will follow. Zero for any of these fields would make no sense, - * so one can safely assume that the applications were already getting - * unexpected results. - * - * _res.options is tricky since some apps were known to diddle the bits - * before res_init() was first called. We can't replicate that semantic - * with dynamic initialization (they may have turned bits off that are - * set in RES_DEFAULT). Our solution is to declare such applications - * "broken". They could fool us by setting RES_INIT but none do (yet). - */ - if (!_res.retrans) - _res.retrans = RES_TIMEOUT; - if (!_res.retry) - _res.retry = 4; - if (!(_res.options & RES_INIT)) - _res.options = RES_DEFAULT; - - /* - * This one used to initialize implicitly to zero, so unless the app - * has set it to something in particular, we can randomize it now. - */ - if (!_res.id) - _res.id = res_randomid(); - - return (__res_vinit(&_res, 1)); -} - -void -p_query(const u_char *msg) { - fp_query(msg, stdout); -} - -void -fp_query(const u_char *msg, FILE *file) { - fp_nquery(msg, PACKETSZ, file); -} - -void -fp_nquery(const u_char *msg, int len, FILE *file) { - if ((_res.options & RES_INIT) == 0U && res_init() == -1) - return; - - res_pquery(&_res, msg, len, file); -} - -int -res_mkquery(int op, /* opcode of query */ - const char *dname, /* domain name */ - int class, int type, /* class and type of query */ - const u_char *data, /* resource record data */ - int datalen, /* length of data */ - const u_char *newrr_in, /* new rr for modify or append */ - u_char *buf, /* buffer to put query */ - int buflen) /* size of buffer */ -{ - if ((_res.options & RES_INIT) == 0U && res_init() == -1) { - RES_SET_H_ERRNO(&_res, NETDB_INTERNAL); - return (-1); - } - return (res_nmkquery(&_res, op, dname, class, type, - data, datalen, - newrr_in, buf, buflen)); -} - -int -res_mkupdate(ns_updrec *rrecp_in, u_char *buf, int buflen) { - if ((_res.options & RES_INIT) == 0U && res_init() == -1) { - RES_SET_H_ERRNO(&_res, NETDB_INTERNAL); - return (-1); - } - - return (res_nmkupdate(&_res, rrecp_in, buf, buflen)); -} - -int -res_query(const char *name, /* domain name */ - int class, int type, /* class and type of query */ - u_char *answer, /* buffer to put answer */ - int anslen) /* size of answer buffer */ -{ - if ((_res.options & RES_INIT) == 0U && res_init() == -1) { - RES_SET_H_ERRNO(&_res, NETDB_INTERNAL); - return (-1); - } - return (res_nquery(&_res, name, class, type, answer, anslen)); -} - -void -res_send_setqhook(res_send_qhook hook) { - _res.qhook = hook; -} - -void -res_send_setrhook(res_send_rhook hook) { - _res.rhook = hook; -} - -int -res_isourserver(const struct sockaddr_in *inp) { - return (res_ourserver_p(&_res, inp)); -} - -int -res_send(const u_char *buf, int buflen, u_char *ans, int anssiz) { - if ((_res.options & RES_INIT) == 0U && res_init() == -1) { - /* errno should have been set by res_init() in this case. */ - return (-1); - } - - return (res_nsend(&_res, buf, buflen, ans, anssiz)); -} - -int -res_sendsigned(const u_char *buf, int buflen, ns_tsig_key *key, - u_char *ans, int anssiz) -{ - if ((_res.options & RES_INIT) == 0U && res_init() == -1) { - /* errno should have been set by res_init() in this case. */ - return (-1); - } - - return (res_nsendsigned(&_res, buf, buflen, key, ans, anssiz)); -} - -void -res_close(void) { - res_nclose(&_res); -} - -int -res_update(ns_updrec *rrecp_in) { - if ((_res.options & RES_INIT) == 0U && res_init() == -1) { - RES_SET_H_ERRNO(&_res, NETDB_INTERNAL); - return (-1); - } - - return (res_nupdate(&_res, rrecp_in, NULL)); -} - -int -res_search(const char *name, /* domain name */ - int class, int type, /* class and type of query */ - u_char *answer, /* buffer to put answer */ - int anslen) /* size of answer */ -{ - if ((_res.options & RES_INIT) == 0U && res_init() == -1) { - RES_SET_H_ERRNO(&_res, NETDB_INTERNAL); - return (-1); - } - - return (res_nsearch(&_res, name, class, type, answer, anslen)); -} - -int -res_querydomain(const char *name, - const char *domain, - int class, int type, /* class and type of query */ - u_char *answer, /* buffer to put answer */ - int anslen) /* size of answer */ -{ - if ((_res.options & RES_INIT) == 0U && res_init() == -1) { - RES_SET_H_ERRNO(&_res, NETDB_INTERNAL); - return (-1); - } - - return (res_nquerydomain(&_res, name, domain, - class, type, - answer, anslen)); -} - -const char * -hostalias(const char *name) { - static char abuf[MAXDNAME]; - - return (res_hostalias(&_res, name, abuf, sizeof abuf)); -} - -#ifdef ultrix -int -local_hostname_length(const char *hostname) { - int len_host, len_domain; - - if (!*_res.defdname) - res_init(); - len_host = strlen(hostname); - len_domain = strlen(_res.defdname); - if (len_host > len_domain && - !strcasecmp(hostname + len_host - len_domain, _res.defdname) && - hostname[len_host - len_domain - 1] == '.') - return (len_host - len_domain - 1); - return (0); -} -#endif /*ultrix*/ - -#endif diff --git a/lib/libc/resolv/res_debug.c b/lib/libc/resolv/res_debug.c deleted file mode 100644 index 8dda12c5e81c..000000000000 --- a/lib/libc/resolv/res_debug.c +++ /dev/null @@ -1,1163 +0,0 @@ -/* - * Copyright (c) 1985 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Portions Copyright (c) 1995 by International Business Machines, Inc. - * - * International Business Machines, Inc. (hereinafter called IBM) grants - * permission under its copyrights to use, copy, modify, and distribute this - * Software with or without fee, provided that the above copyright notice and - * all paragraphs of this notice appear in all copies, and that the name of IBM - * not be used in connection with the marketing of any product incorporating - * the Software or modifications thereof, without specific, written prior - * permission. - * - * To the extent it has a right to do so, IBM grants an immunity from suit - * under its patents, if any, for the use, sale or manufacture of products to - * the extent that such products are used for performing Domain Name System - * dynamic updates in TCP/IP networks by means of the Software. No immunity is - * granted for any product per se or for any other function of any product. - * - * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, - * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN - * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. - */ - -/* - * 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 sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: res_debug.c,v 1.3.2.5.4.6 2005/07/28 07:43:22 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#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 <math.h> -#include <netdb.h> -#include <resolv.h> -#include <resolv_mt.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#include "port_after.h" - -#ifdef SPRINTF_CHAR -# define SPRINTF(x) strlen(sprintf/**/x) -#else -# define SPRINTF(x) sprintf x -#endif - -extern const char *_res_opcodes[]; -extern const char *_res_sectioncodes[]; - -/* - * Print the current options. - */ -void -fp_resstat(const res_state statp, FILE *file) { - u_long mask; - - fprintf(file, ";; res options:"); - for (mask = 1; mask != 0U; mask <<= 1) - if (statp->options & mask) - fprintf(file, " %s", p_option(mask)); - putc('\n', file); -} - -static void -do_section(const res_state statp, - ns_msg *handle, ns_sect section, - int pflag, FILE *file) -{ - int n, sflag, rrnum; - static int buflen = 2048; - char *buf; - ns_opcode opcode; - ns_rr rr; - - /* - * Print answer records. - */ - sflag = (statp->pfcode & pflag); - if (statp->pfcode && !sflag) - return; - - buf = malloc(buflen); - if (buf == NULL) { - fprintf(file, ";; memory allocation failure\n"); - return; - } - - opcode = (ns_opcode) ns_msg_getflag(*handle, ns_f_opcode); - rrnum = 0; - for (;;) { - if (ns_parserr(handle, section, rrnum, &rr)) { - if (errno != ENODEV) - fprintf(file, ";; ns_parserr: %s\n", - strerror(errno)); - else if (rrnum > 0 && sflag != 0 && - (statp->pfcode & RES_PRF_HEAD1)) - putc('\n', file); - goto cleanup; - } - if (rrnum == 0 && sflag != 0 && (statp->pfcode & RES_PRF_HEAD1)) - fprintf(file, ";; %s SECTION:\n", - p_section(section, opcode)); - if (section == ns_s_qd) - fprintf(file, ";;\t%s, type = %s, class = %s\n", - ns_rr_name(rr), - p_type(ns_rr_type(rr)), - p_class(ns_rr_class(rr))); - else if (section == ns_s_ar && ns_rr_type(rr) == ns_t_opt) { - u_int32_t ttl = ns_rr_ttl(rr); - fprintf(file, - "; EDNS: version: %u, udp=%u, flags=%04x\n", - (ttl>>16)&0xff, ns_rr_class(rr), ttl&0xffff); - } else { - n = ns_sprintrr(handle, &rr, NULL, NULL, - buf, buflen); - if (n < 0) { - if (errno == ENOSPC) { - free(buf); - buf = NULL; - if (buflen < 131072) - buf = malloc(buflen += 1024); - if (buf == NULL) { - fprintf(file, - ";; memory allocation failure\n"); - return; - } - continue; - } - fprintf(file, ";; ns_sprintrr: %s\n", - strerror(errno)); - goto cleanup; - } - fputs(buf, file); - fputc('\n', file); - } - rrnum++; - } - cleanup: - if (buf != NULL) - free(buf); -} - -/* - * Print the contents of a query. - * This is intended to be primarily a debugging routine. - */ -void -res_pquery(const res_state statp, const u_char *msg, int len, FILE *file) { - ns_msg handle; - int qdcount, ancount, nscount, arcount; - u_int opcode, rcode, id; - - if (ns_initparse(msg, len, &handle) < 0) { - fprintf(file, ";; ns_initparse: %s\n", strerror(errno)); - return; - } - opcode = ns_msg_getflag(handle, ns_f_opcode); - rcode = ns_msg_getflag(handle, ns_f_rcode); - id = ns_msg_id(handle); - qdcount = ns_msg_count(handle, ns_s_qd); - ancount = ns_msg_count(handle, ns_s_an); - nscount = ns_msg_count(handle, ns_s_ns); - arcount = ns_msg_count(handle, ns_s_ar); - - /* - * Print header fields. - */ - if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEADX) || rcode) - fprintf(file, - ";; ->>HEADER<<- opcode: %s, status: %s, id: %d\n", - _res_opcodes[opcode], p_rcode(rcode), id); - if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEADX)) - putc(';', file); - if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEAD2)) { - fprintf(file, "; flags:"); - if (ns_msg_getflag(handle, ns_f_qr)) - fprintf(file, " qr"); - if (ns_msg_getflag(handle, ns_f_aa)) - fprintf(file, " aa"); - if (ns_msg_getflag(handle, ns_f_tc)) - fprintf(file, " tc"); - if (ns_msg_getflag(handle, ns_f_rd)) - fprintf(file, " rd"); - if (ns_msg_getflag(handle, ns_f_ra)) - fprintf(file, " ra"); - if (ns_msg_getflag(handle, ns_f_z)) - fprintf(file, " ??"); - if (ns_msg_getflag(handle, ns_f_ad)) - fprintf(file, " ad"); - if (ns_msg_getflag(handle, ns_f_cd)) - fprintf(file, " cd"); - } - if ((!statp->pfcode) || (statp->pfcode & RES_PRF_HEAD1)) { - fprintf(file, "; %s: %d", - p_section(ns_s_qd, opcode), qdcount); - fprintf(file, ", %s: %d", - p_section(ns_s_an, opcode), ancount); - fprintf(file, ", %s: %d", - p_section(ns_s_ns, opcode), nscount); - fprintf(file, ", %s: %d", - p_section(ns_s_ar, opcode), arcount); - } - if ((!statp->pfcode) || (statp->pfcode & - (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1))) { - putc('\n',file); - } - /* - * Print the various sections. - */ - do_section(statp, &handle, ns_s_qd, RES_PRF_QUES, file); - do_section(statp, &handle, ns_s_an, RES_PRF_ANS, file); - do_section(statp, &handle, ns_s_ns, RES_PRF_AUTH, file); - do_section(statp, &handle, ns_s_ar, RES_PRF_ADD, file); - if (qdcount == 0 && ancount == 0 && - nscount == 0 && arcount == 0) - putc('\n', file); -} - -const u_char * -p_cdnname(const u_char *cp, const u_char *msg, int len, FILE *file) { - char name[MAXDNAME]; - int n; - - if ((n = dn_expand(msg, msg + len, cp, name, sizeof name)) < 0) - return (NULL); - if (name[0] == '\0') - putc('.', file); - else - fputs(name, file); - return (cp + n); -} - -const u_char * -p_cdname(const u_char *cp, const u_char *msg, FILE *file) { - return (p_cdnname(cp, msg, PACKETSZ, file)); -} - -/* Return a fully-qualified domain name from a compressed name (with - length supplied). */ - -const u_char * -p_fqnname(cp, msg, msglen, name, namelen) - const u_char *cp, *msg; - int msglen; - char *name; - int namelen; -{ - int n, newlen; - - if ((n = dn_expand(msg, cp + msglen, cp, name, namelen)) < 0) - return (NULL); - newlen = strlen(name); - if (newlen == 0 || name[newlen - 1] != '.') { - if (newlen + 1 >= namelen) /* Lack space for final dot */ - return (NULL); - else - strcpy(name + newlen, "."); - } - return (cp + n); -} - -/* XXX: the rest of these functions need to become length-limited, too. */ - -const u_char * -p_fqname(const u_char *cp, const u_char *msg, FILE *file) { - char name[MAXDNAME]; - const u_char *n; - - n = p_fqnname(cp, msg, MAXCDNAME, name, sizeof name); - if (n == NULL) - return (NULL); - fputs(name, file); - return (n); -} - -/* - * Names of RR classes and qclasses. Classes and qclasses are the same, except - * that C_ANY is a qclass but not a class. (You can ask for records of class - * C_ANY, but you can't have any records of that class in the database.) - */ -const struct res_sym __p_class_syms[] = { - {C_IN, "IN", (char *)0}, - {C_CHAOS, "CH", (char *)0}, - {C_CHAOS, "CHAOS", (char *)0}, - {C_HS, "HS", (char *)0}, - {C_HS, "HESIOD", (char *)0}, - {C_ANY, "ANY", (char *)0}, - {C_NONE, "NONE", (char *)0}, - {C_IN, (char *)0, (char *)0} -}; - -/* - * Names of message sections. - */ -const struct res_sym __p_default_section_syms[] = { - {ns_s_qd, "QUERY", (char *)0}, - {ns_s_an, "ANSWER", (char *)0}, - {ns_s_ns, "AUTHORITY", (char *)0}, - {ns_s_ar, "ADDITIONAL", (char *)0}, - {0, (char *)0, (char *)0} -}; - -const struct res_sym __p_update_section_syms[] = { - {S_ZONE, "ZONE", (char *)0}, - {S_PREREQ, "PREREQUISITE", (char *)0}, - {S_UPDATE, "UPDATE", (char *)0}, - {S_ADDT, "ADDITIONAL", (char *)0}, - {0, (char *)0, (char *)0} -}; - -const struct res_sym __p_key_syms[] = { - {NS_ALG_MD5RSA, "RSA", "RSA KEY with MD5 hash"}, - {NS_ALG_DH, "DH", "Diffie Hellman"}, - {NS_ALG_DSA, "DSA", "Digital Signature Algorithm"}, - {NS_ALG_EXPIRE_ONLY, "EXPIREONLY", "No algorithm"}, - {NS_ALG_PRIVATE_OID, "PRIVATE", "Algorithm obtained from OID"}, - {0, NULL, NULL} -}; - -const struct res_sym __p_cert_syms[] = { - {cert_t_pkix, "PKIX", "PKIX (X.509v3) Certificate"}, - {cert_t_spki, "SPKI", "SPKI certificate"}, - {cert_t_pgp, "PGP", "PGP certificate"}, - {cert_t_url, "URL", "URL Private"}, - {cert_t_oid, "OID", "OID Private"}, - {0, NULL, NULL} -}; - -/* - * Names of RR types and qtypes. Types and qtypes are the same, except - * that T_ANY is a qtype but not a type. (You can ask for records of type - * T_ANY, but you can't have any records of that type in the database.) - */ -const struct res_sym __p_type_syms[] = { - {ns_t_a, "A", "address"}, - {ns_t_ns, "NS", "name server"}, - {ns_t_md, "MD", "mail destination (deprecated)"}, - {ns_t_mf, "MF", "mail forwarder (deprecated)"}, - {ns_t_cname, "CNAME", "canonical name"}, - {ns_t_soa, "SOA", "start of authority"}, - {ns_t_mb, "MB", "mailbox"}, - {ns_t_mg, "MG", "mail group member"}, - {ns_t_mr, "MR", "mail rename"}, - {ns_t_null, "NULL", "null"}, - {ns_t_wks, "WKS", "well-known service (deprecated)"}, - {ns_t_ptr, "PTR", "domain name pointer"}, - {ns_t_hinfo, "HINFO", "host information"}, - {ns_t_minfo, "MINFO", "mailbox information"}, - {ns_t_mx, "MX", "mail exchanger"}, - {ns_t_txt, "TXT", "text"}, - {ns_t_rp, "RP", "responsible person"}, - {ns_t_afsdb, "AFSDB", "DCE or AFS server"}, - {ns_t_x25, "X25", "X25 address"}, - {ns_t_isdn, "ISDN", "ISDN address"}, - {ns_t_rt, "RT", "router"}, - {ns_t_nsap, "NSAP", "nsap address"}, - {ns_t_nsap_ptr, "NSAP_PTR", "domain name pointer"}, - {ns_t_sig, "SIG", "signature"}, - {ns_t_key, "KEY", "key"}, - {ns_t_px, "PX", "mapping information"}, - {ns_t_gpos, "GPOS", "geographical position (withdrawn)"}, - {ns_t_aaaa, "AAAA", "IPv6 address"}, - {ns_t_loc, "LOC", "location"}, - {ns_t_nxt, "NXT", "next valid name (unimplemented)"}, - {ns_t_eid, "EID", "endpoint identifier (unimplemented)"}, - {ns_t_nimloc, "NIMLOC", "NIMROD locator (unimplemented)"}, - {ns_t_srv, "SRV", "server selection"}, - {ns_t_atma, "ATMA", "ATM address (unimplemented)"}, - {ns_t_tkey, "TKEY", "tkey"}, - {ns_t_tsig, "TSIG", "transaction signature"}, - {ns_t_ixfr, "IXFR", "incremental zone transfer"}, - {ns_t_axfr, "AXFR", "zone transfer"}, - {ns_t_zxfr, "ZXFR", "compressed zone transfer"}, - {ns_t_mailb, "MAILB", "mailbox-related data (deprecated)"}, - {ns_t_maila, "MAILA", "mail agent (deprecated)"}, - {ns_t_naptr, "NAPTR", "URN Naming Authority"}, - {ns_t_kx, "KX", "Key Exchange"}, - {ns_t_cert, "CERT", "Certificate"}, - {ns_t_a6, "A6", "IPv6 Address"}, - {ns_t_dname, "DNAME", "dname"}, - {ns_t_sink, "SINK", "Kitchen Sink (experimental)"}, - {ns_t_opt, "OPT", "EDNS Options"}, - {ns_t_any, "ANY", "\"any\""}, - {0, NULL, NULL} -}; - -/* - * Names of DNS rcodes. - */ -const struct res_sym __p_rcode_syms[] = { - {ns_r_noerror, "NOERROR", "no error"}, - {ns_r_formerr, "FORMERR", "format error"}, - {ns_r_servfail, "SERVFAIL", "server failed"}, - {ns_r_nxdomain, "NXDOMAIN", "no such domain name"}, - {ns_r_notimpl, "NOTIMP", "not implemented"}, - {ns_r_refused, "REFUSED", "refused"}, - {ns_r_yxdomain, "YXDOMAIN", "domain name exists"}, - {ns_r_yxrrset, "YXRRSET", "rrset exists"}, - {ns_r_nxrrset, "NXRRSET", "rrset doesn't exist"}, - {ns_r_notauth, "NOTAUTH", "not authoritative"}, - {ns_r_notzone, "NOTZONE", "Not in zone"}, - {ns_r_max, "", ""}, - {ns_r_badsig, "BADSIG", "bad signature"}, - {ns_r_badkey, "BADKEY", "bad key"}, - {ns_r_badtime, "BADTIME", "bad time"}, - {0, NULL, NULL} -}; - -int -sym_ston(const struct res_sym *syms, const char *name, int *success) { - for ((void)NULL; syms->name != 0; syms++) { - if (strcasecmp (name, syms->name) == 0) { - if (success) - *success = 1; - return (syms->number); - } - } - if (success) - *success = 0; - return (syms->number); /* The default value. */ -} - -const char * -sym_ntos(const struct res_sym *syms, int number, int *success) { - char *unname = sym_ntos_unname; - - for ((void)NULL; syms->name != 0; syms++) { - if (number == syms->number) { - if (success) - *success = 1; - return (syms->name); - } - } - - sprintf(unname, "%d", number); /* XXX nonreentrant */ - if (success) - *success = 0; - return (unname); -} - -const char * -sym_ntop(const struct res_sym *syms, int number, int *success) { - char *unname = sym_ntop_unname; - - for ((void)NULL; syms->name != 0; syms++) { - if (number == syms->number) { - if (success) - *success = 1; - return (syms->humanname); - } - } - sprintf(unname, "%d", number); /* XXX nonreentrant */ - if (success) - *success = 0; - return (unname); -} - -/* - * Return a string for the type. - */ -const char * -p_type(int type) { - int success; - const char *result; - static char typebuf[20]; - - result = sym_ntos(__p_type_syms, type, &success); - if (success) - return (result); - if (type < 0 || type > 0xffff) - return ("BADTYPE"); - sprintf(typebuf, "TYPE%d", type); - return (typebuf); -} - -/* - * Return a string for the type. - */ -const char * -p_section(int section, int opcode) { - const struct res_sym *symbols; - - switch (opcode) { - case ns_o_update: - symbols = __p_update_section_syms; - break; - default: - symbols = __p_default_section_syms; - break; - } - return (sym_ntos(symbols, section, (int *)0)); -} - -/* - * Return a mnemonic for class. - */ -const char * -p_class(int class) { - int success; - const char *result; - static char classbuf[20]; - - result = sym_ntos(__p_class_syms, class, &success); - if (success) - return (result); - if (class < 0 || class > 0xffff) - return ("BADCLASS"); - sprintf(classbuf, "CLASS%d", class); - return (classbuf); -} - -/* - * Return a mnemonic for an option - */ -const char * -p_option(u_long option) { - char *nbuf = p_option_nbuf; - - switch (option) { - case RES_INIT: return "init"; - case RES_DEBUG: return "debug"; - case RES_AAONLY: return "aaonly(unimpl)"; - case RES_USEVC: return "usevc"; - case RES_PRIMARY: return "primry(unimpl)"; - case RES_IGNTC: return "igntc"; - case RES_RECURSE: return "recurs"; - case RES_DEFNAMES: return "defnam"; - case RES_STAYOPEN: return "styopn"; - case RES_DNSRCH: return "dnsrch"; - case RES_INSECURE1: return "insecure1"; - case RES_INSECURE2: return "insecure2"; - case RES_NOALIASES: return "noaliases"; - case RES_USE_INET6: return "inet6"; -#ifdef RES_USE_EDNS0 /* KAME extension */ - case RES_USE_EDNS0: return "edns0"; -#endif -#ifdef RES_USE_DNAME - case RES_USE_DNAME: return "dname"; -#endif -#ifdef RES_USE_DNSSEC - case RES_USE_DNSSEC: return "dnssec"; -#endif -#ifdef RES_NOTLDQUERY - case RES_NOTLDQUERY: return "no-tld-query"; -#endif -#ifdef RES_NO_NIBBLE2 - case RES_NO_NIBBLE2: return "no-nibble2"; -#endif - /* XXX nonreentrant */ - default: sprintf(nbuf, "?0x%lx?", (u_long)option); - return (nbuf); - } -} - -/* - * Return a mnemonic for a time to live. - */ -const char * -p_time(u_int32_t value) { - char *nbuf = p_time_nbuf; - - if (ns_format_ttl(value, nbuf, sizeof nbuf) < 0) - sprintf(nbuf, "%u", value); - return (nbuf); -} - -/* - * Return a string for the rcode. - */ -const char * -p_rcode(int rcode) { - return (sym_ntos(__p_rcode_syms, rcode, (int *)0)); -} - -/* - * Return a string for a res_sockaddr_union. - */ -const char * -p_sockun(union res_sockaddr_union u, char *buf, size_t size) { - char ret[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:123.123.123.123"]; - - switch (u.sin.sin_family) { - case AF_INET: - inet_ntop(AF_INET, &u.sin.sin_addr, ret, sizeof ret); - break; -#ifdef HAS_INET6_STRUCTS - case AF_INET6: - inet_ntop(AF_INET6, &u.sin6.sin6_addr, ret, sizeof ret); - break; -#endif - default: - sprintf(ret, "[af%d]", u.sin.sin_family); - break; - } - if (size > 0U) { - strncpy(buf, ret, size - 1); - buf[size - 1] = '0'; - } - return (buf); -} - -/* - * routines to convert between on-the-wire RR format and zone file format. - * Does not contain conversion to/from decimal degrees; divide or multiply - * by 60*60*1000 for that. - */ - -static unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000, - 1000000,10000000,100000000,1000000000}; - -/* takes an XeY precision/size value, returns a string representation. */ -static const char * -precsize_ntoa(prec) - u_int8_t prec; -{ - char *retbuf = precsize_ntoa_retbuf; - unsigned long val; - int mantissa, exponent; - - mantissa = (int)((prec >> 4) & 0x0f) % 10; - exponent = (int)((prec >> 0) & 0x0f) % 10; - - val = mantissa * poweroften[exponent]; - - (void) sprintf(retbuf, "%lu.%.2lu", val/100, val%100); - return (retbuf); -} - -/* converts ascii size/precision X * 10**Y(cm) to 0xXY. moves pointer. */ -static u_int8_t -precsize_aton(const char **strptr) { - unsigned int mval = 0, cmval = 0; - u_int8_t retval = 0; - const char *cp; - int exponent; - int mantissa; - - cp = *strptr; - - while (isdigit((unsigned char)*cp)) - mval = mval * 10 + (*cp++ - '0'); - - if (*cp == '.') { /* centimeters */ - cp++; - if (isdigit((unsigned char)*cp)) { - cmval = (*cp++ - '0') * 10; - if (isdigit((unsigned char)*cp)) { - cmval += (*cp++ - '0'); - } - } - } - cmval = (mval * 100) + cmval; - - for (exponent = 0; exponent < 9; exponent++) - if (cmval < poweroften[exponent+1]) - break; - - mantissa = cmval / poweroften[exponent]; - if (mantissa > 9) - mantissa = 9; - - retval = (mantissa << 4) | exponent; - - *strptr = cp; - - return (retval); -} - -/* converts ascii lat/lon to unsigned encoded 32-bit number. moves pointer. */ -static u_int32_t -latlon2ul(const char **latlonstrptr, int *which) { - const char *cp; - u_int32_t retval; - int deg = 0, min = 0, secs = 0, secsfrac = 0; - - cp = *latlonstrptr; - - while (isdigit((unsigned char)*cp)) - deg = deg * 10 + (*cp++ - '0'); - - while (isspace((unsigned char)*cp)) - cp++; - - if (!(isdigit((unsigned char)*cp))) - goto fndhemi; - - while (isdigit((unsigned char)*cp)) - min = min * 10 + (*cp++ - '0'); - - while (isspace((unsigned char)*cp)) - cp++; - - if (!(isdigit((unsigned char)*cp))) - goto fndhemi; - - while (isdigit((unsigned char)*cp)) - secs = secs * 10 + (*cp++ - '0'); - - if (*cp == '.') { /* decimal seconds */ - cp++; - if (isdigit((unsigned char)*cp)) { - secsfrac = (*cp++ - '0') * 100; - if (isdigit((unsigned char)*cp)) { - secsfrac += (*cp++ - '0') * 10; - if (isdigit((unsigned char)*cp)) { - secsfrac += (*cp++ - '0'); - } - } - } - } - - while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ - cp++; - - while (isspace((unsigned char)*cp)) - cp++; - - fndhemi: - switch (*cp) { - case 'N': case 'n': - case 'E': case 'e': - retval = ((unsigned)1<<31) - + (((((deg * 60) + min) * 60) + secs) * 1000) - + secsfrac; - break; - case 'S': case 's': - case 'W': case 'w': - retval = ((unsigned)1<<31) - - (((((deg * 60) + min) * 60) + secs) * 1000) - - secsfrac; - break; - default: - retval = 0; /* invalid value -- indicates error */ - break; - } - - switch (*cp) { - case 'N': case 'n': - case 'S': case 's': - *which = 1; /* latitude */ - break; - case 'E': case 'e': - case 'W': case 'w': - *which = 2; /* longitude */ - break; - default: - *which = 0; /* error */ - break; - } - - cp++; /* skip the hemisphere */ - - while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ - cp++; - - while (isspace((unsigned char)*cp)) /* move to next field */ - cp++; - - *latlonstrptr = cp; - - return (retval); -} - -/* converts a zone file representation in a string to an RDATA on-the-wire - * representation. */ -int -loc_aton(ascii, binary) - const char *ascii; - u_char *binary; -{ - const char *cp, *maxcp; - u_char *bcp; - - u_int32_t latit = 0, longit = 0, alt = 0; - u_int32_t lltemp1 = 0, lltemp2 = 0; - int altmeters = 0, altfrac = 0, altsign = 1; - u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */ - u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */ - u_int8_t siz = 0x12; /* default = 1e2 cm = 1.00m */ - int which1 = 0, which2 = 0; - - cp = ascii; - maxcp = cp + strlen(ascii); - - lltemp1 = latlon2ul(&cp, &which1); - - lltemp2 = latlon2ul(&cp, &which2); - - switch (which1 + which2) { - case 3: /* 1 + 2, the only valid combination */ - if ((which1 == 1) && (which2 == 2)) { /* normal case */ - latit = lltemp1; - longit = lltemp2; - } else if ((which1 == 2) && (which2 == 1)) { /* reversed */ - longit = lltemp1; - latit = lltemp2; - } else { /* some kind of brokenness */ - return (0); - } - break; - default: /* we didn't get one of each */ - return (0); - } - - /* altitude */ - if (*cp == '-') { - altsign = -1; - cp++; - } - - if (*cp == '+') - cp++; - - while (isdigit((unsigned char)*cp)) - altmeters = altmeters * 10 + (*cp++ - '0'); - - if (*cp == '.') { /* decimal meters */ - cp++; - if (isdigit((unsigned char)*cp)) { - altfrac = (*cp++ - '0') * 10; - if (isdigit((unsigned char)*cp)) { - altfrac += (*cp++ - '0'); - } - } - } - - alt = (10000000 + (altsign * (altmeters * 100 + altfrac))); - - while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ - cp++; - - while (isspace((unsigned char)*cp) && (cp < maxcp)) - cp++; - - if (cp >= maxcp) - goto defaults; - - siz = precsize_aton(&cp); - - while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ - cp++; - - while (isspace((unsigned char)*cp) && (cp < maxcp)) - cp++; - - if (cp >= maxcp) - goto defaults; - - hp = precsize_aton(&cp); - - while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ - cp++; - - while (isspace((unsigned char)*cp) && (cp < maxcp)) - cp++; - - if (cp >= maxcp) - goto defaults; - - vp = precsize_aton(&cp); - - defaults: - - bcp = binary; - *bcp++ = (u_int8_t) 0; /* version byte */ - *bcp++ = siz; - *bcp++ = hp; - *bcp++ = vp; - PUTLONG(latit,bcp); - PUTLONG(longit,bcp); - PUTLONG(alt,bcp); - - return (16); /* size of RR in octets */ -} - -/* takes an on-the-wire LOC RR and formats it in a human readable format. */ -const char * -loc_ntoa(binary, ascii) - const u_char *binary; - char *ascii; -{ - static const char *error = "?"; - static char tmpbuf[sizeof -"1000 60 60.000 N 1000 60 60.000 W -12345678.00m 90000000.00m 90000000.00m 90000000.00m"]; - const u_char *cp = binary; - - int latdeg, latmin, latsec, latsecfrac; - int longdeg, longmin, longsec, longsecfrac; - char northsouth, eastwest; - const char *altsign; - int altmeters, altfrac; - - const u_int32_t referencealt = 100000 * 100; - - int32_t latval, longval, altval; - u_int32_t templ; - u_int8_t sizeval, hpval, vpval, versionval; - - char *sizestr, *hpstr, *vpstr; - - versionval = *cp++; - - if (ascii == NULL) - ascii = tmpbuf; - - if (versionval) { - (void) sprintf(ascii, "; error: unknown LOC RR version"); - return (ascii); - } - - sizeval = *cp++; - - hpval = *cp++; - vpval = *cp++; - - GETLONG(templ, cp); - latval = (templ - ((unsigned)1<<31)); - - GETLONG(templ, cp); - longval = (templ - ((unsigned)1<<31)); - - GETLONG(templ, cp); - if (templ < referencealt) { /* below WGS 84 spheroid */ - altval = referencealt - templ; - altsign = "-"; - } else { - altval = templ - referencealt; - altsign = ""; - } - - if (latval < 0) { - northsouth = 'S'; - latval = -latval; - } else - northsouth = 'N'; - - latsecfrac = latval % 1000; - latval = latval / 1000; - latsec = latval % 60; - latval = latval / 60; - latmin = latval % 60; - latval = latval / 60; - latdeg = latval; - - if (longval < 0) { - eastwest = 'W'; - longval = -longval; - } else - eastwest = 'E'; - - longsecfrac = longval % 1000; - longval = longval / 1000; - longsec = longval % 60; - longval = longval / 60; - longmin = longval % 60; - longval = longval / 60; - longdeg = longval; - - altfrac = altval % 100; - altmeters = (altval / 100); - - sizestr = strdup(precsize_ntoa(sizeval)); - hpstr = strdup(precsize_ntoa(hpval)); - vpstr = strdup(precsize_ntoa(vpval)); - - sprintf(ascii, - "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %s%d.%.2dm %sm %sm %sm", - latdeg, latmin, latsec, latsecfrac, northsouth, - longdeg, longmin, longsec, longsecfrac, eastwest, - altsign, altmeters, altfrac, - (sizestr != NULL) ? sizestr : error, - (hpstr != NULL) ? hpstr : error, - (vpstr != NULL) ? vpstr : error); - - if (sizestr != NULL) - free(sizestr); - if (hpstr != NULL) - free(hpstr); - if (vpstr != NULL) - free(vpstr); - - return (ascii); -} - - -/* Return the number of DNS hierarchy levels in the name. */ -int -dn_count_labels(const char *name) { - int i, len, count; - - len = strlen(name); - for (i = 0, count = 0; i < len; i++) { - /* XXX need to check for \. or use named's nlabels(). */ - if (name[i] == '.') - count++; - } - - /* don't count initial wildcard */ - if (name[0] == '*') - if (count) - count--; - - /* don't count the null label for root. */ - /* if terminating '.' not found, must adjust */ - /* count to include last label */ - if (len > 0 && name[len-1] != '.') - count++; - return (count); -} - - -/* - * Make dates expressed in seconds-since-Jan-1-1970 easy to read. - * SIG records are required to be printed like this, by the Secure DNS RFC. - */ -char * -p_secstodate (u_long secs) { - char *output = p_secstodate_output; - time_t clock = secs; - struct tm *time; -#ifdef HAVE_TIME_R - struct tm res; - - time = gmtime_r(&clock, &res); -#else - time = gmtime(&clock); -#endif - time->tm_year += 1900; - time->tm_mon += 1; - sprintf(output, "%04d%02d%02d%02d%02d%02d", - time->tm_year, time->tm_mon, time->tm_mday, - time->tm_hour, time->tm_min, time->tm_sec); - return (output); -} - -u_int16_t -res_nametoclass(const char *buf, int *successp) { - unsigned long result; - char *endptr; - int success; - - result = sym_ston(__p_class_syms, buf, &success); - if (success) - goto done; - - if (strncasecmp(buf, "CLASS", 5) != 0 || - !isdigit((unsigned char)buf[5])) - goto done; - errno = 0; - result = strtoul(buf + 5, &endptr, 10); - if (errno == 0 && *endptr == '\0' && result <= 0xffffU) - success = 1; - done: - if (successp) - *successp = success; - return (result); -} - -u_int16_t -res_nametotype(const char *buf, int *successp) { - unsigned long result; - char *endptr; - int success; - - result = sym_ston(__p_type_syms, buf, &success); - if (success) - goto done; - - if (strncasecmp(buf, "type", 4) != 0 || - !isdigit((unsigned char)buf[4])) - goto done; - errno = 0; - result = strtoul(buf + 4, &endptr, 10); - if (errno == 0 && *endptr == '\0' && result <= 0xffffU) - success = 1; - done: - if (successp) - *successp = success; - return (result); -} diff --git a/lib/libc/resolv/res_debug.h b/lib/libc/resolv/res_debug.h deleted file mode 100644 index 2a9c0ae6f53a..000000000000 --- a/lib/libc/resolv/res_debug.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 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. - */ - -#ifndef _RES_DEBUG_H_ -#define _RES_DEBUG_H_ - -#ifndef DEBUG -# define Dprint(cond, args) /*empty*/ -# define DprintQ(cond, args, query, size) /*empty*/ -# define Aerror(statp, file, string, error, address) /*empty*/ -# define Perror(statp, file, string, error) /*empty*/ -#else -# define Dprint(cond, args) if (cond) {fprintf args;} else {} -# define DprintQ(cond, args, query, size) if (cond) {\ - fprintf args;\ - res_pquery(statp, query, size, stdout);\ - } else {} -#endif - -#endif /* _RES_DEBUG_H_ */ diff --git a/lib/libc/resolv/res_findzonecut.c b/lib/libc/resolv/res_findzonecut.c deleted file mode 100644 index 804beb647464..000000000000 --- a/lib/libc/resolv/res_findzonecut.c +++ /dev/null @@ -1,719 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: res_findzonecut.c,v 1.2.2.3.4.4 2005/10/11 00:48:16 marka Exp $"; -#endif /* not lint */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 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. - */ - -/* Import. */ - -#include "port_before.h" - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/time.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <limits.h> -#include <netdb.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/list.h> - -#include "port_after.h" - -#include <resolv.h> - -/* Data structures. */ - -typedef struct rr_a { - LINK(struct rr_a) link; - union res_sockaddr_union addr; -} rr_a; -typedef LIST(rr_a) rrset_a; - -typedef struct rr_ns { - LINK(struct rr_ns) link; - const char * name; - unsigned int flags; - rrset_a addrs; -} rr_ns; -typedef LIST(rr_ns) rrset_ns; - -#define RR_NS_HAVE_V4 0x01 -#define RR_NS_HAVE_V6 0x02 - -/* Forward. */ - -static int satisfy(res_state, const char *, rrset_ns *, - union res_sockaddr_union *, int); -static int add_addrs(res_state, rr_ns *, - union res_sockaddr_union *, int); -static int get_soa(res_state, const char *, ns_class, int, - char *, size_t, char *, size_t, - rrset_ns *); -static int get_ns(res_state, const char *, ns_class, int, rrset_ns *); -static int get_glue(res_state, ns_class, int, rrset_ns *); -static int save_ns(res_state, ns_msg *, ns_sect, - const char *, ns_class, int, rrset_ns *); -static int save_a(res_state, ns_msg *, ns_sect, - const char *, ns_class, int, rr_ns *); -static void free_nsrrset(rrset_ns *); -static void free_nsrr(rrset_ns *, rr_ns *); -static rr_ns * find_ns(rrset_ns *, const char *); -static int do_query(res_state, const char *, ns_class, ns_type, - u_char *, ns_msg *); -static void res_dprintf(const char *, ...) ISC_FORMAT_PRINTF(1, 2); - -/* Macros. */ - -#define DPRINTF(x) do {\ - int save_errno = errno; \ - if ((statp->options & RES_DEBUG) != 0U) res_dprintf x; \ - errno = save_errno; \ - } while (0) - -/* Public. */ - -/* - * int - * res_findzonecut(res, dname, class, zname, zsize, addrs, naddrs) - * find enclosing zone for a <dname,class>, and some server addresses - * parameters: - * res - resolver context to work within (is modified) - * dname - domain name whose enclosing zone is desired - * class - class of dname (and its enclosing zone) - * zname - found zone name - * zsize - allocated size of zname - * addrs - found server addresses - * naddrs - max number of addrs - * return values: - * < 0 - an error occurred (check errno) - * = 0 - zname is now valid, but addrs[] wasn't changed - * > 0 - zname is now valid, and return value is number of addrs[] found - * notes: - * this function calls res_nsend() which means it depends on correctly - * functioning recursive nameservers (usually defined in /etc/resolv.conf - * or its local equivilent). - * - * we start by asking for an SOA<dname,class>. if we get one as an - * answer, that just means <dname,class> is a zone top, which is fine. - * more than likely we'll be told to go pound sand, in the form of a - * negative answer. - * - * note that we are not prepared to deal with referrals since that would - * only come from authority servers and our correctly functioning local - * recursive server would have followed the referral and got us something - * more definite. - * - * if the authority section contains an SOA, this SOA should also be the - * closest enclosing zone, since any intermediary zone cuts would've been - * returned as referrals and dealt with by our correctly functioning local - * recursive name server. but an SOA in the authority section should NOT - * match our dname (since that would have been returned in the answer - * section). an authority section SOA has to be "above" our dname. - * - * however, since authority section SOA's were once optional, it's - * possible that we'll have to go hunting for the enclosing SOA by - * ripping labels off the front of our dname -- this is known as "doing - * it the hard way." - * - * ultimately we want some server addresses, which are ideally the ones - * pertaining to the SOA.MNAME, but only if there is a matching NS RR. - * so the second phase (after we find an SOA) is to go looking for the - * NS RRset for that SOA's zone. - * - * no answer section processed by this code is allowed to contain CNAME - * or DNAME RR's. for the SOA query this means we strip a label and - * keep going. for the NS and A queries this means we just give up. - */ - -int -res_findzonecut(res_state statp, const char *dname, ns_class class, int opts, - char *zname, size_t zsize, struct in_addr *addrs, int naddrs) -{ - int result, i; - union res_sockaddr_union *u; - - - opts |= RES_IPV4ONLY; - opts &= ~RES_IPV6ONLY; - - u = calloc(naddrs, sizeof(*u)); - if (u == NULL) - return(-1); - - result = res_findzonecut2(statp, dname, class, opts, zname, zsize, - u, naddrs); - - for (i = 0; i < result; i++) { - addrs[i] = u[i].sin.sin_addr; - } - free(u); - return (result); -} - -int -res_findzonecut2(res_state statp, const char *dname, ns_class class, int opts, - char *zname, size_t zsize, union res_sockaddr_union *addrs, - int naddrs) -{ - char mname[NS_MAXDNAME]; - u_long save_pfcode; - rrset_ns nsrrs; - int n; - - DPRINTF(("START dname='%s' class=%s, zsize=%ld, naddrs=%d", - dname, p_class(class), (long)zsize, naddrs)); - save_pfcode = statp->pfcode; - statp->pfcode |= RES_PRF_HEAD2 | RES_PRF_HEAD1 | RES_PRF_HEADX | - RES_PRF_QUES | RES_PRF_ANS | - RES_PRF_AUTH | RES_PRF_ADD; - INIT_LIST(nsrrs); - - DPRINTF(("get the soa, and see if it has enough glue")); - if ((n = get_soa(statp, dname, class, opts, zname, zsize, - mname, sizeof mname, &nsrrs)) < 0 || - ((opts & RES_EXHAUSTIVE) == 0 && - (n = satisfy(statp, mname, &nsrrs, addrs, naddrs)) > 0)) - goto done; - - DPRINTF(("get the ns rrset and see if it has enough glue")); - if ((n = get_ns(statp, zname, class, opts, &nsrrs)) < 0 || - ((opts & RES_EXHAUSTIVE) == 0 && - (n = satisfy(statp, mname, &nsrrs, addrs, naddrs)) > 0)) - goto done; - - DPRINTF(("get the missing glue and see if it's finally enough")); - if ((n = get_glue(statp, class, opts, &nsrrs)) >= 0) - n = satisfy(statp, mname, &nsrrs, addrs, naddrs); - - done: - DPRINTF(("FINISH n=%d (%s)", n, (n < 0) ? strerror(errno) : "OK")); - free_nsrrset(&nsrrs); - statp->pfcode = save_pfcode; - return (n); -} - -/* Private. */ - -static int -satisfy(res_state statp, const char *mname, rrset_ns *nsrrsp, - union res_sockaddr_union *addrs, int naddrs) -{ - rr_ns *nsrr; - int n, x; - - n = 0; - nsrr = find_ns(nsrrsp, mname); - if (nsrr != NULL) { - x = add_addrs(statp, nsrr, addrs, naddrs); - addrs += x; - naddrs -= x; - n += x; - } - for (nsrr = HEAD(*nsrrsp); - nsrr != NULL && naddrs > 0; - nsrr = NEXT(nsrr, link)) - if (ns_samename(nsrr->name, mname) != 1) { - x = add_addrs(statp, nsrr, addrs, naddrs); - addrs += x; - naddrs -= x; - n += x; - } - DPRINTF(("satisfy(%s): %d", mname, n)); - return (n); -} - -static int -add_addrs(res_state statp, rr_ns *nsrr, - union res_sockaddr_union *addrs, int naddrs) -{ - rr_a *arr; - int n = 0; - - for (arr = HEAD(nsrr->addrs); arr != NULL; arr = NEXT(arr, link)) { - if (naddrs <= 0) - return (0); - *addrs++ = arr->addr; - naddrs--; - n++; - } - DPRINTF(("add_addrs: %d", n)); - return (n); -} - -static int -get_soa(res_state statp, const char *dname, ns_class class, int opts, - char *zname, size_t zsize, char *mname, size_t msize, - rrset_ns *nsrrsp) -{ - char tname[NS_MAXDNAME]; - u_char *resp = NULL; - int n, i, ancount, nscount; - ns_sect sect; - ns_msg msg; - u_int rcode; - - /* - * Find closest enclosing SOA, even if it's for the root zone. - */ - - /* First canonicalize dname (exactly one unescaped trailing "."). */ - if (ns_makecanon(dname, tname, sizeof tname) < 0) - goto cleanup; - dname = tname; - - resp = malloc(NS_MAXMSG); - if (resp == NULL) - goto cleanup; - - /* Now grovel the subdomains, hunting for an SOA answer or auth. */ - for (;;) { - /* Leading or inter-label '.' are skipped here. */ - while (*dname == '.') - dname++; - - /* Is there an SOA? */ - n = do_query(statp, dname, class, ns_t_soa, resp, &msg); - if (n < 0) { - DPRINTF(("get_soa: do_query('%s', %s) failed (%d)", - dname, p_class(class), n)); - goto cleanup; - } - if (n > 0) { - DPRINTF(("get_soa: CNAME or DNAME found")); - sect = ns_s_max, n = 0; - } else { - rcode = ns_msg_getflag(msg, ns_f_rcode); - ancount = ns_msg_count(msg, ns_s_an); - nscount = ns_msg_count(msg, ns_s_ns); - if (ancount > 0 && rcode == ns_r_noerror) - sect = ns_s_an, n = ancount; - else if (nscount > 0) - sect = ns_s_ns, n = nscount; - else - sect = ns_s_max, n = 0; - } - for (i = 0; i < n; i++) { - const char *t; - const u_char *rdata; - ns_rr rr; - - if (ns_parserr(&msg, sect, i, &rr) < 0) { - DPRINTF(("get_soa: ns_parserr(%s, %d) failed", - p_section(sect, ns_o_query), i)); - goto cleanup; - } - if (ns_rr_type(rr) == ns_t_cname || - ns_rr_type(rr) == ns_t_dname) - break; - if (ns_rr_type(rr) != ns_t_soa || - ns_rr_class(rr) != class) - continue; - t = ns_rr_name(rr); - switch (sect) { - case ns_s_an: - if (ns_samedomain(dname, t) == 0) { - DPRINTF( - ("get_soa: ns_samedomain('%s', '%s') == 0", - dname, t) - ); - errno = EPROTOTYPE; - goto cleanup; - } - break; - case ns_s_ns: - if (ns_samename(dname, t) == 1 || - ns_samedomain(dname, t) == 0) { - DPRINTF( - ("get_soa: ns_samename() || !ns_samedomain('%s', '%s')", - dname, t) - ); - errno = EPROTOTYPE; - goto cleanup; - } - break; - default: - abort(); - } - if (strlen(t) + 1 > zsize) { - DPRINTF(("get_soa: zname(%lu) too small (%lu)", - (unsigned long)zsize, - (unsigned long)strlen(t) + 1)); - errno = EMSGSIZE; - goto cleanup; - } - strcpy(zname, t); - rdata = ns_rr_rdata(rr); - if (ns_name_uncompress(resp, ns_msg_end(msg), rdata, - mname, msize) < 0) { - DPRINTF(("get_soa: ns_name_uncompress failed") - ); - goto cleanup; - } - if (save_ns(statp, &msg, ns_s_ns, - zname, class, opts, nsrrsp) < 0) { - DPRINTF(("get_soa: save_ns failed")); - goto cleanup; - } - free(resp); - return (0); - } - - /* If we're out of labels, then not even "." has an SOA! */ - if (*dname == '\0') - break; - - /* Find label-terminating "."; top of loop will skip it. */ - while (*dname != '.') { - if (*dname == '\\') - if (*++dname == '\0') { - errno = EMSGSIZE; - goto cleanup; - } - dname++; - } - } - DPRINTF(("get_soa: out of labels")); - errno = EDESTADDRREQ; - cleanup: - if (resp != NULL) - free(resp); - return (-1); -} - -static int -get_ns(res_state statp, const char *zname, ns_class class, int opts, - rrset_ns *nsrrsp) -{ - u_char *resp; - ns_msg msg; - int n; - - resp = malloc(NS_MAXMSG); - if (resp == NULL) - return (-1); - - /* Go and get the NS RRs for this zone. */ - n = do_query(statp, zname, class, ns_t_ns, resp, &msg); - if (n != 0) { - DPRINTF(("get_ns: do_query('%s', %s) failed (%d)", - zname, p_class(class), n)); - free(resp); - return (-1); - } - - /* Remember the NS RRs and associated A RRs that came back. */ - if (save_ns(statp, &msg, ns_s_an, zname, class, opts, nsrrsp) < 0) { - DPRINTF(("get_ns save_ns('%s', %s) failed", - zname, p_class(class))); - free(resp); - return (-1); - } - - free(resp); - return (0); -} - -static int -get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) { - rr_ns *nsrr, *nsrr_n; - u_char *resp; - - resp = malloc(NS_MAXMSG); - if (resp == NULL) - return(-1); - - /* Go and get the A RRs for each empty NS RR on our list. */ - for (nsrr = HEAD(*nsrrsp); nsrr != NULL; nsrr = nsrr_n) { - ns_msg msg; - int n; - - nsrr_n = NEXT(nsrr, link); - - if ((nsrr->flags & RR_NS_HAVE_V4) == 0) { - n = do_query(statp, nsrr->name, class, ns_t_a, - resp, &msg); - if (n < 0) { - DPRINTF( - ("get_glue: do_query('%s', %s') failed", - nsrr->name, p_class(class))); - goto cleanup; - } - if (n > 0) { - DPRINTF(( - "get_glue: do_query('%s', %s') CNAME or DNAME found", - nsrr->name, p_class(class))); - } - if (save_a(statp, &msg, ns_s_an, nsrr->name, class, - opts, nsrr) < 0) { - DPRINTF(("get_glue: save_r('%s', %s) failed", - nsrr->name, p_class(class))); - goto cleanup; - } - } - - if ((nsrr->flags & RR_NS_HAVE_V6) == 0) { - n = do_query(statp, nsrr->name, class, ns_t_aaaa, - resp, &msg); - if (n < 0) { - DPRINTF( - ("get_glue: do_query('%s', %s') failed", - nsrr->name, p_class(class))); - goto cleanup; - } - if (n > 0) { - DPRINTF(( - "get_glue: do_query('%s', %s') CNAME or DNAME found", - nsrr->name, p_class(class))); - } - if (save_a(statp, &msg, ns_s_an, nsrr->name, class, - opts, nsrr) < 0) { - DPRINTF(("get_glue: save_r('%s', %s) failed", - nsrr->name, p_class(class))); - goto cleanup; - } - } - - /* If it's still empty, it's just chaff. */ - if (EMPTY(nsrr->addrs)) { - DPRINTF(("get_glue: removing empty '%s' NS", - nsrr->name)); - free_nsrr(nsrrsp, nsrr); - } - } - free(resp); - return (0); - - cleanup: - free(resp); - return (-1); -} - -static int -save_ns(res_state statp, ns_msg *msg, ns_sect sect, - const char *owner, ns_class class, int opts, - rrset_ns *nsrrsp) -{ - int i; - - for (i = 0; i < ns_msg_count(*msg, sect); i++) { - char tname[MAXDNAME]; - const u_char *rdata; - rr_ns *nsrr; - ns_rr rr; - - if (ns_parserr(msg, sect, i, &rr) < 0) { - DPRINTF(("save_ns: ns_parserr(%s, %d) failed", - p_section(sect, ns_o_query), i)); - return (-1); - } - if (ns_rr_type(rr) != ns_t_ns || - ns_rr_class(rr) != class || - ns_samename(ns_rr_name(rr), owner) != 1) - continue; - nsrr = find_ns(nsrrsp, ns_rr_name(rr)); - if (nsrr == NULL) { - nsrr = malloc(sizeof *nsrr); - if (nsrr == NULL) { - DPRINTF(("save_ns: malloc failed")); - return (-1); - } - rdata = ns_rr_rdata(rr); - if (ns_name_uncompress(ns_msg_base(*msg), - ns_msg_end(*msg), rdata, - tname, sizeof tname) < 0) { - DPRINTF(("save_ns: ns_name_uncompress failed") - ); - free(nsrr); - return (-1); - } - nsrr->name = strdup(tname); - if (nsrr->name == NULL) { - DPRINTF(("save_ns: strdup failed")); - free(nsrr); - return (-1); - } - INIT_LINK(nsrr, link); - INIT_LIST(nsrr->addrs); - nsrr->flags = 0; - APPEND(*nsrrsp, nsrr, link); - } - if (save_a(statp, msg, ns_s_ar, - nsrr->name, class, opts, nsrr) < 0) { - DPRINTF(("save_ns: save_r('%s', %s) failed", - nsrr->name, p_class(class))); - return (-1); - } - } - return (0); -} - -static int -save_a(res_state statp, ns_msg *msg, ns_sect sect, - const char *owner, ns_class class, int opts, - rr_ns *nsrr) -{ - int i; - - for (i = 0; i < ns_msg_count(*msg, sect); i++) { - ns_rr rr; - rr_a *arr; - - if (ns_parserr(msg, sect, i, &rr) < 0) { - DPRINTF(("save_a: ns_parserr(%s, %d) failed", - p_section(sect, ns_o_query), i)); - return (-1); - } - if ((ns_rr_type(rr) != ns_t_a && - ns_rr_type(rr) != ns_t_aaaa) || - ns_rr_class(rr) != class || - ns_samename(ns_rr_name(rr), owner) != 1 || - ns_rr_rdlen(rr) != NS_INADDRSZ) - continue; - if ((opts & RES_IPV6ONLY) != 0 && ns_rr_type(rr) != ns_t_aaaa) - continue; - if ((opts & RES_IPV4ONLY) != 0 && ns_rr_type(rr) != ns_t_a) - continue; - arr = malloc(sizeof *arr); - if (arr == NULL) { - DPRINTF(("save_a: malloc failed")); - return (-1); - } - INIT_LINK(arr, link); - memset(&arr->addr, 0, sizeof(arr->addr)); - switch (ns_rr_type(rr)) { - case ns_t_a: - arr->addr.sin.sin_family = AF_INET; -#ifdef HAVE_SA_LEN - arr->addr.sin.sin_len = sizeof(arr->addr.sin); -#endif - memcpy(&arr->addr.sin.sin_addr, ns_rr_rdata(rr), - NS_INADDRSZ); - arr->addr.sin.sin_port = htons(NAMESERVER_PORT); - nsrr->flags |= RR_NS_HAVE_V4; - break; - case ns_t_aaaa: - arr->addr.sin6.sin6_family = AF_INET6; -#ifdef HAVE_SA_LEN - arr->addr.sin6.sin6_len = sizeof(arr->addr.sin6); -#endif - memcpy(&arr->addr.sin6.sin6_addr, ns_rr_rdata(rr), 16); - arr->addr.sin.sin_port = htons(NAMESERVER_PORT); - nsrr->flags |= RR_NS_HAVE_V6; - break; - default: - abort(); - } - APPEND(nsrr->addrs, arr, link); - } - return (0); -} - -static void -free_nsrrset(rrset_ns *nsrrsp) { - rr_ns *nsrr; - - while ((nsrr = HEAD(*nsrrsp)) != NULL) - free_nsrr(nsrrsp, nsrr); -} - -static void -free_nsrr(rrset_ns *nsrrsp, rr_ns *nsrr) { - rr_a *arr; - char *tmp; - - while ((arr = HEAD(nsrr->addrs)) != NULL) { - UNLINK(nsrr->addrs, arr, link); - free(arr); - } - DE_CONST(nsrr->name, tmp); - free(tmp); - UNLINK(*nsrrsp, nsrr, link); - free(nsrr); -} - -static rr_ns * -find_ns(rrset_ns *nsrrsp, const char *dname) { - rr_ns *nsrr; - - for (nsrr = HEAD(*nsrrsp); nsrr != NULL; nsrr = NEXT(nsrr, link)) - if (ns_samename(nsrr->name, dname) == 1) - return (nsrr); - return (NULL); -} - -static int -do_query(res_state statp, const char *dname, ns_class class, ns_type qtype, - u_char *resp, ns_msg *msg) -{ - u_char req[NS_PACKETSZ]; - int i, n; - - n = res_nmkquery(statp, ns_o_query, dname, class, qtype, - NULL, 0, NULL, req, NS_PACKETSZ); - if (n < 0) { - DPRINTF(("do_query: res_nmkquery failed")); - return (-1); - } - n = res_nsend(statp, req, n, resp, NS_MAXMSG); - if (n < 0) { - DPRINTF(("do_query: res_nsend failed")); - return (-1); - } - if (n == 0) { - DPRINTF(("do_query: res_nsend returned 0")); - errno = EMSGSIZE; - return (-1); - } - if (ns_initparse(resp, n, msg) < 0) { - DPRINTF(("do_query: ns_initparse failed")); - return (-1); - } - n = 0; - for (i = 0; i < ns_msg_count(*msg, ns_s_an); i++) { - ns_rr rr; - - if (ns_parserr(msg, ns_s_an, i, &rr) < 0) { - DPRINTF(("do_query: ns_parserr failed")); - return (-1); - } - n += (ns_rr_class(rr) == class && - (ns_rr_type(rr) == ns_t_cname || - ns_rr_type(rr) == ns_t_dname)); - } - return (n); -} - -static void -res_dprintf(const char *fmt, ...) { - va_list ap; - - va_start(ap, fmt); - fputs(";; res_findzonecut: ", stderr); - vfprintf(stderr, fmt, ap); - fputc('\n', stderr); - va_end(ap); -} diff --git a/lib/libc/resolv/res_init.c b/lib/libc/resolv/res_init.c deleted file mode 100644 index 28a3ebd088e9..000000000000 --- a/lib/libc/resolv/res_init.c +++ /dev/null @@ -1,799 +0,0 @@ -/* - * Copyright (c) 1985, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Copyright (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 sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93"; -static const char rcsid[] = "$Id: res_init.c,v 1.9.2.5.4.5 2005/11/03 00:00:52 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/time.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <netdb.h> - -#include "port_after.h" - -/* ensure that sockaddr_in6 and IN6ADDR_ANY_INIT are declared / defined */ -#include <resolv.h> - -#include "res_private.h" - -/* Options. Should all be left alone. */ -#define RESOLVSORT -#define DEBUG - -#ifdef SOLARIS2 -#include <sys/systeminfo.h> -#endif - -static void res_setoptions __P((res_state, const char *, const char *)); - -#ifdef RESOLVSORT -static const char sort_mask[] = "/&"; -#define ISSORTMASK(ch) (strchr(sort_mask, ch) != NULL) -static u_int32_t net_mask __P((struct in_addr)); -#endif - -#if !defined(isascii) /* XXX - could be a function */ -# define isascii(c) (!(c & 0200)) -#endif - -/* - * Resolver state default settings. - */ - -/* - * Set up default settings. If the configuration file exist, the values - * there will have precedence. Otherwise, the server address is set to - * INADDR_ANY and the default domain name comes from the gethostname(). - * - * An interrim version of this code (BIND 4.9, pre-4.4BSD) used 127.0.0.1 - * rather than INADDR_ANY ("0.0.0.0") as the default name server address - * since it was noted that INADDR_ANY actually meant ``the first interface - * you "ifconfig"'d at boot time'' and if this was a SLIP or PPP interface, - * it had to be "up" in order for you to reach your own name server. It - * was later decided that since the recommended practice is to always - * install local static routes through 127.0.0.1 for all your network - * interfaces, that we could solve this problem without a code change. - * - * The configuration file should always be used, since it is the only way - * to specify a default domain. If you are running a server on your local - * machine, you should say "nameserver 0.0.0.0" or "nameserver 127.0.0.1" - * in the configuration file. - * - * Return 0 if completes successfully, -1 on error - */ -int -res_ninit(res_state statp) { - extern int __res_vinit(res_state, int); - - return (__res_vinit(statp, 0)); -} - -/* This function has to be reachable by res_data.c but not publically. */ -int -__res_vinit(res_state statp, int preinit) { - register FILE *fp; - register char *cp, **pp; - register int n; - char buf[BUFSIZ]; - int nserv = 0; /* number of nameserver records read from file */ - int haveenv = 0; - int havesearch = 0; -#ifdef RESOLVSORT - int nsort = 0; - char *net; -#endif - int dots; - union res_sockaddr_union u[2]; - - if (statp->_u._ext.ext != NULL) - res_ndestroy(statp); - - if (!preinit) { - statp->retrans = RES_TIMEOUT; - statp->retry = RES_DFLRETRY; - statp->options = RES_DEFAULT; - statp->id = res_randomid(); - } - - memset(u, 0, sizeof(u)); -#ifdef USELOOPBACK - u[nserv].sin.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1); -#else - u[nserv].sin.sin_addr.s_addr = INADDR_ANY; -#endif - u[nserv].sin.sin_family = AF_INET; - u[nserv].sin.sin_port = htons(NAMESERVER_PORT); -#ifdef HAVE_SA_LEN - u[nserv].sin.sin_len = sizeof(struct sockaddr_in); -#endif - nserv++; -#ifdef HAS_INET6_STRUCTS -#ifdef USELOOPBACK - u[nserv].sin6.sin6_addr = in6addr_loopback; -#else - u[nserv].sin6.sin6_addr = in6addr_any; -#endif - u[nserv].sin6.sin6_family = AF_INET6; - u[nserv].sin6.sin6_port = htons(NAMESERVER_PORT); -#ifdef HAVE_SA_LEN - u[nserv].sin6.sin6_len = sizeof(struct sockaddr_in6); -#endif - nserv++; -#endif - statp->nscount = 0; - statp->ndots = 1; - statp->pfcode = 0; - statp->_vcsock = -1; - statp->_flags = 0; - statp->qhook = NULL; - statp->rhook = NULL; - statp->_u._ext.nscount = 0; - statp->_u._ext.ext = malloc(sizeof(*statp->_u._ext.ext)); - if (statp->_u._ext.ext != NULL) { - memset(statp->_u._ext.ext, 0, sizeof(*statp->_u._ext.ext)); - statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr; - strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa"); - strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int"); - } else - return (-1); -#ifdef RESOLVSORT - statp->nsort = 0; -#endif - res_setservers(statp, u, nserv); - -#ifdef SOLARIS2 - /* - * The old libresolv derived the defaultdomain from NIS/NIS+. - * We want to keep this behaviour - */ - { - char buf[sizeof(statp->defdname)], *cp; - int ret; - - if ((ret = sysinfo(SI_SRPC_DOMAIN, buf, sizeof(buf))) > 0 && - (unsigned int)ret <= sizeof(buf)) { - if (buf[0] == '+') - buf[0] = '.'; - cp = strchr(buf, '.'); - if (cp == NULL) { - if (strlcpy(statp->defdname, buf, - sizeof(statp->defdname)) - >= sizeof(statp->defdname)) - goto freedata; - } else { - if (strlcpy(statp->defdname, cp+1, - sizeof(statp->defdname)) - >= sizeof(statp->defdname)) - goto freedata; - } - } - } -#endif /* SOLARIS2 */ - - /* Allow user to override the local domain definition */ - if ((cp = getenv("LOCALDOMAIN")) != NULL) { - (void)strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); - statp->defdname[sizeof(statp->defdname) - 1] = '\0'; - haveenv++; - - /* - * Set search list to be blank-separated strings - * from rest of env value. Permits users of LOCALDOMAIN - * to still have a search list, and anyone to set the - * one that they want to use as an individual (even more - * important now that the rfc1535 stuff restricts searches) - */ - cp = statp->defdname; - pp = statp->dnsrch; - *pp++ = cp; - for (n = 0; *cp && pp < statp->dnsrch + MAXDNSRCH; cp++) { - if (*cp == '\n') /* silly backwards compat */ - break; - else if (*cp == ' ' || *cp == '\t') { - *cp = 0; - n = 1; - } else if (n) { - *pp++ = cp; - n = 0; - havesearch = 1; - } - } - /* null terminate last domain if there are excess */ - while (*cp != '\0' && *cp != ' ' && *cp != '\t' && *cp != '\n') - cp++; - *cp = '\0'; - *pp++ = 0; - } - -#define MATCH(line, name) \ - (!strncmp(line, name, sizeof(name) - 1) && \ - (line[sizeof(name) - 1] == ' ' || \ - line[sizeof(name) - 1] == '\t')) - - nserv = 0; - if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) { - /* read the config file */ - while (fgets(buf, sizeof(buf), fp) != NULL) { - /* skip comments */ - if (*buf == ';' || *buf == '#') - continue; - /* read default domain name */ - if (MATCH(buf, "domain")) { - if (haveenv) /* skip if have from environ */ - continue; - cp = buf + sizeof("domain") - 1; - while (*cp == ' ' || *cp == '\t') - cp++; - if ((*cp == '\0') || (*cp == '\n')) - continue; - strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); - statp->defdname[sizeof(statp->defdname) - 1] = '\0'; - if ((cp = strpbrk(statp->defdname, " \t\n")) != NULL) - *cp = '\0'; - havesearch = 0; - continue; - } - /* set search list */ - if (MATCH(buf, "search")) { - if (haveenv) /* skip if have from environ */ - continue; - cp = buf + sizeof("search") - 1; - while (*cp == ' ' || *cp == '\t') - cp++; - if ((*cp == '\0') || (*cp == '\n')) - continue; - strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1); - statp->defdname[sizeof(statp->defdname) - 1] = '\0'; - if ((cp = strchr(statp->defdname, '\n')) != NULL) - *cp = '\0'; - /* - * Set search list to be blank-separated strings - * on rest of line. - */ - cp = statp->defdname; - pp = statp->dnsrch; - *pp++ = cp; - for (n = 0; *cp && pp < statp->dnsrch + MAXDNSRCH; cp++) { - if (*cp == ' ' || *cp == '\t') { - *cp = 0; - n = 1; - } else if (n) { - *pp++ = cp; - n = 0; - } - } - /* null terminate last domain if there are excess */ - while (*cp != '\0' && *cp != ' ' && *cp != '\t') - cp++; - *cp = '\0'; - *pp++ = 0; - havesearch = 1; - continue; - } - /* read nameservers to query */ - if (MATCH(buf, "nameserver") && nserv < MAXNS) { - struct addrinfo hints, *ai; - char sbuf[NI_MAXSERV]; - const size_t minsiz = - sizeof(statp->_u._ext.ext->nsaddrs[0]); - - cp = buf + sizeof("nameserver") - 1; - while (*cp == ' ' || *cp == '\t') - cp++; - cp[strcspn(cp, ";# \t\n")] = '\0'; - if ((*cp != '\0') && (*cp != '\n')) { - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; /*dummy*/ - hints.ai_flags = AI_NUMERICHOST; - sprintf(sbuf, "%u", NAMESERVER_PORT); - if (getaddrinfo(cp, sbuf, &hints, &ai) == 0 && - ai->ai_addrlen <= minsiz) { - if (statp->_u._ext.ext != NULL) { - memcpy(&statp->_u._ext.ext->nsaddrs[nserv], - ai->ai_addr, ai->ai_addrlen); - } - if (ai->ai_addrlen <= - sizeof(statp->nsaddr_list[nserv])) { - memcpy(&statp->nsaddr_list[nserv], - ai->ai_addr, ai->ai_addrlen); - } else - statp->nsaddr_list[nserv].sin_family = 0; - freeaddrinfo(ai); - nserv++; - } - } - continue; - } -#ifdef RESOLVSORT - if (MATCH(buf, "sortlist")) { - struct in_addr a; - - cp = buf + sizeof("sortlist") - 1; - while (nsort < MAXRESOLVSORT) { - while (*cp == ' ' || *cp == '\t') - cp++; - if (*cp == '\0' || *cp == '\n' || *cp == ';') - break; - net = cp; - while (*cp && !ISSORTMASK(*cp) && *cp != ';' && - isascii(*cp) && !isspace((unsigned char)*cp)) - cp++; - n = *cp; - *cp = 0; - if (inet_aton(net, &a)) { - statp->sort_list[nsort].addr = a; - if (ISSORTMASK(n)) { - *cp++ = n; - net = cp; - while (*cp && *cp != ';' && - isascii(*cp) && - !isspace((unsigned char)*cp)) - cp++; - n = *cp; - *cp = 0; - if (inet_aton(net, &a)) { - statp->sort_list[nsort].mask = a.s_addr; - } else { - statp->sort_list[nsort].mask = - net_mask(statp->sort_list[nsort].addr); - } - } else { - statp->sort_list[nsort].mask = - net_mask(statp->sort_list[nsort].addr); - } - nsort++; - } - *cp = n; - } - continue; - } -#endif - if (MATCH(buf, "options")) { - res_setoptions(statp, buf + sizeof("options") - 1, "conf"); - continue; - } - } - if (nserv > 0) - statp->nscount = nserv; -#ifdef RESOLVSORT - statp->nsort = nsort; -#endif - (void) fclose(fp); - } -/* - * Last chance to get a nameserver. This should not normally - * be necessary - */ -#ifdef NO_RESOLV_CONF - if(nserv == 0) - nserv = get_nameservers(statp); -#endif - - if (statp->defdname[0] == 0 && - gethostname(buf, sizeof(statp->defdname) - 1) == 0 && - (cp = strchr(buf, '.')) != NULL) - strcpy(statp->defdname, cp + 1); - - /* find components of local domain that might be searched */ - if (havesearch == 0) { - pp = statp->dnsrch; - *pp++ = statp->defdname; - *pp = NULL; - - dots = 0; - for (cp = statp->defdname; *cp; cp++) - dots += (*cp == '.'); - - cp = statp->defdname; - while (pp < statp->dnsrch + MAXDFLSRCH) { - if (dots < LOCALDOMAINPARTS) - break; - cp = strchr(cp, '.') + 1; /* we know there is one */ - *pp++ = cp; - dots--; - } - *pp = NULL; -#ifdef DEBUG - if (statp->options & RES_DEBUG) { - printf(";; res_init()... default dnsrch list:\n"); - for (pp = statp->dnsrch; *pp; pp++) - printf(";;\t%s\n", *pp); - printf(";;\t..END..\n"); - } -#endif - } - - if ((cp = getenv("RES_OPTIONS")) != NULL) - res_setoptions(statp, cp, "env"); - statp->options |= RES_INIT; - return (0); - -#ifdef SOLARIS2 - freedata: - if (statp->_u._ext.ext != NULL) { - free(statp->_u._ext.ext); - statp->_u._ext.ext = NULL; - } - return (-1); -#endif -} - -static void -res_setoptions(res_state statp, const char *options, const char *source) -{ - const char *cp = options; - int i; - struct __res_state_ext *ext = statp->_u._ext.ext; - -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";; res_setoptions(\"%s\", \"%s\")...\n", - options, source); -#endif - while (*cp) { - /* skip leading and inner runs of spaces */ - while (*cp == ' ' || *cp == '\t') - cp++; - /* search for and process individual options */ - if (!strncmp(cp, "ndots:", sizeof("ndots:") - 1)) { - i = atoi(cp + sizeof("ndots:") - 1); - if (i <= RES_MAXNDOTS) - statp->ndots = i; - else - statp->ndots = RES_MAXNDOTS; -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";;\tndots=%d\n", statp->ndots); -#endif - } else if (!strncmp(cp, "timeout:", sizeof("timeout:") - 1)) { - i = atoi(cp + sizeof("timeout:") - 1); - if (i <= RES_MAXRETRANS) - statp->retrans = i; - else - statp->retrans = RES_MAXRETRANS; -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";;\ttimeout=%d\n", statp->retrans); -#endif -#ifdef SOLARIS2 - } else if (!strncmp(cp, "retrans:", sizeof("retrans:") - 1)) { - /* - * For backward compatibility, 'retrans' is - * supported as an alias for 'timeout', though - * without an imposed maximum. - */ - statp->retrans = atoi(cp + sizeof("retrans:") - 1); - } else if (!strncmp(cp, "retry:", sizeof("retry:") - 1)){ - /* - * For backward compatibility, 'retry' is - * supported as an alias for 'attempts', though - * without an imposed maximum. - */ - statp->retry = atoi(cp + sizeof("retry:") - 1); -#endif /* SOLARIS2 */ - } else if (!strncmp(cp, "attempts:", sizeof("attempts:") - 1)){ - i = atoi(cp + sizeof("attempts:") - 1); - if (i <= RES_MAXRETRY) - statp->retry = i; - else - statp->retry = RES_MAXRETRY; -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";;\tattempts=%d\n", statp->retry); -#endif - } else if (!strncmp(cp, "debug", sizeof("debug") - 1)) { -#ifdef DEBUG - if (!(statp->options & RES_DEBUG)) { - printf(";; res_setoptions(\"%s\", \"%s\")..\n", - options, source); - statp->options |= RES_DEBUG; - } - printf(";;\tdebug\n"); -#endif - } else if (!strncmp(cp, "no_tld_query", - sizeof("no_tld_query") - 1) || - !strncmp(cp, "no-tld-query", - sizeof("no-tld-query") - 1)) { - statp->options |= RES_NOTLDQUERY; - } else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) { - statp->options |= RES_USE_INET6; - } else if (!strncmp(cp, "rotate", sizeof("rotate") - 1)) { - statp->options |= RES_ROTATE; - } else if (!strncmp(cp, "no-check-names", - sizeof("no-check-names") - 1)) { - statp->options |= RES_NOCHECKNAME; - } -#ifdef RES_USE_EDNS0 - else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) { - statp->options |= RES_USE_EDNS0; - } -#endif - else if (!strncmp(cp, "dname", sizeof("dname") - 1)) { - statp->options |= RES_USE_DNAME; - } - else if (!strncmp(cp, "nibble:", sizeof("nibble:") - 1)) { - if (ext == NULL) - goto skip; - cp += sizeof("nibble:") - 1; - i = MIN(strcspn(cp, " \t"), sizeof(ext->nsuffix) - 1); - strncpy(ext->nsuffix, cp, i); - ext->nsuffix[i] = '\0'; - } - else if (!strncmp(cp, "nibble2:", sizeof("nibble2:") - 1)) { - if (ext == NULL) - goto skip; - cp += sizeof("nibble2:") - 1; - i = MIN(strcspn(cp, " \t"), sizeof(ext->nsuffix2) - 1); - strncpy(ext->nsuffix2, cp, i); - ext->nsuffix2[i] = '\0'; - } - else if (!strncmp(cp, "v6revmode:", sizeof("v6revmode:") - 1)) { - cp += sizeof("v6revmode:") - 1; - /* "nibble" and "bitstring" used to be valid */ - if (!strncmp(cp, "single", sizeof("single") - 1)) { - statp->options |= RES_NO_NIBBLE2; - } else if (!strncmp(cp, "both", sizeof("both") - 1)) { - statp->options &= - ~RES_NO_NIBBLE2; - } - } - else { - /* XXX - print a warning here? */ - } - skip: - /* skip to next run of spaces */ - while (*cp && *cp != ' ' && *cp != '\t') - cp++; - } -} - -#ifdef RESOLVSORT -/* XXX - should really support CIDR which means explicit masks always. */ -static u_int32_t -net_mask(in) /* XXX - should really use system's version of this */ - struct in_addr in; -{ - register u_int32_t i = ntohl(in.s_addr); - - if (IN_CLASSA(i)) - return (htonl(IN_CLASSA_NET)); - else if (IN_CLASSB(i)) - return (htonl(IN_CLASSB_NET)); - return (htonl(IN_CLASSC_NET)); -} -#endif - -u_int -res_randomid(void) { - struct timeval now; - - gettimeofday(&now, NULL); - return (0xffff & (now.tv_sec ^ now.tv_usec ^ getpid())); -} - -/* - * This routine is for closing the socket if a virtual circuit is used and - * the program wants to close it. This provides support for endhostent() - * which expects to close the socket. - * - * This routine is not expected to be user visible. - */ -void -res_nclose(res_state statp) { - int ns; - - if (statp->_vcsock >= 0) { - (void) close(statp->_vcsock); - statp->_vcsock = -1; - statp->_flags &= ~(RES_F_VC | RES_F_CONN); - } - for (ns = 0; ns < statp->_u._ext.nscount; ns++) { - if (statp->_u._ext.nssocks[ns] != -1) { - (void) close(statp->_u._ext.nssocks[ns]); - statp->_u._ext.nssocks[ns] = -1; - } - } -} - -void -res_ndestroy(res_state statp) { - res_nclose(statp); - if (statp->_u._ext.ext != NULL) - free(statp->_u._ext.ext); - statp->options &= ~RES_INIT; - statp->_u._ext.ext = NULL; -} - -const char * -res_get_nibblesuffix(res_state statp) { - if (statp->_u._ext.ext) - return (statp->_u._ext.ext->nsuffix); - return ("ip6.arpa"); -} - -const char * -res_get_nibblesuffix2(res_state statp) { - if (statp->_u._ext.ext) - return (statp->_u._ext.ext->nsuffix2); - return ("ip6.int"); -} - -void -res_setservers(res_state statp, const union res_sockaddr_union *set, int cnt) { - int i, nserv; - size_t size; - - /* close open servers */ - res_nclose(statp); - - /* cause rtt times to be forgotten */ - statp->_u._ext.nscount = 0; - - nserv = 0; - for (i = 0; i < cnt && nserv < MAXNS; i++) { - switch (set->sin.sin_family) { - case AF_INET: - size = sizeof(set->sin); - if (statp->_u._ext.ext) - memcpy(&statp->_u._ext.ext->nsaddrs[nserv], - &set->sin, size); - if (size <= sizeof(statp->nsaddr_list[nserv])) - memcpy(&statp->nsaddr_list[nserv], - &set->sin, size); - else - statp->nsaddr_list[nserv].sin_family = 0; - nserv++; - break; - -#ifdef HAS_INET6_STRUCTS - case AF_INET6: - size = sizeof(set->sin6); - if (statp->_u._ext.ext) - memcpy(&statp->_u._ext.ext->nsaddrs[nserv], - &set->sin6, size); - if (size <= sizeof(statp->nsaddr_list[nserv])) - memcpy(&statp->nsaddr_list[nserv], - &set->sin6, size); - else - statp->nsaddr_list[nserv].sin_family = 0; - nserv++; - break; -#endif - - default: - break; - } - set++; - } - statp->nscount = nserv; - -} - -int -res_getservers(res_state statp, union res_sockaddr_union *set, int cnt) { - int i; - size_t size; - u_int16_t family; - - for (i = 0; i < statp->nscount && i < cnt; i++) { - if (statp->_u._ext.ext) - family = statp->_u._ext.ext->nsaddrs[i].sin.sin_family; - else - family = statp->nsaddr_list[i].sin_family; - - switch (family) { - case AF_INET: - size = sizeof(set->sin); - if (statp->_u._ext.ext) - memcpy(&set->sin, - &statp->_u._ext.ext->nsaddrs[i], - size); - else - memcpy(&set->sin, &statp->nsaddr_list[i], - size); - break; - -#ifdef HAS_INET6_STRUCTS - case AF_INET6: - size = sizeof(set->sin6); - if (statp->_u._ext.ext) - memcpy(&set->sin6, - &statp->_u._ext.ext->nsaddrs[i], - size); - else - memcpy(&set->sin6, &statp->nsaddr_list[i], - size); - break; -#endif - - default: - set->sin.sin_family = 0; - break; - } - set++; - } - return (statp->nscount); -} diff --git a/lib/libc/resolv/res_mkquery.c b/lib/libc/resolv/res_mkquery.c deleted file mode 100644 index 89000edf6ad4..000000000000 --- a/lib/libc/resolv/res_mkquery.c +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Copyright (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 sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: res_mkquery.c,v 1.1.2.2.4.2 2004/03/16 12:34:18 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" -#include <sys/types.h> -#include <sys/param.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <netdb.h> -#include <resolv.h> -#include <stdio.h> -#include <string.h> -#include "port_after.h" - -/* Options. Leave them on. */ -#define DEBUG - -extern const char *_res_opcodes[]; - -/* - * Form all types of queries. - * Returns the size of the result or -1. - */ -int -res_nmkquery(res_state statp, - int op, /* opcode of query */ - const char *dname, /* domain name */ - int class, int type, /* class and type of query */ - const u_char *data, /* resource record data */ - int datalen, /* length of data */ - const u_char *newrr_in, /* new rr for modify or append */ - u_char *buf, /* buffer to put query */ - int buflen) /* size of buffer */ -{ - register HEADER *hp; - register u_char *cp, *ep; - register int n; - u_char *dnptrs[20], **dpp, **lastdnptr; - - UNUSED(newrr_in); - -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";; res_nmkquery(%s, %s, %s, %s)\n", - _res_opcodes[op], dname, p_class(class), p_type(type)); -#endif - /* - * Initialize header fields. - */ - if ((buf == NULL) || (buflen < HFIXEDSZ)) - return (-1); - memset(buf, 0, HFIXEDSZ); - hp = (HEADER *) buf; - hp->id = htons(++statp->id); - hp->opcode = op; - hp->rd = (statp->options & RES_RECURSE) != 0U; - hp->rcode = NOERROR; - cp = buf + HFIXEDSZ; - ep = buf + buflen; - dpp = dnptrs; - *dpp++ = buf; - *dpp++ = NULL; - lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0]; - /* - * perform opcode specific processing - */ - switch (op) { - case QUERY: /*FALLTHROUGH*/ - case NS_NOTIFY_OP: - if (ep - cp < QFIXEDSZ) - return (-1); - if ((n = dn_comp(dname, cp, ep - cp - QFIXEDSZ, dnptrs, - lastdnptr)) < 0) - return (-1); - cp += n; - ns_put16(type, cp); - cp += INT16SZ; - ns_put16(class, cp); - cp += INT16SZ; - hp->qdcount = htons(1); - if (op == QUERY || data == NULL) - break; - /* - * Make an additional record for completion domain. - */ - if ((ep - cp) < RRFIXEDSZ) - return (-1); - n = dn_comp((const char *)data, cp, ep - cp - RRFIXEDSZ, - dnptrs, lastdnptr); - if (n < 0) - return (-1); - cp += n; - ns_put16(T_NULL, cp); - cp += INT16SZ; - ns_put16(class, cp); - cp += INT16SZ; - ns_put32(0, cp); - cp += INT32SZ; - ns_put16(0, cp); - cp += INT16SZ; - hp->arcount = htons(1); - break; - - case IQUERY: - /* - * Initialize answer section - */ - if (ep - cp < 1 + RRFIXEDSZ + datalen) - return (-1); - *cp++ = '\0'; /* no domain name */ - ns_put16(type, cp); - cp += INT16SZ; - ns_put16(class, cp); - cp += INT16SZ; - ns_put32(0, cp); - cp += INT32SZ; - ns_put16(datalen, cp); - cp += INT16SZ; - if (datalen) { - memcpy(cp, data, datalen); - cp += datalen; - } - hp->ancount = htons(1); - break; - - default: - return (-1); - } - return (cp - buf); -} - -#ifdef RES_USE_EDNS0 -/* attach OPT pseudo-RR, as documented in RFC2671 (EDNS0). */ -#ifndef T_OPT -#define T_OPT 41 -#endif - -int -res_nopt(res_state statp, - int n0, /* current offset in buffer */ - u_char *buf, /* buffer to put query */ - int buflen, /* size of buffer */ - int anslen) /* UDP answer buffer size */ -{ - register HEADER *hp; - register u_char *cp, *ep; - u_int16_t flags = 0; - -#ifdef DEBUG - if ((statp->options & RES_DEBUG) != 0U) - printf(";; res_nopt()\n"); -#endif - - hp = (HEADER *) buf; - cp = buf + n0; - ep = buf + buflen; - - if ((ep - cp) < 1 + RRFIXEDSZ) - return (-1); - - *cp++ = 0; /* "." */ - - ns_put16(T_OPT, cp); /* TYPE */ - cp += INT16SZ; - ns_put16(anslen & 0xffff, cp); /* CLASS = UDP payload size */ - cp += INT16SZ; - *cp++ = NOERROR; /* extended RCODE */ - *cp++ = 0; /* EDNS version */ - if (statp->options & RES_USE_DNSSEC) { -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";; res_opt()... ENDS0 DNSSEC\n"); -#endif - flags |= NS_OPT_DNSSEC_OK; - } - ns_put16(flags, cp); - cp += INT16SZ; - ns_put16(0, cp); /* RDLEN */ - cp += INT16SZ; - hp->arcount = htons(ntohs(hp->arcount) + 1); - - return (cp - buf); -} -#endif diff --git a/lib/libc/resolv/res_mkupdate.c b/lib/libc/resolv/res_mkupdate.c deleted file mode 100644 index 01078f1a51a6..000000000000 --- a/lib/libc/resolv/res_mkupdate.c +++ /dev/null @@ -1,1158 +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. - */ - -/* - * Based on the Dynamic DNS reference implementation by Viraj Bais - * <viraj_bais@ccm.fm.intel.com> - */ - -#if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: res_mkupdate.c,v 1.1.2.1.4.5 2005/10/14 05:43:47 marka Exp $"; -#endif /* not lint */ - -#include "port_before.h" - -#include <sys/types.h> -#include <sys/param.h> - -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> - -#include <errno.h> -#include <limits.h> -#include <netdb.h> -#include <resolv.h> -#include <res_update.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <ctype.h> - -#include "port_after.h" - -/* Options. Leave them on. */ -#define DEBUG -#define MAXPORT 1024 - -static int getnum_str(u_char **, u_char *); -static int gethexnum_str(u_char **, u_char *); -static int getword_str(char *, int, u_char **, u_char *); -static int getstr_str(char *, int, u_char **, u_char *); - -#define ShrinkBuffer(x) if ((buflen -= x) < 0) return (-2); - -/* Forward. */ - -int res_protocolnumber(const char *); -int res_servicenumber(const char *); - -/* - * Form update packets. - * Returns the size of the resulting packet if no error - * On error, - * returns -1 if error in reading a word/number in rdata - * portion for update packets - * -2 if length of buffer passed is insufficient - * -3 if zone section is not the first section in - * the linked list, or section order has a problem - * -4 on a number overflow - * -5 unknown operation or no records - */ -int -res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) { - ns_updrec *rrecp_start = rrecp_in; - HEADER *hp; - u_char *cp, *sp2, *startp, *endp; - int n, i, soanum, multiline; - ns_updrec *rrecp; - struct in_addr ina; - struct in6_addr in6a; - char buf2[MAXDNAME]; - u_char buf3[MAXDNAME]; - int section, numrrs = 0, counts[ns_s_max]; - u_int16_t rtype, rclass; - u_int32_t n1, rttl; - u_char *dnptrs[20], **dpp, **lastdnptr; - int siglen, keylen, certlen; - - /* - * Initialize header fields. - */ - if ((buf == NULL) || (buflen < HFIXEDSZ)) - return (-1); - memset(buf, 0, HFIXEDSZ); - hp = (HEADER *) buf; - hp->id = htons(++statp->id); - hp->opcode = ns_o_update; - hp->rcode = NOERROR; - cp = buf + HFIXEDSZ; - buflen -= HFIXEDSZ; - dpp = dnptrs; - *dpp++ = buf; - *dpp++ = NULL; - lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0]; - - if (rrecp_start == NULL) - return (-5); - else if (rrecp_start->r_section != S_ZONE) - return (-3); - - memset(counts, 0, sizeof counts); - for (rrecp = rrecp_start; rrecp; rrecp = NEXT(rrecp, r_glink)) { - numrrs++; - section = rrecp->r_section; - if (section < 0 || section >= ns_s_max) - return (-1); - counts[section]++; - for (i = section + 1; i < ns_s_max; i++) - if (counts[i]) - return (-3); - rtype = rrecp->r_type; - rclass = rrecp->r_class; - rttl = rrecp->r_ttl; - /* overload class and type */ - if (section == S_PREREQ) { - rttl = 0; - switch (rrecp->r_opcode) { - case YXDOMAIN: - rclass = C_ANY; - rtype = T_ANY; - rrecp->r_size = 0; - break; - case NXDOMAIN: - rclass = C_NONE; - rtype = T_ANY; - rrecp->r_size = 0; - break; - case NXRRSET: - rclass = C_NONE; - rrecp->r_size = 0; - break; - case YXRRSET: - if (rrecp->r_size == 0) - rclass = C_ANY; - break; - default: - fprintf(stderr, - "res_mkupdate: incorrect opcode: %d\n", - rrecp->r_opcode); - fflush(stderr); - return (-1); - } - } else if (section == S_UPDATE) { - switch (rrecp->r_opcode) { - case DELETE: - rclass = rrecp->r_size == 0 ? C_ANY : C_NONE; - break; - case ADD: - break; - default: - fprintf(stderr, - "res_mkupdate: incorrect opcode: %d\n", - rrecp->r_opcode); - fflush(stderr); - return (-1); - } - } - - /* - * XXX appending default domain to owner name is omitted, - * fqdn must be provided - */ - if ((n = dn_comp(rrecp->r_dname, cp, buflen, dnptrs, - lastdnptr)) < 0) - return (-1); - cp += n; - ShrinkBuffer(n + 2*INT16SZ); - PUTSHORT(rtype, cp); - PUTSHORT(rclass, cp); - if (section == S_ZONE) { - if (numrrs != 1 || rrecp->r_type != T_SOA) - return (-3); - continue; - } - ShrinkBuffer(INT32SZ + INT16SZ); - PUTLONG(rttl, cp); - sp2 = cp; /* save pointer to length byte */ - cp += INT16SZ; - if (rrecp->r_size == 0) { - if (section == S_UPDATE && rclass != C_ANY) - return (-1); - else { - PUTSHORT(0, sp2); - continue; - } - } - startp = rrecp->r_data; - endp = startp + rrecp->r_size - 1; - /* XXX this should be done centrally. */ - switch (rrecp->r_type) { - case T_A: - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - if (!inet_aton(buf2, &ina)) - return (-1); - n1 = ntohl(ina.s_addr); - ShrinkBuffer(INT32SZ); - PUTLONG(n1, cp); - break; - case T_CNAME: - case T_MB: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - case ns_t_dname: - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - n = dn_comp(buf2, cp, buflen, dnptrs, lastdnptr); - if (n < 0) - return (-1); - cp += n; - ShrinkBuffer(n); - break; - case T_MINFO: - case T_SOA: - case T_RP: - for (i = 0; i < 2; i++) { - if (!getword_str(buf2, sizeof buf2, &startp, - endp)) - return (-1); - n = dn_comp(buf2, cp, buflen, - dnptrs, lastdnptr); - if (n < 0) - return (-1); - cp += n; - ShrinkBuffer(n); - } - if (rrecp->r_type == T_SOA) { - ShrinkBuffer(5 * INT32SZ); - while (isspace(*startp) || !*startp) - startp++; - if (*startp == '(') { - multiline = 1; - startp++; - } else - multiline = 0; - /* serial, refresh, retry, expire, minimum */ - for (i = 0; i < 5; i++) { - soanum = getnum_str(&startp, endp); - if (soanum < 0) - return (-1); - PUTLONG(soanum, cp); - } - if (multiline) { - while (isspace(*startp) || !*startp) - startp++; - if (*startp != ')') - return (-1); - } - } - break; - case T_MX: - case T_AFSDB: - case T_RT: - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - n = dn_comp(buf2, cp, buflen, dnptrs, lastdnptr); - if (n < 0) - return (-1); - cp += n; - ShrinkBuffer(n); - break; - case T_SRV: - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - n = dn_comp(buf2, cp, buflen, NULL, NULL); - if (n < 0) - return (-1); - cp += n; - ShrinkBuffer(n); - break; - case T_PX: - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - PUTSHORT(n, cp); - ShrinkBuffer(INT16SZ); - for (i = 0; i < 2; i++) { - if (!getword_str(buf2, sizeof buf2, &startp, - endp)) - return (-1); - n = dn_comp(buf2, cp, buflen, dnptrs, - lastdnptr); - if (n < 0) - return (-1); - cp += n; - ShrinkBuffer(n); - } - break; - case T_WKS: { - char bm[MAXPORT/8]; - unsigned int maxbm = 0; - - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - if (!inet_aton(buf2, &ina)) - return (-1); - n1 = ntohl(ina.s_addr); - ShrinkBuffer(INT32SZ); - PUTLONG(n1, cp); - - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - if ((i = res_protocolnumber(buf2)) < 0) - return (-1); - ShrinkBuffer(1); - *cp++ = i & 0xff; - - for (i = 0; i < MAXPORT/8 ; i++) - bm[i] = 0; - - while (getword_str(buf2, sizeof buf2, &startp, endp)) { - if ((n = res_servicenumber(buf2)) <= 0) - return (-1); - - if (n < MAXPORT) { - bm[n/8] |= (0x80>>(n%8)); - if ((unsigned)n > maxbm) - maxbm = n; - } else - return (-1); - } - maxbm = maxbm/8 + 1; - ShrinkBuffer(maxbm); - memcpy(cp, bm, maxbm); - cp += maxbm; - break; - } - case T_HINFO: - for (i = 0; i < 2; i++) { - if ((n = getstr_str(buf2, sizeof buf2, - &startp, endp)) < 0) - return (-1); - if (n > 255) - return (-1); - ShrinkBuffer(n+1); - *cp++ = n; - memcpy(cp, buf2, n); - cp += n; - } - break; - case T_TXT: - for (;;) { - if ((n = getstr_str(buf2, sizeof buf2, - &startp, endp)) < 0) { - if (cp != (sp2 + INT16SZ)) - break; - return (-1); - } - if (n > 255) - return (-1); - ShrinkBuffer(n+1); - *cp++ = n; - memcpy(cp, buf2, n); - cp += n; - } - break; - case T_X25: - /* RFC 1183 */ - if ((n = getstr_str(buf2, sizeof buf2, &startp, - endp)) < 0) - return (-1); - if (n > 255) - return (-1); - ShrinkBuffer(n+1); - *cp++ = n; - memcpy(cp, buf2, n); - cp += n; - break; - case T_ISDN: - /* RFC 1183 */ - if ((n = getstr_str(buf2, sizeof buf2, &startp, - endp)) < 0) - return (-1); - if ((n > 255) || (n == 0)) - return (-1); - ShrinkBuffer(n+1); - *cp++ = n; - memcpy(cp, buf2, n); - cp += n; - if ((n = getstr_str(buf2, sizeof buf2, &startp, - endp)) < 0) - n = 0; - if (n > 255) - return (-1); - ShrinkBuffer(n+1); - *cp++ = n; - memcpy(cp, buf2, n); - cp += n; - break; - case T_NSAP: - if ((n = inet_nsap_addr((char *)startp, (u_char *)buf2, sizeof(buf2))) != 0) { - ShrinkBuffer(n); - memcpy(cp, buf2, n); - cp += n; - } else { - return (-1); - } - break; - case T_LOC: - if ((n = loc_aton((char *)startp, (u_char *)buf2)) != 0) { - ShrinkBuffer(n); - memcpy(cp, buf2, n); - cp += n; - } else - return (-1); - break; - case ns_t_sig: - { - int sig_type, success, dateerror; - u_int32_t exptime, timesigned; - - /* type */ - if ((n = getword_str(buf2, sizeof buf2, - &startp, endp)) < 0) - return (-1); - sig_type = sym_ston(__p_type_syms, buf2, &success); - if (!success || sig_type == ns_t_any) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(sig_type, cp); - /* alg */ - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(1); - *cp++ = n; - /* labels */ - n = getnum_str(&startp, endp); - if (n <= 0 || n > 255) - return (-1); - ShrinkBuffer(1); - *cp++ = n; - /* ottl & expire */ - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - exptime = ns_datetosecs(buf2, &dateerror); - if (!dateerror) { - ShrinkBuffer(INT32SZ); - PUTLONG(rttl, cp); - } - else { - char *ulendp; - u_int32_t ottl; - - errno = 0; - ottl = strtoul(buf2, &ulendp, 10); - if (errno != 0 || - (ulendp != NULL && *ulendp != '\0')) - return (-1); - ShrinkBuffer(INT32SZ); - PUTLONG(ottl, cp); - if (!getword_str(buf2, sizeof buf2, &startp, - endp)) - return (-1); - exptime = ns_datetosecs(buf2, &dateerror); - if (dateerror) - return (-1); - } - /* expire */ - ShrinkBuffer(INT32SZ); - PUTLONG(exptime, cp); - /* timesigned */ - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - timesigned = ns_datetosecs(buf2, &dateerror); - if (!dateerror) { - ShrinkBuffer(INT32SZ); - PUTLONG(timesigned, cp); - } - else - return (-1); - /* footprint */ - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - /* signer name */ - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - n = dn_comp(buf2, cp, buflen, dnptrs, lastdnptr); - if (n < 0) - return (-1); - cp += n; - ShrinkBuffer(n); - /* sig */ - if ((n = getword_str(buf2, sizeof buf2, - &startp, endp)) < 0) - return (-1); - siglen = b64_pton(buf2, buf3, sizeof(buf3)); - if (siglen < 0) - return (-1); - ShrinkBuffer(siglen); - memcpy(cp, buf3, siglen); - cp += siglen; - break; - } - case ns_t_key: - /* flags */ - n = gethexnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - /* proto */ - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(1); - *cp++ = n; - /* alg */ - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(1); - *cp++ = n; - /* key */ - if ((n = getword_str(buf2, sizeof buf2, - &startp, endp)) < 0) - return (-1); - keylen = b64_pton(buf2, buf3, sizeof(buf3)); - if (keylen < 0) - return (-1); - ShrinkBuffer(keylen); - memcpy(cp, buf3, keylen); - cp += keylen; - break; - case ns_t_nxt: - { - int success, nxt_type; - u_char data[32]; - int maxtype; - - /* next name */ - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - n = dn_comp(buf2, cp, buflen, NULL, NULL); - if (n < 0) - return (-1); - cp += n; - ShrinkBuffer(n); - maxtype = 0; - memset(data, 0, sizeof data); - for (;;) { - if (!getword_str(buf2, sizeof buf2, &startp, - endp)) - break; - nxt_type = sym_ston(__p_type_syms, buf2, - &success); - if (!success || !ns_t_rr_p(nxt_type)) - return (-1); - NS_NXT_BIT_SET(nxt_type, data); - if (nxt_type > maxtype) - maxtype = nxt_type; - } - n = maxtype/NS_NXT_BITS+1; - ShrinkBuffer(n); - memcpy(cp, data, n); - cp += n; - break; - } - case ns_t_cert: - /* type */ - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - /* key tag */ - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - /* alg */ - n = getnum_str(&startp, endp); - if (n < 0) - return (-1); - ShrinkBuffer(1); - *cp++ = n; - /* cert */ - if ((n = getword_str(buf2, sizeof buf2, - &startp, endp)) < 0) - return (-1); - certlen = b64_pton(buf2, buf3, sizeof(buf3)); - if (certlen < 0) - return (-1); - ShrinkBuffer(certlen); - memcpy(cp, buf3, certlen); - cp += certlen; - break; - case ns_t_aaaa: - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - if (inet_pton(AF_INET6, buf2, &in6a) <= 0) - return (-1); - ShrinkBuffer(NS_IN6ADDRSZ); - memcpy(cp, &in6a, NS_IN6ADDRSZ); - cp += NS_IN6ADDRSZ; - break; - case ns_t_naptr: - /* Order Preference Flags Service Replacement Regexp */ - /* Order */ - n = getnum_str(&startp, endp); - if (n < 0 || n > 65535) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - /* Preference */ - n = getnum_str(&startp, endp); - if (n < 0 || n > 65535) - return (-1); - ShrinkBuffer(INT16SZ); - PUTSHORT(n, cp); - /* Flags */ - if ((n = getstr_str(buf2, sizeof buf2, - &startp, endp)) < 0) { - return (-1); - } - if (n > 255) - return (-1); - ShrinkBuffer(n+1); - *cp++ = n; - memcpy(cp, buf2, n); - cp += n; - /* Service Classes */ - if ((n = getstr_str(buf2, sizeof buf2, - &startp, endp)) < 0) { - return (-1); - } - if (n > 255) - return (-1); - ShrinkBuffer(n+1); - *cp++ = n; - memcpy(cp, buf2, n); - cp += n; - /* Pattern */ - if ((n = getstr_str(buf2, sizeof buf2, - &startp, endp)) < 0) { - return (-1); - } - if (n > 255) - return (-1); - ShrinkBuffer(n+1); - *cp++ = n; - memcpy(cp, buf2, n); - cp += n; - /* Replacement */ - if (!getword_str(buf2, sizeof buf2, &startp, endp)) - return (-1); - n = dn_comp(buf2, cp, buflen, NULL, NULL); - if (n < 0) - return (-1); - cp += n; - ShrinkBuffer(n); - break; - default: - return (-1); - } /*switch*/ - n = (u_int16_t)((cp - sp2) - INT16SZ); - PUTSHORT(n, sp2); - } /*for*/ - - hp->qdcount = htons(counts[0]); - hp->ancount = htons(counts[1]); - hp->nscount = htons(counts[2]); - hp->arcount = htons(counts[3]); - return (cp - buf); -} - -/* - * Get a whitespace delimited word from a string (not file) - * into buf. modify the start pointer to point after the - * word in the string. - */ -static int -getword_str(char *buf, int size, u_char **startpp, u_char *endp) { - char *cp; - int c; - - for (cp = buf; *startpp <= endp; ) { - c = **startpp; - if (isspace(c) || c == '\0') { - if (cp != buf) /* trailing whitespace */ - break; - else { /* leading whitespace */ - (*startpp)++; - continue; - } - } - (*startpp)++; - if (cp >= buf+size-1) - break; - *cp++ = (u_char)c; - } - *cp = '\0'; - return (cp != buf); -} - -/* - * get a white spae delimited string from memory. Process quoted strings - * and \DDD escapes. Return length or -1 on error. Returned string may - * contain nulls. - */ -static char digits[] = "0123456789"; -static int -getstr_str(char *buf, int size, u_char **startpp, u_char *endp) { - char *cp; - int c, c1 = 0; - int inquote = 0; - int seen_quote = 0; - int escape = 0; - int dig = 0; - - for (cp = buf; *startpp <= endp; ) { - if ((c = **startpp) == '\0') - break; - /* leading white space */ - if ((cp == buf) && !seen_quote && isspace(c)) { - (*startpp)++; - continue; - } - - switch (c) { - case '\\': - if (!escape) { - escape = 1; - dig = 0; - c1 = 0; - (*startpp)++; - continue; - } - goto do_escape; - case '"': - if (!escape) { - inquote = !inquote; - seen_quote = 1; - (*startpp)++; - continue; - } - /* fall through */ - default: - do_escape: - if (escape) { - switch (c) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - c1 = c1 * 10 + - (strchr(digits, c) - digits); - - if (++dig == 3) { - c = c1 &0xff; - break; - } - (*startpp)++; - continue; - } - escape = 0; - } else if (!inquote && isspace(c)) - goto done; - if (cp >= buf+size-1) - goto done; - *cp++ = (u_char)c; - (*startpp)++; - } - } - done: - *cp = '\0'; - return ((cp == buf)? (seen_quote? 0: -1): (cp - buf)); -} -/* - * Get a whitespace delimited base 16 number from a string (not file) into buf - * update the start pointer to point after the number in the string. - */ -static int -gethexnum_str(u_char **startpp, u_char *endp) { - int c, n; - int seendigit = 0; - int m = 0; - - if (*startpp + 2 >= endp || strncasecmp((char *)*startpp, "0x", 2) != 0) - return getnum_str(startpp, endp); - (*startpp)+=2; - for (n = 0; *startpp <= endp; ) { - c = **startpp; - if (isspace(c) || c == '\0') { - if (seendigit) /* trailing whitespace */ - break; - else { /* leading whitespace */ - (*startpp)++; - continue; - } - } - if (c == ';') { - while ((*startpp <= endp) && - ((c = **startpp) != '\n')) - (*startpp)++; - if (seendigit) - break; - continue; - } - if (!isxdigit(c)) { - if (c == ')' && seendigit) { - (*startpp)--; - break; - } - return (-1); - } - (*startpp)++; - if (isdigit(c)) - n = n * 16 + (c - '0'); - else - n = n * 16 + (tolower(c) - 'a' + 10); - seendigit = 1; - } - return (n + m); -} - -/* - * Get a whitespace delimited base 10 number from a string (not file) into buf - * update the start pointer to point after the number in the string. - */ -static int -getnum_str(u_char **startpp, u_char *endp) { - int c, n; - int seendigit = 0; - int m = 0; - - for (n = 0; *startpp <= endp; ) { - c = **startpp; - if (isspace(c) || c == '\0') { - if (seendigit) /* trailing whitespace */ - break; - else { /* leading whitespace */ - (*startpp)++; - continue; - } - } - if (c == ';') { - while ((*startpp <= endp) && - ((c = **startpp) != '\n')) - (*startpp)++; - if (seendigit) - break; - continue; - } - if (!isdigit(c)) { - if (c == ')' && seendigit) { - (*startpp)--; - break; - } - return (-1); - } - (*startpp)++; - n = n * 10 + (c - '0'); - seendigit = 1; - } - return (n + m); -} - -/* - * Allocate a resource record buffer & save rr info. - */ -ns_updrec * -res_mkupdrec(int section, const char *dname, - u_int class, u_int type, u_long ttl) { - ns_updrec *rrecp = (ns_updrec *)calloc(1, sizeof(ns_updrec)); - - if (!rrecp || !(rrecp->r_dname = strdup(dname))) { - if (rrecp) - free((char *)rrecp); - return (NULL); - } - INIT_LINK(rrecp, r_link); - INIT_LINK(rrecp, r_glink); - rrecp->r_class = (ns_class)class; - rrecp->r_type = (ns_type)type; - rrecp->r_ttl = ttl; - rrecp->r_section = (ns_sect)section; - return (rrecp); -} - -/* - * Free a resource record buffer created by res_mkupdrec. - */ -void -res_freeupdrec(ns_updrec *rrecp) { - /* Note: freeing r_dp is the caller's responsibility. */ - if (rrecp->r_dname != NULL) - free(rrecp->r_dname); - free(rrecp); -} - -struct valuelist { - struct valuelist * next; - struct valuelist * prev; - char * name; - char * proto; - int port; -}; -static struct valuelist *servicelist, *protolist; - -static void -res_buildservicelist() { - struct servent *sp; - struct valuelist *slp; - -#ifdef MAYBE_HESIOD - setservent(0); -#else - setservent(1); -#endif - while ((sp = getservent()) != NULL) { - slp = (struct valuelist *)malloc(sizeof(struct valuelist)); - if (!slp) - break; - slp->name = strdup(sp->s_name); - slp->proto = strdup(sp->s_proto); - if ((slp->name == NULL) || (slp->proto == NULL)) { - if (slp->name) free(slp->name); - if (slp->proto) free(slp->proto); - free(slp); - break; - } - slp->port = ntohs((u_int16_t)sp->s_port); /* host byt order */ - slp->next = servicelist; - slp->prev = NULL; - if (servicelist) - servicelist->prev = slp; - servicelist = slp; - } - endservent(); -} - -void -res_destroyservicelist() { - struct valuelist *slp, *slp_next; - - for (slp = servicelist; slp != NULL; slp = slp_next) { - slp_next = slp->next; - free(slp->name); - free(slp->proto); - free(slp); - } - servicelist = (struct valuelist *)0; -} - -void -res_buildprotolist(void) { - struct protoent *pp; - struct valuelist *slp; - -#ifdef MAYBE_HESIOD - setprotoent(0); -#else - setprotoent(1); -#endif - while ((pp = getprotoent()) != NULL) { - slp = (struct valuelist *)malloc(sizeof(struct valuelist)); - if (!slp) - break; - slp->name = strdup(pp->p_name); - if (slp->name == NULL) { - free(slp); - break; - } - slp->port = pp->p_proto; /* host byte order */ - slp->next = protolist; - slp->prev = NULL; - if (protolist) - protolist->prev = slp; - protolist = slp; - } - endprotoent(); -} - -void -res_destroyprotolist(void) { - struct valuelist *plp, *plp_next; - - for (plp = protolist; plp != NULL; plp = plp_next) { - plp_next = plp->next; - free(plp->name); - free(plp); - } - protolist = (struct valuelist *)0; -} - -static int -findservice(const char *s, struct valuelist **list) { - struct valuelist *lp = *list; - int n; - - for (; lp != NULL; lp = lp->next) - if (strcasecmp(lp->name, s) == 0) { - if (lp != *list) { - lp->prev->next = lp->next; - if (lp->next) - lp->next->prev = lp->prev; - (*list)->prev = lp; - lp->next = *list; - *list = lp; - } - return (lp->port); /* host byte order */ - } - if (sscanf(s, "%d", &n) != 1 || n <= 0) - n = -1; - return (n); -} - -/* - * Convert service name or (ascii) number to int. - */ -int -res_servicenumber(const char *p) { - if (servicelist == (struct valuelist *)0) - res_buildservicelist(); - return (findservice(p, &servicelist)); -} - -/* - * Convert protocol name or (ascii) number to int. - */ -int -res_protocolnumber(const char *p) { - if (protolist == (struct valuelist *)0) - res_buildprotolist(); - return (findservice(p, &protolist)); -} - -static struct servent * -cgetservbyport(u_int16_t port, const char *proto) { /* Host byte order. */ - struct valuelist **list = &servicelist; - struct valuelist *lp = *list; - static struct servent serv; - - port = ntohs(port); - for (; lp != NULL; lp = lp->next) { - if (port != (u_int16_t)lp->port) /* Host byte order. */ - continue; - if (strcasecmp(lp->proto, proto) == 0) { - if (lp != *list) { - lp->prev->next = lp->next; - if (lp->next) - lp->next->prev = lp->prev; - (*list)->prev = lp; - lp->next = *list; - *list = lp; - } - serv.s_name = lp->name; - serv.s_port = htons((u_int16_t)lp->port); - serv.s_proto = lp->proto; - return (&serv); - } - } - return (0); -} - -static struct protoent * -cgetprotobynumber(int proto) { /* Host byte order. */ - struct valuelist **list = &protolist; - struct valuelist *lp = *list; - static struct protoent prot; - - for (; lp != NULL; lp = lp->next) - if (lp->port == proto) { /* Host byte order. */ - if (lp != *list) { - lp->prev->next = lp->next; - if (lp->next) - lp->next->prev = lp->prev; - (*list)->prev = lp; - lp->next = *list; - *list = lp; - } - prot.p_name = lp->name; - prot.p_proto = lp->port; /* Host byte order. */ - return (&prot); - } - return (0); -} - -const char * -res_protocolname(int num) { - static char number[8]; - struct protoent *pp; - - if (protolist == (struct valuelist *)0) - res_buildprotolist(); - pp = cgetprotobynumber(num); - if (pp == 0) { - (void) sprintf(number, "%d", num); - return (number); - } - return (pp->p_name); -} - -const char * -res_servicename(u_int16_t port, const char *proto) { /* Host byte order. */ - static char number[8]; - struct servent *ss; - - if (servicelist == (struct valuelist *)0) - res_buildservicelist(); - ss = cgetservbyport(htons(port), proto); - if (ss == 0) { - (void) sprintf(number, "%d", port); - return (number); - } - return (ss->s_name); -} diff --git a/lib/libc/resolv/res_private.h b/lib/libc/resolv/res_private.h deleted file mode 100644 index d7b66cd691bc..000000000000 --- a/lib/libc/resolv/res_private.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef res_private_h -#define res_private_h - -struct __res_state_ext { - union res_sockaddr_union nsaddrs[MAXNS]; - struct sort_list { - int af; - union { - struct in_addr ina; - struct in6_addr in6a; - } addr, mask; - } sort_list[MAXRESOLVSORT]; - char nsuffix[64]; - char nsuffix2[64]; -}; - -extern int -res_ourserver_p(const res_state statp, const struct sockaddr *sa); - -#endif diff --git a/lib/libc/resolv/res_query.c b/lib/libc/resolv/res_query.c deleted file mode 100644 index 5156ce84c086..000000000000 --- a/lib/libc/resolv/res_query.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Copyright (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 sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: res_query.c,v 1.2.2.3.4.2 2004/03/16 12:34:19 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include "port_before.h" -#include <sys/types.h> -#include <sys/param.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 "port_after.h" - -/* Options. Leave them on. */ -#define DEBUG - -#if PACKETSZ > 1024 -#define MAXPACKET PACKETSZ -#else -#define MAXPACKET 1024 -#endif - -/* - * Formulate a normal query, send, and await answer. - * Returned answer is placed in supplied buffer "answer". - * Perform preliminary check of answer, returning success only - * if no error is indicated and the answer count is nonzero. - * Return the size of the response on success, -1 on error. - * Error number is left in H_ERRNO. - * - * Caller must parse answer and determine whether it answers the question. - */ -int -res_nquery(res_state statp, - const char *name, /* domain name */ - int class, int type, /* class and type of query */ - u_char *answer, /* buffer to put answer */ - int anslen) /* size of answer buffer */ -{ - u_char buf[MAXPACKET]; - HEADER *hp = (HEADER *) answer; - int n; - u_int oflags; - - oflags = statp->_flags; - -again: - hp->rcode = NOERROR; /* default */ - -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";; res_query(%s, %d, %d)\n", name, class, type); -#endif - - n = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL, - buf, sizeof(buf)); -#ifdef RES_USE_EDNS0 - if (n > 0 && (statp->_flags & RES_F_EDNS0ERR) == 0 && - (statp->options & (RES_USE_EDNS0|RES_USE_DNSSEC)) != 0U) - n = res_nopt(statp, n, buf, sizeof(buf), anslen); -#endif - if (n <= 0) { -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";; res_query: mkquery failed\n"); -#endif - RES_SET_H_ERRNO(statp, NO_RECOVERY); - return (n); - } - n = res_nsend(statp, buf, n, answer, anslen); - if (n < 0) { -#ifdef RES_USE_EDNS0 - /* if the query choked with EDNS0, retry without EDNS0 */ - if ((statp->options & (RES_USE_EDNS0|RES_USE_DNSSEC)) != 0U && - ((oflags ^ statp->_flags) & RES_F_EDNS0ERR) != 0) { - statp->_flags |= RES_F_EDNS0ERR; - if (statp->options & RES_DEBUG) - printf(";; res_nquery: retry without EDNS0\n"); - goto again; - } -#endif -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";; res_query: send error\n"); -#endif - RES_SET_H_ERRNO(statp, TRY_AGAIN); - return (n); - } - - if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) { -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";; rcode = (%s), counts = an:%d ns:%d ar:%d\n", - p_rcode(hp->rcode), - ntohs(hp->ancount), - ntohs(hp->nscount), - ntohs(hp->arcount)); -#endif - switch (hp->rcode) { - case NXDOMAIN: - RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); - break; - case SERVFAIL: - RES_SET_H_ERRNO(statp, TRY_AGAIN); - break; - case NOERROR: - RES_SET_H_ERRNO(statp, NO_DATA); - break; - case FORMERR: - case NOTIMP: - case REFUSED: - default: - RES_SET_H_ERRNO(statp, NO_RECOVERY); - break; - } - return (-1); - } - return (n); -} - -/* - * Formulate a normal query, send, and retrieve answer in supplied buffer. - * Return the size of the response on success, -1 on error. - * If enabled, implement search rules until answer or unrecoverable failure - * is detected. Error code, if any, is left in H_ERRNO. - */ -int -res_nsearch(res_state statp, - const char *name, /* domain name */ - int class, int type, /* class and type of query */ - u_char *answer, /* buffer to put answer */ - int anslen) /* size of answer */ -{ - const char *cp, * const *domain; - HEADER *hp = (HEADER *) answer; - char tmp[NS_MAXDNAME]; - u_int dots; - int trailing_dot, ret, saved_herrno; - int got_nodata = 0, got_servfail = 0, root_on_list = 0; - int tried_as_is = 0; - int searched = 0; - - errno = 0; - RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); /* True if we never query. */ - - dots = 0; - for (cp = name; *cp != '\0'; cp++) - dots += (*cp == '.'); - trailing_dot = 0; - if (cp > name && *--cp == '.') - trailing_dot++; - - /* If there aren't any dots, it could be a user-level alias. */ - if (!dots && (cp = res_hostalias(statp, name, tmp, sizeof tmp))!= NULL) - return (res_nquery(statp, cp, class, type, answer, anslen)); - - /* - * If there are enough dots in the name, let's just give it a - * try 'as is'. The threshold can be set with the "ndots" option. - * Also, query 'as is', if there is a trailing dot in the name. - */ - saved_herrno = -1; - if (dots >= statp->ndots || trailing_dot) { - ret = res_nquerydomain(statp, name, NULL, class, type, - answer, anslen); - if (ret > 0 || trailing_dot) - return (ret); - saved_herrno = statp->res_h_errno; - tried_as_is++; - } - - /* - * We do at least one level of search if - * - there is no dot and RES_DEFNAME is set, or - * - there is at least one dot, there is no trailing dot, - * and RES_DNSRCH is set. - */ - if ((!dots && (statp->options & RES_DEFNAMES) != 0U) || - (dots && !trailing_dot && (statp->options & RES_DNSRCH) != 0U)) { - int done = 0; - - for (domain = (const char * const *)statp->dnsrch; - *domain && !done; - domain++) { - searched = 1; - - if (domain[0][0] == '\0' || - (domain[0][0] == '.' && domain[0][1] == '\0')) - root_on_list++; - - ret = res_nquerydomain(statp, name, *domain, - class, type, - answer, anslen); - if (ret > 0) - return (ret); - - /* - * If no server present, give up. - * If name isn't found in this domain, - * keep trying higher domains in the search list - * (if that's enabled). - * On a NO_DATA error, keep trying, otherwise - * a wildcard entry of another type could keep us - * from finding this entry higher in the domain. - * If we get some other error (negative answer or - * server failure), then stop searching up, - * but try the input name below in case it's - * fully-qualified. - */ - if (errno == ECONNREFUSED) { - RES_SET_H_ERRNO(statp, TRY_AGAIN); - return (-1); - } - - switch (statp->res_h_errno) { - case NO_DATA: - got_nodata++; - /* FALLTHROUGH */ - case HOST_NOT_FOUND: - /* keep trying */ - break; - case TRY_AGAIN: - if (hp->rcode == SERVFAIL) { - /* try next search element, if any */ - got_servfail++; - break; - } - /* FALLTHROUGH */ - default: - /* anything else implies that we're done */ - done++; - } - - /* if we got here for some reason other than DNSRCH, - * we only wanted one iteration of the loop, so stop. - */ - if ((statp->options & RES_DNSRCH) == 0U) - done++; - } - } - - /* - * If the query has not already been tried as is then try it - * unless RES_NOTLDQUERY is set and there were no dots. - */ - if ((dots || !searched || (statp->options & RES_NOTLDQUERY) == 0U) && - !(tried_as_is || root_on_list)) { - ret = res_nquerydomain(statp, name, NULL, class, type, - answer, anslen); - if (ret > 0) - return (ret); - } - - /* if we got here, we didn't satisfy the search. - * if we did an initial full query, return that query's H_ERRNO - * (note that we wouldn't be here if that query had succeeded). - * else if we ever got a nodata, send that back as the reason. - * else send back meaningless H_ERRNO, that being the one from - * the last DNSRCH we did. - */ - if (saved_herrno != -1) - RES_SET_H_ERRNO(statp, saved_herrno); - else if (got_nodata) - RES_SET_H_ERRNO(statp, NO_DATA); - else if (got_servfail) - RES_SET_H_ERRNO(statp, TRY_AGAIN); - return (-1); -} - -/* - * Perform a call on res_query on the concatenation of name and domain, - * removing a trailing dot from name if domain is NULL. - */ -int -res_nquerydomain(res_state statp, - const char *name, - const char *domain, - int class, int type, /* class and type of query */ - u_char *answer, /* buffer to put answer */ - int anslen) /* size of answer */ -{ - char nbuf[MAXDNAME]; - const char *longname = nbuf; - int n, d; - -#ifdef DEBUG - if (statp->options & RES_DEBUG) - printf(";; res_nquerydomain(%s, %s, %d, %d)\n", - name, domain?domain:"<Nil>", class, type); -#endif - if (domain == NULL) { - /* - * Check for trailing '.'; - * copy without '.' if present. - */ - n = strlen(name); - if (n >= MAXDNAME) { - RES_SET_H_ERRNO(statp, NO_RECOVERY); - return (-1); - } - n--; - if (n >= 0 && name[n] == '.') { - strncpy(nbuf, name, n); - nbuf[n] = '\0'; - } else - longname = name; - } else { - n = strlen(name); - d = strlen(domain); - if (n + d + 1 >= MAXDNAME) { - RES_SET_H_ERRNO(statp, NO_RECOVERY); - return (-1); - } - sprintf(nbuf, "%s.%s", name, domain); - } - return (res_nquery(statp, longname, class, type, answer, anslen)); -} - -const char * -res_hostalias(const res_state statp, const char *name, char *dst, size_t siz) { - char *file, *cp1, *cp2; - char buf[BUFSIZ]; - FILE *fp; - - if (statp->options & RES_NOALIASES) - return (NULL); - file = getenv("HOSTALIASES"); - if (file == NULL || (fp = fopen(file, "r")) == NULL) - return (NULL); - setbuf(fp, NULL); - buf[sizeof(buf) - 1] = '\0'; - while (fgets(buf, sizeof(buf), fp)) { - for (cp1 = buf; *cp1 && !isspace((unsigned char)*cp1); ++cp1) - ; - if (!*cp1) - break; - *cp1 = '\0'; - if (ns_samename(buf, name) == 1) { - while (isspace((unsigned char)*++cp1)) - ; - if (!*cp1) - break; - for (cp2 = cp1 + 1; *cp2 && - !isspace((unsigned char)*cp2); ++cp2) - ; - *cp2 = '\0'; - strncpy(dst, cp1, siz - 1); - dst[siz - 1] = '\0'; - fclose(fp); - return (dst); - } - } - fclose(fp); - return (NULL); -} diff --git a/lib/libc/resolv/res_update.c b/lib/libc/resolv/res_update.c deleted file mode 100644 index 8783d8a7645b..000000000000 --- a/lib/libc/resolv/res_update.c +++ /dev/null @@ -1,212 +0,0 @@ -#if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: res_update.c,v 1.6.2.4.4.2 2004/03/16 12:34:20 marka Exp $"; -#endif /* not lint */ - -/* - * 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. - */ - -/* - * Based on the Dynamic DNS reference implementation by Viraj Bais - * <viraj_bais@ccm.fm.intel.com> - */ - -#include "port_before.h" - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/time.h> - -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> - -#include <errno.h> -#include <limits.h> -#include <netdb.h> -#include <res_update.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <isc/list.h> -#include <resolv.h> - -#include "port_after.h" -#include "res_private.h" - -/* - * Separate a linked list of records into groups so that all records - * in a group will belong to a single zone on the nameserver. - * Create a dynamic update packet for each zone and send it to the - * nameservers for that zone, and await answer. - * Abort if error occurs in updating any zone. - * Return the number of zones updated on success, < 0 on error. - * - * On error, caller must deal with the unsynchronized zones - * eg. an A record might have been successfully added to the forward - * zone but the corresponding PTR record would be missing if error - * was encountered while updating the reverse zone. - */ - -struct zonegrp { - char z_origin[MAXDNAME]; - ns_class z_class; - union res_sockaddr_union z_nsaddrs[MAXNS]; - int z_nscount; - int z_flags; - LIST(ns_updrec) z_rrlist; - LINK(struct zonegrp) z_link; -}; - -#define ZG_F_ZONESECTADDED 0x0001 - -/* Forward. */ - -static void res_dprintf(const char *, ...) ISC_FORMAT_PRINTF(1, 2); - -/* Macros. */ - -#define DPRINTF(x) do {\ - int save_errno = errno; \ - if ((statp->options & RES_DEBUG) != 0U) res_dprintf x; \ - errno = save_errno; \ - } while (0) - -/* Public. */ - -int -res_nupdate(res_state statp, ns_updrec *rrecp_in, ns_tsig_key *key) { - ns_updrec *rrecp; - u_char answer[PACKETSZ]; - u_char *packet; - struct zonegrp *zptr, tgrp; - LIST(struct zonegrp) zgrps; - int nzones = 0, nscount = 0, n; - union res_sockaddr_union nsaddrs[MAXNS]; - - packet = malloc(NS_MAXMSG); - if (packet == NULL) { - DPRINTF(("malloc failed")); - return (0); - } - /* Thread all of the updates onto a list of groups. */ - INIT_LIST(zgrps); - memset(&tgrp, 0, sizeof (tgrp)); - for (rrecp = rrecp_in; rrecp; - rrecp = LINKED(rrecp, r_link) ? NEXT(rrecp, r_link) : NULL) { - int nscnt; - /* Find the origin for it if there is one. */ - tgrp.z_class = rrecp->r_class; - nscnt = res_findzonecut2(statp, rrecp->r_dname, tgrp.z_class, - RES_EXHAUSTIVE, tgrp.z_origin, - sizeof tgrp.z_origin, - tgrp.z_nsaddrs, MAXNS); - if (nscnt <= 0) { - DPRINTF(("res_findzonecut failed (%d)", nscnt)); - goto done; - } - tgrp.z_nscount = nscnt; - /* Find the group for it if there is one. */ - for (zptr = HEAD(zgrps); zptr != NULL; zptr = NEXT(zptr, z_link)) - if (ns_samename(tgrp.z_origin, zptr->z_origin) == 1 && - tgrp.z_class == zptr->z_class) - break; - /* Make a group for it if there isn't one. */ - if (zptr == NULL) { - zptr = malloc(sizeof *zptr); - if (zptr == NULL) { - DPRINTF(("malloc failed")); - goto done; - } - *zptr = tgrp; - zptr->z_flags = 0; - INIT_LINK(zptr, z_link); - INIT_LIST(zptr->z_rrlist); - APPEND(zgrps, zptr, z_link); - } - /* Thread this rrecp onto the right group. */ - APPEND(zptr->z_rrlist, rrecp, r_glink); - } - - for (zptr = HEAD(zgrps); zptr != NULL; zptr = NEXT(zptr, z_link)) { - /* Construct zone section and prepend it. */ - rrecp = res_mkupdrec(ns_s_zn, zptr->z_origin, - zptr->z_class, ns_t_soa, 0); - if (rrecp == NULL) { - DPRINTF(("res_mkupdrec failed")); - goto done; - } - PREPEND(zptr->z_rrlist, rrecp, r_glink); - zptr->z_flags |= ZG_F_ZONESECTADDED; - - /* Marshall the update message. */ - n = res_nmkupdate(statp, HEAD(zptr->z_rrlist), - packet, NS_MAXMSG); - DPRINTF(("res_mkupdate -> %d", n)); - if (n < 0) - goto done; - - /* Temporarily replace the resolver's nameserver set. */ - nscount = res_getservers(statp, nsaddrs, MAXNS); - res_setservers(statp, zptr->z_nsaddrs, zptr->z_nscount); - - /* Send the update and remember the result. */ - if (key != NULL) - n = res_nsendsigned(statp, packet, n, key, - answer, sizeof answer); - else - n = res_nsend(statp, packet, n, answer, sizeof answer); - if (n < 0) { - DPRINTF(("res_nsend: send error, n=%d (%s)\n", - n, strerror(errno))); - goto done; - } - if (((HEADER *)answer)->rcode == NOERROR) - nzones++; - - /* Restore resolver's nameserver set. */ - res_setservers(statp, nsaddrs, nscount); - nscount = 0; - } - done: - while (!EMPTY(zgrps)) { - zptr = HEAD(zgrps); - if ((zptr->z_flags & ZG_F_ZONESECTADDED) != 0) - res_freeupdrec(HEAD(zptr->z_rrlist)); - UNLINK(zgrps, zptr, z_link); - free(zptr); - } - if (nscount != 0) - res_setservers(statp, nsaddrs, nscount); - - free(packet); - return (nzones); -} - -/* Private. */ - -static void -res_dprintf(const char *fmt, ...) { - va_list ap; - - va_start(ap, fmt); - fputs(";; res_nupdate: ", stderr); - vfprintf(stderr, fmt, ap); - fputc('\n', stderr); - va_end(ap); -} |