Backed out changeset c3a50afc2243 due to large volume of crashes tracked in bug 687367
authorBrad Lassey <blassey@mozilla.com>
Mon, 10 Oct 2011 10:40:27 -0400
changeset 78525 09ca3ba9ccb0
parent 78524 20ba6842a750
child 78526 cd148629d7e7
push id21308
push usermak77@bonardo.net
push dateTue, 11 Oct 2011 09:17:03 +0000
treeherdermozilla-central@568821b5cdca [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs687367
milestone10.0a1
backs outc3a50afc2243
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset c3a50afc2243 due to large volume of crashes tracked in bug 687367
configure.in
other-licenses/android/001-remove-dns-proxy-lookaside.patch
other-licenses/android/002-replace-stdio-with-mmap.patch
other-licenses/android/Makefile.in
other-licenses/android/arpa_nameser.h
other-licenses/android/arpa_nameser_compat.h
other-licenses/android/getaddrinfo.c
other-licenses/android/resolv_private.h
other-licenses/android/resolv_static.h
xpcom/base/nsSystemInfo.cpp
--- a/configure.in
+++ b/configure.in
@@ -7065,17 +7065,17 @@ AC_SUBST(MOZ_UTILS_PROGRAM_LDFLAGS)
 AC_SUBST(WIN32_CRT_LIBS)
 dnl Need to set this for make because NSS doesn't have configure
 AC_SUBST(DLLFLAGS)
 
 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 ========================================================
 dnl = Use malloc wrapper lib
 dnl ========================================================
 MOZ_ARG_ENABLE_BOOL(wrap-malloc,
 [  --enable-wrap-malloc    Wrap malloc calls (gnu linker only)],
     _WRAP_MALLOC=1,
deleted file mode 100644
--- 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
deleted file mode 100644
--- 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 <m.k.edwards@gmail.com>).
-+ * These changes are offered under the same license as the original NetBSD
-+ * file, whose copyright and license are unchanged above.
-+ */
-+#define ANDROID_CHANGES 1
-+
-+/*
-  * 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 <sys/param.h>
- #include <sys/socket.h>
- #include <sys/un.h>
-+#include <sys/mman.h>
- #include <net/if.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
-@@ -94,7 +105,6 @@
- #include <netdb.h>
- #include "resolv_private.h"
- #include <stddef.h>
--#include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
-@@ -103,10 +113,95 @@
- #include <stdarg.h>
- #include "nsswitch.h"
- 
-+#ifdef MOZ_GETADDRINFO_LOG_VERBOSE
-+#include <android/log.h>
-+#endif
-+
- #ifdef ANDROID_CHANGES
- #include <sys/system_properties.h>
- #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 *);
--- a/other-licenses/android/Makefile.in
+++ b/other-licenses/android/Makefile.in
@@ -66,17 +66,16 @@ CPPSRCS = \
   nsGeckoUtils.cpp \
   APKOpen.cpp \
   $(NULL)
 
 CSRCS = \
   ba.c \
   debugger.c \
   dlfcn.c \
-  getaddrinfo.c \
   linker.c \
   linker_format.c \
   rt.c \
   $(NULL)
 
 EXPORTS = APKOpen.h
 
 include $(topsrcdir)/config/rules.mk
deleted file mode 100644
--- 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 <sys/types.h>
-#include <sys/cdefs.h>
-
-/*
- * Revision information.  This is the release date in YYYYMMDD format.
- * It can change every day so the right thing to do with it is use it
- * in preprocessor commands such as "#if (__NAMESER > 19931104)".  Do not
- * compare for equality; rather, use it to determine whether your libbind.a
- * contains a new enough lib/nameser/ to support the feature you need.
- */
-
-#define __NAMESER	19991006	/* New interface version stamp. */
-
-/*
- * Define constants based on RFC 883, RFC 1034, RFC 1035
- */
-#define NS_PACKETSZ	512	/* default UDP packet size */
-#define NS_MAXDNAME	1025	/* maximum domain name */
-#define NS_MAXMSG	65535	/* maximum message size */
-#define NS_MAXCDNAME	255	/* maximum compressed domain name */
-#define NS_MAXLABEL	63	/* maximum length of domain label */
-#define NS_HFIXEDSZ	12	/* #/bytes of fixed data in header */
-#define NS_QFIXEDSZ	4	/* #/bytes of fixed data in query */
-#define NS_RRFIXEDSZ	10	/* #/bytes of fixed data in r record */
-#define NS_INT32SZ	4	/* #/bytes of data in a uint32_t */
-#define NS_INT16SZ	2	/* #/bytes of data in a uint16_t */
-#define NS_INT8SZ	1	/* #/bytes of data in a uint8_t */
-#define NS_INADDRSZ	4	/* IPv4 T_A */
-#define NS_IN6ADDRSZ	16	/* IPv6 T_AAAA */
-#define NS_CMPRSFLGS	0xc0	/* Flag bits indicating name compression. */
-#define NS_DEFAULTPORT	53	/* For both TCP and UDP. */
-
-/*
- * These can be expanded with synonyms, just keep ns_parse.c:ns_parserecord()
- * in synch with it.
- */
-typedef enum __ns_sect {
-	ns_s_qd = 0,		/* Query: Question. */
-	ns_s_zn = 0,		/* Update: Zone. */
-	ns_s_an = 1,		/* Query: Answer. */
-	ns_s_pr = 1,		/* Update: Prerequisites. */
-	ns_s_ns = 2,		/* Query: Name servers. */
-	ns_s_ud = 2,		/* Update: Update. */
-	ns_s_ar = 3,		/* Query|Update: Additional records. */
-	ns_s_max = 4
-} ns_sect;
-
-/*
- * This is a message handle.  It is caller allocated and has no dynamic data.
- * This structure is intended to be opaque to all but ns_parse.c, thus the
- * leading _'s on the member names.  Use the accessor functions, not the _'s.
- */
-typedef struct __ns_msg {
-	const u_char	*_msg, *_eom;
-	uint16_t	_id, _flags, _counts[ns_s_max];
-	const u_char	*_sections[ns_s_max];
-	ns_sect		_sect;
-	int		_rrnum;
-	const u_char	*_msg_ptr;
-} ns_msg;
-
-/* Private data structure - do not use from outside library. */
-struct _ns_flagdata {  int mask, shift;  };
-extern const struct _ns_flagdata _ns_flagdata[];
-
-/* Accessor macros - this is part of the public interface. */
-
-#define ns_msg_id(handle) ((handle)._id + 0)
-#define ns_msg_base(handle) ((handle)._msg + 0)
-#define ns_msg_end(handle) ((handle)._eom + 0)
-#define ns_msg_size(handle) ((size_t)((handle)._eom - (handle)._msg))
-#define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
-
-/*
- * This is a parsed record.  It is caller allocated and has no dynamic data.
- */
-typedef	struct __ns_rr {
-	char		name[NS_MAXDNAME];
-	uint16_t	type;
-	uint16_t	rr_class;
-	uint32_t	ttl;
-	uint16_t	rdlength;
-	const u_char *	rdata;
-} ns_rr;
-
-/* Accessor macros - this is part of the public interface. */
-#define ns_rr_name(rr)	(((rr).name[0] != '\0') ? (rr).name : ".")
-#define ns_rr_type(rr)	((ns_type)((rr).type + 0))
-#define ns_rr_class(rr)	((ns_class)((rr).rr_class + 0))
-#define ns_rr_ttl(rr)	((u_long)(rr).ttl + 0)
-#define ns_rr_rdlen(rr)	((size_t)(rr).rdlength + 0)
-#define ns_rr_rdata(rr)	((rr).rdata + 0)
-
-/*
- * These don't have to be in the same order as in the packet flags word,
- * and they can even overlap in some cases, but they will need to be kept
- * in synch with ns_parse.c:ns_flagdata[].
- */
-typedef enum __ns_flag {
-	ns_f_qr,		/* Question/Response. */
-	ns_f_opcode,		/* Operation code. */
-	ns_f_aa,		/* Authoritative Answer. */
-	ns_f_tc,		/* Truncation occurred. */
-	ns_f_rd,		/* Recursion Desired. */
-	ns_f_ra,		/* Recursion Available. */
-	ns_f_z,			/* MBZ. */
-	ns_f_ad,		/* Authentic Data (DNSSEC). */
-	ns_f_cd,		/* Checking Disabled (DNSSEC). */
-	ns_f_rcode,		/* Response code. */
-	ns_f_max
-} ns_flag;
-
-/*
- * Currently defined opcodes.
- */
-typedef enum __ns_opcode {
-	ns_o_query = 0,		/* Standard query. */
-	ns_o_iquery = 1,	/* Inverse query (deprecated/unsupported). */
-	ns_o_status = 2,	/* Name server status query (unsupported). */
-				/* Opcode 3 is undefined/reserved. */
-	ns_o_notify = 4,	/* Zone change notification. */
-	ns_o_update = 5,	/* Zone update message. */
-	ns_o_max = 6
-} ns_opcode;
-
-/*
- * Currently defined response codes.
- */
-typedef	enum __ns_rcode {
-	ns_r_noerror = 0,	/* No error occurred. */
-	ns_r_formerr = 1,	/* Format error. */
-	ns_r_servfail = 2,	/* Server failure. */
-	ns_r_nxdomain = 3,	/* Name error. */
-	ns_r_notimpl = 4,	/* Unimplemented. */
-	ns_r_refused = 5,	/* Operation refused. */
-	/* these are for BIND_UPDATE */
-	ns_r_yxdomain = 6,	/* Name exists */
-	ns_r_yxrrset = 7,	/* RRset exists */
-	ns_r_nxrrset = 8,	/* RRset does not exist */
-	ns_r_notauth = 9,	/* Not authoritative for zone */
-	ns_r_notzone = 10,	/* Zone of record different from zone section */
-	ns_r_max = 11,
-	/* The following are EDNS extended rcodes */
-	ns_r_badvers = 16,
-	/* The following are TSIG errors */
-	ns_r_badsig = 16,
-	ns_r_badkey = 17,
-	ns_r_badtime = 18
-} ns_rcode;
-
-/* BIND_UPDATE */
-typedef enum __ns_update_operation {
-	ns_uop_delete = 0,
-	ns_uop_add = 1,
-	ns_uop_max = 2
-} ns_update_operation;
-
-/*
- * This structure is used for TSIG authenticated messages
- */
-struct ns_tsig_key {
-        char name[NS_MAXDNAME], alg[NS_MAXDNAME];
-        unsigned char *data;
-        int len;
-};
-typedef struct ns_tsig_key ns_tsig_key;
-
-/*
- * This structure is used for TSIG authenticated TCP messages
- */
-struct ns_tcp_tsig_state {
-	int counter;
-	struct dst_key *key;
-	void *ctx;
-	unsigned char sig[NS_PACKETSZ];
-	int siglen;
-};
-typedef struct ns_tcp_tsig_state ns_tcp_tsig_state;
-
-#define NS_TSIG_FUDGE 300
-#define NS_TSIG_TCP_COUNT 100
-#define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
-
-#define NS_TSIG_ERROR_NO_TSIG -10
-#define NS_TSIG_ERROR_NO_SPACE -11
-#define NS_TSIG_ERROR_FORMERR -12
-
-/*
- * Currently defined type values for resources and queries.
- */
-typedef enum __ns_type {
-	ns_t_invalid = 0,	/* Cookie. */
-	ns_t_a = 1,		/* Host address. */
-	ns_t_ns = 2,		/* Authoritative server. */
-	ns_t_md = 3,		/* Mail destination. */
-	ns_t_mf = 4,		/* Mail forwarder. */
-	ns_t_cname = 5,		/* Canonical name. */
-	ns_t_soa = 6,		/* Start of authority zone. */
-	ns_t_mb = 7,		/* Mailbox domain name. */
-	ns_t_mg = 8,		/* Mail group member. */
-	ns_t_mr = 9,		/* Mail rename name. */
-	ns_t_null = 10,		/* Null resource record. */
-	ns_t_wks = 11,		/* Well known service. */
-	ns_t_ptr = 12,		/* Domain name pointer. */
-	ns_t_hinfo = 13,	/* Host information. */
-	ns_t_minfo = 14,	/* Mailbox information. */
-	ns_t_mx = 15,		/* Mail routing information. */
-	ns_t_txt = 16,		/* Text strings. */
-	ns_t_rp = 17,		/* Responsible person. */
-	ns_t_afsdb = 18,	/* AFS cell database. */
-	ns_t_x25 = 19,		/* X_25 calling address. */
-	ns_t_isdn = 20,		/* ISDN calling address. */
-	ns_t_rt = 21,		/* Router. */
-	ns_t_nsap = 22,		/* NSAP address. */
-	ns_t_nsap_ptr = 23,	/* Reverse NSAP lookup (deprecated). */
-	ns_t_sig = 24,		/* Security signature. */
-	ns_t_key = 25,		/* Security key. */
-	ns_t_px = 26,		/* X.400 mail mapping. */
-	ns_t_gpos = 27,		/* Geographical position (withdrawn). */
-	ns_t_aaaa = 28,		/* Ip6 Address. */
-	ns_t_loc = 29,		/* Location Information. */
-	ns_t_nxt = 30,		/* Next domain (security). */
-	ns_t_eid = 31,		/* Endpoint identifier. */
-	ns_t_nimloc = 32,	/* Nimrod Locator. */
-	ns_t_srv = 33,		/* Server Selection. */
-	ns_t_atma = 34,		/* ATM Address */
-	ns_t_naptr = 35,	/* Naming Authority PoinTeR */
-	ns_t_kx = 36,		/* Key Exchange */
-	ns_t_cert = 37,		/* Certification record */
-	ns_t_a6 = 38,		/* IPv6 address (deprecates AAAA) */
-	ns_t_dname = 39,	/* Non-terminal DNAME (for IPv6) */
-	ns_t_sink = 40,		/* Kitchen sink (experimentatl) */
-	ns_t_opt = 41,		/* EDNS0 option (meta-RR) */
-	ns_t_apl = 42,		/* Address prefix list (RFC 3123) */
-	ns_t_tkey = 249,	/* Transaction key */
-	ns_t_tsig = 250,	/* Transaction signature. */
-	ns_t_ixfr = 251,	/* Incremental zone transfer. */
-	ns_t_axfr = 252,	/* Transfer zone of authority. */
-	ns_t_mailb = 253,	/* Transfer mailbox records. */
-	ns_t_maila = 254,	/* Transfer mail agent records. */
-	ns_t_any = 255,		/* Wildcard match. */
-	ns_t_zxfr = 256,	/* BIND-specific, nonstandard. */
-	ns_t_max = 65536
-} ns_type;
-
-/* Exclusively a QTYPE? (not also an RTYPE) */
-#define	ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \
-		      (t) == ns_t_mailb || (t) == ns_t_maila)
-/* Some kind of meta-RR? (not a QTYPE, but also not an RTYPE) */
-#define	ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
-/* Exclusively an RTYPE? (not also a QTYPE or a meta-RR) */
-#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
-#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
-#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \
-		       (t) == ns_t_zxfr)
-
-/*
- * Values for class field
- */
-typedef enum __ns_class {
-	ns_c_invalid = 0,	/* Cookie. */
-	ns_c_in = 1,		/* Internet. */
-	ns_c_2 = 2,		/* unallocated/unsupported. */
-	ns_c_chaos = 3,		/* MIT Chaos-net. */
-	ns_c_hs = 4,		/* MIT Hesiod. */
-	/* Query class values which do not appear in resource records */
-	ns_c_none = 254,	/* for prereq. sections in update requests */
-	ns_c_any = 255,		/* Wildcard match. */
-	ns_c_max = 65536
-} ns_class;
-
-/* DNSSEC constants. */
-
-typedef enum __ns_key_types {
-	ns_kt_rsa = 1,		/* key type RSA/MD5 */
-	ns_kt_dh  = 2,		/* Diffie Hellman */
-	ns_kt_dsa = 3,		/* Digital Signature Standard (MANDATORY) */
-	ns_kt_private = 254	/* Private key type starts with OID */
-} ns_key_types;
-
-typedef enum __ns_cert_types {
-	cert_t_pkix = 1,	/* PKIX (X.509v3) */
-	cert_t_spki = 2,	/* SPKI */
-	cert_t_pgp  = 3,	/* PGP */
-	cert_t_url  = 253,	/* URL private type */
-	cert_t_oid  = 254	/* OID private type */
-} ns_cert_types;
-
-/* Flags field of the KEY RR rdata. */
-#define	NS_KEY_TYPEMASK		0xC000	/* Mask for "type" bits */
-#define	NS_KEY_TYPE_AUTH_CONF	0x0000	/* Key usable for both */
-#define	NS_KEY_TYPE_CONF_ONLY	0x8000	/* Key usable for confidentiality */
-#define	NS_KEY_TYPE_AUTH_ONLY	0x4000	/* Key usable for authentication */
-#define	NS_KEY_TYPE_NO_KEY	0xC000	/* No key usable for either; no key */
-/* The type bits can also be interpreted independently, as single bits: */
-#define	NS_KEY_NO_AUTH		0x8000	/* Key unusable for authentication */
-#define	NS_KEY_NO_CONF		0x4000	/* Key unusable for confidentiality */
-#define	NS_KEY_RESERVED2	0x2000	/* Security is *mandatory* if bit=0 */
-#define	NS_KEY_EXTENDED_FLAGS	0x1000	/* reserved - must be zero */
-#define	NS_KEY_RESERVED4	0x0800  /* reserved - must be zero */
-#define	NS_KEY_RESERVED5	0x0400  /* reserved - must be zero */
-#define	NS_KEY_NAME_TYPE	0x0300	/* these bits determine the type */
-#define	NS_KEY_NAME_USER	0x0000	/* key is assoc. with user */
-#define	NS_KEY_NAME_ENTITY	0x0200	/* key is assoc. with entity eg host */
-#define	NS_KEY_NAME_ZONE	0x0100	/* key is zone key */
-#define	NS_KEY_NAME_RESERVED	0x0300	/* reserved meaning */
-#define	NS_KEY_RESERVED8	0x0080  /* reserved - must be zero */
-#define	NS_KEY_RESERVED9	0x0040  /* reserved - must be zero */
-#define	NS_KEY_RESERVED10	0x0020  /* reserved - must be zero */
-#define	NS_KEY_RESERVED11	0x0010  /* reserved - must be zero */
-#define	NS_KEY_SIGNATORYMASK	0x000F	/* key can sign RR's of same name */
-#define	NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \
-				  NS_KEY_RESERVED4 | \
-				  NS_KEY_RESERVED5 | \
-				  NS_KEY_RESERVED8 | \
-				  NS_KEY_RESERVED9 | \
-				  NS_KEY_RESERVED10 | \
-				  NS_KEY_RESERVED11 )
-#define NS_KEY_RESERVED_BITMASK2 0xFFFF /* no bits defined here */
-
-/* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */
-#define	NS_ALG_MD5RSA		1	/* MD5 with RSA */
-#define	NS_ALG_DH               2	/* Diffie Hellman KEY */
-#define	NS_ALG_DSA              3	/* DSA KEY */
-#define	NS_ALG_DSS              NS_ALG_DSA
-#define	NS_ALG_EXPIRE_ONLY	253	/* No alg, no security */
-#define	NS_ALG_PRIVATE_OID	254	/* Key begins with OID giving alg */
-
-/* Protocol values  */
-/* value 0 is reserved */
-#define NS_KEY_PROT_TLS         1
-#define NS_KEY_PROT_EMAIL       2
-#define NS_KEY_PROT_DNSSEC      3
-#define NS_KEY_PROT_IPSEC       4
-#define NS_KEY_PROT_ANY		255
-
-/* Signatures */
-#define	NS_MD5RSA_MIN_BITS	 512	/* Size of a mod or exp in bits */
-#define	NS_MD5RSA_MAX_BITS	4096
-	/* Total of binary mod and exp */
-#define	NS_MD5RSA_MAX_BYTES	((NS_MD5RSA_MAX_BITS+7/8)*2+3)
-	/* Max length of text sig block */
-#define	NS_MD5RSA_MAX_BASE64	(((NS_MD5RSA_MAX_BYTES+2)/3)*4)
-#define NS_MD5RSA_MIN_SIZE	((NS_MD5RSA_MIN_BITS+7)/8)
-#define NS_MD5RSA_MAX_SIZE	((NS_MD5RSA_MAX_BITS+7)/8)
-
-#define NS_DSA_SIG_SIZE         41
-#define NS_DSA_MIN_SIZE         213
-#define NS_DSA_MAX_BYTES        405
-
-/* Offsets into SIG record rdata to find various values */
-#define	NS_SIG_TYPE	0	/* Type flags */
-#define	NS_SIG_ALG	2	/* Algorithm */
-#define	NS_SIG_LABELS	3	/* How many labels in name */
-#define	NS_SIG_OTTL	4	/* Original TTL */
-#define	NS_SIG_EXPIR	8	/* Expiration time */
-#define	NS_SIG_SIGNED	12	/* Signature time */
-#define	NS_SIG_FOOT	16	/* Key footprint */
-#define	NS_SIG_SIGNER	18	/* Domain name of who signed it */
-
-/* How RR types are represented as bit-flags in NXT records */
-#define	NS_NXT_BITS 8
-#define	NS_NXT_BIT_SET(  n,p) (p[(n)/NS_NXT_BITS] |=  (0x80>>((n)%NS_NXT_BITS)))
-#define	NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
-#define	NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] &   (0x80>>((n)%NS_NXT_BITS)))
-#define NS_NXT_MAX 127
-
-/*
- * EDNS0 extended flags, host order.
- */
-#define NS_OPT_DNSSEC_OK	0x8000U
-
-/*
- * Inline versions of get/put short/long.  Pointer is advanced.
- */
-#define NS_GET16(s, cp) do { \
-	const u_char *t_cp = (const u_char *)(cp); \
-	(s) = ((uint16_t)t_cp[0] << 8) \
-	    | ((uint16_t)t_cp[1]) \
-	    ; \
-	(cp) += NS_INT16SZ; \
-} while (/*CONSTCOND*/0)
-
-#define NS_GET32(l, cp) do { \
-	const u_char *t_cp = (const u_char *)(cp); \
-	(l) = ((uint32_t)t_cp[0] << 24) \
-	    | ((uint32_t)t_cp[1] << 16) \
-	    | ((uint32_t)t_cp[2] << 8) \
-	    | ((uint32_t)t_cp[3]) \
-	    ; \
-	(cp) += NS_INT32SZ; \
-} while (/*CONSTCOND*/0)
-
-#define NS_PUT16(s, cp) do { \
-	uint32_t t_s = (uint32_t)(s); \
-	u_char *t_cp = (u_char *)(cp); \
-	*t_cp++ = t_s >> 8; \
-	*t_cp   = t_s; \
-	(cp) += NS_INT16SZ; \
-} while (/*CONSTCOND*/0)
-
-#define NS_PUT32(l, cp) do { \
-	uint32_t t_l = (uint32_t)(l); \
-	u_char *t_cp = (u_char *)(cp); \
-	*t_cp++ = t_l >> 24; \
-	*t_cp++ = t_l >> 16; \
-	*t_cp++ = t_l >> 8; \
-	*t_cp   = t_l; \
-	(cp) += NS_INT32SZ; \
-} while (/*CONSTCOND*/0)
-
-/*
- * ANSI C identifier hiding for bind's lib/nameser.
- */
-#define	ns_msg_getflag		__ns_msg_getflag
-#define ns_get16		__ns_get16
-#define ns_get32		__ns_get32
-#define ns_put16		__ns_put16
-#define ns_put32		__ns_put32
-#define ns_initparse		__ns_initparse
-#define ns_skiprr		__ns_skiprr
-#define ns_parserr		__ns_parserr
-#define	ns_sprintrr		__ns_sprintrr
-#define	ns_sprintrrf		__ns_sprintrrf
-#define	ns_format_ttl		__ns_format_ttl
-#define	ns_parse_ttl		__ns_parse_ttl
-#define ns_datetosecs		__ns_datetosecs
-#define	ns_name_ntol		__ns_name_ntol
-#define	ns_name_ntop		__ns_name_ntop
-#define	ns_name_pton		__ns_name_pton
-#define	ns_name_unpack		__ns_name_unpack
-#define	ns_name_pack		__ns_name_pack
-#define	ns_name_compress	__ns_name_compress
-#define	ns_name_uncompress	__ns_name_uncompress
-#define	ns_name_skip		__ns_name_skip
-#define	ns_name_rollback	__ns_name_rollback
-#define	ns_sign			__ns_sign
-#define	ns_sign2		__ns_sign2
-#define	ns_sign_tcp		__ns_sign_tcp
-#define	ns_sign_tcp2		__ns_sign_tcp2
-#define	ns_sign_tcp_init	__ns_sign_tcp_init
-#define ns_find_tsig		__ns_find_tsig
-#define	ns_verify		__ns_verify
-#define	ns_verify_tcp		__ns_verify_tcp
-#define	ns_verify_tcp_init	__ns_verify_tcp_init
-#define	ns_samedomain		__ns_samedomain
-#define	ns_subdomain		__ns_subdomain
-#define	ns_makecanon		__ns_makecanon
-#define	ns_samename		__ns_samename
-
-__BEGIN_DECLS
-int		ns_msg_getflag(ns_msg, int);
-uint16_t	ns_get16(const u_char *);
-uint32_t	ns_get32(const u_char *);
-void		ns_put16(uint16_t, u_char *);
-void		ns_put32(uint32_t, u_char *);
-int		ns_initparse(const u_char *, int, ns_msg *);
-int		ns_skiprr(const u_char *, const u_char *, ns_sect, int);
-int		ns_parserr(ns_msg *, ns_sect, int, ns_rr *);
-int		ns_sprintrr(const ns_msg *, const ns_rr *,
-				 const char *, const char *, char *, size_t);
-int		ns_sprintrrf(const u_char *, size_t, const char *,
-				  ns_class, ns_type, u_long, const u_char *,
-				  size_t, const char *, const char *,
-				  char *, size_t);
-int		ns_format_ttl(u_long, char *, size_t);
-int		ns_parse_ttl(const char *, u_long *);
-uint32_t	ns_datetosecs(const char *cp, int *errp);
-int		ns_name_ntol(const u_char *, u_char *, size_t);
-int		ns_name_ntop(const u_char *, char *, size_t);
-int		ns_name_pton(const char *, u_char *, size_t);
-int		ns_name_unpack(const u_char *, const u_char *,
-				    const u_char *, u_char *, size_t);
-int		ns_name_pack(const u_char *, u_char *, int,
-				  const u_char **, const u_char **);
-int		ns_name_uncompress(const u_char *, const u_char *,
-					const u_char *, char *, size_t);
-int		ns_name_compress(const char *, u_char *, size_t,
-				      const u_char **, const u_char **);
-int		ns_name_skip(const u_char **, const u_char *);
-void		ns_name_rollback(const u_char *, const u_char **,
-				      const u_char **);
-int		ns_sign(u_char *, int *, int, int, void *,
-			     const u_char *, int, u_char *, int *, time_t);
-int		ns_sign2(u_char *, int *, int, int, void *,
-			      const u_char *, int, u_char *, int *, time_t,
-			      u_char **, u_char **);
-int		ns_sign_tcp(u_char *, int *, int, int,
-				 ns_tcp_tsig_state *, int);
-int		ns_sign_tcp2(u_char *, int *, int, int,
-				  ns_tcp_tsig_state *, int,
-				  u_char **, u_char **);
-int		ns_sign_tcp_init(void *, const u_char *, int,
-					ns_tcp_tsig_state *);
-u_char		*ns_find_tsig(u_char *, u_char *);
-int		ns_verify(u_char *, int *, void *,
-			       const u_char *, int, u_char *, int *,
-			       time_t *, int);
-int		ns_verify_tcp(u_char *, int *, ns_tcp_tsig_state *, int);
-int		ns_verify_tcp_init(void *, const u_char *, int,
-					ns_tcp_tsig_state *);
-int		ns_samedomain(const char *, const char *);
-int		ns_subdomain(const char *, const char *);
-int		ns_makecanon(const char *, char *, size_t);
-int		ns_samename(const char *, const char *);
-__END_DECLS
-
-#ifdef BIND_4_COMPAT
-#include "arpa_nameser_compat.h"
-#endif
-
-#if 0
-#  include <logd.h>
-#  define  XLOG(...)   \
-    __libc_android_log_print(ANDROID_LOG_DEBUG,"libc",__VA_ARGS__)
-#else
-#define  XLOG(...)   do {} while (0)
-#endif
-
-#endif /* !_ARPA_NAMESER_H_ */
deleted file mode 100644
--- 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 <endian.h>
-
-#ifndef BYTE_ORDER
-#if (BSD >= 199103)
-# include <machine/endian.h>
-#else
-#ifdef __linux
-# include <endian.h>
-#else
-#define	LITTLE_ENDIAN	1234	/* least-significant byte first (vax, pc) */
-#define	BIG_ENDIAN	4321	/* most-significant byte first (IBM, net) */
-#define	PDP_ENDIAN	3412	/* LSB first in word, MSW first in long (pdp)*/
-
-#if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \
-    defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \
-    defined(__alpha__) || defined(__alpha) || \
-    (defined(__Lynx__) && defined(__x86__))
-#define BYTE_ORDER	LITTLE_ENDIAN
-#endif
-
-#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \
-    defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \
-    defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\
-    defined(apollo) || defined(__convex__) || defined(_CRAY) || \
-    defined(__hppa) || defined(__hp9000) || \
-    defined(__hp9000s300) || defined(__hp9000s700) || \
-    defined(__hp3000s900) || defined(__hpux) || defined(MPE) || \
-    defined (BIT_ZERO_ON_LEFT) || defined(m68k) || defined(__sparc) ||  \
-    (defined(__Lynx__) && \
-     (defined(__68k__) || defined(__sparc__) || defined(__powerpc__)))
-#define BYTE_ORDER	BIG_ENDIAN
-#endif
-#endif /* __linux */
-#endif /* BSD */
-#endif /* BYTE_ORDER */
-
-#if !defined(BYTE_ORDER) || \
-    (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \
-    BYTE_ORDER != PDP_ENDIAN)
-	/* you must determine what the correct bit order is for
-	 * your compiler - the next line is an intentional error
-	 * which will force your compiles to bomb until you fix
-	 * the above macros.
-	 */
-  #error "Undefined or invalid BYTE_ORDER";
-#endif
-
-/*
- * Structure for query header.  The order of the fields is machine- and
- * compiler-dependent, depending on the byte/bit order and the layout
- * of bit fields.  We use bit fields only in int variables, as this
- * is all ANSI requires.  This requires a somewhat confusing rearrangement.
- */
-
-typedef struct {
-	unsigned	id :16;		/* query identification number */
-#if BYTE_ORDER == BIG_ENDIAN
-			/* fields in third byte */
-	unsigned	qr: 1;		/* response flag */
-	unsigned	opcode: 4;	/* purpose of message */
-	unsigned	aa: 1;		/* authoritive answer */
-	unsigned	tc: 1;		/* truncated message */
-	unsigned	rd: 1;		/* recursion desired */
-			/* fields in fourth byte */
-	unsigned	ra: 1;		/* recursion available */
-	unsigned	unused :1;	/* unused bits (MBZ as of 4.9.3a3) */
-	unsigned	ad: 1;		/* authentic data from named */
-	unsigned	cd: 1;		/* checking disabled by resolver */
-	unsigned	rcode :4;	/* response code */
-#endif
-#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
-			/* fields in third byte */
-	unsigned	rd :1;		/* recursion desired */
-	unsigned	tc :1;		/* truncated message */
-	unsigned	aa :1;		/* authoritive answer */
-	unsigned	opcode :4;	/* purpose of message */
-	unsigned	qr :1;		/* response flag */
-			/* fields in fourth byte */
-	unsigned	rcode :4;	/* response code */
-	unsigned	cd: 1;		/* checking disabled by resolver */
-	unsigned	ad: 1;		/* authentic data from named */
-	unsigned	unused :1;	/* unused bits (MBZ as of 4.9.3a3) */
-	unsigned	ra :1;		/* recursion available */
-#endif
-			/* remaining bytes */
-	unsigned	qdcount :16;	/* number of question entries */
-	unsigned	ancount :16;	/* number of answer entries */
-	unsigned	nscount :16;	/* number of authority entries */
-	unsigned	arcount :16;	/* number of resource entries */
-} HEADER;
-
-#define PACKETSZ	NS_PACKETSZ
-#define MAXDNAME	NS_MAXDNAME
-#define MAXCDNAME	NS_MAXCDNAME
-#define MAXLABEL	NS_MAXLABEL
-#define	HFIXEDSZ	NS_HFIXEDSZ
-#define QFIXEDSZ	NS_QFIXEDSZ
-#define RRFIXEDSZ	NS_RRFIXEDSZ
-#define	INT32SZ		NS_INT32SZ
-#define	INT16SZ		NS_INT16SZ
-#define	INT8SZ		NS_INT8SZ
-#define	INADDRSZ	NS_INADDRSZ
-#define	IN6ADDRSZ	NS_IN6ADDRSZ
-#define	INDIR_MASK	NS_CMPRSFLGS
-#define NAMESERVER_PORT	NS_DEFAULTPORT
-
-#define S_ZONE		ns_s_zn
-#define S_PREREQ	ns_s_pr
-#define S_UPDATE	ns_s_ud
-#define S_ADDT		ns_s_ar
-
-#define QUERY		ns_o_query
-#define IQUERY		ns_o_iquery
-#define STATUS		ns_o_status
-#define	NS_NOTIFY_OP	ns_o_notify
-#define	NS_UPDATE_OP	ns_o_update
-
-#define NOERROR		ns_r_noerror
-#define FORMERR		ns_r_formerr
-#define SERVFAIL	ns_r_servfail
-#define NXDOMAIN	ns_r_nxdomain
-#define NOTIMP		ns_r_notimpl
-#define REFUSED		ns_r_refused
-#define YXDOMAIN	ns_r_yxdomain
-#define YXRRSET		ns_r_yxrrset
-#define NXRRSET		ns_r_nxrrset
-#define NOTAUTH		ns_r_notauth
-#define NOTZONE		ns_r_notzone
-/*#define BADSIG		ns_r_badsig*/
-/*#define BADKEY		ns_r_badkey*/
-/*#define BADTIME		ns_r_badtime*/
-
-
-#define DELETE		ns_uop_delete
-#define ADD		ns_uop_add
-
-#define T_A		ns_t_a
-#define T_NS		ns_t_ns
-#define T_MD		ns_t_md
-#define T_MF		ns_t_mf
-#define T_CNAME		ns_t_cname
-#define T_SOA		ns_t_soa
-#define T_MB		ns_t_mb
-#define T_MG		ns_t_mg
-#define T_MR		ns_t_mr
-#define T_NULL		ns_t_null
-#define T_WKS		ns_t_wks
-#define T_PTR		ns_t_ptr
-#define T_HINFO		ns_t_hinfo
-#define T_MINFO		ns_t_minfo
-#define T_MX		ns_t_mx
-#define T_TXT		ns_t_txt
-#define	T_RP		ns_t_rp
-#define T_AFSDB		ns_t_afsdb
-#define T_X25		ns_t_x25
-#define T_ISDN		ns_t_isdn
-#define T_RT		ns_t_rt
-#define T_NSAP		ns_t_nsap
-#define T_NSAP_PTR	ns_t_nsap_ptr
-#define	T_SIG		ns_t_sig
-#define	T_KEY		ns_t_key
-#define	T_PX		ns_t_px
-#define	T_GPOS		ns_t_gpos
-#define	T_AAAA		ns_t_aaaa
-#define	T_LOC		ns_t_loc
-#define	T_NXT		ns_t_nxt
-#define	T_EID		ns_t_eid
-#define	T_NIMLOC	ns_t_nimloc
-#define	T_SRV		ns_t_srv
-#define T_ATMA		ns_t_atma
-#define T_NAPTR		ns_t_naptr
-#define T_A6		ns_t_a6
-#define	T_TSIG		ns_t_tsig
-#define	T_IXFR		ns_t_ixfr
-#define T_AXFR		ns_t_axfr
-#define T_MAILB		ns_t_mailb
-#define T_MAILA		ns_t_maila
-#define T_ANY		ns_t_any
-
-#define C_IN		ns_c_in
-#define C_CHAOS		ns_c_chaos
-#define C_HS		ns_c_hs
-/* BIND_UPDATE */
-#define C_NONE		ns_c_none
-#define C_ANY		ns_c_any
-
-#define	GETSHORT		NS_GET16
-#define	GETLONG			NS_GET32
-#define	PUTSHORT		NS_PUT16
-#define	PUTLONG			NS_PUT32
-
-#endif /* _ARPA_NAMESER_COMPAT_ */
deleted file mode 100644
--- 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 <m.k.edwards@gmail.com>).
- * These changes are offered under the same license as the original NetBSD
- * file, whose copyright and license are unchanged above.
- */
-#define ANDROID_CHANGES 1
-
-/*
- * 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 <fcntl.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/mman.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include "arpa_nameser.h"
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <netdb.h>
-#include "resolv_private.h"
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <syslog.h>
-#include <stdarg.h>
-#include "nsswitch.h"
-
-#ifdef MOZ_GETADDRINFO_LOG_VERBOSE
-#include <android/log.h>
-#endif
-
-#ifdef ANDROID_CHANGES
-#include <sys/system_properties.h>
-#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 <scoped_address><delimiter><scope id>
-	 */
-	hostname2 = strdup(hostname);
-	if (hostname2 == NULL)
-		return EAI_MEMORY;
-	/* terminate at the delimiter */
-	hostname2[cp - hostname] = '\0';
-	addr = hostname2;
-	scope = cp + 1;
-
-	error = explore_numeric(pai, addr, servname, res, 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 <netinet/in6.h>. */
-
-/* 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:"<Nil>");
-#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);
-}
deleted file mode 100644
--- 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 <resolv.h>
-#include "resolv_static.h"
-
-/*
- * Revision information.  This is the release date in YYYYMMDD format.
- * It can change every day so the right thing to do with it is use it
- * in preprocessor commands such as "#if (__RES > 19931104)".  Do not
- * compare for equality; rather, use it to determine whether your resolver
- * is new enough to contain a certain feature.
- */
-
-#define	__RES	20030124
-
-/*
- * This used to be defined in res_query.c, now it's in herror.c.
- * [XXX no it's not.  It's in irs/irs_data.c]
- * It was
- * never extern'd by any *.h file before it was placed here.  For thread
- * aware programs, the last h_errno value set is stored in res->h_errno.
- *
- * XXX:	There doesn't seem to be a good reason for exposing RES_SET_H_ERRNO
- *	(and __h_errno_set) to the public via <resolv.h>.
- * XXX:	__h_errno_set is really part of IRS, not part of the resolver.
- *	If somebody wants to build and use a resolver that doesn't use IRS,
- *	what do they do?  Perhaps something like
- *		#ifdef WANT_IRS
- *		# define RES_SET_H_ERRNO(r,x) __h_errno_set(r,x)
- *		#else
- *		# define RES_SET_H_ERRNO(r,x) (h_errno = (r)->res_h_errno = (x))
- *		#endif
- */
-
-#define RES_SET_H_ERRNO(r,x) (h_errno = (r)->res_h_errno = (x))
-struct __res_state; /* forward */
-
-/*
- * Resolver configuration file.
- * Normally not present, but may contain the address of the
- * initial name server(s) to query and the domain search list.
- */
-
-#ifndef _PATH_RESCONF
-#ifdef ANDROID_CHANGES
-#define _PATH_RESCONF        "/etc/ppp/resolv.conf"
-#else
-#define _PATH_RESCONF        "/etc/resolv.conf"
-#endif
-#endif
-
-typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
-	res_sendhookact;
-
-typedef res_sendhookact (*res_send_qhook)(struct sockaddr * const *,
-					      const u_char **, int *,
-					      u_char *, int, int *);
-
-typedef res_sendhookact (*res_send_rhook)(const struct sockaddr *,
-					      const u_char *, int, u_char *,
-					      int, int *);
-
-struct res_sym {
-	int		number;	   /* Identifying number, like T_MX */
-	const char *	name;	   /* Its symbolic name, like "MX" */
-	const char *	humanname; /* Its fun name, like "mail exchanger" */
-};
-
-/*
- * Global defines and variables for resolver stub.
- */
-#define	MAXNS			3	/* max # name servers we'll track */
-#define	MAXDFLSRCH		3	/* # default domain levels to try */
-#define	MAXDNSRCH		6	/* max # domains in search path */
-#define	LOCALDOMAINPARTS	2	/* min levels in name that is "local" */
-
-#define	RES_TIMEOUT		5	/* min. seconds between retries */
-#define	MAXRESOLVSORT		10	/* number of net to sort on */
-#define	RES_MAXNDOTS		15	/* should reflect bit field size */
-#define	RES_MAXRETRANS		30	/* only for resolv.conf/RES_OPTIONS */
-#define	RES_MAXRETRY		5	/* only for resolv.conf/RES_OPTIONS */
-#define	RES_DFLRETRY		2	/* Default #/tries. */
-#define	RES_MAXTIME		65535	/* Infinity, in milliseconds. */
-
-struct __res_state_ext;
-
-struct __res_state {
-	int	retrans;	 	/* retransmission time interval */
-	int	retry;			/* number of times to retransmit */
-#ifdef sun
-	u_int	options;		/* option flags - see below. */
-#else
-	u_long	options;		/* option flags - see below. */
-#endif
-	int	nscount;		/* number of name servers */
-	struct sockaddr_in
-		nsaddr_list[MAXNS];	/* address of name server */
-#define	nsaddr	nsaddr_list[0]		/* for backward compatibility */
-	u_short	id;			/* current message id */
-	char	*dnsrch[MAXDNSRCH+1];	/* components of domain to search */
-	char	defdname[256];		/* default domain (deprecated) */
-#ifdef sun
-	u_int	pfcode;			/* RES_PRF_ flags - see below. */
-#else
-	u_long	pfcode;			/* RES_PRF_ flags - see below. */
-#endif
-	unsigned ndots:4;		/* threshold for initial abs. query */
-	unsigned nsort:4;		/* number of elements in sort_list[] */
-	char	unused[3];
-	struct {
-		struct in_addr	addr;
-		uint32_t	mask;
-	} sort_list[MAXRESOLVSORT];
-#ifdef __OLD_RES_STATE
-	char lookups[4];
-#else
-	res_send_qhook qhook;		/* query hook */
-	res_send_rhook rhook;		/* response hook */
-	int	res_h_errno;		/* last one set for this context */
-	int	_vcsock;		/* PRIVATE: for res_send VC i/o */
-	u_int	_flags;			/* PRIVATE: see below */
-	u_int	_pad;			/* make _u 64 bit aligned */
-	union {
-		/* On an 32-bit arch this means 512b total. */
-		char	pad[72 - 4*sizeof (int) - 2*sizeof (void *)];
-		struct {
-			uint16_t		nscount;
-			uint16_t		nstimes[MAXNS];	/* ms. */
-			int			nssocks[MAXNS];
-			struct __res_state_ext *ext;	/* extention for IPv6 */
-		} _ext;
-	} _u;
-#endif
-        struct res_static   rstatic[1];
-};
-
-typedef struct __res_state *res_state;
-
-union res_sockaddr_union {
-	struct sockaddr_in	sin;
-#ifdef IN6ADDR_ANY_INIT
-	struct sockaddr_in6	sin6;
-#endif
-#ifdef ISC_ALIGN64
-	int64_t			__align64;	/* 64bit alignment */
-#else
-	int32_t			__align32;	/* 32bit alignment */
-#endif
-	char			__space[128];   /* max size */
-};
-
-/*
- * Resolver flags (used to be discrete per-module statics ints).
- */
-#define	RES_F_VC	0x00000001	/* socket is TCP */
-#define	RES_F_CONN	0x00000002	/* socket is connected */
-#define	RES_F_EDNS0ERR	0x00000004	/* EDNS0 caused errors */
-#define	RES_F__UNUSED	0x00000008	/* (unused) */
-#define	RES_F_LASTMASK	0x000000F0	/* ordinal server of last res_nsend */
-#define	RES_F_LASTSHIFT	4		/* bit position of LASTMASK "flag" */
-#define	RES_GETLAST(res) (((res)._flags & RES_F_LASTMASK) >> RES_F_LASTSHIFT)
-
-/* res_findzonecut2() options */
-#define	RES_EXHAUSTIVE	0x00000001	/* always do all queries */
-#define	RES_IPV4ONLY	0x00000002	/* IPv4 only */
-#define	RES_IPV6ONLY	0x00000004	/* IPv6 only */
-
-/*
- * Resolver options (keep these in synch with res_debug.c, please)
- */
-#define RES_INIT	0x00000001	/* address initialized */
-#define RES_DEBUG	0x00000002	/* print debug messages */
-#define RES_AAONLY	0x00000004	/* authoritative answers only (!IMPL)*/
-#define RES_USEVC	0x00000008	/* use virtual circuit */
-#define RES_PRIMARY	0x00000010	/* query primary server only (!IMPL) */
-#define RES_IGNTC	0x00000020	/* ignore trucation errors */
-#define RES_RECURSE	0x00000040	/* recursion desired */
-#define RES_DEFNAMES	0x00000080	/* use default domain name */
-#define RES_STAYOPEN	0x00000100	/* Keep TCP socket open */
-#define RES_DNSRCH	0x00000200	/* search up local domain tree */
-#define	RES_INSECURE1	0x00000400	/* type 1 security disabled */
-#define	RES_INSECURE2	0x00000800	/* type 2 security disabled */
-#define	RES_NOALIASES	0x00001000	/* shuts off HOSTALIASES feature */
-#define	RES_USE_INET6	0x00002000	/* use/map IPv6 in gethostbyname() */
-#define RES_ROTATE	0x00004000	/* rotate ns list after each query */
-#define	RES_NOCHECKNAME	0x00008000	/* do not check names for sanity. */
-#define	RES_KEEPTSIG	0x00010000	/* do not strip TSIG records */
-#define	RES_BLAST	0x00020000	/* blast all recursive servers */
-#define RES_NOTLDQUERY	0x00100000	/* don't unqualified name as a tld */
-#define RES_USE_DNSSEC	0x00200000	/* use DNSSEC using OK bit in OPT */
-/* #define RES_DEBUG2	0x00400000 */	/* nslookup internal */
-/* KAME extensions: use higher bit to avoid conflict with ISC use */
-#define RES_USE_DNAME	0x10000000	/* use DNAME */
-#define RES_USE_EDNS0	0x40000000	/* use EDNS0 if configured */
-#define RES_NO_NIBBLE2	0x80000000	/* disable alternate nibble lookup */
-
-#define RES_DEFAULT	(RES_RECURSE | RES_DEFNAMES | \
-			 RES_DNSRCH | RES_NO_NIBBLE2)
-
-/*
- * Resolver "pfcode" values.  Used by dig.
- */
-#define RES_PRF_STATS	0x00000001
-#define RES_PRF_UPDATE	0x00000002
-#define RES_PRF_CLASS   0x00000004
-#define RES_PRF_CMD	0x00000008
-#define RES_PRF_QUES	0x00000010
-#define RES_PRF_ANS	0x00000020
-#define RES_PRF_AUTH	0x00000040
-#define RES_PRF_ADD	0x00000080
-#define RES_PRF_HEAD1	0x00000100
-#define RES_PRF_HEAD2	0x00000200
-#define RES_PRF_TTLID	0x00000400
-#define RES_PRF_HEADX	0x00000800
-#define RES_PRF_QUERY	0x00001000
-#define RES_PRF_REPLY	0x00002000
-#define RES_PRF_INIT	0x00004000
-#define RES_PRF_TRUNC	0x00008000
-/*			0x00010000	*/
-
-/* Things involving an internal (static) resolver context. */
-__BEGIN_DECLS
-extern struct __res_state *__res_get_state(void);
-extern void __res_put_state(struct __res_state *);
-
-#ifndef ANDROID_CHANGES
-/*
- * Source and Binary compatibility; _res will not work properly
- * with multi-threaded programs.
- */
-extern struct __res_state *__res_state(void);
-#define _res (*__res_state())
-#endif
-
-__END_DECLS
-
-#ifndef __BIND_NOSTATIC
-#define fp_nquery		__fp_nquery
-#define fp_query		__fp_query
-#define hostalias		__hostalias
-#define p_query			__p_query
-#define res_close		__res_close
-#define res_opt			__res_opt
-#define res_isourserver		__res_isourserver
-#define	res_querydomain		__res_querydomain
-#define res_send		__res_send
-#define res_sendsigned		__res_sendsigned
-
-#ifdef BIND_RES_POSIX3
-#define	dn_expand	__dn_expand
-#define	res_init	__res_init
-#define	res_query	__res_query
-#define	res_search	__res_search
-#define	res_mkquery	__res_mkquery
-#endif
-
-__BEGIN_DECLS
-void		fp_nquery(const u_char *, int, FILE *);
-void		fp_query(const u_char *, FILE *);
-const char *	hostalias(const char *);
-void		p_query(const u_char *);
-void		res_close(void);
-int		res_init(void);
-int		res_opt(int, u_char *, int, int);
-int		res_isourserver(const struct sockaddr_in *);
-int		res_mkquery(int, const char *, int, int, const u_char *, int, const u_char *, u_char *, int);
-int		res_query(const char *, int, int, u_char *, int);
-int		res_querydomain(const char *, const char *, int, int, u_char *, int);
-int		res_search(const char *, int, int, u_char *, int);
-int		res_send(const u_char *, int, u_char *, int);
-int		res_sendsigned(const u_char *, int, ns_tsig_key *, u_char *, int);
-__END_DECLS
-#endif
-
-#if !defined(SHARED_LIBBIND) || defined(LIB)
-/*
- * If libbind is a shared object (well, DLL anyway)
- * these externs break the linker when resolv.h is
- * included by a lib client (like named)
- * Make them go away if a client is including this
- *
- */
-extern const struct res_sym __p_key_syms[];
-extern const struct res_sym __p_cert_syms[];
-extern const struct res_sym __p_class_syms[];
-extern const struct res_sym __p_type_syms[];
-extern const struct res_sym __p_rcode_syms[];
-#endif /* SHARED_LIBBIND */
-
-#ifndef ADNROID_CHANGES
-#define b64_ntop		__b64_ntop
-#define b64_pton		__b64_pton
-#endif
-
-#define dn_comp			__dn_comp
-#define dn_count_labels		__dn_count_labels
-#define dn_skipname		__dn_skipname
-#define fp_resstat		__fp_resstat
-#define loc_aton		__loc_aton
-#define loc_ntoa		__loc_ntoa
-#define p_cdname		__p_cdname
-#define p_cdnname		__p_cdnname
-#define p_class			__p_class
-#define p_fqname		__p_fqname
-#define p_fqnname		__p_fqnname
-#define p_option		__p_option
-#define p_secstodate		__p_secstodate
-#define p_section		__p_section
-#define p_time			__p_time
-#define p_type			__p_type
-#define p_rcode			__p_rcode
-#define p_sockun		__p_sockun
-#define putlong			__putlong
-#define putshort		__putshort
-#define res_dnok		__res_dnok
-#define res_findzonecut		__res_findzonecut
-#define res_findzonecut2	__res_findzonecut2
-#define res_hnok		__res_hnok
-#define res_hostalias		__res_hostalias
-#define res_mailok		__res_mailok
-#define res_nameinquery		__res_nameinquery
-#define res_nclose		__res_nclose
-#define res_ninit		__res_ninit
-#define res_nmkquery		__res_nmkquery
-#define res_pquery		__res_pquery
-#define res_nquery		__res_nquery
-#define res_nquerydomain	__res_nquerydomain
-#define res_nsearch		__res_nsearch
-#define res_nsend		__res_nsend
-#define res_nsendsigned		__res_nsendsigned
-#define res_nisourserver	__res_nisourserver
-#define res_ownok		__res_ownok
-#define res_queriesmatch	__res_queriesmatch
-#define res_randomid		__res_randomid
-#define sym_ntop		__sym_ntop
-#define sym_ntos		__sym_ntos
-#define sym_ston		__sym_ston
-#define res_nopt		__res_nopt
-#define res_ndestroy		__res_ndestroy
-#define	res_nametoclass		__res_nametoclass
-#define	res_nametotype		__res_nametotype
-#define	res_setservers		__res_setservers
-#define	res_getservers		__res_getservers
-#define	res_buildprotolist	__res_buildprotolist
-#define	res_destroyprotolist	__res_destroyprotolist
-#define	res_destroyservicelist	__res_destroyservicelist
-#define	res_get_nibblesuffix	__res_get_nibblesuffix
-#define	res_get_nibblesuffix2	__res_get_nibblesuffix2
-#define	res_ourserver_p		__res_ourserver_p
-#define	res_protocolname	__res_protocolname
-#define	res_protocolnumber	__res_protocolnumber
-#define	res_send_setqhook	__res_send_setqhook
-#define	res_send_setrhook	__res_send_setrhook
-#define	res_servicename		__res_servicename
-#define	res_servicenumber	__res_servicenumber
-__BEGIN_DECLS
-int		res_hnok(const char *);
-int		res_ownok(const char *);
-int		res_mailok(const char *);
-int		res_dnok(const char *);
-int		sym_ston(const struct res_sym *, const char *, int *);
-const char *	sym_ntos(const struct res_sym *, int, int *);
-const char *	sym_ntop(const struct res_sym *, int, int *);
-#ifndef ANDROID_CHANGES
-int		b64_ntop(u_char const *, size_t, char *, size_t);
-int		b64_pton(char const *, u_char *, size_t);
-#endif
-int		loc_aton(const char *, u_char *);
-const char *	loc_ntoa(const u_char *, char *);
-int		dn_skipname(const u_char *, const u_char *);
-void		putlong(uint32_t, u_char *);
-void		putshort(uint16_t, u_char *);
-#ifndef __ultrix__
-uint16_t	_getshort(const u_char *);
-uint32_t	_getlong(const u_char *);
-#endif
-const char *	p_class(int);
-const char *	p_time(uint32_t);
-const char *	p_type(int);
-const char *	p_rcode(int);
-const char *	p_sockun(union res_sockaddr_union, char *, size_t);
-const u_char *	p_cdnname(const u_char *, const u_char *, int, FILE *);
-const u_char *	p_cdname(const u_char *, const u_char *, FILE *);
-const u_char *	p_fqnname(const u_char *, const u_char *,
-			       int, char *, int);
-const u_char *	p_fqname(const u_char *, const u_char *, FILE *);
-const char *	p_option(u_long);
-char *		p_secstodate(u_long);
-int		dn_count_labels(const char *);
-int		dn_comp(const char *, u_char *, int, u_char **, u_char **);
-int		dn_expand(const u_char *, const u_char *, const u_char *,
-			       char *, int);
-u_int		res_randomid(void);
-int		res_nameinquery(const char *, int, int, const u_char *,
-				     const u_char *);
-int		res_queriesmatch(const u_char *, const u_char *,
-				      const u_char *, const u_char *);
-const char *	p_section(int, int);
-/* Things involving a resolver context. */
-int		res_ninit(res_state);
-int		res_nisourserver(const res_state, const struct sockaddr_in *);
-void		fp_resstat(const res_state, FILE *);
-void		res_pquery(const res_state, const u_char *, int, FILE *);
-const char *	res_hostalias(const res_state, const char *, char *, size_t);
-int		res_nquery(res_state, const char *, int, int, u_char *, int);
-int		res_nsearch(res_state, const char *, int, int, u_char *, int);
-int		res_nquerydomain(res_state, const char *, const char *,
-				      int, int, u_char *, int);
-int		res_nmkquery(res_state, int, const char *, int, int,
-				  const u_char *, int, const u_char *,
-				  u_char *, int);
-int		res_nsend(res_state, const u_char *, int, u_char *, int);
-int		res_nsendsigned(res_state, const u_char *, int,
-				     ns_tsig_key *, u_char *, int);
-int		res_findzonecut(res_state, const char *, ns_class, int,
-				     char *, size_t, struct in_addr *, int);
-int		res_findzonecut2(res_state, const char *, ns_class, int,
-				      char *, size_t,
-				      union res_sockaddr_union *, int);
-void		res_nclose(res_state);
-int		res_nopt(res_state, int, u_char *, int, int);
-void		res_send_setqhook(res_send_qhook);
-void		res_send_setrhook(res_send_rhook);
-int		__res_vinit(res_state, int);
-void		res_destroyservicelist(void);
-const char *	res_servicename(uint16_t, const char *);
-const char *	res_protocolname(int);
-void		res_destroyprotolist(void);
-void		res_buildprotolist(void);
-const char *	res_get_nibblesuffix(res_state);
-const char *	res_get_nibblesuffix2(res_state);
-void		res_ndestroy(res_state);
-uint16_t	res_nametoclass(const char *, int *);
-uint16_t	res_nametotype(const char *, int *);
-void		res_setservers(res_state,
-				    const union res_sockaddr_union *, int);
-int		res_getservers(res_state,
-				    union res_sockaddr_union *, int);
-
-int res_get_dns_changed();
-u_int  res_randomid(void);
-
-__END_DECLS
-
-#endif /* !_RESOLV_PRIVATE_H_ */
deleted file mode 100644
--- a/other-licenses/android/resolv_static.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef _RESOLV_STATIC_H
-#define _RESOLV_STATIC_H
-
-#include <netdb.h>
-
-/* this structure contains all the variables that were declared
- * 'static' in the original NetBSD resolver code.
- *
- * this caused vast amounts of crashes and memory corruptions
- * when the resolver was being used by multiple threads.
- *
- * (note: the OpenBSD/FreeBSD resolver has similar 'issues')
- */
-
-#define	MAXALIASES	35
-#define	MAXADDRS	35
-
-typedef struct res_static {
-    char*           h_addr_ptrs[MAXADDRS + 1];
-    char*           host_aliases[MAXALIASES];
-    char            hostbuf[8*1024];
-    u_int32_t       host_addr[16 / sizeof(u_int32_t)];  /* IPv4 or IPv6 */
-    FILE*           hostf;
-    int             stayopen;
-    const char*     servent_ptr;
-    struct servent  servent;
-    struct hostent  host;
-} *res_static;
-
-extern res_static __res_get_static(void);
-
-#endif /* _RESOLV_STATIC_H */
--- a/xpcom/base/nsSystemInfo.cpp
+++ b/xpcom/base/nsSystemInfo.cpp
@@ -44,20 +44,16 @@
 #include "mozilla/arm.h"
 
 #ifdef MOZ_WIDGET_GTK2
 #include <gtk/gtk.h>
 #endif
 
 #ifdef ANDROID
 #include "AndroidBridge.h"
-
-extern "C" {
-extern int android_sdk_version;
-}
 #endif
 
 nsSystemInfo::nsSystemInfo()
 {
 }
 
 nsSystemInfo::~nsSystemInfo()
 {
@@ -179,17 +175,16 @@ nsSystemInfo::Init()
         nsAutoString str;
         if (mozilla::AndroidBridge::Bridge()->GetStaticStringField("android/os/Build", "MODEL", str))
             SetPropertyAsAString(NS_LITERAL_STRING("device"), str);
         if (mozilla::AndroidBridge::Bridge()->GetStaticStringField("android/os/Build", "MANUFACTURER", str))
             SetPropertyAsAString(NS_LITERAL_STRING("manufacturer"), str);
         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"));
         if (mozilla::AndroidBridge::Bridge()->GetStaticStringField("android/os/Build$VERSION", "CODENAME", str)) {
             if (version) {
                 str.Append(NS_LITERAL_STRING(" ("));
                 str.AppendInt(version);
                 str.Append(NS_LITERAL_STRING(")"));