зеркало из https://github.com/mozilla/gecko-dev.git
Bug 694325: Add files for DNS Multithreading on Android; avoid undefined, unexposed libc symbols r=mwu
This commit is contained in:
Родитель
630f3382fc
Коммит
50e8ffcb33
|
@ -7279,7 +7279,7 @@ dnl our own linker.
|
|||
if test "$OS_TARGET" = Android; then
|
||||
WRAP_LDFLAGS="${WRAP_LDFLAGS} -L$_objdir/dist/lib -lmozutils"
|
||||
if test "$MOZ_WIDGET_TOOLKIT" = android; then
|
||||
WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=dlopen,--wrap=dlclose,--wrap=dlerror,--wrap=dlsym,--wrap=dladdr"
|
||||
WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=dlopen,--wrap=dlclose,--wrap=dlerror,--wrap=dlsym,--wrap=dladdr,--wrap=getaddrinfo,--wrap=freeaddrinfo,--wrap=gai_strerror"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
|
@ -71,19 +71,9 @@ class nsResolveHostCallback;
|
|||
return n; \
|
||||
}
|
||||
|
||||
#ifdef ANDROID
|
||||
// See bug 687367 - pre gingerbread android has race conditions involving stdio.
|
||||
// stdio is used as part of the getaddrinfo() implementation. In order to reduce
|
||||
// that race window limit ourselves to 1 lookup at a time on android.
|
||||
|
||||
#define MAX_RESOLVER_THREADS_FOR_ANY_PRIORITY 0
|
||||
#define MAX_RESOLVER_THREADS_FOR_HIGH_PRIORITY 1
|
||||
#define MAX_NON_PRIORITY_REQUESTS 0
|
||||
#else
|
||||
#define MAX_RESOLVER_THREADS_FOR_ANY_PRIORITY 3
|
||||
#define MAX_RESOLVER_THREADS_FOR_HIGH_PRIORITY 5
|
||||
#define MAX_NON_PRIORITY_REQUESTS 150
|
||||
#endif
|
||||
|
||||
#define MAX_RESOLVER_THREADS (MAX_RESOLVER_THREADS_FOR_ANY_PRIORITY + \
|
||||
MAX_RESOLVER_THREADS_FOR_HIGH_PRIORITY)
|
||||
|
|
|
@ -71,8 +71,24 @@ CSRCS = \
|
|||
ba.c \
|
||||
debugger.c \
|
||||
dlfcn.c \
|
||||
ev_streams.c \
|
||||
ev_timers.c \
|
||||
getaddrinfo.c \
|
||||
linker.c \
|
||||
linker_format.c \
|
||||
ns_name.c \
|
||||
ns_netint.c \
|
||||
ns_parse.c \
|
||||
ns_print.c \
|
||||
ns_samedomain.c \
|
||||
ns_ttl.c \
|
||||
res_comp.c \
|
||||
res_data.c \
|
||||
res_debug.c \
|
||||
res_init.c \
|
||||
res_mkquery.c \
|
||||
res_send.c \
|
||||
res_state.c \
|
||||
rt.c \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
@ -0,0 +1,587 @@
|
|||
/* $NetBSD: nameser.h,v 1.19 2005/12/26 19:01:47 perry Exp $ */
|
||||
|
||||
/*
|
||||
* 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. 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _ARPA_NAMESER_H_
|
||||
#define _ARPA_NAMESER_H_
|
||||
|
||||
#define BIND_4_COMPAT
|
||||
|
||||
#include <sys/types.h>
|
||||
#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 uint32_t */
|
||||
#define NS_INT16SZ 2 /* #/bytes of data in a uint16_t */
|
||||
#define NS_INT8SZ 1 /* #/bytes of data in a uint8_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;
|
||||
uint16_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 const 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) ((size_t)((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];
|
||||
uint16_t type;
|
||||
uint16_t rr_class;
|
||||
uint32_t ttl;
|
||||
uint16_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) ((u_long)(rr).ttl + 0)
|
||||
#define ns_rr_rdlen(rr) ((size_t)(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 { \
|
||||
const u_char *t_cp = (const u_char *)(cp); \
|
||||
(s) = ((uint16_t)t_cp[0] << 8) \
|
||||
| ((uint16_t)t_cp[1]) \
|
||||
; \
|
||||
(cp) += NS_INT16SZ; \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define NS_GET32(l, cp) do { \
|
||||
const u_char *t_cp = (const u_char *)(cp); \
|
||||
(l) = ((uint32_t)t_cp[0] << 24) \
|
||||
| ((uint32_t)t_cp[1] << 16) \
|
||||
| ((uint32_t)t_cp[2] << 8) \
|
||||
| ((uint32_t)t_cp[3]) \
|
||||
; \
|
||||
(cp) += NS_INT32SZ; \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define NS_PUT16(s, cp) do { \
|
||||
uint32_t t_s = (uint32_t)(s); \
|
||||
u_char *t_cp = (u_char *)(cp); \
|
||||
*t_cp++ = t_s >> 8; \
|
||||
*t_cp = t_s; \
|
||||
(cp) += NS_INT16SZ; \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define NS_PUT32(l, cp) do { \
|
||||
uint32_t t_l = (uint32_t)(l); \
|
||||
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 (/*CONSTCOND*/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(ns_msg, int);
|
||||
uint16_t ns_get16(const u_char *);
|
||||
uint32_t ns_get32(const u_char *);
|
||||
void ns_put16(uint16_t, u_char *);
|
||||
void ns_put32(uint32_t, u_char *);
|
||||
int ns_initparse(const u_char *, int, ns_msg *);
|
||||
int ns_skiprr(const u_char *, const u_char *, ns_sect, int);
|
||||
int ns_parserr(ns_msg *, ns_sect, int, ns_rr *);
|
||||
int ns_sprintrr(const ns_msg *, const ns_rr *,
|
||||
const char *, const char *, char *, size_t);
|
||||
int ns_sprintrrf(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(u_long, char *, size_t);
|
||||
int ns_parse_ttl(const char *, u_long *);
|
||||
uint32_t ns_datetosecs(const char *cp, int *errp);
|
||||
int ns_name_ntol(const u_char *, u_char *, size_t);
|
||||
int ns_name_ntop(const u_char *, char *, size_t);
|
||||
int ns_name_pton(const char *, u_char *, size_t);
|
||||
int ns_name_unpack(const u_char *, const u_char *,
|
||||
const u_char *, u_char *, size_t);
|
||||
int ns_name_pack(const u_char *, u_char *, int,
|
||||
const u_char **, const u_char **);
|
||||
int ns_name_uncompress(const u_char *, const u_char *,
|
||||
const u_char *, char *, size_t);
|
||||
int ns_name_compress(const char *, u_char *, size_t,
|
||||
const u_char **, const u_char **);
|
||||
int ns_name_skip(const u_char **, const u_char *);
|
||||
void ns_name_rollback(const u_char *, const u_char **,
|
||||
const u_char **);
|
||||
int ns_sign(u_char *, int *, int, int, void *,
|
||||
const u_char *, int, u_char *, int *, time_t);
|
||||
int ns_sign2(u_char *, int *, int, int, void *,
|
||||
const u_char *, int, u_char *, int *, time_t,
|
||||
u_char **, u_char **);
|
||||
int ns_sign_tcp(u_char *, int *, int, int,
|
||||
ns_tcp_tsig_state *, int);
|
||||
int ns_sign_tcp2(u_char *, int *, int, int,
|
||||
ns_tcp_tsig_state *, int,
|
||||
u_char **, u_char **);
|
||||
int ns_sign_tcp_init(void *, const u_char *, int,
|
||||
ns_tcp_tsig_state *);
|
||||
u_char *ns_find_tsig(u_char *, u_char *);
|
||||
int ns_verify(u_char *, int *, void *,
|
||||
const u_char *, int, u_char *, int *,
|
||||
time_t *, int);
|
||||
int ns_verify_tcp(u_char *, int *, ns_tcp_tsig_state *, int);
|
||||
int ns_verify_tcp_init(void *, const u_char *, int,
|
||||
ns_tcp_tsig_state *);
|
||||
int ns_samedomain(const char *, const char *);
|
||||
int ns_subdomain(const char *, const char *);
|
||||
int ns_makecanon(const char *, char *, size_t);
|
||||
int ns_samename(const char *, const char *);
|
||||
__END_DECLS
|
||||
|
||||
#ifdef BIND_4_COMPAT
|
||||
#include "arpa_nameser_compat.h"
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
# include <logd.h>
|
||||
# define XLOG(...) \
|
||||
__libc_android_log_print(ANDROID_LOG_DEBUG,"libc",__VA_ARGS__)
|
||||
#else
|
||||
#define XLOG(...) do {} while (0)
|
||||
#endif
|
||||
|
||||
#endif /* !_ARPA_NAMESER_H_ */
|
|
@ -0,0 +1,246 @@
|
|||
/* $NetBSD: nameser_compat.h,v 1.1.1.2 2004/11/07 01:28:27 christos Exp $ */
|
||||
|
||||
/* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _ARPA_NAMESER_COMPAT_
|
||||
#define _ARPA_NAMESER_COMPAT_
|
||||
|
||||
#define __BIND 19950621 /* (DEAD) interface version stamp. */
|
||||
|
||||
#include <endian.h>
|
||||
|
||||
#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_ */
|
|
@ -0,0 +1,134 @@
|
|||
/* $NetBSD: assertions.h,v 1.1.1.1 2004/05/20 19:49:41 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Id: assertions.h,v 1.1.206.1 2004/03/09 08:33:30 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef ASSERTIONS_H
|
||||
#define ASSERTIONS_H 1
|
||||
|
||||
typedef enum {
|
||||
assert_require, assert_ensure, assert_insist, assert_invariant
|
||||
} assertion_type;
|
||||
|
||||
typedef void (*assertion_failure_callback)(const char *, int, assertion_type,
|
||||
const char *, int);
|
||||
|
||||
extern assertion_failure_callback __assertion_failed;
|
||||
void set_assertion_failure_callback(assertion_failure_callback f);
|
||||
const char *assertion_type_to_text(assertion_type type);
|
||||
|
||||
#ifdef CHECK_ALL
|
||||
#define CHECK_REQUIRE 1
|
||||
#define CHECK_ENSURE 1
|
||||
#define CHECK_INSIST 1
|
||||
#define CHECK_INVARIANT 1
|
||||
#endif
|
||||
|
||||
#ifdef CHECK_NONE
|
||||
#define CHECK_REQUIRE 0
|
||||
#define CHECK_ENSURE 0
|
||||
#define CHECK_INSIST 0
|
||||
#define CHECK_INVARIANT 0
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_REQUIRE
|
||||
#define CHECK_REQUIRE 1
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_ENSURE
|
||||
#define CHECK_ENSURE 1
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_INSIST
|
||||
#define CHECK_INSIST 1
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_INVARIANT
|
||||
#define CHECK_INVARIANT 1
|
||||
#endif
|
||||
|
||||
#if CHECK_REQUIRE != 0
|
||||
#define REQUIRE(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_require, \
|
||||
#cond, 0), 0)))
|
||||
#define REQUIRE_ERR(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_require, \
|
||||
#cond, 1), 0)))
|
||||
#else
|
||||
#define REQUIRE(cond) ((void) (cond))
|
||||
#define REQUIRE_ERR(cond) ((void) (cond))
|
||||
#endif /* CHECK_REQUIRE */
|
||||
|
||||
#if CHECK_ENSURE != 0
|
||||
#define ENSURE(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_ensure, \
|
||||
#cond, 0), 0)))
|
||||
#define ENSURE_ERR(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_ensure, \
|
||||
#cond, 1), 0)))
|
||||
#else
|
||||
#define ENSURE(cond) ((void) (cond))
|
||||
#define ENSURE_ERR(cond) ((void) (cond))
|
||||
#endif /* CHECK_ENSURE */
|
||||
|
||||
#if CHECK_INSIST != 0
|
||||
#define INSIST(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_insist, \
|
||||
#cond, 0), 0)))
|
||||
#define INSIST_ERR(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_insist, \
|
||||
#cond, 1), 0)))
|
||||
#else
|
||||
#define INSIST(cond) ((void) (cond))
|
||||
#define INSIST_ERR(cond) ((void) (cond))
|
||||
#endif /* CHECK_INSIST */
|
||||
|
||||
#if CHECK_INVARIANT != 0
|
||||
#define INVARIANT(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_invariant, \
|
||||
#cond, 0), 0)))
|
||||
#define INVARIANT_ERR(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_invariant, \
|
||||
#cond, 1), 0)))
|
||||
#else
|
||||
#define INVARIANT(cond) ((void) (cond))
|
||||
#define INVARIANT_ERR(cond) ((void) (cond))
|
||||
#endif /* CHECK_INVARIANT */
|
||||
|
||||
#endif /* ASSERTIONS_H */
|
|
@ -0,0 +1,192 @@
|
|||
/* $NetBSD: dst.h,v 1.1.1.1 2004/05/20 19:49:41 christos Exp $ */
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef DST_H
|
||||
#define DST_H
|
||||
|
||||
#ifndef HAS_DST_KEY
|
||||
typedef struct dst_key {
|
||||
char *dk_key_name; /* name of the key */
|
||||
int dk_key_size; /* this is the size of the key in bits */
|
||||
int dk_proto; /* what protocols this key can be used for */
|
||||
int dk_alg; /* algorithm number from key record */
|
||||
u_int32_t dk_flags; /* and the flags of the public key */
|
||||
u_int16_t dk_id; /* identifier of the key */
|
||||
} DST_KEY;
|
||||
#endif /* HAS_DST_KEY */
|
||||
|
||||
/*
|
||||
* do not taint namespace
|
||||
*/
|
||||
#define dst_bsafe_init __dst_bsafe_init
|
||||
#define dst_buffer_to_key __dst_buffer_to_key
|
||||
#define dst_check_algorithm __dst_check_algorithm
|
||||
#define dst_compare_keys __dst_compare_keys
|
||||
#define dst_cylink_init __dst_cylink_init
|
||||
#define dst_dnskey_to_key __dst_dnskey_to_key
|
||||
#define dst_eay_dss_init __dst_eay_dss_init
|
||||
#define dst_free_key __dst_free_key
|
||||
#define dst_generate_key __dst_generate_key
|
||||
#define dst_hmac_md5_init __dst_hmac_md5_init
|
||||
#define dst_init __dst_init
|
||||
#define dst_key_to_buffer __dst_key_to_buffer
|
||||
#define dst_key_to_dnskey __dst_key_to_dnskey
|
||||
#define dst_read_key __dst_read_key
|
||||
#define dst_rsaref_init __dst_rsaref_init
|
||||
#define dst_s_build_filename __dst_s_build_filename
|
||||
#define dst_s_calculate_bits __dst_s_calculate_bits
|
||||
#define dst_s_conv_bignum_b64_to_u8 __dst_s_conv_bignum_b64_to_u8
|
||||
#define dst_s_conv_bignum_u8_to_b64 __dst_s_conv_bignum_u8_to_b64
|
||||
#define dst_s_dns_key_id __dst_s_dns_key_id
|
||||
#define dst_s_dump __dst_s_dump
|
||||
#define dst_s_filename_length __dst_s_filename_length
|
||||
#define dst_s_fopen __dst_s_fopen
|
||||
#define dst_s_get_int16 __dst_s_get_int16
|
||||
#define dst_s_get_int32 __dst_s_get_int32
|
||||
#define dst_s_id_calc __dst_s_id_calc
|
||||
#define dst_s_put_int16 __dst_s_put_int16
|
||||
#define dst_s_put_int32 __dst_s_put_int32
|
||||
#define dst_s_quick_random __dst_s_quick_random
|
||||
#define dst_s_quick_random_set __dst_s_quick_random_set
|
||||
#define dst_s_random __dst_s_random
|
||||
#define dst_s_semi_random __dst_s_semi_random
|
||||
#define dst_s_verify_str __dst_s_verify_str
|
||||
#define dst_sig_size __dst_sig_size
|
||||
#define dst_sign_data __dst_sign_data
|
||||
#define dst_verify_data __dst_verify_data
|
||||
#define dst_write_key __dst_write_key
|
||||
|
||||
/*
|
||||
* DST Crypto API defintions
|
||||
*/
|
||||
void dst_init(void);
|
||||
int dst_check_algorithm(const int);
|
||||
|
||||
int dst_sign_data(const int, /* specifies INIT/UPDATE/FINAL/ALL */
|
||||
DST_KEY *, /* the key to use */
|
||||
void **, /* pointer to state structure */
|
||||
const u_char *, /* data to be signed */
|
||||
const int, /* length of input data */
|
||||
u_char *, /* buffer to write signature to */
|
||||
const int); /* size of output buffer */
|
||||
|
||||
int dst_verify_data(const int, /* specifies INIT/UPDATE/FINAL/ALL */
|
||||
DST_KEY *, /* the key to use */
|
||||
void **, /* pointer to state structure */
|
||||
const u_char *, /* data to be verified */
|
||||
const int, /* length of input data */
|
||||
const u_char *, /* buffer containing signature */
|
||||
const int); /* length of signature */
|
||||
|
||||
|
||||
DST_KEY *dst_read_key(const char *, /* name of key */
|
||||
const u_int16_t, /* key tag identifier */
|
||||
const int, /* key algorithm */
|
||||
const int); /* Private/PublicKey wanted*/
|
||||
|
||||
int dst_write_key(const DST_KEY *, /* key to write out */
|
||||
const int); /* Public/Private */
|
||||
|
||||
DST_KEY *dst_dnskey_to_key(const char *, /* KEY record name */
|
||||
const u_char *, /* KEY RDATA */
|
||||
const int); /* size of input buffer*/
|
||||
|
||||
|
||||
int dst_key_to_dnskey(const DST_KEY *, /* key to translate */
|
||||
u_char *, /* output buffer */
|
||||
const int); /* size of out_storage*/
|
||||
|
||||
|
||||
DST_KEY *dst_buffer_to_key(const char *, /* name of the key */
|
||||
const int, /* algorithm */
|
||||
const int, /* dns flags */
|
||||
const int, /* dns protocol */
|
||||
const u_char *, /* key in dns wire fmt */
|
||||
const int); /* size of key */
|
||||
|
||||
|
||||
int dst_key_to_buffer(DST_KEY *, u_char *, int);
|
||||
|
||||
DST_KEY *dst_generate_key(const char *, /* name of new key */
|
||||
const int, /* key algorithm to generate */
|
||||
const int, /* size of new key */
|
||||
const int, /* alg dependent parameter*/
|
||||
const int, /* key DNS flags */
|
||||
const int); /* key DNS protocol */
|
||||
|
||||
DST_KEY *dst_free_key(DST_KEY *);
|
||||
int dst_compare_keys(const DST_KEY *, const DST_KEY *);
|
||||
|
||||
int dst_sig_size(DST_KEY *);
|
||||
|
||||
|
||||
/* support for dns key tags/ids */
|
||||
u_int16_t dst_s_dns_key_id(const u_char *, const int);
|
||||
u_int16_t dst_s_id_calc(const u_char *, const int);
|
||||
|
||||
/* Used by callers as well as by the library. */
|
||||
#define RAW_KEY_SIZE 8192 /* large enough to store any key */
|
||||
|
||||
/* DST_API control flags */
|
||||
/* These are used used in functions dst_sign_data and dst_verify_data */
|
||||
#define SIG_MODE_INIT 1 /* initialize digest */
|
||||
#define SIG_MODE_UPDATE 2 /* add data to digest */
|
||||
#define SIG_MODE_FINAL 4 /* generate/verify signature */
|
||||
#define SIG_MODE_ALL (SIG_MODE_INIT|SIG_MODE_UPDATE|SIG_MODE_FINAL)
|
||||
|
||||
/* Flags for dst_read_private_key() */
|
||||
#define DST_FORCE_READ 0x1000000
|
||||
#define DST_CAN_SIGN 0x010F
|
||||
#define DST_NO_AUTHEN 0x8000
|
||||
#define DST_EXTEND_FLAG 0x1000
|
||||
#define DST_STANDARD 0
|
||||
#define DST_PRIVATE 0x2000000
|
||||
#define DST_PUBLIC 0x4000000
|
||||
#define DST_RAND_SEMI 1
|
||||
#define DST_RAND_STD 2
|
||||
#define DST_RAND_KEY 3
|
||||
#define DST_RAND_DSS 4
|
||||
|
||||
|
||||
/* DST algorithm codes */
|
||||
#define KEY_RSA 1
|
||||
#define KEY_DH 2
|
||||
#define KEY_DSA 3
|
||||
#define KEY_PRIVATE 254
|
||||
#define KEY_EXPAND 255
|
||||
#define KEY_HMAC_MD5 157
|
||||
#define KEY_HMAC_SHA1 158
|
||||
#define UNKNOWN_KEYALG 0
|
||||
#define DST_MAX_ALGS KEY_HMAC_SHA1
|
||||
|
||||
/* DST constants to locations in KEY record changes in new KEY record */
|
||||
#define DST_FLAGS_SIZE 2
|
||||
#define DST_KEY_PROT 2
|
||||
#define DST_KEY_ALG 3
|
||||
#define DST_EXT_FLAG 4
|
||||
#define DST_KEY_START 4
|
||||
|
||||
#ifndef SIGN_F_NOKEY
|
||||
#define SIGN_F_NOKEY 0xC000
|
||||
#endif
|
||||
|
||||
/* error codes from dst routines */
|
||||
#define SIGN_INIT_FAILURE (-23)
|
||||
#define SIGN_UPDATE_FAILURE (-24)
|
||||
#define SIGN_FINAL_FAILURE (-25)
|
||||
#define VERIFY_INIT_FAILURE (-26)
|
||||
#define VERIFY_UPDATE_FAILURE (-27)
|
||||
#define VERIFY_FINAL_FAILURE (-28)
|
||||
#define MISSING_KEY_OR_SIGNATURE (-30)
|
||||
#define UNSUPPORTED_KEYALG (-31)
|
||||
|
||||
#endif /* DST_H */
|
|
@ -0,0 +1,328 @@
|
|||
/* $NetBSD: ev_streams.c,v 1.2 2004/05/20 19:52:31 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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]
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if !defined(LINT) && !defined(CODECENTER) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ev_streams.c,v 1.2.206.2 2004/03/17 00:29:51 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ev_streams.c,v 1.2 2004/05/20 19:52:31 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "eventlib.h"
|
||||
#include "eventlib_p.h"
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef _LIBC
|
||||
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);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef _LIBC
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,522 @@
|
|||
/* $NetBSD: ev_timers.c,v 1.2 2004/05/20 19:52:31 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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]
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if !defined(LINT) && !defined(CODECENTER) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ev_timers.c,v 1.2.2.1.4.5 2004/03/17 02:39:13 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ev_timers.c,v 1.2 2004/05/20 19:52:31 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "assertions.h"
|
||||
#include "eventlib.h"
|
||||
#include "eventlib_p.h"
|
||||
|
||||
/* Constants. */
|
||||
|
||||
#define MILLION 1000000
|
||||
#define BILLION 1000000000
|
||||
|
||||
/* Forward. */
|
||||
|
||||
#ifndef _LIBC
|
||||
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;
|
||||
#endif
|
||||
|
||||
/* 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(0L, 0L));
|
||||
return (evTimeSpec(now));
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
struct timespec
|
||||
evUTCTime(void) {
|
||||
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(0L, 0L));
|
||||
return (evTimeSpec(now));
|
||||
}
|
||||
|
||||
#ifndef _LIBC
|
||||
struct timespec
|
||||
evLastEventTime(evContext opaqueCtx) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
|
||||
return (ctx->lastEventTime);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct timespec
|
||||
evTimeSpec(struct timeval tv) {
|
||||
struct timespec ts;
|
||||
|
||||
ts.tv_sec = tv.tv_sec;
|
||||
ts.tv_nsec = tv.tv_usec * 1000;
|
||||
return (ts);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
struct timeval
|
||||
evTimeVal(struct timespec ts) {
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = ts.tv_sec;
|
||||
tv.tv_usec = ts.tv_nsec / 1000;
|
||||
return (tv);
|
||||
}
|
||||
|
||||
#ifndef _LIBC
|
||||
int
|
||||
evSetTimer(evContext opaqueCtx,
|
||||
evTimerFunc func,
|
||||
void *uap,
|
||||
struct timespec due,
|
||||
struct timespec inter,
|
||||
evTimerID *opaqueID
|
||||
) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evTimer *id;
|
||||
|
||||
printf("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) {
|
||||
printf("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) {
|
||||
printf("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) {
|
||||
printf("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) {
|
||||
printf("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 idx) {
|
||||
evTimer *timer;
|
||||
|
||||
timer = what;
|
||||
timer->index = idx;
|
||||
}
|
||||
|
||||
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(0L, 0L);
|
||||
FREE(this);
|
||||
} else {
|
||||
/* evDrop() will reschedule the timer. */
|
||||
this->timer->inter = evSubTime(this->max_idle, idle);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,214 @@
|
|||
/* $NetBSD: eventlib.h,v 1.1.1.3 2005/12/21 23:15:22 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#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*/
|
|
@ -0,0 +1,243 @@
|
|||
/* $NetBSD: eventlib_p.h,v 1.1.1.1 2004/05/20 19:34:32 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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_p.h - private interfaces for eventlib
|
||||
* vix 09sep95 [initial]
|
||||
*
|
||||
* Id: eventlib_p.h,v 1.3.2.1.4.1 2004/03/09 08:33:43 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#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 "heap.h"
|
||||
#include "list.h"
|
||||
#include "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
|
||||
|
||||
|
||||
#if HAVE_MEM_GET_SET
|
||||
#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
|
||||
|
||||
#else
|
||||
|
||||
#define NEW(p) p = malloc(sizeof *(p));
|
||||
#define OKNEW(p) if (!((p) = malloc(sizeof *(p)))) { errno = ENOMEM; return (-1); }
|
||||
#define FREE(p) free(p)
|
||||
#define FILL(p)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
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;
|
||||
socklen_t lalen;
|
||||
union {
|
||||
struct sockaddr sa;
|
||||
struct sockaddr_in in;
|
||||
#ifndef NO_SOCKADDR_UN
|
||||
struct sockaddr_un un;
|
||||
#endif
|
||||
} ra;
|
||||
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;
|
||||
|
||||
typedef struct {
|
||||
/* Global. */
|
||||
const evEvent_p *cur;
|
||||
/* Debugging. */
|
||||
int debug;
|
||||
FILE *output;
|
||||
/* Connections. */
|
||||
evConn *conns;
|
||||
LIST(evAccept) accepts;
|
||||
/* Files. */
|
||||
evFile *files, *fdNext;
|
||||
fd_set rdLast, rdNext;
|
||||
fd_set wrLast, wrNext;
|
||||
fd_set exLast, exNext;
|
||||
fd_set nonblockBefore;
|
||||
int fdMax, fdCount, highestFD;
|
||||
evFile *fdTable[FD_SETSIZE];
|
||||
#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, ...);
|
||||
|
||||
/* 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 */
|
||||
int __evOptMonoTime;
|
||||
|
||||
#endif /*_EVENTLIB_P_H*/
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,59 @@
|
|||
/* $NetBSD: heap.h,v 1.1.1.1 2004/05/20 19:49:41 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
typedef int (*heap_higher_priority_func)(void *, void *);
|
||||
typedef void (*heap_index_func)(void *, int);
|
||||
typedef void (*heap_for_each_func)(void *, void *);
|
||||
|
||||
typedef struct heap_context {
|
||||
int array_size;
|
||||
int array_size_increment;
|
||||
int heap_size;
|
||||
void **heap;
|
||||
heap_higher_priority_func higher_priority;
|
||||
heap_index_func index;
|
||||
} *heap_context;
|
||||
|
||||
#define heap_new __heap_new
|
||||
#define heap_free __heap_free
|
||||
#define heap_insert __heap_insert
|
||||
#define heap_delete __heap_delete
|
||||
#define heap_increased __heap_increased
|
||||
#define heap_decreased __heap_decreased
|
||||
#define heap_element __heap_element
|
||||
#define heap_for_each __heap_for_each
|
||||
|
||||
heap_context heap_new(heap_higher_priority_func, heap_index_func, int);
|
||||
int heap_free(heap_context);
|
||||
int heap_insert(heap_context, void *);
|
||||
int heap_delete(heap_context, int);
|
||||
int heap_increased(heap_context, int);
|
||||
int heap_decreased(heap_context, int);
|
||||
void * heap_element(heap_context, int);
|
||||
int heap_for_each(heap_context, heap_for_each_func, void *);
|
|
@ -0,0 +1,124 @@
|
|||
/* $NetBSD: list.h,v 1.2 2004/05/20 19:51:55 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef LIST_H
|
||||
#define LIST_H 1
|
||||
#include "assertions.h"
|
||||
|
||||
#define LIST(type) struct { type *head, *tail; }
|
||||
#define INIT_LIST(list) \
|
||||
do { (list).head = NULL; (list).tail = NULL; } while (/*CONSTCOND*/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 (/*CONSTCOND*/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 (/*CONSTCOND*/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 (/*CONSTCOND*/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 (/*CONSTCOND*/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 (/*CONSTCOND*/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 (/*CONSTCOND*/0)
|
||||
|
||||
#define ENQUEUE(list, elt, link) APPEND(list, elt, link)
|
||||
#define DEQUEUE(list, elt, link) UNLINK(list, elt, link)
|
||||
|
||||
#endif /* LIST_H */
|
|
@ -0,0 +1,61 @@
|
|||
/* $NetBSD: memcluster.h,v 1.1.1.1 2004/05/20 19:49:41 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef MEMCLUSTER_H
|
||||
#define MEMCLUSTER_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define meminit __meminit
|
||||
#ifdef MEMCLUSTER_DEBUG
|
||||
#define memget(s) __memget_debug(s, __FILE__, __LINE__)
|
||||
#define memput(p, s) __memput_debug(p, s, __FILE__, __LINE__)
|
||||
#else /*MEMCLUSTER_DEBUG*/
|
||||
#ifdef MEMCLUSTER_RECORD
|
||||
#define memget(s) __memget_record(s, __FILE__, __LINE__)
|
||||
#define memput(p, s) __memput_record(p, s, __FILE__, __LINE__)
|
||||
#else /*MEMCLUSTER_RECORD*/
|
||||
#define memget __memget
|
||||
#define memput __memput
|
||||
#endif /*MEMCLUSTER_RECORD*/
|
||||
#endif /*MEMCLUSTER_DEBUG*/
|
||||
#define memstats __memstats
|
||||
#define memactive __memactive
|
||||
|
||||
int meminit(size_t, size_t);
|
||||
void * __memget(size_t);
|
||||
void __memput(void *, size_t);
|
||||
void * __memget_debug(size_t, const char *, int);
|
||||
void __memput_debug(void *, size_t, const char *, int);
|
||||
void * __memget_record(size_t, const char *, int);
|
||||
void __memput_record(void *, size_t, const char *, int);
|
||||
void memstats(FILE *);
|
||||
int memactive(void);
|
||||
|
||||
#endif /* MEMCLUSTER_H */
|
|
@ -0,0 +1,987 @@
|
|||
/* $NetBSD: ns_name.c,v 1.3 2004/11/07 02:19:49 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_name.c,v 1.3.2.4.4.2 2004/05/04 03:27:47 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_name.c,v 1.3 2004/11/07 02:19:49 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
#include <errno.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.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 (; 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);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
/*
|
||||
* 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 (; l > 0; l--) {
|
||||
c = *cp++;
|
||||
if (isupper(c))
|
||||
*dn++ = tolower(c);
|
||||
else
|
||||
*dn++ = c;
|
||||
}
|
||||
}
|
||||
*dn++ = '\0';
|
||||
return (dn - dst);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 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, (size_t)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++)
|
||||
;
|
||||
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++ = ((u_int32_t)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, (size_t)(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, (int)dstsiz, dnptrs, lastdnptr));
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
/*
|
||||
* 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++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 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 (; 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",
|
||||
(((u_int32_t)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);
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
/* $NetBSD: ns_netint.c,v 1.2 2004/05/20 20:19:00 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_netint.c,v 1.1.206.1 2004/03/09 08:33:44 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_netint.c,v 1.2 2004/05/20 20:19:00 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
/* Public. */
|
||||
|
||||
u_int16_t
|
||||
ns_get16(const u_char *src) {
|
||||
u_int dst;
|
||||
|
||||
NS_GET16(dst, src);
|
||||
return (dst);
|
||||
}
|
||||
|
||||
u_int32_t
|
||||
ns_get32(const u_char *src) {
|
||||
u_long dst;
|
||||
|
||||
NS_GET32(dst, src);
|
||||
return (dst);
|
||||
}
|
||||
|
||||
void
|
||||
ns_put16(u_int16_t src, u_char *dst) {
|
||||
NS_PUT16(src, dst);
|
||||
}
|
||||
|
||||
void
|
||||
ns_put32(u_int32_t src, u_char *dst) {
|
||||
NS_PUT32(src, dst);
|
||||
}
|
|
@ -0,0 +1,222 @@
|
|||
/* $NetBSD: ns_parse.c,v 1.2 2004/05/20 20:35:05 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_parse.c,v 1.3.2.1.4.1 2004/03/09 08:33:44 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_parse.c,v 1.2 2004/05/20 20:35:05 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
#include <errno.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
/* Forward. */
|
||||
|
||||
static void setsection(ns_msg *msg, ns_sect sect);
|
||||
|
||||
/* Macros. */
|
||||
|
||||
#define RETERR(err) do { errno = (err); return (-1); } while (/*NOTREACHED*//*CONSTCOND*/0)
|
||||
|
||||
/* Public. */
|
||||
|
||||
/* These need to be in the same order as the nres.h:ns_flag enum. */
|
||||
const 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((u_int32_t)((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 (; 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;
|
||||
|
||||
/* Make section right. */
|
||||
if ((unsigned)section >= (unsigned)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];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,928 @@
|
|||
/* $NetBSD: ns_print.c,v 1.5 2004/11/07 02:19:49 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_print.c,v 1.3.2.1.4.5 2004/07/28 20:16:45 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_print.c,v 1.5 2004/11/07 02:19:49 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "assertions.h"
|
||||
#include "dst.h"
|
||||
#include <errno.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(x,y) ((x)<(y)?(x):(y))
|
||||
#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 (/*CONSTCOND*/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", (size_t)3, &buf, &buflen));
|
||||
} else {
|
||||
len = prune_origin(name, origin);
|
||||
if (*name == '\0') {
|
||||
goto root;
|
||||
} else if (len == 0) {
|
||||
T(addstr("@\t\t\t", (size_t)4, &buf, &buflen));
|
||||
} else {
|
||||
T(addstr(name, (size_t)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(".", (size_t)1, &buf, &buflen));
|
||||
len++;
|
||||
}
|
||||
T(spaced = addtab((size_t)len, 24, spaced, &buf, &buflen));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TTL, Class, Type.
|
||||
*/
|
||||
T(x = ns_format_ttl(ttl, buf, buflen));
|
||||
addlen((size_t)x, &buf, &buflen);
|
||||
len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
T(spaced = addtab((size_t)(x + len), (size_t)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(" ", (size_t)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(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Administrator name. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
T(addstr(" (\n", (size_t)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", (size_t)5, &buf, &buflen));
|
||||
len = SPRINTF((tmp, "%lu", t));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; serial\n", (size_t)9, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
/* Refresh interval. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
T(len = ns_format_ttl(t, buf, buflen));
|
||||
addlen((size_t)len, &buf, &buflen);
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; refresh\n", (size_t)10, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
/* Retry interval. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
T(len = ns_format_ttl(t, buf, buflen));
|
||||
addlen((size_t)len, &buf, &buflen);
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; retry\n", (size_t)8, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
/* Expiry. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
T(len = ns_format_ttl(t, buf, buflen));
|
||||
addlen((size_t)len, &buf, &buflen);
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; expiry\n", (size_t)9, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
/* Minimum TTL. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
T(len = ns_format_ttl(t, buf, buflen));
|
||||
addlen((size_t)len, &buf, &buflen);
|
||||
T(addstr(" )", (size_t)2, &buf, &buflen));
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; minimum\n", (size_t)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, (size_t)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, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Name1. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
T(addstr(" ", (size_t)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(" ", (size_t)1, &buf, &buflen));
|
||||
}
|
||||
break;
|
||||
|
||||
case ns_t_nsap: {
|
||||
char t[2+255*3];
|
||||
|
||||
(void) inet_nsap_ntoa((int)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, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Flags. */
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Service. */
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
T(addstr(" ", (size_t)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(" ", (size_t)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, (size_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(" ", (size_t)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, (size_t)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", (size_t)5,
|
||||
&buf, &buflen));
|
||||
lcnt = 10;
|
||||
spaced = 0;
|
||||
}
|
||||
len = SPRINTF((tmp, "%d ", n));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
lcnt--;
|
||||
}
|
||||
c <<= 1;
|
||||
} while (++n & 07);
|
||||
}
|
||||
T(addstr(")", (size_t)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. */
|
||||
#if !defined(MOZILLA_NECKO_EXCLUDE_CODE) && !defined(_LIBC)
|
||||
key_id = dst_s_dns_key_id(rdata, edata-rdata);
|
||||
#else
|
||||
key_id = 0;
|
||||
#endif
|
||||
keyflags = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
protocol = *rdata++;
|
||||
algorithm = *rdata++;
|
||||
len = SPRINTF((tmp, "0x%04x %u %u",
|
||||
keyflags, protocol, algorithm));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Public key data. */
|
||||
len = b64_ntop(rdata, (size_t)(edata - rdata),
|
||||
base64_key, sizeof base64_key);
|
||||
if (len < 0)
|
||||
goto formerr;
|
||||
if (len > 15) {
|
||||
T(addstr(" (", (size_t)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, (size_t)MIN(len - n, 48),
|
||||
&buf, &buflen));
|
||||
}
|
||||
if (len > 15)
|
||||
T(addstr(" )", (size_t)2, &buf, &buflen));
|
||||
n = SPRINTF((tmp, " ; key_tag= %u", key_id));
|
||||
T(addstr(tmp, (size_t)n, &buf, &buflen));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_sig: {
|
||||
char base64_key[NS_MD5RSA_MAX_BASE64];
|
||||
u_int typ, algorithm, labels, footprint;
|
||||
const char *leader;
|
||||
u_long t;
|
||||
int n;
|
||||
|
||||
if (rdlen < 22U)
|
||||
goto formerr;
|
||||
|
||||
/* Type covered, Algorithm, Label count, Original TTL. */
|
||||
typ = 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((int)typ), algorithm, labels, t));
|
||||
T(addstr(tmp, (size_t)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, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Time signed. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
len = SPRINTF((tmp, "%s ", p_secstodate(t)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Signature Footprint. */
|
||||
footprint = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
len = SPRINTF((tmp, "%u ", footprint));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Signer's name. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
|
||||
/* Signature. */
|
||||
len = b64_ntop(rdata, (size_t)(edata - rdata),
|
||||
base64_key, sizeof base64_key);
|
||||
if (len > 15) {
|
||||
T(addstr(" (", (size_t)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, (size_t)MIN(len - n, 48),
|
||||
&buf, &buflen));
|
||||
}
|
||||
if (len > 15)
|
||||
T(addstr(" )", (size_t)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, (size_t)len, &buf, &buflen));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_cert: {
|
||||
u_int c_type, key_tag, alg;
|
||||
int n;
|
||||
unsigned int siz;
|
||||
char base64_cert[8192], tmp1[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((tmp1, "%d %d %d ", c_type, key_tag, alg));
|
||||
T(addstr(tmp1, (size_t)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, (size_t)(edata-rdata),
|
||||
base64_cert, siz);
|
||||
|
||||
if (len < 0)
|
||||
goto formerr;
|
||||
else if (len > 15) {
|
||||
T(addstr(" (", (size_t)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, (size_t)MIN(len - n, 48),
|
||||
&buf, &buflen));
|
||||
}
|
||||
if (len > 15)
|
||||
T(addstr(" )", (size_t)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(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Inception. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
len = SPRINTF((tmp, "%s ", p_secstodate(t)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Experation. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
len = SPRINTF((tmp, "%s ", p_secstodate(t)));
|
||||
T(addstr(tmp, (size_t)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, (size_t)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(" ", (size_t)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, (size_t)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(" ", (size_t)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, (size_t)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, "\\# %tu%s\t; %s", edata - rdata,
|
||||
rdlen != 0 ? " (" : "", comment));
|
||||
T(addstr(tmp, (size_t)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, (size_t)(p - tmp), &buf, &buflen));
|
||||
if (n < 16) {
|
||||
T(addstr(")", (size_t)1, &buf, &buflen));
|
||||
T(addtab((size_t)(p - tmp + 1), (size_t)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, (size_t)(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("\"", (size_t)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("\\", (size_t)1, buf, buflen) < 0)
|
||||
goto enospc;
|
||||
if (addstr((const char *)rdata, (size_t)1,
|
||||
buf, buflen) < 0)
|
||||
goto enospc;
|
||||
rdata++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addstr("\"", (size_t)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, (int)*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) {
|
||||
assert(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(" ", (size_t)2, buf, buflen));
|
||||
spaced = 1;
|
||||
} else {
|
||||
for (t = (target - len - 1) / 8; t >= 0; t--)
|
||||
if (addstr("\t", (size_t)1, buf, buflen) < 0) {
|
||||
*buflen = save_buflen;
|
||||
*buf = save_buf;
|
||||
return (-1);
|
||||
}
|
||||
spaced = 0;
|
||||
}
|
||||
return (spaced);
|
||||
}
|
|
@ -0,0 +1,226 @@
|
|||
/* $NetBSD: ns_samedomain.c,v 1.2 2004/05/20 20:35:05 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_samedomain.c,v 1.1.2.2.4.2 2004/03/16 12:34:17 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_samedomain.c,v 1.2 2004/05/20 20:35:05 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef _LIBC
|
||||
/*
|
||||
* 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));
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
|
@ -0,0 +1,179 @@
|
|||
/* $NetBSD: ns_ttl.c,v 1.2 2004/05/20 20:35:05 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_ttl.c,v 1.1.206.1 2004/03/09 08:33:45 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_ttl.c,v 1.2 2004/05/20 20:35:05 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.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) do { if ((x) < 0) return (-1); } while(0)
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef _LIBC
|
||||
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; /*FALLTHROUGH*/
|
||||
case 'D': tmp *= 24; /*FALLTHROUGH*/
|
||||
case 'H': tmp *= 60; /*FALLTHROUGH*/
|
||||
case 'M': tmp *= 60; /*FALLTHROUGH*/
|
||||
case 'S': break;
|
||||
default: goto einval;
|
||||
}
|
||||
ttl += tmp;
|
||||
tmp = 0;
|
||||
digits = 0;
|
||||
dirty = 1;
|
||||
}
|
||||
if (digits > 0) {
|
||||
if (dirty)
|
||||
goto einval;
|
||||
else
|
||||
ttl += tmp;
|
||||
}
|
||||
*dst = ttl;
|
||||
return (0);
|
||||
|
||||
einval:
|
||||
errno = EINVAL;
|
||||
return (-1);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* 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);
|
||||
}
|
|
@ -0,0 +1,282 @@
|
|||
/* $NetBSD: res_comp.c,v 1.6 2004/05/22 23:47:09 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#ifdef notdef
|
||||
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.1 2004/03/09 08:33:54 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: res_comp.c,v 1.6 2004/05/22 23:47:09 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <ctype.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.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.
|
||||
*/
|
||||
|
||||
/* BIONIC: We also accept underscores in the middle of labels.
|
||||
* This extension is needed to make resolution on some VPN networks
|
||||
* work properly.
|
||||
*/
|
||||
|
||||
#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 underscorechar(c) ((c) == 0x5f)
|
||||
|
||||
#define borderchar(c) (alphachar(c) || digitchar(c))
|
||||
#define middlechar(c) (borderchar(c) || hyphenchar(c) || underscorechar(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)) {
|
||||
;
|
||||
} 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);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
#endif
|
||||
|
||||
#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.
|
||||
*/
|
||||
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*/
|
|
@ -0,0 +1,348 @@
|
|||
/* $NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: res_data.c,v 1.1.206.2 2004/03/16 12:34:18 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
|
||||
|
||||
#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_private.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
const char * const _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 * const _res_sectioncodes[] = {
|
||||
"ZONE",
|
||||
"PREREQUISITES",
|
||||
"UPDATE",
|
||||
"ADDITIONAL",
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef __BIND_NOSTATIC
|
||||
extern struct __res_state _nres;
|
||||
|
||||
/* Proto. */
|
||||
|
||||
int res_ourserver_p(const res_state, const struct sockaddr *);
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
int res_need_init() {
|
||||
return ((_nres.options & RES_INIT) == 0U) || res_get_dns_changed();
|
||||
}
|
||||
#else
|
||||
#define res_need_init() ((_nres.options & RES_INIT) == 0U)
|
||||
#endif
|
||||
|
||||
int
|
||||
res_init(void) {
|
||||
int rv;
|
||||
extern int __res_vinit(res_state, int);
|
||||
#ifdef COMPAT__RES
|
||||
/*
|
||||
* Compatibility with program that were accessing _res directly
|
||||
* to set options. We keep another struct res that is the same
|
||||
* size as the original res structure, and then copy fields to
|
||||
* it so that we achieve the same initialization
|
||||
*/
|
||||
extern void *__res_get_old_state(void);
|
||||
extern void __res_put_old_state(void *);
|
||||
res_state ores = __res_get_old_state();
|
||||
|
||||
if (ores->options != 0)
|
||||
_nres.options = ores->options;
|
||||
if (ores->retrans != 0)
|
||||
_nres.retrans = ores->retrans;
|
||||
if (ores->retry != 0)
|
||||
_nres.retry = ores->retry;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* _nres.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 (!_nres.retrans)
|
||||
_nres.retrans = RES_TIMEOUT;
|
||||
if (!_nres.retry)
|
||||
_nres.retry = 4;
|
||||
if (!(_nres.options & RES_INIT))
|
||||
_nres.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 (!_nres.id)
|
||||
_nres.id = res_randomid();
|
||||
|
||||
rv = __res_vinit(&_nres, 1);
|
||||
#ifdef COMPAT__RES
|
||||
__res_put_old_state(&_nres);
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
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_need_init() && res_init() == -1)
|
||||
return;
|
||||
|
||||
res_pquery(&_nres, 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_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
return (res_nmkquery(&_nres, op, dname, class, type,
|
||||
data, datalen,
|
||||
newrr_in, buf, buflen));
|
||||
}
|
||||
|
||||
#ifdef _LIBRESOLV
|
||||
int
|
||||
res_mkupdate(ns_updrec *rrecp_in, u_char *buf, int buflen) {
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nmkupdate(&_nres, rrecp_in, buf, buflen));
|
||||
}
|
||||
#endif
|
||||
|
||||
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_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
return (res_nquery(&_nres, name, class, type, answer, anslen));
|
||||
}
|
||||
|
||||
void
|
||||
res_send_setqhook(res_send_qhook hook) {
|
||||
_nres.qhook = hook;
|
||||
}
|
||||
|
||||
void
|
||||
res_send_setrhook(res_send_rhook hook) {
|
||||
_nres.rhook = hook;
|
||||
}
|
||||
|
||||
int
|
||||
res_isourserver(const struct sockaddr_in *inp) {
|
||||
return (res_ourserver_p(&_nres, (const struct sockaddr *)(const void *)inp));
|
||||
}
|
||||
|
||||
int
|
||||
res_send(const u_char *buf, int buflen, u_char *ans, int anssiz) {
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
/* errno should have been set by res_init() in this case. */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nsend(&_nres, buf, buflen, ans, anssiz));
|
||||
}
|
||||
|
||||
#ifdef _LIBRESOLV
|
||||
int
|
||||
res_sendsigned(const u_char *buf, int buflen, ns_tsig_key *key,
|
||||
u_char *ans, int anssiz)
|
||||
{
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
/* errno should have been set by res_init() in this case. */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nsendsigned(&_nres, buf, buflen, key, ans, anssiz));
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
res_close(void) {
|
||||
res_nclose(&_nres);
|
||||
}
|
||||
|
||||
#ifdef _LIBRESOLV
|
||||
int
|
||||
res_update(ns_updrec *rrecp_in) {
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nupdate(&_nres, rrecp_in, NULL));
|
||||
}
|
||||
#endif
|
||||
|
||||
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_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nsearch(&_nres, 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_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nquerydomain(&_nres, name, domain,
|
||||
class, type,
|
||||
answer, anslen));
|
||||
}
|
||||
|
||||
int
|
||||
res_opt(int a, u_char *b, int c, int d)
|
||||
{
|
||||
return res_nopt(&_nres, a, b, c, d);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
const char *
|
||||
hostalias(const char *name) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifdef ultrix
|
||||
int
|
||||
local_hostname_length(const char *hostname) {
|
||||
int len_host, len_domain;
|
||||
|
||||
if (!*_nres.defdname)
|
||||
res_init();
|
||||
len_host = strlen(hostname);
|
||||
len_domain = strlen(_nres.defdname);
|
||||
if (len_host > len_domain &&
|
||||
!strcasecmp(hostname + len_host - len_domain, _nres.defdname) &&
|
||||
hostname[len_host - len_domain - 1] == '.')
|
||||
return (len_host - len_domain - 1);
|
||||
return (0);
|
||||
}
|
||||
#endif /*ultrix*/
|
||||
#endif
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,46 @@
|
|||
/* $NetBSD: res_debug.h,v 1.1.1.1 2004/05/20 17:18:55 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#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_ */
|
|
@ -0,0 +1,915 @@
|
|||
/* $NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $ */
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLE_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#ifdef notdef
|
||||
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.2 2004/03/16 12:34:18 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
|
||||
|
||||
#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>
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include <sys/system_properties.h>
|
||||
#endif /* ANDROID_CHANGES */
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(x,y) ((x)<(y)?(x):(y))
|
||||
#endif
|
||||
|
||||
/* ensure that sockaddr_in6 and IN6ADDR_ANY_INIT are declared / defined */
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#define MAX_DNS_PROPERTIES 8
|
||||
#define DNS_PROP_NAME_PREFIX "net.dns"
|
||||
#define DNS_CHANGE_PROP_NAME "net.dnschange"
|
||||
#define DNS_SEARCH_PROP_NAME "net.dns.search"
|
||||
const prop_info *dns_change_prop;
|
||||
int dns_last_change_counter;
|
||||
static int _get_dns_change_count();
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
|
||||
#include "res_private.h"
|
||||
|
||||
/* Options. Should all be left alone. */
|
||||
#ifndef DEBUG
|
||||
#define DEBUG
|
||||
#endif
|
||||
|
||||
static void res_setoptions __P((res_state, const char *, const char *));
|
||||
|
||||
static const char sort_mask[] = "/&";
|
||||
#define ISSORTMASK(ch) (strchr(sort_mask, ch) != NULL)
|
||||
static u_int32_t net_mask __P((struct in_addr));
|
||||
|
||||
#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));
|
||||
}
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
int load_domain_search_list(res_state statp) {
|
||||
char propvalue[PROP_VALUE_MAX];
|
||||
register char *cp, **pp;
|
||||
|
||||
if(__system_property_get(DNS_SEARCH_PROP_NAME, propvalue) >= 1) {
|
||||
strlcpy(statp->defdname, propvalue, sizeof(statp->defdname));
|
||||
if ((cp = strchr(statp->defdname, '\n')) != NULL)
|
||||
*cp = '\0';
|
||||
cp = statp->defdname;
|
||||
pp = statp->dnsrch;
|
||||
while ( pp < statp->dnsrch + MAXDNSRCH ) {
|
||||
while (*cp == ' ' || *cp == '\t') /* skip leading white space */
|
||||
cp++;
|
||||
if (*cp == '\0') /* stop if nothing more */
|
||||
break;
|
||||
*pp++ = cp; /* record this search domain */
|
||||
while (*cp) { /* zero-terminate it */
|
||||
if (*cp == ' ' || *cp == '\t') {
|
||||
*cp++ = '\0';
|
||||
break;
|
||||
}
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
*pp = NULL; /* statp->dnsrch has MAXDNSRCH+1 items */
|
||||
if (pp > statp->dnsrch)
|
||||
return 1;
|
||||
}
|
||||
statp->defdname[0] = '\0'; /* no default domain name on Android */
|
||||
statp->dnsrch[0] = NULL;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function has to be reachable by res_data.c but not publicly. */
|
||||
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;
|
||||
int nsort = 0;
|
||||
char *net;
|
||||
int dots;
|
||||
union res_sockaddr_union u[2];
|
||||
#ifdef ANDROID_CHANGES
|
||||
pid_t mypid = getpid();
|
||||
int use_proc_props = 0;
|
||||
int found_prop;
|
||||
char dnsProperty[PROP_VALUE_MAX];
|
||||
#endif
|
||||
|
||||
if (!preinit) {
|
||||
statp->retrans = RES_TIMEOUT;
|
||||
statp->retry = RES_DFLRETRY;
|
||||
statp->options = RES_DEFAULT;
|
||||
statp->id = res_randomid();
|
||||
}
|
||||
|
||||
if ((statp->options & RES_INIT) != 0U)
|
||||
res_ndestroy(statp);
|
||||
|
||||
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");
|
||||
}
|
||||
statp->nsort = 0;
|
||||
res_setservers(statp, u, nserv);
|
||||
|
||||
#if 0 /* IGNORE THE ENVIRONMENT */
|
||||
/* 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;
|
||||
}
|
||||
if (nserv > 0)
|
||||
statp->nscount = nserv;
|
||||
#endif
|
||||
#ifdef ANDROID_CHANGES /* READ FROM SYSTEM PROPERTIES */
|
||||
dns_last_change_counter = _get_dns_change_count();
|
||||
|
||||
nserv = 0;
|
||||
for(n = 1; n <= MAX_DNS_PROPERTIES && nserv < MAXNS; n++) {
|
||||
char propname[PROP_NAME_MAX];
|
||||
char propvalue[PROP_VALUE_MAX];
|
||||
|
||||
struct addrinfo hints, *ai;
|
||||
char sbuf[NI_MAXSERV];
|
||||
const size_t minsiz = sizeof(statp->_u._ext.ext->nsaddrs[0]);
|
||||
|
||||
/*
|
||||
* Check first for process-specific properties, and if those don't
|
||||
* exist, try the generic properties.
|
||||
*/
|
||||
found_prop = 0;
|
||||
if (n == 1 || use_proc_props) {
|
||||
snprintf(propname, sizeof(propname), "%s%d.%d", DNS_PROP_NAME_PREFIX, n, mypid);
|
||||
if(__system_property_get(propname, propvalue) < 1) {
|
||||
if (use_proc_props) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
found_prop = 1;
|
||||
use_proc_props = 1;
|
||||
}
|
||||
}
|
||||
if (!found_prop) {
|
||||
snprintf(propname, sizeof(propname), "%s%d", DNS_PROP_NAME_PREFIX, n);
|
||||
if(__system_property_get(propname, propvalue) < 1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cp = propvalue;
|
||||
|
||||
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 &&
|
||||
(size_t)ai->ai_addrlen <= minsiz) {
|
||||
if (statp->_u._ext.ext != NULL) {
|
||||
memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
|
||||
ai->ai_addr, ai->ai_addrlen);
|
||||
}
|
||||
if ((size_t)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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the domain search list */
|
||||
havesearch = load_domain_search_list(statp);
|
||||
#else /* !ANDROID_CHANGES - IGNORE resolv.conf in Android */
|
||||
#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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
if (MATCH(buf, "options")) {
|
||||
res_setoptions(statp, buf + sizeof("options") - 1, "conf");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (nserv > 0)
|
||||
statp->nscount = nserv;
|
||||
statp->nsort = nsort;
|
||||
(void) fclose(fp);
|
||||
}
|
||||
#endif /* !ANDROID_CHANGES */
|
||||
/*
|
||||
* 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");
|
||||
if (nserv > 0) {
|
||||
statp->nscount = nserv;
|
||||
statp->options |= RES_INIT;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
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
|
||||
} 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, (size_t)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, (size_t)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++;
|
||||
}
|
||||
}
|
||||
|
||||
/* 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));
|
||||
}
|
||||
|
||||
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);
|
||||
#ifdef notdef
|
||||
else
|
||||
statp->nsaddr_list[nserv].sin_family = 0;
|
||||
#endif
|
||||
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);
|
||||
}
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
static int _get_dns_change_count()
|
||||
{
|
||||
if (dns_change_prop == NULL) {
|
||||
dns_change_prop = __system_property_find(DNS_CHANGE_PROP_NAME);
|
||||
}
|
||||
if (dns_change_prop != NULL) {
|
||||
char propvalue[PROP_VALUE_MAX];
|
||||
if (__system_property_read(dns_change_prop, NULL, propvalue) >= 1) {
|
||||
return atoi(propvalue);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int res_get_dns_changed()
|
||||
{
|
||||
int change_count;
|
||||
|
||||
change_count = _get_dns_change_count();
|
||||
if (change_count != dns_last_change_counter) {
|
||||
if (change_count != -1) {
|
||||
dns_last_change_counter = change_count;
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif /* ANDROID_CHANGES */
|
|
@ -0,0 +1,289 @@
|
|||
/* $NetBSD: res_mkquery.c,v 1.6 2006/01/24 17:40:32 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Android Open Source Project (query id randomization)
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#ifdef notdef
|
||||
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";
|
||||
#else
|
||||
__RCSID("$NetBSD: res_mkquery.c,v 1.6 2006/01/24 17:40:32 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <netdb.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/* Options. Leave them on. */
|
||||
#ifndef DEBUG
|
||||
#define DEBUG
|
||||
#endif
|
||||
|
||||
#ifndef lint
|
||||
#define UNUSED(a) (void)&a
|
||||
#else
|
||||
#define UNUSED(a) a = a
|
||||
#endif
|
||||
|
||||
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 *)(void *)buf;
|
||||
hp->id = htons(res_randomid());
|
||||
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, (size_t)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 *)(void *)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
|
|
@ -0,0 +1,32 @@
|
|||
/* $NetBSD: res_private.h,v 1.1.1.1 2004/05/20 17:18:54 christos Exp $ */
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#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
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,211 @@
|
|||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
|
||||
* COPYRIGHT OWNER 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <netdb.h>
|
||||
#include "resolv_private.h"
|
||||
#include "resolv_cache.h"
|
||||
#include <pthread.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
|
||||
#include <sys/_system_properties.h>
|
||||
|
||||
static pthread_key_t _res_key;
|
||||
static pthread_once_t _res_once;
|
||||
|
||||
typedef struct {
|
||||
int _h_errno;
|
||||
struct __res_state _nres[1];
|
||||
unsigned _serial;
|
||||
struct prop_info* _pi;
|
||||
struct res_static _rstatic[1];
|
||||
} _res_thread;
|
||||
|
||||
static _res_thread*
|
||||
_res_thread_alloc(void)
|
||||
{
|
||||
_res_thread* rt = malloc(sizeof(*rt));
|
||||
|
||||
if (rt) {
|
||||
rt->_h_errno = 0;
|
||||
/* Special system property which tracks any changes to 'net.*'. */
|
||||
rt->_serial = 0;
|
||||
rt->_pi = (struct prop_info*) __system_property_find("net.change");
|
||||
if (rt->_pi) {
|
||||
rt->_serial = rt->_pi->serial;
|
||||
}
|
||||
if ( res_ninit( rt->_nres ) < 0 ) {
|
||||
free(rt);
|
||||
rt = NULL;
|
||||
} else {
|
||||
memset(rt->_rstatic, 0, sizeof rt->_rstatic);
|
||||
}
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
|
||||
static void
|
||||
_res_static_done( res_static rs )
|
||||
{
|
||||
/* fortunately, there is nothing to do here, since the
|
||||
* points in h_addr_ptrs and host_aliases should all
|
||||
* point to 'hostbuf'
|
||||
*/
|
||||
if (rs->hostf) { /* should not happen in theory, but just be safe */
|
||||
fclose(rs->hostf);
|
||||
rs->hostf = NULL;
|
||||
}
|
||||
free(rs->servent.s_aliases);
|
||||
}
|
||||
|
||||
static void
|
||||
_res_thread_free( void* _rt )
|
||||
{
|
||||
_res_thread* rt = _rt;
|
||||
|
||||
_res_static_done(rt->_rstatic);
|
||||
res_ndestroy(rt->_nres);
|
||||
free(rt);
|
||||
}
|
||||
|
||||
static void
|
||||
_res_init_key( void )
|
||||
{
|
||||
pthread_key_create( &_res_key, _res_thread_free );
|
||||
}
|
||||
|
||||
static _res_thread*
|
||||
_res_thread_get(void)
|
||||
{
|
||||
_res_thread* rt;
|
||||
pthread_once( &_res_once, _res_init_key );
|
||||
rt = pthread_getspecific( _res_key );
|
||||
if (rt == NULL) {
|
||||
if ((rt = _res_thread_alloc()) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
rt->_h_errno = 0;
|
||||
rt->_serial = 0;
|
||||
pthread_setspecific( _res_key, rt );
|
||||
}
|
||||
/* Check the serial value for any chanes to net.* properties. */
|
||||
if (rt->_pi == NULL) {
|
||||
rt->_pi = (struct prop_info*) __system_property_find("net.change");
|
||||
}
|
||||
if (rt->_pi == NULL || rt->_serial == rt->_pi->serial) {
|
||||
return rt;
|
||||
}
|
||||
rt->_serial = rt->_pi->serial;
|
||||
/* Reload from system properties. */
|
||||
if ( res_ninit( rt->_nres ) < 0 ) {
|
||||
free(rt);
|
||||
rt = NULL;
|
||||
pthread_setspecific( _res_key, rt );
|
||||
}
|
||||
#ifdef USE_RESOLV_CACHE
|
||||
_resolv_cache_reset(rt->_serial);
|
||||
#endif
|
||||
return rt;
|
||||
}
|
||||
|
||||
struct __res_state _nres;
|
||||
|
||||
#if 0
|
||||
struct resolv_cache*
|
||||
__get_res_cache(void)
|
||||
{
|
||||
_res_thread* rt = _res_thread_get();
|
||||
|
||||
if (!rt)
|
||||
return NULL;
|
||||
|
||||
if (!rt->_cache) {
|
||||
rt->_cache = _resolv_cache_create();
|
||||
}
|
||||
return rt->_cache;
|
||||
}
|
||||
#endif
|
||||
|
||||
int*
|
||||
__get_h_errno(void)
|
||||
{
|
||||
_res_thread* rt = _res_thread_get();
|
||||
static int panic = NETDB_INTERNAL;
|
||||
|
||||
return rt ? &rt->_h_errno : &panic;
|
||||
}
|
||||
|
||||
res_state
|
||||
__res_get_state(void)
|
||||
{
|
||||
_res_thread* rt = _res_thread_get();
|
||||
|
||||
return rt ? rt->_nres : NULL;
|
||||
}
|
||||
|
||||
void
|
||||
__res_put_state(res_state res)
|
||||
{
|
||||
/* nothing to do */
|
||||
res=res;
|
||||
}
|
||||
|
||||
res_static
|
||||
__res_get_static(void)
|
||||
{
|
||||
_res_thread* rt = _res_thread_get();
|
||||
|
||||
return rt ? rt->_rstatic : NULL;
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
|
||||
* COPYRIGHT OWNER 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _RESOLV_CACHE_H_
|
||||
#define _RESOLV_CACHE_H_
|
||||
|
||||
struct resolv_cache; /* forward */
|
||||
|
||||
/* get cache instance, can be NULL if cache is disabled
|
||||
* (e.g. through an environment variable) */
|
||||
extern struct resolv_cache* __get_res_cache(void);
|
||||
|
||||
/* this gets called everytime we detect some changes in the DNS configuration
|
||||
* and will flush the cache */
|
||||
extern void _resolv_cache_reset( unsigned generation );
|
||||
|
||||
typedef enum {
|
||||
RESOLV_CACHE_UNSUPPORTED, /* the cache can't handle that kind of queries */
|
||||
/* or the answer buffer is too small */
|
||||
RESOLV_CACHE_NOTFOUND, /* the cache doesn't know about this query */
|
||||
RESOLV_CACHE_FOUND /* the cache found the answer */
|
||||
} ResolvCacheStatus;
|
||||
|
||||
extern ResolvCacheStatus
|
||||
_resolv_cache_lookup( struct resolv_cache* cache,
|
||||
const void* query,
|
||||
int querylen,
|
||||
void* answer,
|
||||
int answersize,
|
||||
int *answerlen );
|
||||
|
||||
/* add a (query,answer) to the cache, only call if _resolv_cache_lookup
|
||||
* did return RESOLV_CACHE_NOTFOUND
|
||||
*/
|
||||
extern void
|
||||
_resolv_cache_add( struct resolv_cache* cache,
|
||||
const void* query,
|
||||
int querylen,
|
||||
const void* answer,
|
||||
int answerlen );
|
||||
|
||||
#endif /* _RESOLV_CACHE_H_ */
|
|
@ -0,0 +1,509 @@
|
|||
/* $NetBSD: resolv.h,v 1.31 2005/12/26 19:01:47 perry Exp $ */
|
||||
|
||||
/*
|
||||
* 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. 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.2 2004/06/25 00:41:05 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _RESOLV_PRIVATE_H_
|
||||
#define _RESOLV_PRIVATE_H_
|
||||
|
||||
#include <resolv.h>
|
||||
#include "resolv_static.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 = (r)->res_h_errno = (x))
|
||||
struct __res_state; /* forward */
|
||||
|
||||
/*
|
||||
* 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
|
||||
#ifdef ANDROID_CHANGES
|
||||
#define _PATH_RESCONF "/etc/ppp/resolv.conf"
|
||||
#else
|
||||
#define _PATH_RESCONF "/etc/resolv.conf"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
|
||||
res_sendhookact;
|
||||
|
||||
typedef res_sendhookact (*res_send_qhook)(struct sockaddr * const *,
|
||||
const u_char **, int *,
|
||||
u_char *, int, int *);
|
||||
|
||||
typedef res_sendhookact (*res_send_rhook)(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;
|
||||
uint32_t mask;
|
||||
} sort_list[MAXRESOLVSORT];
|
||||
#ifdef __OLD_RES_STATE
|
||||
char lookups[4];
|
||||
#else
|
||||
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 {
|
||||
uint16_t nscount;
|
||||
uint16_t nstimes[MAXNS]; /* ms. */
|
||||
int nssocks[MAXNS];
|
||||
struct __res_state_ext *ext; /* extention for IPv6 */
|
||||
} _ext;
|
||||
} _u;
|
||||
#endif
|
||||
struct res_static rstatic[1];
|
||||
};
|
||||
|
||||
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. */
|
||||
__BEGIN_DECLS
|
||||
extern struct __res_state *__res_get_state(void);
|
||||
extern void __res_put_state(struct __res_state *);
|
||||
|
||||
#ifndef ANDROID_CHANGES
|
||||
/*
|
||||
* Source and Binary compatibility; _res will not work properly
|
||||
* with multi-threaded programs.
|
||||
*/
|
||||
extern struct __res_state *__res_state(void);
|
||||
#define _res (*__res_state())
|
||||
#endif
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#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_opt __res_opt
|
||||
#define res_isourserver __res_isourserver
|
||||
#define res_querydomain __res_querydomain
|
||||
#define res_send __res_send
|
||||
#define res_sendsigned __res_sendsigned
|
||||
|
||||
#ifdef BIND_RES_POSIX3
|
||||
#define dn_expand __dn_expand
|
||||
#define res_init __res_init
|
||||
#define res_query __res_query
|
||||
#define res_search __res_search
|
||||
#define res_mkquery __res_mkquery
|
||||
#endif
|
||||
|
||||
__BEGIN_DECLS
|
||||
void fp_nquery(const u_char *, int, FILE *);
|
||||
void fp_query(const u_char *, FILE *);
|
||||
const char * hostalias(const char *);
|
||||
void p_query(const u_char *);
|
||||
void res_close(void);
|
||||
int res_init(void);
|
||||
int res_opt(int, u_char *, int, int);
|
||||
int res_isourserver(const struct sockaddr_in *);
|
||||
int res_mkquery(int, const char *, int, int, const u_char *, int, const u_char *, u_char *, int);
|
||||
int res_query(const char *, int, int, u_char *, int);
|
||||
int res_querydomain(const char *, const char *, int, int, u_char *, int);
|
||||
int res_search(const char *, int, int, u_char *, int);
|
||||
int res_send(const u_char *, int, u_char *, int);
|
||||
int res_sendsigned(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 */
|
||||
|
||||
#ifndef ADNROID_CHANGES
|
||||
#define b64_ntop __b64_ntop
|
||||
#define b64_pton __b64_pton
|
||||
#endif
|
||||
|
||||
#define dn_comp __dn_comp
|
||||
#define dn_count_labels __dn_count_labels
|
||||
#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(const char *);
|
||||
int res_ownok(const char *);
|
||||
int res_mailok(const char *);
|
||||
int res_dnok(const char *);
|
||||
int sym_ston(const struct res_sym *, const char *, int *);
|
||||
const char * sym_ntos(const struct res_sym *, int, int *);
|
||||
const char * sym_ntop(const struct res_sym *, int, int *);
|
||||
#ifndef ANDROID_CHANGES
|
||||
int b64_ntop(u_char const *, size_t, char *, size_t);
|
||||
int b64_pton(char const *, u_char *, size_t);
|
||||
#endif
|
||||
int loc_aton(const char *, u_char *);
|
||||
const char * loc_ntoa(const u_char *, char *);
|
||||
int dn_skipname(const u_char *, const u_char *);
|
||||
void putlong(uint32_t, u_char *);
|
||||
void putshort(uint16_t, u_char *);
|
||||
#ifndef __ultrix__
|
||||
uint16_t _getshort(const u_char *);
|
||||
uint32_t _getlong(const u_char *);
|
||||
#endif
|
||||
const char * p_class(int);
|
||||
const char * p_time(uint32_t);
|
||||
const char * p_type(int);
|
||||
const char * p_rcode(int);
|
||||
const char * p_sockun(union res_sockaddr_union, char *, size_t);
|
||||
const u_char * p_cdnname(const u_char *, const u_char *, int, FILE *);
|
||||
const u_char * p_cdname(const u_char *, const u_char *, FILE *);
|
||||
const u_char * p_fqnname(const u_char *, const u_char *,
|
||||
int, char *, int);
|
||||
const u_char * p_fqname(const u_char *, const u_char *, FILE *);
|
||||
const char * p_option(u_long);
|
||||
char * p_secstodate(u_long);
|
||||
int dn_count_labels(const char *);
|
||||
int dn_comp(const char *, u_char *, int, u_char **, u_char **);
|
||||
int dn_expand(const u_char *, const u_char *, const u_char *,
|
||||
char *, int);
|
||||
u_int res_randomid(void);
|
||||
int res_nameinquery(const char *, int, int, const u_char *,
|
||||
const u_char *);
|
||||
int res_queriesmatch(const u_char *, const u_char *,
|
||||
const u_char *, const u_char *);
|
||||
const char * p_section(int, int);
|
||||
/* Things involving a resolver context. */
|
||||
int res_ninit(res_state);
|
||||
int res_nisourserver(const res_state, const struct sockaddr_in *);
|
||||
void fp_resstat(const res_state, FILE *);
|
||||
void res_pquery(const res_state, const u_char *, int, FILE *);
|
||||
const char * res_hostalias(const res_state, const char *, char *, size_t);
|
||||
int res_nquery(res_state, const char *, int, int, u_char *, int);
|
||||
int res_nsearch(res_state, const char *, int, int, u_char *, int);
|
||||
int res_nquerydomain(res_state, const char *, const char *,
|
||||
int, int, u_char *, int);
|
||||
int res_nmkquery(res_state, int, const char *, int, int,
|
||||
const u_char *, int, const u_char *,
|
||||
u_char *, int);
|
||||
int res_nsend(res_state, const u_char *, int, u_char *, int);
|
||||
int res_nsendsigned(res_state, const u_char *, int,
|
||||
ns_tsig_key *, u_char *, int);
|
||||
int res_findzonecut(res_state, const char *, ns_class, int,
|
||||
char *, size_t, struct in_addr *, int);
|
||||
int res_findzonecut2(res_state, const char *, ns_class, int,
|
||||
char *, size_t,
|
||||
union res_sockaddr_union *, int);
|
||||
void res_nclose(res_state);
|
||||
int res_nopt(res_state, int, u_char *, int, int);
|
||||
void res_send_setqhook(res_send_qhook);
|
||||
void res_send_setrhook(res_send_rhook);
|
||||
int __res_vinit(res_state, int);
|
||||
void res_destroyservicelist(void);
|
||||
const char * res_servicename(uint16_t, const char *);
|
||||
const char * res_protocolname(int);
|
||||
void res_destroyprotolist(void);
|
||||
void res_buildprotolist(void);
|
||||
const char * res_get_nibblesuffix(res_state);
|
||||
const char * res_get_nibblesuffix2(res_state);
|
||||
void res_ndestroy(res_state);
|
||||
uint16_t res_nametoclass(const char *, int *);
|
||||
uint16_t res_nametotype(const char *, int *);
|
||||
void res_setservers(res_state,
|
||||
const union res_sockaddr_union *, int);
|
||||
int res_getservers(res_state,
|
||||
union res_sockaddr_union *, int);
|
||||
|
||||
int res_get_dns_changed();
|
||||
u_int res_randomid(void);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* !_RESOLV_PRIVATE_H_ */
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _RESOLV_STATIC_H
|
||||
#define _RESOLV_STATIC_H
|
||||
|
||||
#include <netdb.h>
|
||||
|
||||
/* this structure contains all the variables that were declared
|
||||
* 'static' in the original NetBSD resolver code.
|
||||
*
|
||||
* this caused vast amounts of crashes and memory corruptions
|
||||
* when the resolver was being used by multiple threads.
|
||||
*
|
||||
* (note: the OpenBSD/FreeBSD resolver has similar 'issues')
|
||||
*/
|
||||
|
||||
#define MAXALIASES 35
|
||||
#define MAXADDRS 35
|
||||
|
||||
typedef struct res_static {
|
||||
char* h_addr_ptrs[MAXADDRS + 1];
|
||||
char* host_aliases[MAXALIASES];
|
||||
char hostbuf[8*1024];
|
||||
u_int32_t host_addr[16 / sizeof(u_int32_t)]; /* IPv4 or IPv6 */
|
||||
FILE* hostf;
|
||||
int stayopen;
|
||||
const char* servent_ptr;
|
||||
struct servent servent;
|
||||
struct hostent host;
|
||||
} *res_static;
|
||||
|
||||
extern res_static __res_get_static(void);
|
||||
|
||||
#endif /* _RESOLV_STATIC_H */
|
|
@ -51,6 +51,10 @@
|
|||
|
||||
#ifdef MOZ_WIDGET_ANDROID
|
||||
#include "AndroidBridge.h"
|
||||
|
||||
extern "C" {
|
||||
extern int android_sdk_version;
|
||||
}
|
||||
#endif
|
||||
|
||||
using namespace mozilla;
|
||||
|
@ -184,6 +188,7 @@ nsSystemInfo::Init()
|
|||
PRInt32 version;
|
||||
if (!mozilla::AndroidBridge::Bridge()->GetStaticIntField("android/os/Build$VERSION", "SDK_INT", &version))
|
||||
version = 0;
|
||||
android_sdk_version = version;
|
||||
if (version >= 8 && mozilla::AndroidBridge::Bridge()->GetStaticStringField("android/os/Build", "HARDWARE", str))
|
||||
SetPropertyAsAString(NS_LITERAL_STRING("hardware"), str);
|
||||
SetPropertyAsAString(NS_LITERAL_STRING("shellName"), NS_LITERAL_STRING("Android"));
|
||||
|
|
Загрузка…
Ссылка в новой задаче