mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-03-24 18:16:24 +01:00
1849 lines
46 KiB
Plaintext
1849 lines
46 KiB
Plaintext
|
|
- 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 \
|