Files
metasploit-gs/external/source/meterpreter/source/bionic
James Lee d44c7896b6 Add a 'debug' target for posix meterpreter build
This new target adds debugging symbols and doesn't strip binaries. New
bins are considerably bigger, but may be more helpful when diagnosing
problems or adding new features.

[Fixes #6343]
2012-02-10 15:57:01 -07:00
..

- we do not need libstdc++, nor linker (linker code will be held elsewhere), nor libthreads_db. rm -rf'd

- libdl we might want to compile / stick somewhere for compiling against so symbols resolve

For records keeping, here is the modifications I made to bionic to get things working.. it mostly worked from the start :)

diff --git a/libc/Jamfile b/libc/Jamfile
index a65be5d..346a178 100644
--- a/libc/Jamfile
+++ b/libc/Jamfile
@@ -192,7 +192,7 @@ BIONIC_SRC_SUBDIRS = string ;
 BIONIC_x86_SUBDIRS = ;
 BIONIC_arm_SUBDIRS = ;
 
-CFLAGS   = -O0 -g -W ;
+CFLAGS   = -O0 -g -W ; 
 
 
 
@@ -367,8 +367,8 @@ INCLUDES = include stdio string stdlib .
            ../msun/include
            ;
 
-DEFINES  = ANDROID_CHANGES
-           USE_LOCKS
+DEFINES  = USE_LOCKS
+           ANDROID_CHANGES
            REALLOC_ZERO_BYTES_FREES
            _LIBC=1
            SOFTFLOAT
@@ -377,7 +377,7 @@ DEFINES  = ANDROID_CHANGES
            ANDROID
            ;
 
-CFLAGS_x86 = ;
+CFLAGS_x86 = -I/opt/bionic/libc/private -I/opt/bionic/libc/bionic -I/opt/bionic/libc/kernel/arch-x86 -I/opt/bionic/libc/kernel/common -I/opt/bionic/libm/include -fno-stack-protector -fno-pie -DPIC -ffreestanding  -fno-tree-scev-cprop ;
 
 
 for arch in $(ARCH)
diff --git a/libc/bionic/libc_init_common.c b/libc/bionic/libc_init_common.c
index dd6e027..3ab16ac 100644
--- a/libc/bionic/libc_init_common.c
+++ b/libc/bionic/libc_init_common.c
@@ -49,15 +49,19 @@ char **environ;
 unsigned int __page_size = PAGE_SIZE;
 unsigned int __page_shift = PAGE_SHIFT;
 
+static char *__default_environ[] = {
+	"USER=metasploit", 
+	"HOME=/",
+	"USERNAME=metasploit",
+	"HISTFILE=/dev/null",
+	"HISTSIZE=0",
+	"PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin",
+	NULL
+};
 
-int __system_properties_init(void);
 
-void __libc_init_common(uintptr_t *elfdata)
+void __libc_init_common()
 {
-    int     argc = *elfdata;
-    char**  argv = (char**)(elfdata + 1);
-    char**  envp = argv + argc + 1;
-
     pthread_attr_t             thread_attr;
     static pthread_internal_t  thread;
     static void*               tls_area[BIONIC_TLS_SLOTS];
@@ -76,11 +80,9 @@ void __libc_init_common(uintptr_t *elfdata)
     errno = 0;
 
     /* set program name */
-    __progname = argv[0] ? argv[0] : "<unknown>";
+    __progname = "metasploit";
 
     /* setup environment pointer */
-    environ = envp;
+    environ = __default_environ;
 
-    /* setup system properties - requires environment */
-    __system_properties_init();
 }
diff --git a/libc/bionic/libc_init_common.h b/libc/bionic/libc_init_common.h
index 8663c61..f801677 100644
--- a/libc/bionic/libc_init_common.h
+++ b/libc/bionic/libc_init_common.h
@@ -38,6 +38,6 @@ typedef struct
     void (**ctors_array)(void);
 } structors_array_t;
 
-extern void __libc_init_common(uintptr_t *elfdata);
+extern void __libc_init_common();
 
 #endif
diff --git a/libc/bionic/libc_init_dynamic.c b/libc/bionic/libc_init_dynamic.c
index 97e80ea..3832c12 100644
--- a/libc/bionic/libc_init_dynamic.c
+++ b/libc/bionic/libc_init_dynamic.c
@@ -79,8 +79,10 @@ void __libc_prenit(void)
     /* Setup malloc routines accordingly to the environment.
      * Requires system properties
      */
+#if 0 // PKS
     extern void malloc_debug_init(void);
     malloc_debug_init();
+#endif 
 }
 
 __noreturn void __libc_init(uintptr_t *elfdata,
diff --git a/libc/bionic/rules.jam b/libc/bionic/rules.jam
index 219526b..b398605 100644
--- a/libc/bionic/rules.jam
+++ b/libc/bionic/rules.jam
@@ -1 +1 @@
-NO_LOCAL_SRC = malloc_leak.c ;
+NO_LOCAL_SRC = malloc_leak.c malloc_debug_leak.c malloc_debug_qemu.c stubs.c logd_write.c ssp.c malloc_debug_common.c system_properties.c bionic_clone.c ;
diff --git a/libc/include/malloc.h b/libc/include/malloc.h
index a864286..87614b2 100644
--- a/libc/include/malloc.h
+++ b/libc/include/malloc.h
@@ -35,7 +35,7 @@ __BEGIN_DECLS
 
 extern __mallocfunc void*  malloc(size_t);
 extern __mallocfunc void*  calloc(size_t, size_t);
-extern __mallocfunc void*  realloc(void *, size_t);
+extern __mallocfunc void*  realloc(void *ptr, size_t);
 extern                void   free(void *);
 
 extern void*   memalign(size_t  alignment, size_t  bytesize);
diff --git a/libc/include/netdb.h b/libc/include/netdb.h
index c2e08ea..f8edecb 100644
--- a/libc/include/netdb.h
+++ b/libc/include/netdb.h
@@ -65,6 +65,8 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 
+#include <sys/endian.h>
+
 #ifndef _PATH_HEQUIV
 # define	_PATH_HEQUIV	"/system/etc/hosts.equiv"
 #endif
diff --git a/libc/include/netinet/in.h b/libc/include/netinet/in.h
index 0ebd926..16eb888 100644
--- a/libc/include/netinet/in.h
+++ b/libc/include/netinet/in.h
@@ -33,6 +33,7 @@
 #include <linux/in.h>
 #include <linux/in6.h>
 #include <netinet/in6.h>
+#include <sys/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/libc/include/stdint.h b/libc/include/stdint.h
index 237baa2..1e89895 100644
--- a/libc/include/stdint.h
+++ b/libc/include/stdint.h
@@ -59,14 +59,15 @@ typedef __uint32_t    uint32_t;
 #if defined(__STDC_INT64__)
 typedef __int64_t     int64_t;
 typedef __uint64_t    uint64_t;
+
 #endif
 
 /*
  * int8_t & uint8_t
  */
 
-typedef int8_t        int_least8_t;
-typedef int8_t        int_fast8_t;
+//typedef int8_t        int_least8_t; PKS .. remote_dispatch problem
+//typedef int8_t        int_fast8_t;
 
 typedef uint8_t       uint_least8_t;
 typedef uint8_t       uint_fast8_t;
diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index 41e8d26..6665ffa 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -25,6 +25,8 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+#include <sys/types.h>
+
 #ifndef _STDLIB_H_
 #define _STDLIB_H_
 
@@ -113,6 +115,7 @@ extern void arc4random_stir(void);
 extern void arc4random_addrandom(unsigned char *, int);
 
 #define RAND_MAX 0x7fffffff
+#if 0
 static __inline__ int rand(void) {
     return (int)lrand48();
 }
@@ -127,6 +130,7 @@ static __inline__ void srandom(unsigned int __s)
 {
     srand48(__s);
 }
+#endif
 
 /* Basic PTY functions.  These only work if devpts is mounted! */
 
diff --git a/libc/include/string.h b/libc/include/string.h
index 613dcd7..2c60e03 100644
--- a/libc/include/string.h
+++ b/libc/include/string.h
@@ -25,6 +25,9 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+
+#include <sys/types.h>
+
 #ifndef _STRING_H_
 #define _STRING_H_
 
diff --git a/libc/include/strings.h b/libc/include/strings.h
index fee7dc4..a70ff2f 100644
--- a/libc/include/strings.h
+++ b/libc/include/strings.h
@@ -50,7 +50,7 @@ int	 ffs(int);
 char	*index(const char *, int);
 char	*rindex(const char *, int);
 int	 strcasecmp(const char *, const char *);
-int	 strncasecmp(const char *, const char *, size_t);
+// int	 strncasecmp(const char *, const char *, size_t);
 __END_DECLS
 
 #endif /* !defined(_STRINGS_H_) */
diff --git a/libc/include/sys/select.h b/libc/include/sys/select.h
index 52315b9..a088d85 100644
--- a/libc/include/sys/select.h
+++ b/libc/include/sys/select.h
@@ -31,6 +31,7 @@
 #include <sys/cdefs.h>
 #include <sys/time.h>
 #include <sys/types.h>
+#include <sys/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/libc/netbsd/gethnamaddr.c b/libc/netbsd/gethnamaddr.c
deleted file mode 100644
index 1c219b2..0000000
--- a/libc/netbsd/gethnamaddr.c
+++ /dev/null
@@ -1,1210 +0,0 @@
-/*	$NetBSD: gethnamaddr.c,v 1.70 2006/03/22 00:03:51 christos Exp $	*/
-
-/*
- * ++Copyright++ 1985, 1988, 1993
- * -
- * Copyright (c) 1985, 1988, 1993
- *    The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * -
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- * -
- * --Copyright--
- */
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include "arpa_nameser.h"
-#include "resolv_private.h"
-#include "resolv_cache.h"
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <netdb.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <syslog.h>
-
-#ifndef LOG_AUTH
-# define LOG_AUTH 0
-#endif
-
-#define MULTI_PTRS_ARE_ALIASES 1	/* XXX - experimental */
-
-#include "nsswitch.h"
-#include <stdlib.h>
-#include <string.h>
-
-static const char const AskedForGot[] =
-			  "gethostby*.getanswer: asked for \"%s\", got \"%s\"";
-
-#define	MAXPACKET	(64*1024)
-
-typedef union {
-    HEADER hdr;
-    u_char buf[MAXPACKET];
-} querybuf;
-
-typedef union {
-    int32_t al;
-    char ac;
-} align;
-
-#ifdef DEBUG
-static void dprintf(const char *, res_state, ...)
-	__attribute__((__format__(__printf__, 1, 3)));
-#endif
-static struct hostent *getanswer(const querybuf *, int, const char *, int,
-    res_state);
-static void map_v4v6_address(const char *, char *);
-static void map_v4v6_hostent(struct hostent *, char **, char *);
-static void addrsort(char **, int, res_state);
-
-void _sethtent(int);
-void _endhtent(void);
-struct hostent *_gethtent(void);
-void ht_sethostent(int);
-void ht_endhostent(void);
-struct hostent *ht_gethostbyname(char *);
-struct hostent *ht_gethostbyaddr(const char *, int, int);
-void dns_service(void);
-#undef dn_skipname
-int dn_skipname(const u_char *, const u_char *);
-int _gethtbyaddr(void *, void *, va_list);
-int _gethtbyname(void *, void *, va_list);
-struct hostent *_gethtbyname2(const char *, int);
-int _dns_gethtbyaddr(void *, void *, va_list);
-int _dns_gethtbyname(void *, void *, va_list);
-
-static struct hostent *gethostbyname_internal(const char *, int, res_state);
-
-static const ns_src default_dns_files[] = {
-	{ NSSRC_FILES, 	NS_SUCCESS },
-	{ NSSRC_DNS, 	NS_SUCCESS },
-	{ 0, 0 }
-};
-
-
-#ifdef DEBUG
-static void
-dprintf(const char *msg, res_state res, ...)
-{
-	assert(msg != NULL);
-
-	if (res->options & RES_DEBUG) {
-		int save = errno;
-		va_list ap;
-
-		va_start (ap, res);
-		vprintf(msg, ap);
-		va_end (ap);
-
-		errno = save;
-	}
-}
-#else
-# define dprintf(msg, res, num) ((void)0) /*nada*/
-#endif
-
-#define BOUNDED_INCR(x) \
-	do { \
-		cp += (x); \
-		if (cp > eom) { \
-			h_errno = NO_RECOVERY; \
-			return NULL; \
-		} \
-	} while (/*CONSTCOND*/0)
-
-#define BOUNDS_CHECK(ptr, count) \
-	do { \
-		if ((ptr) + (count) > eom) { \
-			h_errno = NO_RECOVERY; \
-			return NULL; \
-		} \
-	} while (/*CONSTCOND*/0)
-
-static struct hostent *
-getanswer(const querybuf *answer, int anslen, const char *qname, int qtype,
-    res_state res)
-{
-	const HEADER *hp;
-	const u_char *cp;
-	int n;
-	const u_char *eom, *erdata;
-	char *bp, **ap, **hap, *ep;
-	int type, class, ancount, qdcount;
-	int haveanswer, had_error;
-	int toobig = 0;
-	char tbuf[MAXDNAME];
-	const char *tname;
-	int (*name_ok)(const char *);
-	res_static  rs = __res_get_static();
-
-	assert(answer != NULL);
-	assert(qname != NULL);
-
-	tname = qname;
-	rs->host.h_name = NULL;
-	eom = answer->buf + anslen;
-	switch (qtype) {
-	case T_A:
-	case T_AAAA:
-		name_ok = res_hnok;
-		break;
-	case T_PTR:
-		name_ok = res_dnok;
-		break;
-	default:
-		return NULL;	/* XXX should be abort(); */
-	}
-	/*
-	 * find first satisfactory answer
-	 */
-	hp = &answer->hdr;
-	ancount = ntohs(hp->ancount);
-	qdcount = ntohs(hp->qdcount);
-	bp = rs->hostbuf;
-	ep = rs->hostbuf + sizeof rs->hostbuf;
-	cp = answer->buf;
-	BOUNDED_INCR(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;
-	}
-	BOUNDED_INCR(n + QFIXEDSZ);
-	if (qtype == T_A || qtype == T_AAAA) {
-		/* 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;
-		}
-		rs->host.h_name = bp;
-		bp += n;
-		/* The qname can be abbreviated, but h_name is now absolute. */
-		qname = rs->host.h_name;
-	}
-	ap = rs->host_aliases;
-	*ap = NULL;
-	rs->host.h_aliases = rs->host_aliases;
-	hap = rs->h_addr_ptrs;
-	*hap = NULL;
-	rs->host.h_addr_list = rs->h_addr_ptrs;
-	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 */
-		BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ);
-		type = _getshort(cp);
- 		cp += INT16SZ;			/* type */
-		class = _getshort(cp);
- 		cp += INT16SZ + INT32SZ;	/* class, TTL */
-		n = _getshort(cp);
-		cp += INT16SZ;			/* len */
-		BOUNDS_CHECK(cp, n);
-		erdata = cp + n;
-		if (class != C_IN) {
-			/* XXX - debug? syslog? */
-			cp += n;
-			continue;		/* XXX - had_error++ ? */
-		}
-		if ((qtype == T_A || qtype == T_AAAA) && type == T_CNAME) {
-			if (ap >= &rs->host_aliases[MAXALIASES-1])
-				continue;
-			n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf);
-			if ((n < 0) || !(*name_ok)(tbuf)) {
-				had_error++;
-				continue;
-			}
-			cp += n;
-			if (cp != erdata) {
-				h_errno = NO_RECOVERY;
-				return NULL;
-			}
-			/* Store alias. */
-			*ap++ = bp;
-			n = strlen(bp) + 1;	/* for the \0 */
-			if (n >= MAXHOSTNAMELEN) {
-				had_error++;
-				continue;
-			}
-			bp += 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));
-			rs->host.h_name = bp;
-			bp += n;
-			continue;
-		}
-		if (qtype == T_PTR && type == T_CNAME) {
-			n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf);
-			if (n < 0 || !res_dnok(tbuf)) {
-				had_error++;
-				continue;
-			}
-			cp += n;
-			if (cp != erdata) {
-				h_errno = NO_RECOVERY;
-				return NULL;
-			}
-			/* 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));
-			tname = bp;
-			bp += n;
-			continue;
-		}
-		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_PTR:
-			if (strcasecmp(tname, bp) != 0) {
-				syslog(LOG_NOTICE|LOG_AUTH,
-				       AskedForGot, qname, bp);
-				cp += n;
-				continue;	/* XXX - had_error++ ? */
-			}
-			n = dn_expand(answer->buf, eom, cp, bp, ep - bp);
-			if ((n < 0) || !res_hnok(bp)) {
-				had_error++;
-				break;
-			}
-#if MULTI_PTRS_ARE_ALIASES
-			cp += n;
-			if (cp != erdata) {
-				h_errno = NO_RECOVERY;
-				return NULL;
-			}
-			if (!haveanswer)
-				rs->host.h_name = bp;
-			else if (ap < &rs->host_aliases[MAXALIASES-1])
-				*ap++ = bp;
-			else
-				n = -1;
-			if (n != -1) {
-				n = strlen(bp) + 1;	/* for the \0 */
-				if (n >= MAXHOSTNAMELEN) {
-					had_error++;
-					break;
-				}
-				bp += n;
-			}
-			break;
-#else
-			rs->host.h_name = bp;
-			if (res->options & RES_USE_INET6) {
-				n = strlen(bp) + 1;	/* for the \0 */
-				if (n >= MAXHOSTNAMELEN) {
-					had_error++;
-					break;
-				}
-				bp += n;
-				map_v4v6_hostent(&rs->host, &bp, ep);
-			}
-			h_errno = NETDB_SUCCESS;
-			return &rs->host;
-#endif
-		case T_A:
-		case T_AAAA:
-			if (strcasecmp(rs->host.h_name, bp) != 0) {
-				syslog(LOG_NOTICE|LOG_AUTH,
-				       AskedForGot, rs->host.h_name, bp);
-				cp += n;
-				continue;	/* XXX - had_error++ ? */
-			}
-			if (n != rs->host.h_length) {
-				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;
-
-				rs->host.h_name = bp;
-				nn = strlen(bp) + 1;	/* for the \0 */
-				bp += nn;
-			}
-
-			bp += sizeof(align) -
-			    (size_t)((u_long)bp % sizeof(align));
-
-			if (bp + n >= &rs->hostbuf[sizeof rs->hostbuf]) {
-				dprintf("size (%d) too big\n", res, n);
-				had_error++;
-				continue;
-			}
-			if (hap >= &rs->h_addr_ptrs[MAXADDRS-1]) {
-				if (!toobig++)
-					dprintf("Too many addresses (%d)\n",
-						res, MAXADDRS);
-				cp += n;
-				continue;
-			}
-			(void)memcpy(*hap++ = bp, cp, (size_t)n);
-			bp += n;
-			cp += n;
-			if (cp != erdata) {
-				h_errno = NO_RECOVERY;
-				return NULL;
-			}
-			break;
-		default:
-			abort();
-		}
-		if (!had_error)
-			haveanswer++;
-	}
-	if (haveanswer) {
-		*ap = NULL;
-		*hap = NULL;
-		/*
-		 * Note: we sort even if host can take only one address
-		 * in its return structures - should give it the "best"
-		 * address in that case, not some random one
-		 */
-		if (res->nsort && haveanswer > 1 && qtype == T_A)
-			addrsort(rs->h_addr_ptrs, haveanswer, res);
-		if (!rs->host.h_name) {
-			n = strlen(qname) + 1;	/* for the \0 */
-			if (n > ep - bp || n >= MAXHOSTNAMELEN)
-				goto no_recovery;
-			strlcpy(bp, qname, (size_t)(ep - bp));
-			rs->host.h_name = bp;
-			bp += n;
-		}
-		if (res->options & RES_USE_INET6)
-			map_v4v6_hostent(&rs->host, &bp, ep);
-		h_errno = NETDB_SUCCESS;
-		return &rs->host;
-	}
- no_recovery:
-	h_errno = NO_RECOVERY;
-	return NULL;
-}
-
-int
-gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen,
-    struct hostent**result, int *errorp)
-{
-        struct hostent *res;
-
-        res = gethostbyname(name);
-        *errorp = h_errno;
-        if (res == NULL) {
-                *result = NULL;
-                return -1;
-        }
-        memcpy(hp, res, sizeof *hp);
-        *result = hp;
-        return 0;
-}
-
-struct hostent *
-gethostbyname(const char *name)
-{
-	struct hostent *hp;
-	res_state res = __res_get_state();
-
-	if (res == NULL)
-		return NULL;
-
-	assert(name != NULL);
-
-	if (res->options & RES_USE_INET6) {
-		hp = gethostbyname_internal(name, AF_INET6, res);
-		if (hp) {
-			__res_put_state(res);
-			return hp;
-		}
-	}
-	hp = gethostbyname_internal(name, AF_INET, res);
-	__res_put_state(res);
-	return hp;
-}
-
-struct hostent *
-gethostbyname2(const char *name, int af)
-{
-	struct hostent *hp;
-	res_state res = __res_get_state();
-
-	if (res == NULL)
-		return NULL;
-	hp = gethostbyname_internal(name, af, res);
-	__res_put_state(res);
-	return hp;
-}
-
-static struct hostent *
-gethostbyname_internal(const char *name, int af, res_state res)
-{
-	const char *cp;
-	char *bp, *ep;
-	int size;
-	struct hostent *hp;
-        struct resolv_cache*  cache;
-        res_static  rs = __res_get_static();
-
-	static const ns_dtab dtab[] = {
-		NS_FILES_CB(_gethtbyname, NULL)
-		{ NSSRC_DNS, _dns_gethtbyname, NULL },	/* force -DHESIOD */
-		{ 0, 0, 0 }
-	};
-
-	assert(name != NULL);
-
-	switch (af) {
-	case AF_INET:
-		size = INADDRSZ;
-		break;
-	case AF_INET6:
-		size = IN6ADDRSZ;
-		break;
-	default:
-		h_errno = NETDB_INTERNAL;
-		errno = EAFNOSUPPORT;
-		return NULL;
-	}
-
-	rs->host.h_addrtype = af;
-	rs->host.h_length = size;
-
-	/*
-	 * if there aren't any dots, it could be a user-level alias.
-	 * this is also done in res_nquery() since we are not the only
-	 * function that looks up host names.
-	 */
-	if (!strchr(name, '.') && (cp = __hostalias(name)))
-		name = cp;
-
-	/*
-	 * disallow names consisting only of digits/dots, unless
-	 * they end in a dot.
-	 */
-	if (isdigit((u_char) name[0]))
-		for (cp = name;; ++cp) {
-			if (!*cp) {
-				if (*--cp == '.')
-					break;
-				/*
-				 * All-numeric, no dot at the end.
-				 * Fake up a hostent as if we'd actually
-				 * done a lookup.
-				 */
-				if (inet_pton(af, name,
-				    (char *)(void *)rs->host_addr) <= 0) {
-					h_errno = HOST_NOT_FOUND;
-					return NULL;
-				}
-				strncpy(rs->hostbuf, name, MAXDNAME);
-				rs->hostbuf[MAXDNAME] = '\0';
-				bp = rs->hostbuf + MAXDNAME;
-				ep = rs->hostbuf + sizeof rs->hostbuf;
-				rs->host.h_name = rs->hostbuf;
-				rs->host.h_aliases = rs->host_aliases;
-				rs->host_aliases[0] = NULL;
-				rs->h_addr_ptrs[0] = (char *)(void *)rs->host_addr;
-				rs->h_addr_ptrs[1] = NULL;
-				rs->host.h_addr_list = rs->h_addr_ptrs;
-				if (res->options & RES_USE_INET6)
-					map_v4v6_hostent(&rs->host, &bp, ep);
-				h_errno = NETDB_SUCCESS;
-				return &rs->host;
-			}
-			if (!isdigit((u_char) *cp) && *cp != '.')
-				break;
-		}
-	if ((isxdigit((u_char) name[0]) && strchr(name, ':') != NULL) ||
-	    name[0] == ':')
-		for (cp = name;; ++cp) {
-			if (!*cp) {
-				if (*--cp == '.')
-					break;
-				/*
-				 * All-IPv6-legal, no dot at the end.
-				 * Fake up a hostent as if we'd actually
-				 * done a lookup.
-				 */
-				if (inet_pton(af, name,
-				    (char *)(void *)rs->host_addr) <= 0) {
-					h_errno = HOST_NOT_FOUND;
-					return NULL;
-				}
-				strncpy(rs->hostbuf, name, MAXDNAME);
-				rs->hostbuf[MAXDNAME] = '\0';
-				bp = rs->hostbuf + MAXDNAME;
-				ep = rs->hostbuf + sizeof rs->hostbuf;
-				rs->host.h_name = rs->hostbuf;
-				rs->host.h_aliases = rs->host_aliases;
-				rs->host_aliases[0] = NULL;
-				rs->h_addr_ptrs[0] = (char *)(void *)rs->host_addr;
-				rs->h_addr_ptrs[1] = NULL;
-				rs->host.h_addr_list = rs->h_addr_ptrs;
-				h_errno = NETDB_SUCCESS;
-				return &rs->host;
-			}
-			if (!isxdigit((u_char) *cp) && *cp != ':' && *cp != '.')
-				break;
-		}
-
-	hp = NULL;
-	h_errno = NETDB_INTERNAL;
-	if (nsdispatch(&hp, dtab, NSDB_HOSTS, "gethostbyname",
-	    default_dns_files, name, strlen(name), af) != NS_SUCCESS) {
-		return NULL;
-        }
-	h_errno = NETDB_SUCCESS;
-	return hp;
-}
-
-struct hostent *
-gethostbyaddr(const char *addr,	/* XXX should have been def'd as u_char! */
-    socklen_t len, int af)
-{
-	const u_char *uaddr = (const u_char *)addr;
-	socklen_t size;
-	struct hostent *hp;
-	static const ns_dtab dtab[] = {
-		NS_FILES_CB(_gethtbyaddr, NULL)
-		{ NSSRC_DNS, _dns_gethtbyaddr, NULL },	/* force -DHESIOD */
-		{ 0, 0, 0 }
-	};
-
-	assert(addr != NULL);
-
-	if (af == AF_INET6 && len == IN6ADDRSZ &&
-	    (IN6_IS_ADDR_LINKLOCAL((const struct in6_addr *)(const void *)uaddr) ||
-	     IN6_IS_ADDR_SITELOCAL((const struct in6_addr *)(const void *)uaddr))) {
-		h_errno = HOST_NOT_FOUND;
-		return NULL;
-	}
-	if (af == AF_INET6 && len == IN6ADDRSZ &&
-	    (IN6_IS_ADDR_V4MAPPED((const struct in6_addr *)(const void *)uaddr) ||
-	     IN6_IS_ADDR_V4COMPAT((const struct in6_addr *)(const void *)uaddr))) {
-		/* Unmap. */
-		addr += IN6ADDRSZ - INADDRSZ;
-		uaddr += IN6ADDRSZ - INADDRSZ;
-		af = AF_INET;
-		len = INADDRSZ;
-	}
-	switch (af) {
-	case AF_INET:
-		size = INADDRSZ;
-		break;
-	case AF_INET6:
-		size = IN6ADDRSZ;
-		break;
-	default:
-		errno = EAFNOSUPPORT;
-		h_errno = NETDB_INTERNAL;
-		return NULL;
-	}
-	if (size != len) {
-		errno = EINVAL;
-		h_errno = NETDB_INTERNAL;
-		return NULL;
-	}
-	hp = NULL;
-	h_errno = NETDB_INTERNAL;
-	if (nsdispatch(&hp, dtab, NSDB_HOSTS, "gethostbyaddr",
-	    default_dns_files, uaddr, len, af) != NS_SUCCESS)
-		return NULL;
-	h_errno = NETDB_SUCCESS;
-	return hp;
-}
-
-void
-_sethtent(int f)
-{
-    res_static  rs = __res_get_static();
-    if (rs == NULL) return;
-	if (!rs->hostf)
-		rs->hostf = fopen(_PATH_HOSTS, "r" );
-	else
-		rewind(rs->hostf);
-	rs->stayopen = f;
-}
-
-void
-_endhtent(void)
-{
-    res_static  rs = __res_get_static();
-    if (rs == NULL) return;
-
-	if (rs->hostf && !rs->stayopen) {
-		(void) fclose(rs->hostf);
-		rs->hostf = NULL;
-	}
-}
-
-struct hostent *
-_gethtent(void)
-{
-	char *p;
-	char *cp, **q;
-	int af, len;
-	res_static  rs = __res_get_static();
-
-	if (!rs->hostf && !(rs->hostf = fopen(_PATH_HOSTS, "r" ))) {
-		h_errno = NETDB_INTERNAL;
-		return NULL;
-	}
- again:
-	if (!(p = fgets(rs->hostbuf, sizeof rs->hostbuf, rs->hostf))) {
-		h_errno = HOST_NOT_FOUND;
-		return NULL;
-	}
-	if (*p == '#')
-		goto again;
-	if (!(cp = strpbrk(p, "#\n")))
-		goto again;
-	*cp = '\0';
-	if (!(cp = strpbrk(p, " \t")))
-		goto again;
-	*cp++ = '\0';
-	if (inet_pton(AF_INET6, p, (char *)(void *)rs->host_addr) > 0) {
-		af = AF_INET6;
-		len = IN6ADDRSZ;
-	} else if (inet_pton(AF_INET, p, (char *)(void *)rs->host_addr) > 0) {
-		res_state res = __res_get_state();
-		if (res == NULL)
-			return NULL;
-		if (res->options & RES_USE_INET6) {
-			map_v4v6_address((char *)(void *)rs->host_addr,
-			    (char *)(void *)rs->host_addr);
-			af = AF_INET6;
-			len = IN6ADDRSZ;
-		} else {
-			af = AF_INET;
-			len = INADDRSZ;
-		}
-		__res_put_state(res);
-	} else {
-		goto again;
-	}
-	/* if this is not something we're looking for, skip it. */
-	if (rs->host.h_addrtype != 0 && rs->host.h_addrtype != af)
-		goto again;
-	if (rs->host.h_length != 0 && rs->host.h_length != len)
-		goto again;
-	rs->h_addr_ptrs[0] = (char *)(void *)rs->host_addr;
-	rs->h_addr_ptrs[1] = NULL;
-	rs->host.h_addr_list = rs->h_addr_ptrs;
-	rs->host.h_length = len;
-	rs->host.h_addrtype = af;
-	while (*cp == ' ' || *cp == '\t')
-		cp++;
-	rs->host.h_name = cp;
-	q = rs->host.h_aliases = rs->host_aliases;
-	if ((cp = strpbrk(cp, " \t")) != NULL)
-		*cp++ = '\0';
-	while (cp && *cp) {
-		if (*cp == ' ' || *cp == '\t') {
-			cp++;
-			continue;
-		}
-		if (q < &rs->host_aliases[MAXALIASES - 1])
-			*q++ = cp;
-		if ((cp = strpbrk(cp, " \t")) != NULL)
-			*cp++ = '\0';
-	}
-	*q = NULL;
-	h_errno = NETDB_SUCCESS;
-	return &rs->host;
-}
-
-/*ARGSUSED*/
-int
-_gethtbyname(void *rv, void *cb_data, va_list ap)
-{
-	struct hostent *hp;
-	const char *name;
-	int af;
-
-	assert(rv != NULL);
-
-	name = va_arg(ap, char *);
-	/* NOSTRICT skip len */(void)va_arg(ap, int);
-	af = va_arg(ap, int);
-
-	hp = NULL;
-#if 0
-	{
-		res_state res = __res_get_state();
-		if (res == NULL)
-			return NS_NOTFOUND;
-		if (res->options & RES_USE_INET6)
-			hp = _gethtbyname2(name, AF_INET6);
-		if (hp==NULL)
-			hp = _gethtbyname2(name, AF_INET);
-		__res_put_state(res);
-	}
-#else
-	hp = _gethtbyname2(name, af);
-#endif
-	*((struct hostent **)rv) = hp;
-	if (hp == NULL) {
-		h_errno = HOST_NOT_FOUND;
-		return NS_NOTFOUND;
-	}
-	return NS_SUCCESS;
-}
-
-struct hostent *
-_gethtbyname2(const char *name, int af)
-{
-	struct hostent *p;
-	char *tmpbuf, *ptr, **cp;
-	int num;
-	size_t len;
-	res_static rs = __res_get_static();
-
-	assert(name != NULL);
-
-	_sethtent(rs->stayopen);
-	ptr = tmpbuf = NULL;
-	num = 0;
-	while ((p = _gethtent()) != NULL && num < MAXADDRS) {
-		if (p->h_addrtype != af)
-			continue;
-		if (strcasecmp(p->h_name, name) != 0) {
-			for (cp = p->h_aliases; *cp != NULL; cp++)
-				if (strcasecmp(*cp, name) == 0)
-					break;
-			if (*cp == NULL) continue;
-		}
-
-		if (num == 0) {
-			size_t bufsize;
-			char *src;
-
-			bufsize = strlen(p->h_name) + 2 +
-				  MAXADDRS * p->h_length +
-				  ALIGNBYTES;
-			for (cp = p->h_aliases; *cp != NULL; cp++)
-				bufsize += strlen(*cp) + 1;
-
-			if ((tmpbuf = malloc(bufsize)) == NULL) {
-				h_errno = NETDB_INTERNAL;
-				return NULL;
-			}
-
-			ptr = tmpbuf;
-			src = p->h_name;
-			while ((*ptr++ = *src++) != '\0');
-			for (cp = p->h_aliases; *cp != NULL; cp++) {
-				src = *cp;
-				while ((*ptr++ = *src++) != '\0');
-			}
-			*ptr++ = '\0';
-
-			ptr = (char *)(void *)ALIGN(ptr);
-		}
-
-		(void)memcpy(ptr, p->h_addr_list[0], (size_t)p->h_length);
-		ptr += p->h_length;
-		num++;
-	}
-	_endhtent();
-	if (num == 0) return NULL;
-
-	len = ptr - tmpbuf;
-	if (len > (sizeof(rs->hostbuf) - ALIGNBYTES)) {
-		free(tmpbuf);
-		errno = ENOSPC;
-		h_errno = NETDB_INTERNAL;
-		return NULL;
-	}
-	ptr = memcpy((void *)ALIGN(rs->hostbuf), tmpbuf, len);
-	free(tmpbuf);
-
-	rs->host.h_name = ptr;
-	while (*ptr++);
-
-	cp = rs->host_aliases;
-	while (*ptr) {
-		*cp++ = ptr;
-		while (*ptr++);
-	}
-	ptr++;
-	*cp = NULL;
-
-	ptr = (char *)(void *)ALIGN(ptr);
-	cp = rs->h_addr_ptrs;
-	while (num--) {
-		*cp++ = ptr;
-		ptr += rs->host.h_length;
-	}
-	*cp = NULL;
-
-	return &rs->host;
-}
-
-/*ARGSUSED*/
-int
-_gethtbyaddr(void *rv, void *cb_data, va_list ap)
-{
-	struct hostent *p;
-	const unsigned char *addr;
-	int len, af;
-	res_static  rs = __res_get_static();
-
-	assert(rv != NULL);
-
-	addr = va_arg(ap, unsigned char *);
-	len = va_arg(ap, int);
-	af = va_arg(ap, int);
-
-	rs->host.h_length = len;
-	rs->host.h_addrtype = af;
-
-	_sethtent(rs->stayopen);
-	while ((p = _gethtent()) != NULL)
-		if (p->h_addrtype == af && !memcmp(p->h_addr, addr,
-		    (size_t)len))
-			break;
-	_endhtent();
-	*((struct hostent **)rv) = p;
-	if (p==NULL) {
-		h_errno = HOST_NOT_FOUND;
-		return NS_NOTFOUND;
-	}
-	return NS_SUCCESS;
-}
-
-static void
-map_v4v6_address(const char *src, char *dst)
-{
-	u_char *p = (u_char *)dst;
-	char tmp[INADDRSZ];
-	int i;
-
-	assert(src != NULL);
-	assert(dst != NULL);
-
-	/* Stash a temporary copy so our caller can update in place. */
-	(void)memcpy(tmp, src, INADDRSZ);
-	/* Mark this ipv6 addr as a mapped ipv4. */
-	for (i = 0; i < 10; i++)
-		*p++ = 0x00;
-	*p++ = 0xff;
-	*p++ = 0xff;
-	/* Retrieve the saved copy and we're done. */
-	(void)memcpy((void *)p, tmp, INADDRSZ);
-}
-
-static void
-map_v4v6_hostent(struct hostent *hp, char **bpp, char *ep)
-{
-	char **ap;
-
-	assert(hp != NULL);
-	assert(bpp != NULL);
-	assert(ep != NULL);
-
-	if (hp->h_addrtype != AF_INET || hp->h_length != INADDRSZ)
-		return;
-	hp->h_addrtype = AF_INET6;
-	hp->h_length = IN6ADDRSZ;
-	for (ap = hp->h_addr_list; *ap; ap++) {
-		int i = sizeof(align) - (size_t)((u_long)*bpp % sizeof(align));
-
-		if (ep - *bpp < (i + IN6ADDRSZ)) {
-			/* Out of memory.  Truncate address list here.  XXX */
-			*ap = NULL;
-			return;
-		}
-		*bpp += i;
-		map_v4v6_address(*ap, *bpp);
-		*ap = *bpp;
-		*bpp += IN6ADDRSZ;
-	}
-}
-
-static void
-addrsort(char **ap, int num, res_state res)
-{
-	int i, j;
-	char **p;
-	short aval[MAXADDRS];
-	int needsort = 0;
-
-	assert(ap != NULL);
-
-	p = ap;
-	for (i = 0; i < num; i++, p++) {
-	    for (j = 0 ; (unsigned)j < res->nsort; j++)
-		if (res->sort_list[j].addr.s_addr ==
-		    (((struct in_addr *)(void *)(*p))->s_addr &
-		    res->sort_list[j].mask))
-			break;
-	    aval[i] = j;
-	    if (needsort == 0 && i > 0 && j < aval[i-1])
-		needsort = i;
-	}
-	if (!needsort)
-	    return;
-
-	while (needsort < num) {
-	    for (j = needsort - 1; j >= 0; j--) {
-		if (aval[j] > aval[j+1]) {
-		    char *hp;
-
-		    i = aval[j];
-		    aval[j] = aval[j+1];
-		    aval[j+1] = i;
-
-		    hp = ap[j];
-		    ap[j] = ap[j+1];
-		    ap[j+1] = hp;
-		} else
-		    break;
-	    }
-	    needsort++;
-	}
-}
-
-struct hostent *
-gethostent(void)
-{
-    res_static  rs = __res_get_static();
-	rs->host.h_addrtype = 0;
-	rs->host.h_length = 0;
-	return _gethtent();
-}
-
-/*ARGSUSED*/
-int
-_dns_gethtbyname(void *rv, void *cb_data, va_list ap)
-{
-	querybuf *buf;
-	int n, type;
-	struct hostent *hp;
-	const char *name;
-	int af;
-	res_state res;
-
-	assert(rv != NULL);
-
-	name = va_arg(ap, char *);
-	/* NOSTRICT skip len */(void)va_arg(ap, int);
-	af = va_arg(ap, int);
-
-	switch (af) {
-	case AF_INET:
-		type = T_A;
-		break;
-	case AF_INET6:
-		type = T_AAAA;
-		break;
-	default:
-		return NS_UNAVAIL;
-	}
-	buf = malloc(sizeof(*buf));
-	if (buf == NULL) {
-		h_errno = NETDB_INTERNAL;
-		return NS_NOTFOUND;
-	}
-	res = __res_get_state();
-	if (res == NULL) {
-		free(buf);
-		return NS_NOTFOUND;
-	}
-	n = res_nsearch(res, name, C_IN, type, buf->buf, sizeof(buf->buf));
-	if (n < 0) {
-		free(buf);
-		dprintf("res_nsearch failed (%d)\n", res, n);
-		__res_put_state(res);
-		return NS_NOTFOUND;
-	}
-	hp = getanswer(buf, n, name, type, res);
-	free(buf);
-	__res_put_state(res);
-	if (hp == NULL)
-		switch (h_errno) {
-		case HOST_NOT_FOUND:
-			return NS_NOTFOUND;
-		case TRY_AGAIN:
-			return NS_TRYAGAIN;
-		default:
-			return NS_UNAVAIL;
-		}
-	*((struct hostent **)rv) = hp;
-	return NS_SUCCESS;
-}
-
-/*ARGSUSED*/
-int
-_dns_gethtbyaddr(void *rv, void	*cb_data, va_list ap)
-{
-	char qbuf[MAXDNAME + 1], *qp, *ep;
-	int n;
-	querybuf *buf;
-	struct hostent *hp;
-	const unsigned char *uaddr;
-	int len, af, advance;
-	res_state res;
-	res_static rs = __res_get_static();
-
-	assert(rv != NULL);
-
-	uaddr = va_arg(ap, unsigned char *);
-	len = va_arg(ap, int);
-	af = va_arg(ap, int);
-
-	switch (af) {
-	case AF_INET:
-		(void)snprintf(qbuf, sizeof(qbuf), "%u.%u.%u.%u.in-addr.arpa",
-		    (uaddr[3] & 0xff), (uaddr[2] & 0xff),
-		    (uaddr[1] & 0xff), (uaddr[0] & 0xff));
-		break;
-
-	case AF_INET6:
-		qp = qbuf;
-		ep = qbuf + sizeof(qbuf) - 1;
-		for (n = IN6ADDRSZ - 1; n >= 0; n--) {
-			advance = snprintf(qp, (size_t)(ep - qp), "%x.%x.",
-			    uaddr[n] & 0xf,
-			    ((unsigned int)uaddr[n] >> 4) & 0xf);
-			if (advance > 0 && qp + advance < ep)
-				qp += advance;
-			else {
-				h_errno = NETDB_INTERNAL;
-				return NS_NOTFOUND;
-			}
-		}
-		if (strlcat(qbuf, "ip6.arpa", sizeof(qbuf)) >= sizeof(qbuf)) {
-			h_errno = NETDB_INTERNAL;
-			return NS_NOTFOUND;
-		}
-		break;
-	default:
-		abort();
-	}
-
-	buf = malloc(sizeof(*buf));
-	if (buf == NULL) {
-		h_errno = NETDB_INTERNAL;
-		return NS_NOTFOUND;
-	}
-	res = __res_get_state();
-	if (res == NULL) {
-		free(buf);
-		return NS_NOTFOUND;
-	}
-	n = res_nquery(res, qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf));
-	if (n < 0) {
-		free(buf);
-		dprintf("res_nquery failed (%d)\n", res, n);
-		__res_put_state(res);
-		return NS_NOTFOUND;
-	}
-	hp = getanswer(buf, n, qbuf, T_PTR, res);
-	free(buf);
-	if (hp == 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;
-		}
-	}
-	hp->h_addrtype = af;
-	hp->h_length = len;
-	(void)memcpy(rs->host_addr, uaddr, (size_t)len);
-	rs->h_addr_ptrs[0] = (char *)(void *)rs->host_addr;
-	rs->h_addr_ptrs[1] = NULL;
-	if (af == AF_INET && (res->options & RES_USE_INET6)) {
-		map_v4v6_address((char *)(void *)rs->host_addr,
-		    (char *)(void *)rs->host_addr);
-		hp->h_addrtype = AF_INET6;
-		hp->h_length = IN6ADDRSZ;
-	}
-
-	__res_put_state(res);
-	*((struct hostent **)rv) = hp;
-	h_errno = NETDB_SUCCESS;
-	return NS_SUCCESS;
-}
diff --git a/libc/netbsd/nameser/ns_parse.c b/libc/netbsd/nameser/ns_parse.c
index fd94860..7c54026 100644
--- a/libc/netbsd/nameser/ns_parse.c
+++ b/libc/netbsd/nameser/ns_parse.c
@@ -36,6 +36,7 @@ __RCSID("$NetBSD: ns_parse.c,v 1.2 2004/05/20 20:35:05 christos Exp $");
 #include <errno.h>
 #ifdef ANDROID_CHANGES
 #include "resolv_private.h"
+#include "private/resolv_private.h"
 #else
 #include <resolv.h>
 #endif
diff --git a/libc/netbsd/nameser/ns_print.c b/libc/netbsd/nameser/ns_print.c
index 7465e62..c3a44bc 100644
--- a/libc/netbsd/nameser/ns_print.c
+++ b/libc/netbsd/nameser/ns_print.c
@@ -40,6 +40,7 @@ __RCSID("$NetBSD: ns_print.c,v 1.5 2004/11/07 02:19:49 christos Exp $");
 #include <errno.h>
 #ifdef ANDROID_CHANGES
 #include "resolv_private.h"
+#include "private/resolv_private.h"
 #else
 #include <resolv.h>
 #endif
diff --git a/libc/netbsd/net/getaddrinfo.c b/libc/netbsd/net/getaddrinfo.c
index 51079ae..9b08b52 100644
--- a/libc/netbsd/net/getaddrinfo.c
+++ b/libc/netbsd/net/getaddrinfo.c
@@ -90,6 +90,7 @@
 #include <errno.h>
 #include <netdb.h>
 #include "resolv_private.h"
+#include "private/resolv_private.h"
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/libc/netbsd/net/getservent.c b/libc/netbsd/net/getservent.c
index 9f6ec32..cc49ce1 100644
--- a/libc/netbsd/net/getservent.c
+++ b/libc/netbsd/net/getservent.c
@@ -31,6 +31,7 @@
 #include <netdb.h>
 #include "servent.h"
 #include "services.h"
+#include <sys/endian.h>
 
 void
 setservent(int f)
diff --git a/libc/netbsd/net/getservent_r.c b/libc/netbsd/net/getservent_r.c
index 1668759..c06bb1a 100644
--- a/libc/netbsd/net/getservent_r.c
+++ b/libc/netbsd/net/getservent_r.c
@@ -31,6 +31,9 @@
 
 #include <sys/cdefs.h>
 #include <sys/types.h>
+#include <endian.h>
+#include <sys/endian.h>
+
 
 #if defined(LIBC_SCCS) && !defined(lint)
 #if 0
@@ -48,6 +51,8 @@ __RCSID("$NetBSD: getservent_r.c,v 1.5 2005/04/18 19:39:45 kleink Exp $");
 #include <netinet/in.h>
 
 #include "servent.h"
+#include "services.h"
+
 
 void
 setservent_r(int f, struct servent_data *sd)
diff --git a/libc/netbsd/net/servent.h b/libc/netbsd/net/servent.h
index 822b375..5e6a576 100644
--- a/libc/netbsd/net/servent.h
+++ b/libc/netbsd/net/servent.h
@@ -41,4 +41,23 @@
 #include <string.h>
 #include "resolv_static.h"
 
-struct servent*  getservent_r(res_static rs);
+// not included in bionic distribution. wtf is up with that?
+// maybe they compile on a bsd that has it defined due to
+// not using -nostdinc
+ 
+#ifndef servent_data
+
+struct servent_data {
+        FILE *fp;
+	struct servent serv;
+	char **aliases;
+	size_t maxaliases;
+	int stayopen;
+	char *line;
+	void *dummy;
+};
+
+#endif
+
+// below line does not make sense ? breaks compile 
+// struct servent*  getservent_r(res_static rs);
diff --git a/libc/netbsd/resolv/res_comp.c b/libc/netbsd/resolv/res_comp.c
index 77b81b4..39c9dda 100644
--- a/libc/netbsd/resolv/res_comp.c
+++ b/libc/netbsd/resolv/res_comp.c
@@ -86,6 +86,7 @@ __RCSID("$NetBSD: res_comp.c,v 1.6 2004/05/22 23:47:09 christos Exp $");
 #include <ctype.h>
 #ifdef ANDROID_CHANGES
 #include "resolv_private.h"
+#include "private/resolv_private.h"
 #else
 #include <resolv.h>
 #endif
@@ -168,7 +169,11 @@ dn_skipname(const u_char *ptr, const u_char *eom) {
 #define	domainchar(c) ((c) > 0x20 && (c) < 0x7f)
 
 int
+#ifdef ANDROID_CHANGES
+__res_hnok(const char *dn) {
+#else
 res_hnok(const char *dn) {
+#endif
 	int pch = PERIOD, ch = *dn++;
 
 	while (ch != '\0') {
diff --git a/libc/netbsd/resolv/res_debug.c b/libc/netbsd/resolv/res_debug.c
index 84c6afc..c9f589b 100644
--- a/libc/netbsd/resolv/res_debug.c
+++ b/libc/netbsd/resolv/res_debug.c
@@ -120,6 +120,7 @@ __RCSID("$NetBSD: res_debug.c,v 1.7 2004/11/07 02:25:01 christos Exp $");
 #include <math.h>
 #include <netdb.h>
 #include "resolv_private.h"
+#include "private/resolv_private.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/libc/netbsd/resolv/res_init.c b/libc/netbsd/resolv/res_init.c
index 81e570f..c660274 100644
--- a/libc/netbsd/resolv/res_init.c
+++ b/libc/netbsd/resolv/res_init.c
@@ -70,6 +70,8 @@
  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+
+
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
 #ifdef notdef
@@ -98,6 +100,8 @@ __RCSID("$NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $");
 #include <unistd.h>
 #include <netdb.h>
 
+
+
 #ifdef ANDROID_CHANGES
 #include <sys/system_properties.h>
 #endif /* ANDROID_CHANGES */
@@ -162,6 +166,10 @@ static u_int32_t net_mask __P((struct in_addr));
  *
  * Return 0 if completes successfully, -1 on error
  */
+
+
+#undef ANDROID_CHANGES
+
 int
 res_ninit(res_state statp) {
 	extern int __res_vinit(res_state, int);
@@ -870,33 +878,14 @@ res_getservers(res_state statp, union res_sockaddr_union *set, int cnt) {
 	return (statp->nscount);
 }
 
-#ifdef ANDROID_CHANGES
+// #ifdef ANDROID_CHANGES
 static int _get_dns_change_count()
 {
-	if (dns_change_prop == NULL) {
-		dns_change_prop = __system_property_find(DNS_CHANGE_PROP_NAME);
-	}
-	if (dns_change_prop != NULL) {
-		char propvalue[PROP_VALUE_MAX];
-		if (__system_property_read(dns_change_prop, NULL, propvalue) >= 1) {
-			return atoi(propvalue);
-		}
-	}
 	return -1;
 }
 
 int res_get_dns_changed()
 {
-	int change_count;
-
-	change_count = _get_dns_change_count();
-	if (change_count != dns_last_change_counter) {
-		if (change_count != -1) {
-			dns_last_change_counter = change_count;
-		}
-		return 1;
-	} else {
-		return 0;
-	}
+	return 0;
 }
-#endif /* ANDROID_CHANGES */
+// #endif /* ANDROID_CHANGES */
diff --git a/libc/netbsd/resolv/res_mkquery.c b/libc/netbsd/resolv/res_mkquery.c
index fb4de7f..b889a26 100644
--- a/libc/netbsd/resolv/res_mkquery.c
+++ b/libc/netbsd/resolv/res_mkquery.c
@@ -90,6 +90,7 @@ __RCSID("$NetBSD: res_mkquery.c,v 1.6 2006/01/24 17:40:32 christos Exp $");
 #include <netdb.h>
 #ifdef ANDROID_CHANGES
 #include "resolv_private.h"
+#include "private/resolv_private.h"
 #else
 #include <resolv.h>
 #endif
diff --git a/libc/netbsd/resolv/res_random.c b/libc/netbsd/resolv/res_random.c
index 4570c4f..15b343d 100644
--- a/libc/netbsd/resolv/res_random.c
+++ b/libc/netbsd/resolv/res_random.c
@@ -69,6 +69,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <pthread.h>
+
 /* BIONIC-BEGIN */
 static pthread_mutex_t         _res_random_lock = PTHREAD_MUTEX_INITIALIZER;
 #define  _RES_RANDOM_LOCK()    pthread_mutex_lock(&_res_random_lock)
@@ -234,7 +236,7 @@ res_randomid(void)
 	struct timeval tv;
         u_int  result;
 
-        _RES_RANDOM_LOCK()
+        _RES_RANDOM_LOCK();
 	gettimeofday(&tv, NULL);
 	if (ru_counter >= RU_MAX || tv.tv_sec > ru_reseed)
 		res_initid();
@@ -244,7 +246,7 @@ res_randomid(void)
 	ru_counter++;
 
 	result = permute15(ru_seed ^ pmod(ru_g, ru_seed2 + ru_x, RU_N)) | ru_msb;
-        _RES_RANDOM_UNLOCK()
+        _RES_RANDOM_UNLOCK();
         return result;
 }
 
diff --git a/libc/netbsd/resolv/res_state.c b/libc/netbsd/resolv/res_state.c
index 3a2301d..7933c05 100644
--- a/libc/netbsd/resolv/res_state.c
+++ b/libc/netbsd/resolv/res_state.c
@@ -35,9 +35,15 @@
 #include <pthread.h>
 #include <stdlib.h>
 
+#undef ANDROID_CHANGES
+
+#ifdef ANDROID_CHANGES
+
 #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
 #include <sys/_system_properties.h>
 
+#endif
+
 static pthread_key_t   _res_key;
 static pthread_once_t  _res_once;
 
@@ -58,10 +64,14 @@ _res_thread_alloc(void)
         rt->_h_errno = 0;
         /* Special system property which tracks any changes to 'net.*'. */
         rt->_serial = 0;
+#ifdef ANDROID_CHANGES
         rt->_pi = (struct prop_info*) __system_property_find("net.change");
         if (rt->_pi) {
-            rt->_serial = rt->_pi->serial;
+            rt->_serial = rt->_pi->serial;aQ
         }
+#else
+	rt->_pi = NULL;
+#endif
         if ( res_ninit( rt->_nres ) < 0 ) {
             free(rt);
             rt = NULL;
@@ -116,6 +126,7 @@ _res_thread_get(void)
         rt->_serial = 0;
         pthread_setspecific( _res_key, rt );
     }
+#ifdef ANDROID_CHANGES
     /* Check the serial value for any chanes to net.* properties. */
     if (rt->_pi == NULL) {
         rt->_pi = (struct prop_info*) __system_property_find("net.change");
@@ -124,6 +135,8 @@ _res_thread_get(void)
         return rt;
     }
     rt->_serial = rt->_pi->serial;
+#endif
+
     /* Reload from system properties. */
     if ( res_ninit( rt->_nres ) < 0 ) {
         free(rt);
diff --git a/libc/private/resolv_private.h b/libc/private/resolv_private.h
index 0f3c6c0..0081699 100644
--- a/libc/private/resolv_private.h
+++ b/libc/private/resolv_private.h
@@ -56,6 +56,7 @@
 
 #include <resolv.h>
 #include "resolv_static.h"
+#include "private/arpa_nameser.h"
 
 /*
  * Revision information.  This is the release date in YYYYMMDD format.
diff --git a/libc/string/strcasecmp.c b/libc/string/strcasecmp.c
index 2be0913..ecba7e3 100644
--- a/libc/string/strcasecmp.c
+++ b/libc/string/strcasecmp.c
@@ -31,7 +31,8 @@
 
 #include <string.h>
 
-typedef unsigned char u_char;
+
+// typedef unsigned char u_char; PKS, sys/types.h defines it for us.
 
 /*
  * This array is designed for mapping upper and lower case letter
diff --git a/libc/tzcode/localtime.c b/libc/tzcode/localtime.c
index 83c1011..f36b6ba 100644
--- a/libc/tzcode/localtime.c
+++ b/libc/tzcode/localtime.c
@@ -1259,9 +1259,11 @@ tzset_locked P((void))
 
     name = getenv("TZ");
 
+#if 0
     // try the "persist.sys.timezone" system property first
     if (name == NULL && __system_property_get("persist.sys.timezone", buf) > 0)
         name = buf;
+#endif
 
     if (name == NULL) {
         tzsetwall();
diff --git a/libc/unistd/initgroups.c b/libc/unistd/initgroups.c
index dea6d96..b1bea1f 100644
--- a/libc/unistd/initgroups.c
+++ b/libc/unistd/initgroups.c
@@ -39,6 +39,7 @@ initgroups (const char *user, gid_t group)
     int     ret       = -1;
     int     numgroups = INIT_GROUPS;
 
+#if 0 // PKS
     if (getgrouplist(user, group, groups, &numgroups) < 0) {
         groups = malloc(numgroups*sizeof(groups[0]));
         if (groups == NULL)
@@ -47,6 +48,11 @@ initgroups (const char *user, gid_t group)
             goto EXIT;
         }
     }
+#else 
+	// basically what stub does. 
+	groups0[0] = group;
+	numgroups = 1;
+#endif
 
     ret = setgroups(numgroups, groups);
 
diff --git a/libm/Android.mk b/libm/Android.mk
index fa73aff..cfe1c79 100644
--- a/libm/Android.mk
+++ b/libm/Android.mk
@@ -1,5 +1,13 @@
 LOCAL_PATH:= $(call my-dir)
 
+all: $(libm_common_src_files)
+
+.c.o:
+	gcc -c $<
+
+
+
+
 libm_common_src_files:= \
 	isinf.c  \
 	fpclassify.c \