diff --git a/configure.in b/configure.in index 4d88c3922791..2d83ad14ee0c 100644 --- a/configure.in +++ b/configure.in @@ -7070,7 +7070,7 @@ dnl We need to wrap dlopen and related functions on Android because we use dnl our own linker. if test "$OS_TARGET" = Android; then WRAP_LDFLAGS="${WRAP_LDFLAGS} -L$_objdir/dist/lib -lmozutils" - WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=dlopen,--wrap=dlclose,--wrap=dlerror,--wrap=dlsym,--wrap=dladdr,--wrap=getaddrinfo,--wrap=freeaddrinfo,--wrap=gai_strerror" + WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=dlopen,--wrap=dlclose,--wrap=dlerror,--wrap=dlsym,--wrap=dladdr" fi dnl ======================================================== diff --git a/other-licenses/android/001-remove-dns-proxy-lookaside.patch b/other-licenses/android/001-remove-dns-proxy-lookaside.patch deleted file mode 100644 index 157b200abbba..000000000000 --- a/other-licenses/android/001-remove-dns-proxy-lookaside.patch +++ /dev/null @@ -1,209 +0,0 @@ -diff --git a/other-licenses/android/getaddrinfo.c b/other-licenses/android/getaddrinfo.c ---- a/other-licenses/android/getaddrinfo.c -+++ b/other-licenses/android/getaddrinfo.c -@@ -398,191 +398,6 @@ _have_ipv4() { - return _test_connect(PF_INET, &addr.generic, sizeof(addr.in)); - } - --// Returns 0 on success, else returns non-zero on error (in which case --// getaddrinfo should continue as normal) --static int --android_getaddrinfo_proxy( -- const char *hostname, const char *servname, -- const struct addrinfo *hints, struct addrinfo **res) --{ -- int sock; -- const int one = 1; -- struct sockaddr_un proxy_addr; -- const char* cache_mode = getenv("ANDROID_DNS_MODE"); -- FILE* proxy = NULL; -- int success = 0; -- -- // Clear this at start, as we use its non-NULLness later (in the -- // error path) to decide if we have to free up any memory we -- // allocated in the process (before failing). -- *res = NULL; -- -- if (cache_mode != NULL && strcmp(cache_mode, "local") == 0) { -- // Don't use the proxy in local mode. This is used by the -- // proxy itself. -- return -1; -- } -- -- // Temporary cautious hack to disable the DNS proxy for processes -- // requesting special treatment. Ideally the DNS proxy should -- // accomodate these apps, though. -- char propname[PROP_NAME_MAX]; -- char propvalue[PROP_VALUE_MAX]; -- snprintf(propname, sizeof(propname), "net.dns1.%d", getpid()); -- if (__system_property_get(propname, propvalue) > 0) { -- return -1; -- } -- -- // Bogus things we can't serialize. Don't use the proxy. -- if ((hostname != NULL && -- strcspn(hostname, " \n\r\t^'\"") != strlen(hostname)) || -- (servname != NULL && -- strcspn(servname, " \n\r\t^'\"") != strlen(servname))) { -- return -1; -- } -- -- sock = socket(AF_UNIX, SOCK_STREAM, 0); -- if (sock < 0) { -- return -1; -- } -- -- setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); -- memset(&proxy_addr, 0, sizeof(proxy_addr)); -- proxy_addr.sun_family = AF_UNIX; -- strlcpy(proxy_addr.sun_path, "/dev/socket/dnsproxyd", -- sizeof(proxy_addr.sun_path)); -- if (TEMP_FAILURE_RETRY(connect(sock, -- (const struct sockaddr*) &proxy_addr, -- sizeof(proxy_addr))) != 0) { -- close(sock); -- return -1; -- } -- -- // Send the request. -- proxy = fdopen(sock, "r+"); -- if (fprintf(proxy, "getaddrinfo %s %s %d %d %d %d", -- hostname == NULL ? "^" : hostname, -- servname == NULL ? "^" : servname, -- hints == NULL ? -1 : hints->ai_flags, -- hints == NULL ? -1 : hints->ai_family, -- hints == NULL ? -1 : hints->ai_socktype, -- hints == NULL ? -1 : hints->ai_protocol) < 0) { -- goto exit; -- } -- // literal NULL byte at end, required by FrameworkListener -- if (fputc(0, proxy) == EOF || -- fflush(proxy) != 0) { -- goto exit; -- } -- -- int remote_rv; -- if (fread(&remote_rv, sizeof(int), 1, proxy) != 1) { -- goto exit; -- } -- -- if (remote_rv != 0) { -- goto exit; -- } -- -- struct addrinfo* ai = NULL; -- struct addrinfo** nextres = res; -- while (1) { -- uint32_t addrinfo_len; -- if (fread(&addrinfo_len, sizeof(addrinfo_len), -- 1, proxy) != 1) { -- break; -- } -- addrinfo_len = ntohl(addrinfo_len); -- if (addrinfo_len == 0) { -- success = 1; -- break; -- } -- -- if (addrinfo_len < sizeof(struct addrinfo)) { -- break; -- } -- struct addrinfo* ai = calloc(1, addrinfo_len + -- sizeof(struct sockaddr_storage)); -- if (ai == NULL) { -- break; -- } -- -- if (fread(ai, addrinfo_len, 1, proxy) != 1) { -- // Error; fall through. -- break; -- } -- -- // Zero out the pointer fields we copied which aren't -- // valid in this address space. -- ai->ai_addr = NULL; -- ai->ai_canonname = NULL; -- ai->ai_next = NULL; -- -- // struct sockaddr -- uint32_t addr_len; -- if (fread(&addr_len, sizeof(addr_len), 1, proxy) != 1) { -- break; -- } -- addr_len = ntohl(addr_len); -- if (addr_len != 0) { -- if (addr_len > sizeof(struct sockaddr_storage)) { -- // Bogus; too big. -- break; -- } -- struct sockaddr* addr = (struct sockaddr*)(ai + 1); -- if (fread(addr, addr_len, 1, proxy) != 1) { -- break; -- } -- ai->ai_addr = addr; -- } -- -- // cannonname -- uint32_t name_len; -- if (fread(&name_len, sizeof(name_len), 1, proxy) != 1) { -- break; -- } -- name_len = ntohl(name_len); -- if (name_len != 0) { -- ai->ai_canonname = (char*) malloc(name_len); -- if (fread(ai->ai_canonname, name_len, 1, proxy) != 1) { -- break; -- } -- if (ai->ai_canonname[name_len - 1] != '\0') { -- // The proxy should be returning this -- // NULL-terminated. -- break; -- } -- } -- -- *nextres = ai; -- nextres = &ai->ai_next; -- ai = NULL; -- } -- -- if (ai != NULL) { -- // Clean up partially-built addrinfo that we never ended up -- // attaching to the response. -- freeaddrinfo(ai); -- } --exit: -- if (proxy != NULL) { -- fclose(proxy); -- } -- -- if (success) { -- return 0; -- } -- -- // Proxy failed; fall through to local -- // resolver case. But first clean up any -- // memory we might've allocated. -- if (*res) { -- freeaddrinfo(*res); -- *res = NULL; -- } -- return -1; --} -- - int - getaddrinfo(const char *hostname, const char *servname, - const struct addrinfo *hints, struct addrinfo **res) -@@ -729,13 +544,6 @@ getaddrinfo(const char *hostname, const - if (pai->ai_flags & AI_NUMERICHOST) - ERR(EAI_NONAME); - -- /* -- * BEGIN ANDROID CHANGES; proxying to the cache -- */ -- if (android_getaddrinfo_proxy(hostname, servname, hints, res) == 0) { -- return 0; -- } -- - /* - * hostname as alphabetical name. - * we would like to prefer AF_INET6 than AF_INET, so we'll make a diff --git a/other-licenses/android/002-replace-stdio-with-mmap.patch b/other-licenses/android/002-replace-stdio-with-mmap.patch deleted file mode 100644 index 77e0d0102057..000000000000 --- a/other-licenses/android/002-replace-stdio-with-mmap.patch +++ /dev/null @@ -1,357 +0,0 @@ -diff --git a/other-licenses/android/getaddrinfo.c b/other-licenses/android/getaddrinfo.c ---- a/other-licenses/android/getaddrinfo.c -+++ b/other-licenses/android/getaddrinfo.c -@@ -31,6 +31,16 @@ - */ - - /* -+ * This version of getaddrinfo.c 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 ). -+ * These changes are offered under the same license as the original NetBSD -+ * file, whose copyright and license are unchanged above. -+ */ -+#define ANDROID_CHANGES 1 -+ -+/* - * Issues to be discussed: - * - Thread safe-ness must be checked. - * - Return values. There are nonstandard return values defined and used -@@ -84,6 +94,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -94,7 +105,6 @@ - #include - #include "resolv_private.h" - #include --#include - #include - #include - #include -@@ -103,10 +113,95 @@ - #include - #include "nsswitch.h" - -+#ifdef MOZ_GETADDRINFO_LOG_VERBOSE -+#include -+#endif -+ - #ifdef ANDROID_CHANGES - #include - #endif /* ANDROID_CHANGES */ - -+typedef struct _pseudo_FILE { -+ int fd; -+ off_t maplen; -+ void* mapping; -+ off_t offset; -+} _pseudo_FILE; -+ -+#define _PSEUDO_FILE_INITIALIZER { -1, 0, MAP_FAILED, 0 } -+ -+static void -+_pseudo_fclose(_pseudo_FILE * __restrict__ fp) -+{ -+ assert(fp); -+ fp->offset = 0; -+ if (fp->mapping != MAP_FAILED) { -+ (void) munmap(fp->mapping, fp->maplen); -+ fp->mapping = MAP_FAILED; -+ } -+ fp->maplen = 0; -+ if (fp->fd != -1) { -+ (void) close(fp->fd); -+ fp->fd = -1; -+ } -+} -+ -+static _pseudo_FILE * -+_pseudo_fopen_r(_pseudo_FILE * __restrict__ fp, const char* fname) -+{ -+ struct stat statbuf; -+ assert(fp); -+ fp->fd = open(fname, O_RDONLY); -+ if (fp->fd < 0) { -+ fp->fd = -1; -+ return NULL; -+ } -+ if ((0 != fstat(fp->fd, &statbuf)) || (statbuf.st_size <= 0)) { -+ close(fp->fd); -+ fp->fd = -1; -+ return NULL; -+ } -+ fp->maplen = statbuf.st_size; -+ fp->mapping = mmap(NULL, fp->maplen, PROT_READ, MAP_PRIVATE, fp->fd, 0); -+ if (fp->mapping == MAP_FAILED) { -+ close(fp->fd); -+ fp->fd = -1; -+ return NULL; -+ } -+ fp->offset = 0; -+ return fp; -+} -+ -+static void -+_pseudo_rewind(_pseudo_FILE * __restrict__ fp) -+{ -+ assert(fp); -+ fp->offset = 0; -+} -+ -+static char* -+_pseudo_fgets(char* buf, int bufsize, _pseudo_FILE * __restrict__ fp) -+{ -+ char* current; -+ char* endp; -+ int maxcopy; -+ assert(fp); -+ maxcopy = fp->maplen - fp->offset; -+ if (fp->mapping == MAP_FAILED) -+ return NULL; -+ if (maxcopy > bufsize - 1) -+ maxcopy = bufsize - 1; -+ if (maxcopy <= 0) -+ return NULL; -+ current = ((char*) fp->mapping) + fp->offset; -+ endp = memccpy(buf, current, '\n', maxcopy); -+ if (endp) -+ maxcopy = endp - buf; -+ buf[maxcopy] = '\0'; -+ fp->offset += maxcopy; -+ return buf; -+} -+ - typedef union sockaddr_union { - struct sockaddr generic; - struct sockaddr_in in; -@@ -231,9 +326,9 @@ static int ip6_str2scopeid(char *, struc - static struct addrinfo *getanswer(const querybuf *, int, const char *, int, - const struct addrinfo *); - static int _dns_getaddrinfo(void *, void *, va_list); --static void _sethtent(FILE **); --static void _endhtent(FILE **); --static struct addrinfo *_gethtent(FILE **, const char *, -+static void _sethtent(_pseudo_FILE * __restrict__); -+static void _endhtent(_pseudo_FILE * __restrict__); -+static struct addrinfo *_gethtent(_pseudo_FILE * __restrict__, const char *, - const struct addrinfo *); - static int _files_getaddrinfo(void *, void *, va_list); - -@@ -303,19 +398,52 @@ do { \ - #define MATCH(x, y, w) \ - ((x) == (y) || (/*CONSTCOND*/(w) && ((x) == ANY || (y) == ANY))) - -+#pragma GCC visibility push(default) -+ -+extern const char * -+__wrap_gai_strerror(int ecode); -+extern void -+__wrap_freeaddrinfo(struct addrinfo *ai); -+extern int -+__wrap_getaddrinfo(const char *hostname, const char *servname, -+ const struct addrinfo *hints, struct addrinfo **res); -+ -+int android_sdk_version; -+ -+#pragma GCC visibility pop -+ -+int android_sdk_version = -1; -+ -+static int honeycomb_or_later() -+{ -+#ifdef MOZ_GETADDRINFO_LOG_VERBOSE -+ __android_log_print(ANDROID_LOG_INFO, "getaddrinfo", -+ "I am%s Honeycomb\n", -+ (android_sdk_version >= 11) ? "" : " not"); -+#endif -+ return android_sdk_version >= 11; -+} -+ - const char * --gai_strerror(int ecode) -+__wrap_gai_strerror(int ecode) - { -+ if (honeycomb_or_later()) -+ return gai_strerror(ecode); - if (ecode < 0 || ecode > EAI_MAX) - ecode = EAI_MAX; - return ai_errlist[ecode]; - } - - void --freeaddrinfo(struct addrinfo *ai) -+__wrap_freeaddrinfo(struct addrinfo *ai) - { - struct addrinfo *next; - -+ if (honeycomb_or_later()) { -+ freeaddrinfo(ai); -+ return; -+ } -+ - assert(ai != NULL); - - do { -@@ -399,7 +527,7 @@ _have_ipv4() { - } - - int --getaddrinfo(const char *hostname, const char *servname, -+__wrap_getaddrinfo(const char *hostname, const char *servname, - const struct addrinfo *hints, struct addrinfo **res) - { - struct addrinfo sentinel; -@@ -410,6 +538,9 @@ getaddrinfo(const char *hostname, const - struct addrinfo *pai; - const struct explore *ex; - -+ if (honeycomb_or_later()) -+ return getaddrinfo(hostname, servname, hints, res); -+ - /* hostname is allowed to be NULL */ - /* servname is allowed to be NULL */ - /* hints is allowed to be NULL */ -@@ -594,7 +725,7 @@ getaddrinfo(const char *hostname, const - free: - bad: - if (sentinel.ai_next) -- freeaddrinfo(sentinel.ai_next); -+ __wrap_freeaddrinfo(sentinel.ai_next); - *res = NULL; - return error; - } -@@ -655,7 +786,7 @@ explore_fqdn(const struct addrinfo *pai, - - free: - if (result) -- freeaddrinfo(result); -+ __wrap_freeaddrinfo(result); - return error; - } - -@@ -723,7 +854,7 @@ explore_null(const struct addrinfo *pai, - - free: - if (sentinel.ai_next) -- freeaddrinfo(sentinel.ai_next); -+ __wrap_freeaddrinfo(sentinel.ai_next); - return error; - } - -@@ -810,7 +941,7 @@ explore_numeric(const struct addrinfo *p - free: - bad: - if (sentinel.ai_next) -- freeaddrinfo(sentinel.ai_next); -+ __wrap_freeaddrinfo(sentinel.ai_next); - return error; - } - -@@ -1373,8 +1504,6 @@ _get_label(const struct sockaddr *addr) - const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; - if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { - return 0; -- } else if (IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { -- return 1; - } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { - return 3; - } else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { -@@ -1414,8 +1543,6 @@ _get_precedence(const struct sockaddr *a - const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; - if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { - return 60; -- } else if (IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { -- return 50; - } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { - return 30; - } else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { -@@ -1804,27 +1931,24 @@ _dns_getaddrinfo(void *rv, void *cb_data - } - - static void --_sethtent(FILE **hostf) -+_sethtent(_pseudo_FILE * __restrict__ hostf) - { -- -- if (!*hostf) -- *hostf = fopen(_PATH_HOSTS, "r" ); -+ assert(hostf); -+ if (hostf->mapping == MAP_FAILED) -+ (void) _pseudo_fopen_r(hostf, _PATH_HOSTS); - else -- rewind(*hostf); -+ _pseudo_rewind(hostf); - } - - static void --_endhtent(FILE **hostf) -+_endhtent(_pseudo_FILE * __restrict__ hostf) - { -- -- if (*hostf) { -- (void) fclose(*hostf); -- *hostf = NULL; -- } -+ assert(hostf); -+ (void) _pseudo_fclose(hostf); - } - - static struct addrinfo * --_gethtent(FILE **hostf, const char *name, const struct addrinfo *pai) -+_gethtent(_pseudo_FILE * __restrict__ hostf, const char *name, const struct addrinfo *pai) - { - char *p; - char *cp, *tname, *cname; -@@ -1833,14 +1957,17 @@ _gethtent(FILE **hostf, const char *name - const char *addr; - char hostbuf[8*1024]; - -+ assert(hostf); - // fprintf(stderr, "_gethtent() name = '%s'\n", name); - assert(name != NULL); - assert(pai != NULL); - -- if (!*hostf && !(*hostf = fopen(_PATH_HOSTS, "r" ))) -+ if (hostf->mapping == MAP_FAILED) -+ (void) _pseudo_fopen_r(hostf, _PATH_HOSTS); -+ if (hostf->mapping == MAP_FAILED) - return (NULL); - again: -- if (!(p = fgets(hostbuf, sizeof hostbuf, *hostf))) -+ if (!(p = _pseudo_fgets(hostbuf, sizeof hostbuf, hostf))) - return (NULL); - if (*p == '#') - goto again; -@@ -1872,7 +1999,7 @@ _gethtent(FILE **hostf, const char *name - found: - hints = *pai; - hints.ai_flags = AI_NUMERICHOST; -- error = getaddrinfo(addr, NULL, &hints, &res0); -+ error = __wrap_getaddrinfo(addr, NULL, &hints, &res0); - if (error) - goto again; - for (res = res0; res; res = res->ai_next) { -@@ -1881,7 +2008,7 @@ found: - - if (pai->ai_flags & AI_CANONNAME) { - if (get_canonname(pai, res, cname) != 0) { -- freeaddrinfo(res0); -+ __wrap_freeaddrinfo(res0); - goto again; - } - } -@@ -1897,7 +2024,7 @@ _files_getaddrinfo(void *rv, void *cb_da - const struct addrinfo *pai; - struct addrinfo sentinel, *cur; - struct addrinfo *p; -- FILE *hostf = NULL; -+ _pseudo_FILE hostf = _PSEUDO_FILE_INITIALIZER; - - name = va_arg(ap, char *); - pai = va_arg(ap, struct addrinfo *); diff --git a/other-licenses/android/Makefile.in b/other-licenses/android/Makefile.in index b0ade51961e6..c14508221dde 100644 --- a/other-licenses/android/Makefile.in +++ b/other-licenses/android/Makefile.in @@ -71,7 +71,6 @@ CSRCS = \ ba.c \ debugger.c \ dlfcn.c \ - getaddrinfo.c \ linker.c \ linker_format.c \ rt.c \ diff --git a/other-licenses/android/arpa_nameser.h b/other-licenses/android/arpa_nameser.h deleted file mode 100644 index 438dc0496c7b..000000000000 --- a/other-licenses/android/arpa_nameser.h +++ /dev/null @@ -1,577 +0,0 @@ -/* $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 - */ - -#ifndef _ARPA_NAMESER_H_ -#define _ARPA_NAMESER_H_ - -#define BIND_4_COMPAT - -#include -#include - -/* - * 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 -# define XLOG(...) \ - __libc_android_log_print(ANDROID_LOG_DEBUG,"libc",__VA_ARGS__) -#else -#define XLOG(...) do {} while (0) -#endif - -#endif /* !_ARPA_NAMESER_H_ */ diff --git a/other-licenses/android/arpa_nameser_compat.h b/other-licenses/android/arpa_nameser_compat.h deleted file mode 100644 index 79bdfd096f51..000000000000 --- a/other-licenses/android/arpa_nameser_compat.h +++ /dev/null @@ -1,236 +0,0 @@ -/* $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 - */ - -#ifndef _ARPA_NAMESER_COMPAT_ -#define _ARPA_NAMESER_COMPAT_ - -#define __BIND 19950621 /* (DEAD) interface version stamp. */ - -#include - -#ifndef BYTE_ORDER -#if (BSD >= 199103) -# include -#else -#ifdef __linux -# include -#else -#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */ -#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */ -#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp)*/ - -#if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \ - defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \ - defined(__alpha__) || defined(__alpha) || \ - (defined(__Lynx__) && defined(__x86__)) -#define BYTE_ORDER LITTLE_ENDIAN -#endif - -#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \ - defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \ - defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\ - defined(apollo) || defined(__convex__) || defined(_CRAY) || \ - defined(__hppa) || defined(__hp9000) || \ - defined(__hp9000s300) || defined(__hp9000s700) || \ - defined(__hp3000s900) || defined(__hpux) || defined(MPE) || \ - defined (BIT_ZERO_ON_LEFT) || defined(m68k) || defined(__sparc) || \ - (defined(__Lynx__) && \ - (defined(__68k__) || defined(__sparc__) || defined(__powerpc__))) -#define BYTE_ORDER BIG_ENDIAN -#endif -#endif /* __linux */ -#endif /* BSD */ -#endif /* BYTE_ORDER */ - -#if !defined(BYTE_ORDER) || \ - (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \ - BYTE_ORDER != PDP_ENDIAN) - /* you must determine what the correct bit order is for - * your compiler - the next line is an intentional error - * which will force your compiles to bomb until you fix - * the above macros. - */ - #error "Undefined or invalid BYTE_ORDER"; -#endif - -/* - * Structure for query header. The order of the fields is machine- and - * compiler-dependent, depending on the byte/bit order and the layout - * of bit fields. We use bit fields only in int variables, as this - * is all ANSI requires. This requires a somewhat confusing rearrangement. - */ - -typedef struct { - unsigned id :16; /* query identification number */ -#if BYTE_ORDER == BIG_ENDIAN - /* fields in third byte */ - unsigned qr: 1; /* response flag */ - unsigned opcode: 4; /* purpose of message */ - unsigned aa: 1; /* authoritive answer */ - unsigned tc: 1; /* truncated message */ - unsigned rd: 1; /* recursion desired */ - /* fields in fourth byte */ - unsigned ra: 1; /* recursion available */ - unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned ad: 1; /* authentic data from named */ - unsigned cd: 1; /* checking disabled by resolver */ - unsigned rcode :4; /* response code */ -#endif -#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN - /* fields in third byte */ - unsigned rd :1; /* recursion desired */ - unsigned tc :1; /* truncated message */ - unsigned aa :1; /* authoritive answer */ - unsigned opcode :4; /* purpose of message */ - unsigned qr :1; /* response flag */ - /* fields in fourth byte */ - unsigned rcode :4; /* response code */ - unsigned cd: 1; /* checking disabled by resolver */ - unsigned ad: 1; /* authentic data from named */ - unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned ra :1; /* recursion available */ -#endif - /* remaining bytes */ - unsigned qdcount :16; /* number of question entries */ - unsigned ancount :16; /* number of answer entries */ - unsigned nscount :16; /* number of authority entries */ - unsigned arcount :16; /* number of resource entries */ -} HEADER; - -#define PACKETSZ NS_PACKETSZ -#define MAXDNAME NS_MAXDNAME -#define MAXCDNAME NS_MAXCDNAME -#define MAXLABEL NS_MAXLABEL -#define HFIXEDSZ NS_HFIXEDSZ -#define QFIXEDSZ NS_QFIXEDSZ -#define RRFIXEDSZ NS_RRFIXEDSZ -#define INT32SZ NS_INT32SZ -#define INT16SZ NS_INT16SZ -#define INT8SZ NS_INT8SZ -#define INADDRSZ NS_INADDRSZ -#define IN6ADDRSZ NS_IN6ADDRSZ -#define INDIR_MASK NS_CMPRSFLGS -#define NAMESERVER_PORT NS_DEFAULTPORT - -#define S_ZONE ns_s_zn -#define S_PREREQ ns_s_pr -#define S_UPDATE ns_s_ud -#define S_ADDT ns_s_ar - -#define QUERY ns_o_query -#define IQUERY ns_o_iquery -#define STATUS ns_o_status -#define NS_NOTIFY_OP ns_o_notify -#define NS_UPDATE_OP ns_o_update - -#define NOERROR ns_r_noerror -#define FORMERR ns_r_formerr -#define SERVFAIL ns_r_servfail -#define NXDOMAIN ns_r_nxdomain -#define NOTIMP ns_r_notimpl -#define REFUSED ns_r_refused -#define YXDOMAIN ns_r_yxdomain -#define YXRRSET ns_r_yxrrset -#define NXRRSET ns_r_nxrrset -#define NOTAUTH ns_r_notauth -#define NOTZONE ns_r_notzone -/*#define BADSIG ns_r_badsig*/ -/*#define BADKEY ns_r_badkey*/ -/*#define BADTIME ns_r_badtime*/ - - -#define DELETE ns_uop_delete -#define ADD ns_uop_add - -#define T_A ns_t_a -#define T_NS ns_t_ns -#define T_MD ns_t_md -#define T_MF ns_t_mf -#define T_CNAME ns_t_cname -#define T_SOA ns_t_soa -#define T_MB ns_t_mb -#define T_MG ns_t_mg -#define T_MR ns_t_mr -#define T_NULL ns_t_null -#define T_WKS ns_t_wks -#define T_PTR ns_t_ptr -#define T_HINFO ns_t_hinfo -#define T_MINFO ns_t_minfo -#define T_MX ns_t_mx -#define T_TXT ns_t_txt -#define T_RP ns_t_rp -#define T_AFSDB ns_t_afsdb -#define T_X25 ns_t_x25 -#define T_ISDN ns_t_isdn -#define T_RT ns_t_rt -#define T_NSAP ns_t_nsap -#define T_NSAP_PTR ns_t_nsap_ptr -#define T_SIG ns_t_sig -#define T_KEY ns_t_key -#define T_PX ns_t_px -#define T_GPOS ns_t_gpos -#define T_AAAA ns_t_aaaa -#define T_LOC ns_t_loc -#define T_NXT ns_t_nxt -#define T_EID ns_t_eid -#define T_NIMLOC ns_t_nimloc -#define T_SRV ns_t_srv -#define T_ATMA ns_t_atma -#define T_NAPTR ns_t_naptr -#define T_A6 ns_t_a6 -#define T_TSIG ns_t_tsig -#define T_IXFR ns_t_ixfr -#define T_AXFR ns_t_axfr -#define T_MAILB ns_t_mailb -#define T_MAILA ns_t_maila -#define T_ANY ns_t_any - -#define C_IN ns_c_in -#define C_CHAOS ns_c_chaos -#define C_HS ns_c_hs -/* BIND_UPDATE */ -#define C_NONE ns_c_none -#define C_ANY ns_c_any - -#define GETSHORT NS_GET16 -#define GETLONG NS_GET32 -#define PUTSHORT NS_PUT16 -#define PUTLONG NS_PUT32 - -#endif /* _ARPA_NAMESER_COMPAT_ */ diff --git a/other-licenses/android/getaddrinfo.c b/other-licenses/android/getaddrinfo.c deleted file mode 100644 index 97d1d1d2d2d6..000000000000 --- a/other-licenses/android/getaddrinfo.c +++ /dev/null @@ -1,2350 +0,0 @@ -/* $NetBSD: getaddrinfo.c,v 1.82 2006/03/25 12:09:40 rpaulo Exp $ */ -/* $KAME: getaddrinfo.c,v 1.29 2000/08/31 17:26:57 itojun Exp $ */ - -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * This version of getaddrinfo.c 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 ). - * These changes are offered under the same license as the original NetBSD - * file, whose copyright and license are unchanged above. - */ -#define ANDROID_CHANGES 1 - -/* - * Issues to be discussed: - * - Thread safe-ness must be checked. - * - Return values. There are nonstandard return values defined and used - * in the source code. This is because RFC2553 is silent about which error - * code must be returned for which situation. - * - IPv4 classful (shortened) form. RFC2553 is silent about it. XNET 5.2 - * says to use inet_aton() to convert IPv4 numeric to binary (alows - * classful form as a result). - * current code - disallow classful form for IPv4 (due to use of inet_pton). - * - freeaddrinfo(NULL). RFC2553 is silent about it. XNET 5.2 says it is - * invalid. - * current code - SEGV on freeaddrinfo(NULL) - * Note: - * - We use getipnodebyname() just for thread-safeness. There's no intent - * to let it do PF_UNSPEC (actually we never pass PF_UNSPEC to - * getipnodebyname(). - * - The code filters out AFs that are not supported by the kernel, - * when globbing NULL hostname (to loopback, or wildcard). Is it the right - * thing to do? What is the relationship with post-RFC2553 AI_ADDRCONFIG - * in ai_flags? - * - (post-2553) semantics of AI_ADDRCONFIG itself is too vague. - * (1) what should we do against numeric hostname (2) what should we do - * against NULL hostname (3) what is AI_ADDRCONFIG itself. AF not ready? - * non-loopback address configured? global address configured? - * - To avoid search order issue, we have a big amount of code duplicate - * from gethnamaddr.c and some other places. The issues that there's no - * lower layer function to lookup "IPv4 or IPv6" record. Calling - * gethostbyname2 from getaddrinfo will end up in wrong search order, as - * follows: - * - The code makes use of following calls when asked to resolver with - * ai_family = PF_UNSPEC: - * getipnodebyname(host, AF_INET6); - * getipnodebyname(host, AF_INET); - * This will result in the following queries if the node is configure to - * prefer /etc/hosts than DNS: - * lookup /etc/hosts for IPv6 address - * lookup DNS for IPv6 address - * lookup /etc/hosts for IPv4 address - * lookup DNS for IPv4 address - * which may not meet people's requirement. - * The right thing to happen is to have underlying layer which does - * PF_UNSPEC lookup (lookup both) and return chain of addrinfos. - * This would result in a bit of code duplicate with _dns_ghbyname() and - * friends. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "arpa_nameser.h" -#include -#include -#include -#include -#include "resolv_private.h" -#include -#include -#include -#include - -#include -#include -#include "nsswitch.h" - -#ifdef MOZ_GETADDRINFO_LOG_VERBOSE -#include -#endif - -#ifdef ANDROID_CHANGES -#include -#endif /* ANDROID_CHANGES */ - -typedef struct _pseudo_FILE { - int fd; - off_t maplen; - void* mapping; - off_t offset; -} _pseudo_FILE; - -#define _PSEUDO_FILE_INITIALIZER { -1, 0, MAP_FAILED, 0 } - -static void -_pseudo_fclose(_pseudo_FILE * __restrict__ fp) -{ - assert(fp); - fp->offset = 0; - if (fp->mapping != MAP_FAILED) { - (void) munmap(fp->mapping, fp->maplen); - fp->mapping = MAP_FAILED; - } - fp->maplen = 0; - if (fp->fd != -1) { - (void) close(fp->fd); - fp->fd = -1; - } -} - -static _pseudo_FILE * -_pseudo_fopen_r(_pseudo_FILE * __restrict__ fp, const char* fname) -{ - struct stat statbuf; - assert(fp); - fp->fd = open(fname, O_RDONLY); - if (fp->fd < 0) { - fp->fd = -1; - return NULL; - } - if ((0 != fstat(fp->fd, &statbuf)) || (statbuf.st_size <= 0)) { - close(fp->fd); - fp->fd = -1; - return NULL; - } - fp->maplen = statbuf.st_size; - fp->mapping = mmap(NULL, fp->maplen, PROT_READ, MAP_PRIVATE, fp->fd, 0); - if (fp->mapping == MAP_FAILED) { - close(fp->fd); - fp->fd = -1; - return NULL; - } - fp->offset = 0; - return fp; -} - -static void -_pseudo_rewind(_pseudo_FILE * __restrict__ fp) -{ - assert(fp); - fp->offset = 0; -} - -static char* -_pseudo_fgets(char* buf, int bufsize, _pseudo_FILE * __restrict__ fp) -{ - char* current; - char* endp; - int maxcopy; - assert(fp); - maxcopy = fp->maplen - fp->offset; - if (fp->mapping == MAP_FAILED) - return NULL; - if (maxcopy > bufsize - 1) - maxcopy = bufsize - 1; - if (maxcopy <= 0) - return NULL; - current = ((char*) fp->mapping) + fp->offset; - endp = memccpy(buf, current, '\n', maxcopy); - if (endp) - maxcopy = endp - buf; - buf[maxcopy] = '\0'; - fp->offset += maxcopy; - return buf; -} - -typedef union sockaddr_union { - struct sockaddr generic; - struct sockaddr_in in; - struct sockaddr_in6 in6; -} sockaddr_union; - -#define SUCCESS 0 -#define ANY 0 -#define YES 1 -#define NO 0 - -static const char in_addrany[] = { 0, 0, 0, 0 }; -static const char in_loopback[] = { 127, 0, 0, 1 }; -#ifdef INET6 -static const char in6_addrany[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static const char in6_loopback[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -}; -#endif - -static const struct afd { - int a_af; - int a_addrlen; - int a_socklen; - int a_off; - const char *a_addrany; - const char *a_loopback; - int a_scoped; -} afdl [] = { -#ifdef INET6 - {PF_INET6, sizeof(struct in6_addr), - sizeof(struct sockaddr_in6), - offsetof(struct sockaddr_in6, sin6_addr), - in6_addrany, in6_loopback, 1}, -#endif - {PF_INET, sizeof(struct in_addr), - sizeof(struct sockaddr_in), - offsetof(struct sockaddr_in, sin_addr), - in_addrany, in_loopback, 0}, - {0, 0, 0, 0, NULL, NULL, 0}, -}; - -struct explore { - int e_af; - int e_socktype; - int e_protocol; - const char *e_protostr; - int e_wild; -#define WILD_AF(ex) ((ex)->e_wild & 0x01) -#define WILD_SOCKTYPE(ex) ((ex)->e_wild & 0x02) -#define WILD_PROTOCOL(ex) ((ex)->e_wild & 0x04) -}; - -static const struct explore explore[] = { -#if 0 - { PF_LOCAL, 0, ANY, ANY, NULL, 0x01 }, -#endif -#ifdef INET6 - { PF_INET6, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 }, - { PF_INET6, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 }, - { PF_INET6, SOCK_RAW, ANY, NULL, 0x05 }, -#endif - { PF_INET, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 }, - { PF_INET, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 }, - { PF_INET, SOCK_RAW, ANY, NULL, 0x05 }, - { PF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 }, - { PF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 }, - { PF_UNSPEC, SOCK_RAW, ANY, NULL, 0x05 }, - { -1, 0, 0, NULL, 0 }, -}; - -#ifdef INET6 -#define PTON_MAX 16 -#else -#define PTON_MAX 4 -#endif - -static const ns_src default_dns_files[] = { - { NSSRC_FILES, NS_SUCCESS }, - { NSSRC_DNS, NS_SUCCESS }, - { 0, 0 } -}; - -#define MAXPACKET (64*1024) - -typedef union { - HEADER hdr; - u_char buf[MAXPACKET]; -} querybuf; - -struct res_target { - struct res_target *next; - const char *name; /* domain name */ - int qclass, qtype; /* class and type of query */ - u_char *answer; /* buffer to put answer */ - int anslen; /* size of answer buffer */ - int n; /* result length */ -}; - -static int str2number(const char *); -static int explore_fqdn(const struct addrinfo *, const char *, - const char *, struct addrinfo **); -static int explore_null(const struct addrinfo *, - const char *, struct addrinfo **); -static int explore_numeric(const struct addrinfo *, const char *, - const char *, struct addrinfo **, const char *); -static int explore_numeric_scope(const struct addrinfo *, const char *, - const char *, struct addrinfo **); -static int get_canonname(const struct addrinfo *, - struct addrinfo *, const char *); -static struct addrinfo *get_ai(const struct addrinfo *, - const struct afd *, const char *); -static int get_portmatch(const struct addrinfo *, const char *); -static int get_port(const struct addrinfo *, const char *, int); -static const struct afd *find_afd(int); -#ifdef INET6 -static int ip6_str2scopeid(char *, struct sockaddr_in6 *, u_int32_t *); -#endif - -static struct addrinfo *getanswer(const querybuf *, int, const char *, int, - const struct addrinfo *); -static int _dns_getaddrinfo(void *, void *, va_list); -static void _sethtent(_pseudo_FILE * __restrict__); -static void _endhtent(_pseudo_FILE * __restrict__); -static struct addrinfo *_gethtent(_pseudo_FILE * __restrict__, const char *, - const struct addrinfo *); -static int _files_getaddrinfo(void *, void *, va_list); - -static int res_queryN(const char *, struct res_target *, res_state); -static int res_searchN(const char *, struct res_target *, res_state); -static int res_querydomainN(const char *, const char *, - struct res_target *, res_state); - -static const char * const ai_errlist[] = { - "Success", - "Address family for hostname not supported", /* EAI_ADDRFAMILY */ - "Temporary failure in name resolution", /* EAI_AGAIN */ - "Invalid value for ai_flags", /* EAI_BADFLAGS */ - "Non-recoverable failure in name resolution", /* EAI_FAIL */ - "ai_family not supported", /* EAI_FAMILY */ - "Memory allocation failure", /* EAI_MEMORY */ - "No address associated with hostname", /* EAI_NODATA */ - "hostname nor servname provided, or not known", /* EAI_NONAME */ - "servname not supported for ai_socktype", /* EAI_SERVICE */ - "ai_socktype not supported", /* EAI_SOCKTYPE */ - "System error returned in errno", /* EAI_SYSTEM */ - "Invalid value for hints", /* EAI_BADHINTS */ - "Resolved protocol is unknown", /* EAI_PROTOCOL */ - "Argument buffer overflow", /* EAI_OVERFLOW */ - "Unknown error", /* EAI_MAX */ -}; - -/* XXX macros that make external reference is BAD. */ - -#define GET_AI(ai, afd, addr) \ -do { \ - /* external reference: pai, error, and label free */ \ - (ai) = get_ai(pai, (afd), (addr)); \ - if ((ai) == NULL) { \ - error = EAI_MEMORY; \ - goto free; \ - } \ -} while (/*CONSTCOND*/0) - -#define GET_PORT(ai, serv) \ -do { \ - /* external reference: error and label free */ \ - error = get_port((ai), (serv), 0); \ - if (error != 0) \ - goto free; \ -} while (/*CONSTCOND*/0) - -#define GET_CANONNAME(ai, str) \ -do { \ - /* external reference: pai, error and label free */ \ - error = get_canonname(pai, (ai), (str)); \ - if (error != 0) \ - goto free; \ -} while (/*CONSTCOND*/0) - -#define ERR(err) \ -do { \ - /* external reference: error, and label bad */ \ - error = (err); \ - goto bad; \ - /*NOTREACHED*/ \ -} while (/*CONSTCOND*/0) - -#define MATCH_FAMILY(x, y, w) \ - ((x) == (y) || (/*CONSTCOND*/(w) && ((x) == PF_UNSPEC || \ - (y) == PF_UNSPEC))) -#define MATCH(x, y, w) \ - ((x) == (y) || (/*CONSTCOND*/(w) && ((x) == ANY || (y) == ANY))) - -#pragma GCC visibility push(default) - -extern const char * -__wrap_gai_strerror(int ecode); -extern void -__wrap_freeaddrinfo(struct addrinfo *ai); -extern int -__wrap_getaddrinfo(const char *hostname, const char *servname, - const struct addrinfo *hints, struct addrinfo **res); - -int android_sdk_version; - -#pragma GCC visibility pop - -int android_sdk_version = -1; - -static int honeycomb_or_later() -{ -#ifdef MOZ_GETADDRINFO_LOG_VERBOSE - __android_log_print(ANDROID_LOG_INFO, "getaddrinfo", - "I am%s Honeycomb\n", - (android_sdk_version >= 11) ? "" : " not"); -#endif - return android_sdk_version >= 11; -} - -const char * -__wrap_gai_strerror(int ecode) -{ - if (honeycomb_or_later()) - return gai_strerror(ecode); - if (ecode < 0 || ecode > EAI_MAX) - ecode = EAI_MAX; - return ai_errlist[ecode]; -} - -void -__wrap_freeaddrinfo(struct addrinfo *ai) -{ - struct addrinfo *next; - - if (honeycomb_or_later()) { - freeaddrinfo(ai); - return; - } - - assert(ai != NULL); - - do { - next = ai->ai_next; - if (ai->ai_canonname) - free(ai->ai_canonname); - /* no need to free(ai->ai_addr) */ - free(ai); - ai = next; - } while (ai); -} - -static int -str2number(const char *p) -{ - char *ep; - unsigned long v; - - assert(p != NULL); - - if (*p == '\0') - return -1; - ep = NULL; - errno = 0; - v = strtoul(p, &ep, 10); - if (errno == 0 && ep && *ep == '\0' && v <= UINT_MAX) - return v; - else - return -1; -} - -/* - * Connect a UDP socket to a given unicast address. This will cause no network - * traffic, but will fail fast if the system has no or limited reachability to - * the destination (e.g., no IPv4 address, no IPv6 default route, ...). - */ -static int -_test_connect(int pf, struct sockaddr *addr, size_t addrlen) { - int s = socket(pf, SOCK_DGRAM, IPPROTO_UDP); - if (s < 0) - return 0; - int ret; - do { - ret = connect(s, addr, addrlen); - } while (ret < 0 && errno == EINTR); - int success = (ret == 0); - do { - ret = close(s); - } while (ret < 0 && errno == EINTR); - return success; -} - -/* - * The following functions determine whether IPv4 or IPv6 connectivity is - * available in order to implement AI_ADDRCONFIG. - * - * Strictly speaking, AI_ADDRCONFIG should not look at whether connectivity is - * available, but whether addresses of the specified family are "configured - * on the local system". However, bionic doesn't currently support getifaddrs, - * so checking for connectivity is the next best thing. - */ -static int -_have_ipv6() { - static const struct sockaddr_in6 sin6_test = { - .sin6_family = AF_INET6, - .sin6_addr.s6_addr = { // 2000:: - 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - }; - sockaddr_union addr = { .in6 = sin6_test }; - return _test_connect(PF_INET6, &addr.generic, sizeof(addr.in6)); -} - -static int -_have_ipv4() { - static const struct sockaddr_in sin_test = { - .sin_family = AF_INET, - .sin_addr.s_addr = __constant_htonl(0x08080808L) // 8.8.8.8 - }; - sockaddr_union addr = { .in = sin_test }; - return _test_connect(PF_INET, &addr.generic, sizeof(addr.in)); -} - -int -__wrap_getaddrinfo(const char *hostname, const char *servname, - const struct addrinfo *hints, struct addrinfo **res) -{ - struct addrinfo sentinel; - struct addrinfo *cur; - int error = 0; - struct addrinfo ai; - struct addrinfo ai0; - struct addrinfo *pai; - const struct explore *ex; - - if (honeycomb_or_later()) - return getaddrinfo(hostname, servname, hints, res); - - /* hostname is allowed to be NULL */ - /* servname is allowed to be NULL */ - /* hints is allowed to be NULL */ - assert(res != NULL); - - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - pai = &ai; - pai->ai_flags = 0; - pai->ai_family = PF_UNSPEC; - pai->ai_socktype = ANY; - pai->ai_protocol = ANY; - pai->ai_addrlen = 0; - pai->ai_canonname = NULL; - pai->ai_addr = NULL; - pai->ai_next = NULL; - - if (hostname == NULL && servname == NULL) - return EAI_NONAME; - if (hints) { - /* error check for hints */ - if (hints->ai_addrlen || hints->ai_canonname || - hints->ai_addr || hints->ai_next) - ERR(EAI_BADHINTS); /* xxx */ - if (hints->ai_flags & ~AI_MASK) - ERR(EAI_BADFLAGS); - switch (hints->ai_family) { - case PF_UNSPEC: - case PF_INET: -#ifdef INET6 - case PF_INET6: -#endif - break; - default: - ERR(EAI_FAMILY); - } - memcpy(pai, hints, sizeof(*pai)); - - /* - * if both socktype/protocol are specified, check if they - * are meaningful combination. - */ - if (pai->ai_socktype != ANY && pai->ai_protocol != ANY) { - for (ex = explore; ex->e_af >= 0; ex++) { - if (pai->ai_family != ex->e_af) - continue; - if (ex->e_socktype == ANY) - continue; - if (ex->e_protocol == ANY) - continue; - if (pai->ai_socktype == ex->e_socktype - && pai->ai_protocol != ex->e_protocol) { - ERR(EAI_BADHINTS); - } - } - } - } - - /* - * check for special cases. (1) numeric servname is disallowed if - * socktype/protocol are left unspecified. (2) servname is disallowed - * for raw and other inet{,6} sockets. - */ - if (MATCH_FAMILY(pai->ai_family, PF_INET, 1) -#ifdef PF_INET6 - || MATCH_FAMILY(pai->ai_family, PF_INET6, 1) -#endif - ) { - ai0 = *pai; /* backup *pai */ - - if (pai->ai_family == PF_UNSPEC) { -#ifdef PF_INET6 - pai->ai_family = PF_INET6; -#else - pai->ai_family = PF_INET; -#endif - } - error = get_portmatch(pai, servname); - if (error) - ERR(error); - - *pai = ai0; - } - - ai0 = *pai; - - /* NULL hostname, or numeric hostname */ - for (ex = explore; ex->e_af >= 0; ex++) { - *pai = ai0; - - /* PF_UNSPEC entries are prepared for DNS queries only */ - if (ex->e_af == PF_UNSPEC) - continue; - - if (!MATCH_FAMILY(pai->ai_family, ex->e_af, WILD_AF(ex))) - continue; - if (!MATCH(pai->ai_socktype, ex->e_socktype, WILD_SOCKTYPE(ex))) - continue; - if (!MATCH(pai->ai_protocol, ex->e_protocol, WILD_PROTOCOL(ex))) - continue; - - if (pai->ai_family == PF_UNSPEC) - pai->ai_family = ex->e_af; - if (pai->ai_socktype == ANY && ex->e_socktype != ANY) - pai->ai_socktype = ex->e_socktype; - if (pai->ai_protocol == ANY && ex->e_protocol != ANY) - pai->ai_protocol = ex->e_protocol; - - if (hostname == NULL) - error = explore_null(pai, servname, &cur->ai_next); - else - error = explore_numeric_scope(pai, hostname, servname, - &cur->ai_next); - - if (error) - goto free; - - while (cur->ai_next) - cur = cur->ai_next; - } - - /* - * XXX - * If numeric representation of AF1 can be interpreted as FQDN - * representation of AF2, we need to think again about the code below. - */ - if (sentinel.ai_next) - goto good; - - if (hostname == NULL) - ERR(EAI_NODATA); - if (pai->ai_flags & AI_NUMERICHOST) - ERR(EAI_NONAME); - - /* - * hostname as alphabetical name. - * we would like to prefer AF_INET6 than AF_INET, so we'll make a - * outer loop by AFs. - */ - for (ex = explore; ex->e_af >= 0; ex++) { - *pai = ai0; - - /* require exact match for family field */ - if (pai->ai_family != ex->e_af) - continue; - - if (!MATCH(pai->ai_socktype, ex->e_socktype, - WILD_SOCKTYPE(ex))) { - continue; - } - if (!MATCH(pai->ai_protocol, ex->e_protocol, - WILD_PROTOCOL(ex))) { - continue; - } - - if (pai->ai_socktype == ANY && ex->e_socktype != ANY) - pai->ai_socktype = ex->e_socktype; - if (pai->ai_protocol == ANY && ex->e_protocol != ANY) - pai->ai_protocol = ex->e_protocol; - - error = explore_fqdn(pai, hostname, servname, - &cur->ai_next); - - while (cur && cur->ai_next) - cur = cur->ai_next; - } - - /* XXX */ - if (sentinel.ai_next) - error = 0; - - if (error) - goto free; - if (error == 0) { - if (sentinel.ai_next) { - good: - *res = sentinel.ai_next; - return SUCCESS; - } else - error = EAI_FAIL; - } - free: - bad: - if (sentinel.ai_next) - __wrap_freeaddrinfo(sentinel.ai_next); - *res = NULL; - return error; -} - -/* - * FQDN hostname, DNS lookup - */ -static int -explore_fqdn(const struct addrinfo *pai, const char *hostname, - const char *servname, struct addrinfo **res) -{ - struct addrinfo *result; - struct addrinfo *cur; - int error = 0; - static const ns_dtab dtab[] = { - NS_FILES_CB(_files_getaddrinfo, NULL) - { NSSRC_DNS, _dns_getaddrinfo, NULL }, /* force -DHESIOD */ - NS_NIS_CB(_yp_getaddrinfo, NULL) - { 0, 0, 0 } - }; - - assert(pai != NULL); - /* hostname may be NULL */ - /* servname may be NULL */ - assert(res != NULL); - - result = NULL; - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return 0; - - switch (nsdispatch(&result, dtab, NSDB_HOSTS, "getaddrinfo", - default_dns_files, hostname, pai)) { - case NS_TRYAGAIN: - error = EAI_AGAIN; - goto free; - case NS_UNAVAIL: - error = EAI_FAIL; - goto free; - case NS_NOTFOUND: - error = EAI_NODATA; - goto free; - case NS_SUCCESS: - error = 0; - for (cur = result; cur; cur = cur->ai_next) { - GET_PORT(cur, servname); - /* canonname should be filled already */ - } - break; - } - - *res = result; - - return 0; - -free: - if (result) - __wrap_freeaddrinfo(result); - return error; -} - -/* - * hostname == NULL. - * passive socket -> anyaddr (0.0.0.0 or ::) - * non-passive socket -> localhost (127.0.0.1 or ::1) - */ -static int -explore_null(const struct addrinfo *pai, const char *servname, - struct addrinfo **res) -{ - int s; - const struct afd *afd; - struct addrinfo *cur; - struct addrinfo sentinel; - int error; - - assert(pai != NULL); - /* servname may be NULL */ - assert(res != NULL); - - *res = NULL; - sentinel.ai_next = NULL; - cur = &sentinel; - - /* - * filter out AFs that are not supported by the kernel - * XXX errno? - */ - s = socket(pai->ai_family, SOCK_DGRAM, 0); - if (s < 0) { - if (errno != EMFILE) - return 0; - } else - close(s); - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return 0; - - afd = find_afd(pai->ai_family); - if (afd == NULL) - return 0; - - if (pai->ai_flags & AI_PASSIVE) { - GET_AI(cur->ai_next, afd, afd->a_addrany); - /* xxx meaningless? - * GET_CANONNAME(cur->ai_next, "anyaddr"); - */ - GET_PORT(cur->ai_next, servname); - } else { - GET_AI(cur->ai_next, afd, afd->a_loopback); - /* xxx meaningless? - * GET_CANONNAME(cur->ai_next, "localhost"); - */ - GET_PORT(cur->ai_next, servname); - } - cur = cur->ai_next; - - *res = sentinel.ai_next; - return 0; - -free: - if (sentinel.ai_next) - __wrap_freeaddrinfo(sentinel.ai_next); - return error; -} - -/* - * numeric hostname - */ -static int -explore_numeric(const struct addrinfo *pai, const char *hostname, - const char *servname, struct addrinfo **res, const char *canonname) -{ - const struct afd *afd; - struct addrinfo *cur; - struct addrinfo sentinel; - int error; - char pton[PTON_MAX]; - - assert(pai != NULL); - /* hostname may be NULL */ - /* servname may be NULL */ - assert(res != NULL); - - *res = NULL; - sentinel.ai_next = NULL; - cur = &sentinel; - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return 0; - - afd = find_afd(pai->ai_family); - if (afd == NULL) - return 0; - - switch (afd->a_af) { -#if 0 /*X/Open spec*/ - case AF_INET: - if (inet_aton(hostname, (struct in_addr *)pton) == 1) { - if (pai->ai_family == afd->a_af || - pai->ai_family == PF_UNSPEC /*?*/) { - GET_AI(cur->ai_next, afd, pton); - GET_PORT(cur->ai_next, servname); - if ((pai->ai_flags & AI_CANONNAME)) { - /* - * Set the numeric address itself as - * the canonical name, based on a - * clarification in rfc2553bis-03. - */ - GET_CANONNAME(cur->ai_next, canonname); - } - while (cur && cur->ai_next) - cur = cur->ai_next; - } else - ERR(EAI_FAMILY); /*xxx*/ - } - break; -#endif - default: - if (inet_pton(afd->a_af, hostname, pton) == 1) { - if (pai->ai_family == afd->a_af || - pai->ai_family == PF_UNSPEC /*?*/) { - GET_AI(cur->ai_next, afd, pton); - GET_PORT(cur->ai_next, servname); - if ((pai->ai_flags & AI_CANONNAME)) { - /* - * Set the numeric address itself as - * the canonical name, based on a - * clarification in rfc2553bis-03. - */ - GET_CANONNAME(cur->ai_next, canonname); - } - while (cur->ai_next) - cur = cur->ai_next; - } else - ERR(EAI_FAMILY); /*xxx*/ - } - break; - } - - *res = sentinel.ai_next; - return 0; - -free: -bad: - if (sentinel.ai_next) - __wrap_freeaddrinfo(sentinel.ai_next); - return error; -} - -/* - * numeric hostname with scope - */ -static int -explore_numeric_scope(const struct addrinfo *pai, const char *hostname, - const char *servname, struct addrinfo **res) -{ -#if !defined(SCOPE_DELIMITER) || !defined(INET6) - return explore_numeric(pai, hostname, servname, res, hostname); -#else - const struct afd *afd; - struct addrinfo *cur; - int error; - char *cp, *hostname2 = NULL, *scope, *addr; - struct sockaddr_in6 *sin6; - - assert(pai != NULL); - /* hostname may be NULL */ - /* servname may be NULL */ - assert(res != NULL); - - /* - * if the servname does not match socktype/protocol, ignore it. - */ - if (get_portmatch(pai, servname) != 0) - return 0; - - afd = find_afd(pai->ai_family); - if (afd == NULL) - return 0; - - if (!afd->a_scoped) - return explore_numeric(pai, hostname, servname, res, hostname); - - cp = strchr(hostname, SCOPE_DELIMITER); - if (cp == NULL) - return explore_numeric(pai, hostname, servname, res, hostname); - - /* - * Handle special case of - */ - hostname2 = strdup(hostname); - if (hostname2 == NULL) - return EAI_MEMORY; - /* terminate at the delimiter */ - hostname2[cp - hostname] = '\0'; - addr = hostname2; - scope = cp + 1; - - error = explore_numeric(pai, addr, servname, res, hostname); - if (error == 0) { - u_int32_t scopeid; - - for (cur = *res; cur; cur = cur->ai_next) { - if (cur->ai_family != AF_INET6) - continue; - sin6 = (struct sockaddr_in6 *)(void *)cur->ai_addr; - if (ip6_str2scopeid(scope, sin6, &scopeid) == -1) { - free(hostname2); - return(EAI_NODATA); /* XXX: is return OK? */ - } - sin6->sin6_scope_id = scopeid; - } - } - - free(hostname2); - - return error; -#endif -} - -static int -get_canonname(const struct addrinfo *pai, struct addrinfo *ai, const char *str) -{ - - assert(pai != NULL); - assert(ai != NULL); - assert(str != NULL); - - if ((pai->ai_flags & AI_CANONNAME) != 0) { - ai->ai_canonname = strdup(str); - if (ai->ai_canonname == NULL) - return EAI_MEMORY; - } - return 0; -} - -static struct addrinfo * -get_ai(const struct addrinfo *pai, const struct afd *afd, const char *addr) -{ - char *p; - struct addrinfo *ai; - - assert(pai != NULL); - assert(afd != NULL); - assert(addr != NULL); - - ai = (struct addrinfo *)malloc(sizeof(struct addrinfo) - + (afd->a_socklen)); - if (ai == NULL) - return NULL; - - memcpy(ai, pai, sizeof(struct addrinfo)); - ai->ai_addr = (struct sockaddr *)(void *)(ai + 1); - memset(ai->ai_addr, 0, (size_t)afd->a_socklen); - -#ifdef HAVE_SA_LEN - ai->ai_addr->sa_len = afd->a_socklen; -#endif - - ai->ai_addrlen = afd->a_socklen; -#if defined (__alpha__) || (defined(__i386__) && defined(_LP64)) || defined(__sparc64__) - ai->__ai_pad0 = 0; -#endif - ai->ai_addr->sa_family = ai->ai_family = afd->a_af; - p = (char *)(void *)(ai->ai_addr); - memcpy(p + afd->a_off, addr, (size_t)afd->a_addrlen); - return ai; -} - -static int -get_portmatch(const struct addrinfo *ai, const char *servname) -{ - - assert(ai != NULL); - /* servname may be NULL */ - - return get_port(ai, servname, 1); -} - -static int -get_port(const struct addrinfo *ai, const char *servname, int matchonly) -{ - const char *proto; - struct servent *sp; - int port; - int allownumeric; - - assert(ai != NULL); - /* servname may be NULL */ - - if (servname == NULL) - return 0; - switch (ai->ai_family) { - case AF_INET: -#ifdef AF_INET6 - case AF_INET6: -#endif - break; - default: - return 0; - } - - switch (ai->ai_socktype) { - case SOCK_RAW: - return EAI_SERVICE; - case SOCK_DGRAM: - case SOCK_STREAM: - allownumeric = 1; - break; - case ANY: -#if 1 /* ANDROID-SPECIFIC CHANGE TO MATCH GLIBC */ - allownumeric = 1; -#else - allownumeric = 0; -#endif - break; - default: - return EAI_SOCKTYPE; - } - - port = str2number(servname); - if (port >= 0) { - if (!allownumeric) - return EAI_SERVICE; - if (port < 0 || port > 65535) - return EAI_SERVICE; - port = htons(port); - } else { - if (ai->ai_flags & AI_NUMERICSERV) - return EAI_NONAME; - - switch (ai->ai_socktype) { - case SOCK_DGRAM: - proto = "udp"; - break; - case SOCK_STREAM: - proto = "tcp"; - break; - default: - proto = NULL; - break; - } - - if ((sp = getservbyname(servname, proto)) == NULL) - return EAI_SERVICE; - port = sp->s_port; - } - - if (!matchonly) { - switch (ai->ai_family) { - case AF_INET: - ((struct sockaddr_in *)(void *) - ai->ai_addr)->sin_port = port; - break; -#ifdef INET6 - case AF_INET6: - ((struct sockaddr_in6 *)(void *) - ai->ai_addr)->sin6_port = port; - break; -#endif - } - } - - return 0; -} - -static const struct afd * -find_afd(int af) -{ - const struct afd *afd; - - if (af == PF_UNSPEC) - return NULL; - for (afd = afdl; afd->a_af; afd++) { - if (afd->a_af == af) - return afd; - } - return NULL; -} - -#ifdef INET6 -/* convert a string to a scope identifier. XXX: IPv6 specific */ -static int -ip6_str2scopeid(char *scope, struct sockaddr_in6 *sin6, u_int32_t *scopeid) -{ - u_long lscopeid; - struct in6_addr *a6; - char *ep; - - assert(scope != NULL); - assert(sin6 != NULL); - assert(scopeid != NULL); - - a6 = &sin6->sin6_addr; - - /* empty scopeid portion is invalid */ - if (*scope == '\0') - return -1; - - if (IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6)) { - /* - * We currently assume a one-to-one mapping between links - * and interfaces, so we simply use interface indices for - * like-local scopes. - */ - *scopeid = if_nametoindex(scope); - if (*scopeid == 0) - goto trynumeric; - return 0; - } - - /* still unclear about literal, allow numeric only - placeholder */ - if (IN6_IS_ADDR_SITELOCAL(a6) || IN6_IS_ADDR_MC_SITELOCAL(a6)) - goto trynumeric; - if (IN6_IS_ADDR_MC_ORGLOCAL(a6)) - goto trynumeric; - else - goto trynumeric; /* global */ - - /* try to convert to a numeric id as a last resort */ - trynumeric: - errno = 0; - lscopeid = strtoul(scope, &ep, 10); - *scopeid = (u_int32_t)(lscopeid & 0xffffffffUL); - if (errno == 0 && ep && *ep == '\0' && *scopeid == lscopeid) - return 0; - else - return -1; -} -#endif - -/* code duplicate with gethnamaddr.c */ - -static const char AskedForGot[] = - "gethostby*.getanswer: asked for \"%s\", got \"%s\""; - -static struct addrinfo * -getanswer(const querybuf *answer, int anslen, const char *qname, int qtype, - const struct addrinfo *pai) -{ - struct addrinfo sentinel, *cur; - struct addrinfo ai; - const struct afd *afd; - char *canonname; - const HEADER *hp; - const u_char *cp; - int n; - const u_char *eom; - char *bp, *ep; - int type, class, ancount, qdcount; - int haveanswer, had_error; - char tbuf[MAXDNAME]; - int (*name_ok) (const char *); - char hostbuf[8*1024]; - - assert(answer != NULL); - assert(qname != NULL); - assert(pai != NULL); - - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - - canonname = NULL; - eom = answer->buf + anslen; - switch (qtype) { - case T_A: - case T_AAAA: - case T_ANY: /*use T_ANY only for T_A/T_AAAA lookup*/ - name_ok = res_hnok; - break; - default: - return NULL; /* XXX should be abort(); */ - } - /* - * find first satisfactory answer - */ - hp = &answer->hdr; - ancount = ntohs(hp->ancount); - qdcount = ntohs(hp->qdcount); - bp = hostbuf; - ep = hostbuf + sizeof hostbuf; - cp = answer->buf + HFIXEDSZ; - if (qdcount != 1) { - h_errno = NO_RECOVERY; - return (NULL); - } - n = dn_expand(answer->buf, eom, cp, bp, ep - bp); - if ((n < 0) || !(*name_ok)(bp)) { - h_errno = NO_RECOVERY; - return (NULL); - } - cp += n + QFIXEDSZ; - if (qtype == T_A || qtype == T_AAAA || qtype == T_ANY) { - /* res_send() has already verified that the query name is the - * same as the one we sent; this just gets the expanded name - * (i.e., with the succeeding search-domain tacked on). - */ - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - h_errno = NO_RECOVERY; - return (NULL); - } - canonname = bp; - bp += n; - /* The qname can be abbreviated, but h_name is now absolute. */ - qname = canonname; - } - haveanswer = 0; - had_error = 0; - while (ancount-- > 0 && cp < eom && !had_error) { - n = dn_expand(answer->buf, eom, cp, bp, ep - bp); - if ((n < 0) || !(*name_ok)(bp)) { - had_error++; - continue; - } - cp += n; /* name */ - type = _getshort(cp); - cp += INT16SZ; /* type */ - class = _getshort(cp); - cp += INT16SZ + INT32SZ; /* class, TTL */ - n = _getshort(cp); - cp += INT16SZ; /* len */ - if (class != C_IN) { - /* XXX - debug? syslog? */ - cp += n; - continue; /* XXX - had_error++ ? */ - } - if ((qtype == T_A || qtype == T_AAAA || qtype == T_ANY) && - type == T_CNAME) { - n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); - if ((n < 0) || !(*name_ok)(tbuf)) { - had_error++; - continue; - } - cp += n; - /* Get canonical name. */ - n = strlen(tbuf) + 1; /* for the \0 */ - if (n > ep - bp || n >= MAXHOSTNAMELEN) { - had_error++; - continue; - } - strlcpy(bp, tbuf, (size_t)(ep - bp)); - canonname = bp; - bp += n; - continue; - } - if (qtype == T_ANY) { - if (!(type == T_A || type == T_AAAA)) { - cp += n; - continue; - } - } else if (type != qtype) { - if (type != T_KEY && type != T_SIG) - syslog(LOG_NOTICE|LOG_AUTH, - "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", - qname, p_class(C_IN), p_type(qtype), - p_type(type)); - cp += n; - continue; /* XXX - had_error++ ? */ - } - switch (type) { - case T_A: - case T_AAAA: - if (strcasecmp(canonname, bp) != 0) { - syslog(LOG_NOTICE|LOG_AUTH, - AskedForGot, canonname, bp); - cp += n; - continue; /* XXX - had_error++ ? */ - } - if (type == T_A && n != INADDRSZ) { - cp += n; - continue; - } - if (type == T_AAAA && n != IN6ADDRSZ) { - cp += n; - continue; - } - if (type == T_AAAA) { - struct in6_addr in6; - memcpy(&in6, cp, IN6ADDRSZ); - if (IN6_IS_ADDR_V4MAPPED(&in6)) { - cp += n; - continue; - } - } - if (!haveanswer) { - int nn; - - canonname = bp; - nn = strlen(bp) + 1; /* for the \0 */ - bp += nn; - } - - /* don't overwrite pai */ - ai = *pai; - ai.ai_family = (type == T_A) ? AF_INET : AF_INET6; - afd = find_afd(ai.ai_family); - if (afd == NULL) { - cp += n; - continue; - } - cur->ai_next = get_ai(&ai, afd, (const char *)cp); - if (cur->ai_next == NULL) - had_error++; - while (cur && cur->ai_next) - cur = cur->ai_next; - cp += n; - break; - default: - abort(); - } - if (!had_error) - haveanswer++; - } - if (haveanswer) { - if (!canonname) - (void)get_canonname(pai, sentinel.ai_next, qname); - else - (void)get_canonname(pai, sentinel.ai_next, canonname); - h_errno = NETDB_SUCCESS; - return sentinel.ai_next; - } - - h_errno = NO_RECOVERY; - return NULL; -} - -struct addrinfo_sort_elem { - struct addrinfo *ai; - int has_src_addr; - sockaddr_union src_addr; - int original_order; -}; - -/*ARGSUSED*/ -static int -_get_scope(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; - if (IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr)) { - return IPV6_ADDR_MC_SCOPE(&addr6->sin6_addr); - } else if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr) || - IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) { - /* - * RFC 4291 section 2.5.3 says loopback is to be treated as having - * link-local scope. - */ - return IPV6_ADDR_SCOPE_LINKLOCAL; - } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { - return IPV6_ADDR_SCOPE_SITELOCAL; - } else { - return IPV6_ADDR_SCOPE_GLOBAL; - } - } else if (addr->sa_family == AF_INET) { - const struct sockaddr_in *addr4 = (const struct sockaddr_in *)addr; - unsigned long int na = ntohl(addr4->sin_addr.s_addr); - - if (IN_LOOPBACK(na) || /* 127.0.0.0/8 */ - (na & 0xffff0000) == 0xa9fe0000) { /* 169.254.0.0/16 */ - return IPV6_ADDR_SCOPE_LINKLOCAL; - } else { - /* - * According to draft-ietf-6man-rfc3484-revise-01 section 2.3, - * it is best not to treat the private IPv4 ranges - * (10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16) as being - * in a special scope, so we don't. - */ - return IPV6_ADDR_SCOPE_GLOBAL; - } - } else { - /* - * This should never happen. - * Return a scope with low priority as a last resort. - */ - return IPV6_ADDR_SCOPE_NODELOCAL; - } -} - -/* These macros are modelled after the ones in . */ - -/* RFC 4380, section 2.6 */ -#define IN6_IS_ADDR_TEREDO(a) \ - ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == ntohl(0x20010000))) - -/* RFC 3056, section 2. */ -#define IN6_IS_ADDR_6TO4(a) \ - (((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02)) - -/* 6bone testing address area (3ffe::/16), deprecated in RFC 3701. */ -#define IN6_IS_ADDR_6BONE(a) \ - (((a)->s6_addr[0] == 0x3f) && ((a)->s6_addr[1] == 0xfe)) - -/* - * Get the label for a given IPv4/IPv6 address. - * RFC 3484, section 2.1, plus changes from draft-ietf-6man-rfc3484-revise-01. - */ - -/*ARGSUSED*/ -static int -_get_label(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET) { - return 3; - } else if (addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; - if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { - return 0; - } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { - return 3; - } else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { - return 4; - } else if (IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { - return 5; - } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) { - return 10; - } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { - return 11; - } else if (IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { - return 12; - } else { - return 2; - } - } else { - /* - * This should never happen. - * Return a semi-random label as a last resort. - */ - return 1; - } -} - -/* - * Get the precedence for a given IPv4/IPv6 address. - * RFC 3484, section 2.1, plus changes from draft-ietf-6man-rfc3484-revise-01. - */ - -/*ARGSUSED*/ -static int -_get_precedence(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET) { - return 30; - } else if (addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)addr; - if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { - return 60; - } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { - return 30; - } else if (IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { - return 20; - } else if (IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { - return 10; - } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) || - IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr) || - IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { - return 1; - } else { - return 40; - } - } else { - return 1; - } -} - -/* - * Find number of matching initial bits between the two addresses a1 and a2. - */ - -/*ARGSUSED*/ -static int -_common_prefix_len(const struct in6_addr *a1, const struct in6_addr *a2) -{ - const char *p1 = (const char *)a1; - const char *p2 = (const char *)a2; - unsigned i; - - for (i = 0; i < sizeof(*a1); ++i) { - int x, j; - - if (p1[i] == p2[i]) { - continue; - } - x = p1[i] ^ p2[i]; - for (j = 0; j < CHAR_BIT; ++j) { - if (x & (1 << (CHAR_BIT - 1))) { - return i * CHAR_BIT + j; - } - x <<= 1; - } - } - return sizeof(*a1) * CHAR_BIT; -} - -/* - * Compare two source/destination address pairs. - * RFC 3484, section 6. - */ - -/*ARGSUSED*/ -static int -_rfc3484_compare(const void *ptr1, const void* ptr2) -{ - const struct addrinfo_sort_elem *a1 = (const struct addrinfo_sort_elem *)ptr1; - const struct addrinfo_sort_elem *a2 = (const struct addrinfo_sort_elem *)ptr2; - int scope_src1, scope_dst1, scope_match1; - int scope_src2, scope_dst2, scope_match2; - int label_src1, label_dst1, label_match1; - int label_src2, label_dst2, label_match2; - int precedence1, precedence2; - int prefixlen1, prefixlen2; - - /* Rule 1: Avoid unusable destinations. */ - if (a1->has_src_addr != a2->has_src_addr) { - return a2->has_src_addr - a1->has_src_addr; - } - - /* Rule 2: Prefer matching scope. */ - scope_src1 = _get_scope(&a1->src_addr.generic); - scope_dst1 = _get_scope(a1->ai->ai_addr); - scope_match1 = (scope_src1 == scope_dst1); - - scope_src2 = _get_scope(&a2->src_addr.generic); - scope_dst2 = _get_scope(a2->ai->ai_addr); - scope_match2 = (scope_src2 == scope_dst2); - - if (scope_match1 != scope_match2) { - return scope_match2 - scope_match1; - } - - /* - * Rule 3: Avoid deprecated addresses. - * TODO(sesse): We don't currently have a good way of finding this. - */ - - /* - * Rule 4: Prefer home addresses. - * TODO(sesse): We don't currently have a good way of finding this. - */ - - /* Rule 5: Prefer matching label. */ - label_src1 = _get_label(&a1->src_addr.generic); - label_dst1 = _get_label(a1->ai->ai_addr); - label_match1 = (label_src1 == label_dst1); - - label_src2 = _get_label(&a2->src_addr.generic); - label_dst2 = _get_label(a2->ai->ai_addr); - label_match2 = (label_src2 == label_dst2); - - if (label_match1 != label_match2) { - return label_match2 - label_match1; - } - - /* Rule 6: Prefer higher precedence. */ - precedence1 = _get_precedence(a1->ai->ai_addr); - precedence2 = _get_precedence(a2->ai->ai_addr); - if (precedence1 != precedence2) { - return precedence2 - precedence1; - } - - /* - * Rule 7: Prefer native transport. - * TODO(sesse): We don't currently have a good way of finding this. - */ - - /* Rule 8: Prefer smaller scope. */ - if (scope_dst1 != scope_dst2) { - return scope_dst1 - scope_dst2; - } - - /* - * Rule 9: Use longest matching prefix. - * We implement this for IPv6 only, as the rules in RFC 3484 don't seem - * to work very well directly applied to IPv4. (glibc uses information from - * the routing table for a custom IPv4 implementation here.) - */ - if (a1->has_src_addr && a1->ai->ai_addr->sa_family == AF_INET6 && - a2->has_src_addr && a2->ai->ai_addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *a1_src = &a1->src_addr.in6; - const struct sockaddr_in6 *a1_dst = (const struct sockaddr_in6 *)a1->ai->ai_addr; - const struct sockaddr_in6 *a2_src = &a2->src_addr.in6; - const struct sockaddr_in6 *a2_dst = (const struct sockaddr_in6 *)a2->ai->ai_addr; - prefixlen1 = _common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr); - prefixlen2 = _common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr); - if (prefixlen1 != prefixlen2) { - return prefixlen2 - prefixlen1; - } - } - - /* - * Rule 10: Leave the order unchanged. - * We need this since qsort() is not necessarily stable. - */ - return a1->original_order - a2->original_order; -} - -/* - * Find the source address that will be used if trying to connect to the given - * address. src_addr must be large enough to hold a struct sockaddr_in6. - * - * Returns 1 if a source address was found, 0 if the address is unreachable, - * and -1 if a fatal error occurred. If 0 or 1, the contents of src_addr are - * undefined. - */ - -/*ARGSUSED*/ -static int -_find_src_addr(const struct sockaddr *addr, struct sockaddr *src_addr) -{ - int sock; - int ret; - socklen_t len; - - switch (addr->sa_family) { - case AF_INET: - len = sizeof(struct sockaddr_in); - break; - case AF_INET6: - len = sizeof(struct sockaddr_in6); - break; - default: - /* No known usable source address for non-INET families. */ - return 0; - } - - sock = socket(addr->sa_family, SOCK_DGRAM, IPPROTO_UDP); - if (sock == -1) { - if (errno == EAFNOSUPPORT) { - return 0; - } else { - return -1; - } - } - - do { - ret = connect(sock, addr, len); - } while (ret == -1 && errno == EINTR); - - if (ret == -1) { - close(sock); - return 0; - } - - if (getsockname(sock, src_addr, &len) == -1) { - close(sock); - return -1; - } - close(sock); - return 1; -} - -/* - * Sort the linked list starting at sentinel->ai_next in RFC3484 order. - * Will leave the list unchanged if an error occurs. - */ - -/*ARGSUSED*/ -static void -_rfc3484_sort(struct addrinfo *list_sentinel) -{ - struct addrinfo *cur; - int nelem = 0, i; - struct addrinfo_sort_elem *elems; - - cur = list_sentinel->ai_next; - while (cur) { - ++nelem; - cur = cur->ai_next; - } - - elems = (struct addrinfo_sort_elem *)malloc(nelem * sizeof(struct addrinfo_sort_elem)); - if (elems == NULL) { - goto error; - } - - /* - * Convert the linked list to an array that also contains the candidate - * source address for each destination address. - */ - for (i = 0, cur = list_sentinel->ai_next; i < nelem; ++i, cur = cur->ai_next) { - int has_src_addr; - assert(cur != NULL); - elems[i].ai = cur; - elems[i].original_order = i; - - has_src_addr = _find_src_addr(cur->ai_addr, &elems[i].src_addr.generic); - if (has_src_addr == -1) { - goto error; - } - elems[i].has_src_addr = has_src_addr; - } - - /* Sort the addresses, and rearrange the linked list so it matches the sorted order. */ - qsort((void *)elems, nelem, sizeof(struct addrinfo_sort_elem), _rfc3484_compare); - - list_sentinel->ai_next = elems[0].ai; - for (i = 0; i < nelem - 1; ++i) { - elems[i].ai->ai_next = elems[i + 1].ai; - } - elems[nelem - 1].ai->ai_next = NULL; - -error: - free(elems); -} - -/*ARGSUSED*/ -static int -_dns_getaddrinfo(void *rv, void *cb_data, va_list ap) -{ - struct addrinfo *ai; - querybuf *buf, *buf2; - const char *name; - const struct addrinfo *pai; - struct addrinfo sentinel, *cur; - struct res_target q, q2; - res_state res; - - name = va_arg(ap, char *); - pai = va_arg(ap, const struct addrinfo *); - //fprintf(stderr, "_dns_getaddrinfo() name = '%s'\n", name); - - memset(&q, 0, sizeof(q)); - memset(&q2, 0, sizeof(q2)); - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - - buf = malloc(sizeof(*buf)); - if (buf == NULL) { - h_errno = NETDB_INTERNAL; - return NS_NOTFOUND; - } - buf2 = malloc(sizeof(*buf2)); - if (buf2 == NULL) { - free(buf); - h_errno = NETDB_INTERNAL; - return NS_NOTFOUND; - } - - switch (pai->ai_family) { - case AF_UNSPEC: - /* prefer IPv6 */ - q.name = name; - q.qclass = C_IN; - q.answer = buf->buf; - q.anslen = sizeof(buf->buf); - int query_ipv6 = 1, query_ipv4 = 1; - if (pai->ai_flags & AI_ADDRCONFIG) { - query_ipv6 = _have_ipv6(); - query_ipv4 = _have_ipv4(); - } - if (query_ipv6) { - q.qtype = T_AAAA; - if (query_ipv4) { - q.next = &q2; - q2.name = name; - q2.qclass = C_IN; - q2.qtype = T_A; - q2.answer = buf2->buf; - q2.anslen = sizeof(buf2->buf); - } - } else if (query_ipv4) { - q.qtype = T_A; - } else { - free(buf); - free(buf2); - return NS_NOTFOUND; - } - break; - case AF_INET: - q.name = name; - q.qclass = C_IN; - q.qtype = T_A; - q.answer = buf->buf; - q.anslen = sizeof(buf->buf); - break; - case AF_INET6: - q.name = name; - q.qclass = C_IN; - q.qtype = T_AAAA; - q.answer = buf->buf; - q.anslen = sizeof(buf->buf); - break; - default: - free(buf); - free(buf2); - return NS_UNAVAIL; - } - - res = __res_get_state(); - if (res == NULL) { - free(buf); - free(buf2); - return NS_NOTFOUND; - } - - if (res_searchN(name, &q, res) < 0) { - __res_put_state(res); - free(buf); - free(buf2); - return NS_NOTFOUND; - } - ai = getanswer(buf, q.n, q.name, q.qtype, pai); - if (ai) { - cur->ai_next = ai; - while (cur && cur->ai_next) - cur = cur->ai_next; - } - if (q.next) { - ai = getanswer(buf2, q2.n, q2.name, q2.qtype, pai); - if (ai) - cur->ai_next = ai; - } - free(buf); - free(buf2); - if (sentinel.ai_next == NULL) { - __res_put_state(res); - switch (h_errno) { - case HOST_NOT_FOUND: - return NS_NOTFOUND; - case TRY_AGAIN: - return NS_TRYAGAIN; - default: - return NS_UNAVAIL; - } - } - - _rfc3484_sort(&sentinel); - - __res_put_state(res); - - *((struct addrinfo **)rv) = sentinel.ai_next; - return NS_SUCCESS; -} - -static void -_sethtent(_pseudo_FILE * __restrict__ hostf) -{ - assert(hostf); - if (hostf->mapping == MAP_FAILED) - (void) _pseudo_fopen_r(hostf, _PATH_HOSTS); - else - _pseudo_rewind(hostf); -} - -static void -_endhtent(_pseudo_FILE * __restrict__ hostf) -{ - assert(hostf); - (void) _pseudo_fclose(hostf); -} - -static struct addrinfo * -_gethtent(_pseudo_FILE * __restrict__ hostf, const char *name, const struct addrinfo *pai) -{ - char *p; - char *cp, *tname, *cname; - struct addrinfo hints, *res0, *res; - int error; - const char *addr; - char hostbuf[8*1024]; - - assert(hostf); -// fprintf(stderr, "_gethtent() name = '%s'\n", name); - assert(name != NULL); - assert(pai != NULL); - - if (hostf->mapping == MAP_FAILED) - (void) _pseudo_fopen_r(hostf, _PATH_HOSTS); - if (hostf->mapping == MAP_FAILED) - return (NULL); - again: - if (!(p = _pseudo_fgets(hostbuf, sizeof hostbuf, hostf))) - return (NULL); - if (*p == '#') - goto again; - if (!(cp = strpbrk(p, "#\n"))) - goto again; - *cp = '\0'; - if (!(cp = strpbrk(p, " \t"))) - goto again; - *cp++ = '\0'; - addr = p; - /* if this is not something we're looking for, skip it. */ - cname = NULL; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (!cname) - cname = cp; - tname = cp; - if ((cp = strpbrk(cp, " \t")) != NULL) - *cp++ = '\0'; -// fprintf(stderr, "\ttname = '%s'", tname); - if (strcasecmp(name, tname) == 0) - goto found; - } - goto again; - -found: - hints = *pai; - hints.ai_flags = AI_NUMERICHOST; - error = __wrap_getaddrinfo(addr, NULL, &hints, &res0); - if (error) - goto again; - for (res = res0; res; res = res->ai_next) { - /* cover it up */ - res->ai_flags = pai->ai_flags; - - if (pai->ai_flags & AI_CANONNAME) { - if (get_canonname(pai, res, cname) != 0) { - __wrap_freeaddrinfo(res0); - goto again; - } - } - } - return res0; -} - -/*ARGSUSED*/ -static int -_files_getaddrinfo(void *rv, void *cb_data, va_list ap) -{ - const char *name; - const struct addrinfo *pai; - struct addrinfo sentinel, *cur; - struct addrinfo *p; - _pseudo_FILE hostf = _PSEUDO_FILE_INITIALIZER; - - name = va_arg(ap, char *); - pai = va_arg(ap, struct addrinfo *); - -// fprintf(stderr, "_files_getaddrinfo() name = '%s'\n", name); - memset(&sentinel, 0, sizeof(sentinel)); - cur = &sentinel; - - _sethtent(&hostf); - while ((p = _gethtent(&hostf, name, pai)) != NULL) { - cur->ai_next = p; - while (cur && cur->ai_next) - cur = cur->ai_next; - } - _endhtent(&hostf); - - *((struct addrinfo **)rv) = sentinel.ai_next; - if (sentinel.ai_next == NULL) - return NS_NOTFOUND; - return NS_SUCCESS; -} - -/* resolver logic */ - -/* - * Formulate a normal query, send, and await answer. - * Returned answer is placed in supplied buffer "answer". - * Perform preliminary check of answer, returning success only - * if no error is indicated and the answer count is nonzero. - * Return the size of the response on success, -1 on error. - * Error number is left in h_errno. - * - * Caller must parse answer and determine whether it answers the question. - */ -static int -res_queryN(const char *name, /* domain name */ struct res_target *target, - res_state res) -{ - u_char buf[MAXPACKET]; - HEADER *hp; - int n; - struct res_target *t; - int rcode; - int ancount; - - assert(name != NULL); - /* XXX: target may be NULL??? */ - - rcode = NOERROR; - ancount = 0; - - for (t = target; t; t = t->next) { - int class, type; - u_char *answer; - int anslen; - - hp = (HEADER *)(void *)t->answer; - hp->rcode = NOERROR; /* default */ - - /* make it easier... */ - class = t->qclass; - type = t->qtype; - answer = t->answer; - anslen = t->anslen; -#ifdef DEBUG - if (res->options & RES_DEBUG) - printf(";; res_nquery(%s, %d, %d)\n", name, class, type); -#endif - - n = res_nmkquery(res, QUERY, name, class, type, NULL, 0, NULL, - buf, sizeof(buf)); -#ifdef RES_USE_EDNS0 - if (n > 0 && (res->options & RES_USE_EDNS0) != 0) - n = res_nopt(res, n, buf, sizeof(buf), anslen); -#endif - if (n <= 0) { -#ifdef DEBUG - if (res->options & RES_DEBUG) - printf(";; res_nquery: mkquery failed\n"); -#endif - h_errno = NO_RECOVERY; - return n; - } - n = res_nsend(res, buf, n, answer, anslen); -#if 0 - if (n < 0) { -#ifdef DEBUG - if (res->options & RES_DEBUG) - printf(";; res_query: send error\n"); -#endif - h_errno = TRY_AGAIN; - return n; - } -#endif - - if (n < 0 || hp->rcode != NOERROR || ntohs(hp->ancount) == 0) { - rcode = hp->rcode; /* record most recent error */ -#ifdef DEBUG - if (res->options & RES_DEBUG) - printf(";; rcode = %u, ancount=%u\n", hp->rcode, - ntohs(hp->ancount)); -#endif - continue; - } - - ancount += ntohs(hp->ancount); - - t->n = n; - } - - if (ancount == 0) { - switch (rcode) { - case NXDOMAIN: - h_errno = HOST_NOT_FOUND; - break; - case SERVFAIL: - h_errno = TRY_AGAIN; - break; - case NOERROR: - h_errno = NO_DATA; - break; - case FORMERR: - case NOTIMP: - case REFUSED: - default: - h_errno = NO_RECOVERY; - break; - } - return -1; - } - return ancount; -} - -/* - * Formulate a normal query, send, and retrieve answer in supplied buffer. - * Return the size of the response on success, -1 on error. - * If enabled, implement search rules until answer or unrecoverable failure - * is detected. Error code, if any, is left in h_errno. - */ -static int -res_searchN(const char *name, struct res_target *target, res_state res) -{ - const char *cp, * const *domain; - HEADER *hp; - u_int dots; - int trailing_dot, ret, saved_herrno; - int got_nodata = 0, got_servfail = 0, tried_as_is = 0; - - assert(name != NULL); - assert(target != NULL); - - hp = (HEADER *)(void *)target->answer; /*XXX*/ - - errno = 0; - h_errno = HOST_NOT_FOUND; /* default, if we never query */ - dots = 0; - for (cp = name; *cp; cp++) - dots += (*cp == '.'); - trailing_dot = 0; - if (cp > name && *--cp == '.') - trailing_dot++; - - - //fprintf(stderr, "res_searchN() name = '%s'\n", name); - - /* - * if there aren't any dots, it could be a user-level alias - */ - if (!dots && (cp = __hostalias(name)) != NULL) { - ret = res_queryN(cp, target, res); - return ret; - } - - /* - * If there are dots in the name already, let's just give it a try - * 'as is'. The threshold can be set with the "ndots" option. - */ - saved_herrno = -1; - if (dots >= res->ndots) { - ret = res_querydomainN(name, NULL, target, res); - if (ret > 0) - return (ret); - saved_herrno = h_errno; - tried_as_is++; - } - - /* - * We do at least one level of search if - * - there is no dot and RES_DEFNAME is set, or - * - there is at least one dot, there is no trailing dot, - * and RES_DNSRCH is set. - */ - if ((!dots && (res->options & RES_DEFNAMES)) || - (dots && !trailing_dot && (res->options & RES_DNSRCH))) { - int done = 0; - - for (domain = (const char * const *)res->dnsrch; - *domain && !done; - domain++) { - - ret = res_querydomainN(name, *domain, target, res); - if (ret > 0) - return ret; - - /* - * If no server present, give up. - * If name isn't found in this domain, - * keep trying higher domains in the search list - * (if that's enabled). - * On a NO_DATA error, keep trying, otherwise - * a wildcard entry of another type could keep us - * from finding this entry higher in the domain. - * If we get some other error (negative answer or - * server failure), then stop searching up, - * but try the input name below in case it's - * fully-qualified. - */ - if (errno == ECONNREFUSED) { - h_errno = TRY_AGAIN; - return -1; - } - - switch (h_errno) { - case NO_DATA: - got_nodata++; - /* FALLTHROUGH */ - case HOST_NOT_FOUND: - /* keep trying */ - break; - case TRY_AGAIN: - if (hp->rcode == SERVFAIL) { - /* try next search element, if any */ - got_servfail++; - break; - } - /* FALLTHROUGH */ - default: - /* anything else implies that we're done */ - done++; - } - /* - * if we got here for some reason other than DNSRCH, - * we only wanted one iteration of the loop, so stop. - */ - if (!(res->options & RES_DNSRCH)) - done++; - } - } - - /* - * if we have not already tried the name "as is", do that now. - * note that we do this regardless of how many dots were in the - * name or whether it ends with a dot. - */ - if (!tried_as_is) { - ret = res_querydomainN(name, NULL, target, res); - if (ret > 0) - return ret; - } - - /* - * if we got here, we didn't satisfy the search. - * if we did an initial full query, return that query's h_errno - * (note that we wouldn't be here if that query had succeeded). - * else if we ever got a nodata, send that back as the reason. - * else send back meaningless h_errno, that being the one from - * the last DNSRCH we did. - */ - if (saved_herrno != -1) - h_errno = saved_herrno; - else if (got_nodata) - h_errno = NO_DATA; - else if (got_servfail) - h_errno = TRY_AGAIN; - return -1; -} - -/* - * Perform a call on res_query on the concatenation of name and domain, - * removing a trailing dot from name if domain is NULL. - */ -static int -res_querydomainN(const char *name, const char *domain, - struct res_target *target, res_state res) -{ - char nbuf[MAXDNAME]; - const char *longname = nbuf; - size_t n, d; - - assert(name != NULL); - /* XXX: target may be NULL??? */ - -#ifdef DEBUG - if (res->options & RES_DEBUG) - printf(";; res_querydomain(%s, %s)\n", - name, domain?domain:""); -#endif - if (domain == NULL) { - /* - * Check for trailing '.'; - * copy without '.' if present. - */ - n = strlen(name); - if (n + 1 > sizeof(nbuf)) { - h_errno = NO_RECOVERY; - return -1; - } - if (n > 0 && name[--n] == '.') { - strncpy(nbuf, name, n); - nbuf[n] = '\0'; - } else - longname = name; - } else { - n = strlen(name); - d = strlen(domain); - if (n + 1 + d + 1 > sizeof(nbuf)) { - h_errno = NO_RECOVERY; - return -1; - } - snprintf(nbuf, sizeof(nbuf), "%s.%s", name, domain); - } - return res_queryN(longname, target, res); -} diff --git a/other-licenses/android/resolv_private.h b/other-licenses/android/resolv_private.h deleted file mode 100644 index 0f3c6c04eb00..000000000000 --- a/other-licenses/android/resolv_private.h +++ /dev/null @@ -1,499 +0,0 @@ -/* $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 - */ - -#ifndef _RESOLV_PRIVATE_H_ -#define _RESOLV_PRIVATE_H_ - -#include -#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 . - * 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_ */ diff --git a/other-licenses/android/resolv_static.h b/other-licenses/android/resolv_static.h deleted file mode 100644 index 8f2a095c5664..000000000000 --- a/other-licenses/android/resolv_static.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _RESOLV_STATIC_H -#define _RESOLV_STATIC_H - -#include - -/* 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 */ diff --git a/xpcom/base/nsSystemInfo.cpp b/xpcom/base/nsSystemInfo.cpp index 24ffc5237944..73ccab9c8f80 100644 --- a/xpcom/base/nsSystemInfo.cpp +++ b/xpcom/base/nsSystemInfo.cpp @@ -49,10 +49,6 @@ #ifdef ANDROID #include "AndroidBridge.h" - -extern "C" { -extern int android_sdk_version; -} #endif nsSystemInfo::nsSystemInfo() @@ -184,7 +180,6 @@ 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"));