diff --git a/libc/Android.bp b/libc/Android.bp
index 4084b96..0cfa53c 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -274,7 +274,7 @@
 
     defaults: ["libc_defaults"],
     srcs: [
-        "dns/**/*.c",
+        "dns/**/*.c*",
 
         "upstream-netbsd/lib/libc/isc/ev_streams.c",
         "upstream-netbsd/lib/libc/isc/ev_timers.c",
diff --git a/libc/dns/include/resolv_private.h b/libc/dns/include/resolv_private.h
index 77b03bf..3054555 100644
--- a/libc/dns/include/resolv_private.h
+++ b/libc/dns/include/resolv_private.h
@@ -51,8 +51,7 @@
  *	Id: resolv.h,v 1.7.2.11.4.2 2004/06/25 00:41:05 marka Exp
  */
 
-#ifndef _RESOLV_PRIVATE_H_
-#define	_RESOLV_PRIVATE_H_
+#pragma once
 
 #include <sys/cdefs.h>
 
@@ -63,6 +62,8 @@
 #include <net/if.h>
 #include <time.h>
 
+__BEGIN_DECLS
+
 // Linux defines MAXHOSTNAMELEN as 64, while the domain name limit in
 // RFC 1034 and RFC 1035 is 255 octets.
 #ifdef MAXHOSTNAMELEN
@@ -293,8 +294,6 @@
 /*			0x00010000	*/
 
 /* Things involving an internal (static) resolver context. */
-__BEGIN_DECLS
-
 __LIBC_HIDDEN__ extern struct __res_state *__res_get_state(void);
 __LIBC_HIDDEN__ extern void __res_put_state(struct __res_state *);
 
@@ -307,8 +306,6 @@
 #define _res (*__res_state())
 #endif
 
-__END_DECLS
-
 #ifndef __BIND_NOSTATIC
 #define fp_nquery		__fp_nquery
 #define fp_query		__fp_query
@@ -319,7 +316,6 @@
 #define res_isourserver		__res_isourserver
 #define	res_querydomain		__res_querydomain
 #define res_send		__res_send
-#define res_sendsigned		__res_sendsigned
 
 #ifdef BIND_RES_POSIX3
 #define	dn_expand	__dn_expand
@@ -329,7 +325,6 @@
 #define	res_mkquery	__res_mkquery
 #endif
 
-__BEGIN_DECLS
 void		fp_nquery(const u_char *, int, FILE *);
 void		fp_query(const u_char *, FILE *);
 const char *	hostalias(const char *);
@@ -343,8 +338,6 @@
 int		res_querydomain(const char *, const char *, int, int, u_char *, int);
 int		res_search(const char *, int, int, u_char *, int);
 int		res_send(const u_char *, int, u_char *, int);
-int		res_sendsigned(const u_char *, int, ns_tsig_key *, u_char *, int);
-__END_DECLS
 #endif
 
 #if !defined(SHARED_LIBBIND) || defined(LIB)
@@ -424,7 +417,6 @@
 #define	res_send_setrhook	__res_send_setrhook
 #define	res_servicename		__res_servicename
 #define	res_servicenumber	__res_servicenumber
-__BEGIN_DECLS
 int		res_hnok(const char *);
 int		res_ownok(const char *);
 int		res_mailok(const char *);
@@ -532,5 +524,3 @@
 int ns_name_labels(ns_nname_ct, size_t);
 
 __END_DECLS
-
-#endif /* !_RESOLV_PRIVATE_H_ */
diff --git a/libc/dns/include/resolv_static.h b/libc/dns/include/resolv_static.h
index 8f2a095..83a435a 100644
--- a/libc/dns/include/resolv_static.h
+++ b/libc/dns/include/resolv_static.h
@@ -1,7 +1,7 @@
-#ifndef _RESOLV_STATIC_H
-#define _RESOLV_STATIC_H
+#pragma once
 
 #include <netdb.h>
+#include <sys/cdefs.h>
 
 /* this structure contains all the variables that were declared
  * 'static' in the original NetBSD resolver code.
@@ -15,18 +15,20 @@
 #define	MAXALIASES	35
 #define	MAXADDRS	35
 
-typedef struct res_static {
-    char*           h_addr_ptrs[MAXADDRS + 1];
-    char*           host_aliases[MAXALIASES];
-    char            hostbuf[8*1024];
-    u_int32_t       host_addr[16 / sizeof(u_int32_t)];  /* IPv4 or IPv6 */
-    FILE*           hostf;
-    int             stayopen;
-    const char*     servent_ptr;
-    struct servent  servent;
-    struct hostent  host;
-} *res_static;
+__BEGIN_DECLS
 
-extern res_static __res_get_static(void);
+struct res_static {
+  char* h_addr_ptrs[MAXADDRS + 1];
+  char* host_aliases[MAXALIASES];
+  char hostbuf[8 * 1024];
+  u_int32_t host_addr[16 / sizeof(u_int32_t)]; /* IPv4 or IPv6 */
+  FILE* hostf;
+  int stayopen;
+  const char* servent_ptr;
+  struct servent servent;
+  struct hostent host;
+};
 
-#endif /* _RESOLV_STATIC_H */
+struct res_static* __res_get_static(void);
+
+__END_DECLS
diff --git a/libc/dns/net/gethnamaddr.c b/libc/dns/net/gethnamaddr.c
index f8212a2..add124f 100644
--- a/libc/dns/net/gethnamaddr.c
+++ b/libc/dns/net/gethnamaddr.c
@@ -1537,7 +1537,7 @@
 gethostbyname(const char *name)
 {
 	struct hostent *result = NULL;
-	res_static rs = __res_get_static(); /* Use res_static to provide thread-safety. */
+	struct res_static* rs = __res_get_static();
 
 	gethostbyname_r(name, &rs->host, rs->hostbuf, sizeof(rs->hostbuf), &result, &h_errno);
 	return result;
@@ -1547,7 +1547,7 @@
 gethostbyname2(const char *name, int af)
 {
 	struct hostent *result = NULL;
-	res_static rs = __res_get_static(); /* Use res_static to provide thread-safety. */
+	struct res_static* rs = __res_get_static();
 
 	gethostbyname2_r(name, af, &rs->host, rs->hostbuf, sizeof(rs->hostbuf), &result, &h_errno);
 	return result;
@@ -1583,7 +1583,7 @@
 	res_state res = __res_get_state();
 	if (res == NULL)
 		return NULL;
-	res_static rs = __res_get_static(); /* Use res_static to provide thread-safety. */
+	struct res_static* rs = __res_get_static();
 	hp = gethostbyname_internal(name, af, res, &rs->host, rs->hostbuf, sizeof(rs->hostbuf),
 	                            &h_errno, netcontext);
 	__res_put_state(res);
@@ -1615,7 +1615,7 @@
 android_gethostbyaddrfornetcontext_proxy(const void* addr, socklen_t len, int af,
                                   const struct android_net_context *netcontext)
 {
-	res_static rs = __res_get_static(); /* Use res_static to provide thread-safety. */
+	struct res_static* rs = __res_get_static();
 	return android_gethostbyaddrfornetcontext_proxy_internal(addr, len, af, &rs->host, rs->hostbuf,
                                                     sizeof(rs->hostbuf), &h_errno, netcontext);
 }
@@ -1623,7 +1623,7 @@
 struct hostent *
 gethostent(void)
 {
-  res_static  rs = __res_get_static();
+  struct res_static* rs = __res_get_static();
 	if (!rs->hostf) {
 	  sethostent_r(&rs->hostf);
 	  if (!rs->hostf) {
diff --git a/libc/dns/net/getservent.c b/libc/dns/net/getservent.c
index 03add59..6a50d23 100644
--- a/libc/dns/net/getservent.c
+++ b/libc/dns/net/getservent.c
@@ -35,7 +35,7 @@
 #include "resolv_static.h"
 #include "services.h"
 
-struct servent* getservent_r(res_static rs) {
+struct servent* getservent_r(struct res_static* rs) {
     const char*  p;
     const char*  q;
     int          namelen;
@@ -109,17 +109,17 @@
 }
 
 void endservent(void) {
-  res_static rs = __res_get_static();
+  struct res_static* rs = __res_get_static();
   if (rs) rs->servent_ptr = NULL;
 }
 
 struct servent* getservent(void) {
-  res_static rs = __res_get_static();
+  struct res_static* rs = __res_get_static();
   return rs ? getservent_r(rs) : NULL;
 }
 
 struct servent* getservbyname(const char* name, const char* proto) {
-  res_static rs = __res_get_static();
+  struct res_static* rs = __res_get_static();
   if (rs == NULL) return NULL;
 
   const char* old_servent_ptr = rs->servent_ptr;
@@ -135,7 +135,7 @@
 }
 
 struct servent* getservbyport(int port, const char* proto) {
-  res_static rs = __res_get_static();
+  struct res_static* rs = __res_get_static();
   if (rs == NULL) return NULL;
 
   const char* old_servent_ptr = rs->servent_ptr;
diff --git a/libc/dns/net/sethostent.c b/libc/dns/net/sethostent.c
index b2b0132..483105a 100644
--- a/libc/dns/net/sethostent.c
+++ b/libc/dns/net/sethostent.c
@@ -65,14 +65,14 @@
 /*ARGSUSED*/
 sethostent(int stayopen)
 {
-	res_static rs = __res_get_static();
+	struct res_static* rs = __res_get_static();
 	if (rs) sethostent_r(&rs->hostf);
 }
 
 void
 endhostent(void)
 {
-	res_static rs = __res_get_static();
+	struct res_static* rs = __res_get_static();
 	if (rs) endhostent_r(&rs->hostf);
 }
 
diff --git a/libc/dns/resolv/res_data.c b/libc/dns/resolv/res_data.c
deleted file mode 100644
index 4f8df69..0000000
--- a/libc/dns/resolv/res_data.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*	$NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $	*/
-
-/*
- * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
- * Copyright (c) 1995-1999 by Internet Software Consortium.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
- * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/cdefs.h>
-#if defined(LIBC_SCCS) && !defined(lint)
-#ifdef notdef
-static const char rcsid[] = "Id: res_data.c,v 1.1.206.2 2004/03/16 12:34:18 marka Exp";
-#else
-__RCSID("$NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $");
-#endif
-#endif /* LIBC_SCCS and not lint */
-
-
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-
-#include <ctype.h>
-#include <netdb.h>
-#include "resolv_private.h"
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-
-__LIBC_HIDDEN__
-const char * const _res_opcodes[] = {
-	"QUERY",
-	"IQUERY",
-	"CQUERYM",
-	"CQUERYU",	/* experimental */
-	"NOTIFY",	/* experimental */
-	"UPDATE",
-	"6",
-	"7",
-	"8",
-	"9",
-	"10",
-	"11",
-	"12",
-	"13",
-	"ZONEINIT",
-	"ZONEREF",
-};
-
-#ifdef BIND_UPDATE
-const char * const _res_sectioncodes[] = {
-	"ZONE",
-	"PREREQUISITES",
-	"UPDATE",
-	"ADDITIONAL",
-};
-#endif
-
-#ifndef __BIND_NOSTATIC
-extern struct __res_state _nres;
-
-/* Proto. */
-
-int  res_ourserver_p(const res_state, const struct sockaddr *);
-
-static pthread_once_t once_control = PTHREAD_ONCE_INIT;
-
-static void init_once(void) {
-	extern int __res_vinit(res_state, int);
-#ifdef COMPAT__RES
-	/*
-	 * Compatibility with program that were accessing _res directly
-	 * to set options. We keep another struct res that is the same
-	 * size as the original res structure, and then copy fields to
-	 * it so that we achieve the same initialization
-	 */
-	extern void *__res_get_old_state(void);
-	extern void __res_put_old_state(void *);
-	res_state ores = __res_get_old_state();
-
-	if (ores->options != 0)
-		_nres.options = ores->options;
-	if (ores->retrans != 0)
-		_nres.retrans = ores->retrans;
-	if (ores->retry != 0)
-		_nres.retry = ores->retry;
-#endif
-
-	/*
-	 * These three fields used to be statically initialized.  This made
-	 * it hard to use this code in a shared library.  It is necessary,
-	 * now that we're doing dynamic initialization here, that we preserve
-	 * the old semantics: if an application modifies one of these three
-	 * fields of _res before res_init() is called, res_init() will not
-	 * alter them.  Of course, if an application is setting them to
-	 * _zero_ before calling res_init(), hoping to override what used
-	 * to be the static default, we can't detect it and unexpected results
-	 * will follow.  Zero for any of these fields would make no sense,
-	 * so one can safely assume that the applications were already getting
-	 * unexpected results.
-	 *
-	 * _nres.options is tricky since some apps were known to diddle the bits
-	 * before res_init() was first called. We can't replicate that semantic
-	 * with dynamic initialization (they may have turned bits off that are
-	 * set in RES_DEFAULT).  Our solution is to declare such applications
-	 * "broken".  They could fool us by setting RES_INIT but none do (yet).
-	 */
-	if (!_nres.retrans)
-		_nres.retrans = RES_TIMEOUT;
-	if (!_nres.retry)
-		_nres.retry = 4;
-	if (!(_nres.options & RES_INIT))
-		_nres.options = RES_DEFAULT;
-
-	/*
-	 * This one used to initialize implicitly to zero, so unless the app
-	 * has set it to something in particular, we can randomize it now.
-	 */
-	if (!_nres.id)
-		_nres.id = res_randomid();
-
-	__res_vinit(&_nres, 1);
-#ifdef COMPAT__RES
-	__res_put_old_state(&_nres);
-#endif
-}
-
-int
-res_init(void) {
-    pthread_once(&once_control, init_once);
-    return 0;
-}
-
-static res_state get_static_res_state() {
-    pthread_once(&once_control, init_once);
-    return &_nres;
-}
-
-void
-p_query(const u_char *msg) {
-	fp_query(msg, stdout);
-}
-
-void
-fp_query(const u_char *msg, FILE *file) {
-	fp_nquery(msg, PACKETSZ, file);
-}
-
-void
-fp_nquery(const u_char *msg, int len, FILE *file) {
-	res_pquery(get_static_res_state(), msg, len, file);
-}
-
-int
-res_mkquery(int op,			/* opcode of query */
-	    const char *dname,		/* domain name */
-	    int class, int type,	/* class and type of query */
-	    const u_char *data,		/* resource record data */
-	    int datalen,		/* length of data */
-	    const u_char *newrr_in,	/* new rr for modify or append */
-	    u_char *buf,		/* buffer to put query */
-	    int buflen)			/* size of buffer */
-{
-	return (res_nmkquery(get_static_res_state(), op, dname, class, type,
-			     data, datalen,
-			     newrr_in, buf, buflen));
-}
-
-#ifdef _LIBRESOLV
-int
-res_mkupdate(ns_updrec *rrecp_in, u_char *buf, int buflen) {
-	return (res_nmkupdate(get_static_res_state(), rrecp_in, buf, buflen));
-}
-#endif
-
-int
-res_query(const char *name,	/* domain name */
-	  int class, int type,	/* class and type of query */
-	  u_char *answer,	/* buffer to put answer */
-	  int anslen)		/* size of answer buffer */
-{
-	return (res_nquery(get_static_res_state(), name, class, type, answer, anslen));
-}
-
-void
-res_send_setqhook(res_send_qhook hook) {
-	_nres.qhook = hook;
-}
-
-void
-res_send_setrhook(res_send_rhook hook) {
-	_nres.rhook = hook;
-}
-
-int
-res_isourserver(const struct sockaddr_in *inp) {
-	return (res_ourserver_p(&_nres, (const struct sockaddr *)(const void *)inp));
-}
-
-int
-res_send(const u_char *buf, int buflen, u_char *ans, int anssiz) {
-	return (res_nsend(get_static_res_state(), buf, buflen, ans, anssiz));
-}
-
-#ifdef _LIBRESOLV
-int
-res_sendsigned(const u_char *buf, int buflen, ns_tsig_key *key,
-	       u_char *ans, int anssiz)
-{
-	return (res_nsendsigned(get_static_res_state(), buf, buflen, key, ans, anssiz));
-}
-#endif
-
-void
-res_close(void) {
-	res_nclose(&_nres);
-}
-
-#ifdef _LIBRESOLV
-int
-res_update(ns_updrec *rrecp_in) {
-	return (res_nupdate(get_static_res_state(), rrecp_in, NULL));
-}
-#endif
-
-int
-res_search(const char *name,	/* domain name */
-	   int class, int type,	/* class and type of query */
-	   u_char *answer,	/* buffer to put answer */
-	   int anslen)		/* size of answer */
-{
-	return (res_nsearch(get_static_res_state(), name, class, type, answer, anslen));
-}
-
-int
-res_querydomain(const char *name,
-		const char *domain,
-		int class, int type,	/* class and type of query */
-		u_char *answer,		/* buffer to put answer */
-		int anslen)		/* size of answer */
-{
-	return (res_nquerydomain(get_static_res_state(), name, domain,
-				 class, type,
-				 answer, anslen));
-}
-
-int
-res_opt(int a, u_char *b, int c, int d)
-{
-	return res_nopt(&_nres, a, b, c, d);
-}
-
-const char *
-hostalias(const char *name) {
-	return NULL;
-}
-
-#ifdef ultrix
-int
-local_hostname_length(const char *hostname) {
-	int len_host, len_domain;
-
-	if (!*_nres.defdname)
-		res_init();
-	len_host = strlen(hostname);
-	len_domain = strlen(_nres.defdname);
-	if (len_host > len_domain &&
-	    !strcasecmp(hostname + len_host - len_domain, _nres.defdname) &&
-	    hostname[len_host - len_domain - 1] == '.')
-		return (len_host - len_domain - 1);
-	return (0);
-}
-#endif /*ultrix*/
-
-#endif
diff --git a/libc/dns/resolv/res_data.cpp b/libc/dns/resolv/res_data.cpp
new file mode 100644
index 0000000..22d9f7b
--- /dev/null
+++ b/libc/dns/resolv/res_data.cpp
@@ -0,0 +1,157 @@
+/*  $NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $  */
+
+/*
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1995-1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "resolv_private.h"
+
+#include <pthread.h>
+
+extern "C" int res_ourserver_p(const res_state, const struct sockaddr*);
+extern "C" int __res_vinit(res_state, int);
+
+class GlobalStateAccessor {
+ public:
+  GlobalStateAccessor() {
+    pthread_mutex_lock(&mutex);
+    if (!initialized) {
+      init();
+      initialized = true;
+    }
+  }
+
+  ~GlobalStateAccessor() {
+    pthread_mutex_unlock(&mutex);
+  }
+
+  __res_state* get() {
+    return &state;
+  }
+
+  int init();
+
+ private:
+  static __res_state state;
+  static bool initialized;
+  static pthread_mutex_t mutex;
+};
+__res_state GlobalStateAccessor::state;
+bool GlobalStateAccessor::initialized = false;
+pthread_mutex_t GlobalStateAccessor::mutex = PTHREAD_MUTEX_INITIALIZER;
+
+int GlobalStateAccessor::init() {
+  // These three fields used to be statically initialized.  This made
+  // it hard to use this code in a shared library.  It is necessary,
+  // now that we're doing dynamic initialization here, that we preserve
+  // the old semantics: if an application modifies one of these three
+  // fields of _res before res_init() is called, res_init() will not
+  // alter them.  Of course, if an application is setting them to
+  // _zero_ before calling res_init(), hoping to override what used
+  // to be the static default, we can't detect it and unexpected results
+  // will follow.  Zero for any of these fields would make no sense,
+  // so one can safely assume that the applications were already getting
+  // unexpected results.
+  // g_nres.options is tricky since some apps were known to diddle the bits
+  // before res_init() was first called. We can't replicate that semantic
+  // with dynamic initialization (they may have turned bits off that are
+  // set in RES_DEFAULT).  Our solution is to declare such applications
+  // "broken".  They could fool us by setting RES_INIT but none do (yet).
+  if (!state.retrans) state.retrans = RES_TIMEOUT;
+  if (!state.retry) state.retry = 4;
+  if (!(state.options & RES_INIT)) state.options = RES_DEFAULT;
+
+  // This one used to initialize implicitly to zero, so unless the app
+  // has set it to something in particular, we can randomize it now.
+  if (!state.id) state.id = res_randomid();
+
+  return __res_vinit(&state, 1);
+}
+
+int res_init(void) {
+  GlobalStateAccessor gsa;
+  return gsa.init();
+}
+
+void p_query(const u_char* msg) {
+  fp_query(msg, stdout);
+}
+
+void fp_query(const u_char* msg, FILE* file) {
+  fp_nquery(msg, PACKETSZ, file);
+}
+
+void fp_nquery(const u_char* msg, int len, FILE* file) {
+  GlobalStateAccessor gsa;
+  res_pquery(gsa.get(), msg, len, file);
+}
+
+int
+res_mkquery(int op, const char* dname, int klass, int type, const u_char* data,
+            int datalen, const u_char* newrr_in, u_char* buf, int buflen) {
+  GlobalStateAccessor gsa;
+  return res_nmkquery(gsa.get(), op, dname, klass, type, data, datalen, newrr_in, buf, buflen);
+}
+
+int res_query(const char* name, int klass, int type, u_char* answer, int anslen) {
+  GlobalStateAccessor gsa;
+  return res_nquery(gsa.get(), name, klass, type, answer, anslen);
+}
+
+void res_send_setqhook(res_send_qhook hook) {
+  GlobalStateAccessor gsa;
+  gsa.get()->qhook = hook;
+}
+
+void res_send_setrhook(res_send_rhook hook) {
+  GlobalStateAccessor gsa;
+  gsa.get()->rhook = hook;
+}
+
+int res_isourserver(const struct sockaddr_in* inp) {
+  GlobalStateAccessor gsa;
+  return res_ourserver_p(gsa.get(), reinterpret_cast<const sockaddr*>(inp));
+}
+
+int res_send(const u_char* buf, int buflen, u_char* ans, int anssiz) {
+  GlobalStateAccessor gsa;
+  return res_nsend(gsa.get(), buf, buflen, ans, anssiz);
+}
+
+void res_close(void) {
+  GlobalStateAccessor gsa;
+  res_nclose(gsa.get());
+}
+
+int res_search(const char* name, int klass, int type, u_char* answer, int anslen) {
+  GlobalStateAccessor gsa;
+  return res_nsearch(gsa.get(), name, klass, type, answer, anslen);
+}
+
+int res_querydomain(const char* name, const char* domain, int klass, int type, u_char* answer,
+                    int anslen) {
+  GlobalStateAccessor gsa;
+  return res_nquerydomain(gsa.get(), name, domain, klass, type, answer, anslen);
+}
+
+int res_opt(int a, u_char* b, int c, int d) {
+  GlobalStateAccessor gsa;
+  return res_nopt(gsa.get(), a, b, c, d);
+}
+
+const char* hostalias(const char* name) {
+  return NULL;
+}
diff --git a/libc/dns/resolv/res_debug.c b/libc/dns/resolv/res_debug.c
index 5f889cb..4fe7553 100644
--- a/libc/dns/resolv/res_debug.c
+++ b/libc/dns/resolv/res_debug.c
@@ -126,9 +126,27 @@
 #include <strings.h>
 #include <time.h>
 
-extern const char * const _res_opcodes[];
 extern const char * const _res_sectioncodes[];
 
+__LIBC_HIDDEN__ const char* const _res_opcodes[] = {
+  "QUERY",
+  "IQUERY",
+  "CQUERYM",
+  "CQUERYU",  /* experimental */
+  "NOTIFY",  /* experimental */
+  "UPDATE",
+  "6",
+  "7",
+  "8",
+  "9",
+  "10",
+  "11",
+  "12",
+  "13",
+  "ZONEINIT",
+  "ZONEREF",
+};
+
 #ifndef _LIBC
 /*
  * Print the current options.
diff --git a/libc/dns/resolv/res_state.c b/libc/dns/resolv/res_state.c
index 94124ff..d1f5c24 100644
--- a/libc/dns/resolv/res_state.c
+++ b/libc/dns/resolv/res_state.c
@@ -68,7 +68,7 @@
 }
 
 static void
-_res_static_done( res_static  rs )
+_res_static_done(struct res_static* rs)
 {
     /* fortunately, there is nothing to do here, since the
      * points in h_addr_ptrs and host_aliases should all
@@ -135,25 +135,6 @@
     return rt;
 }
 
-__LIBC_HIDDEN__
-struct __res_state _nres;
-
-#if 0
-struct resolv_cache*
-__get_res_cache(void)
-{
-    _res_thread*  rt = _res_thread_get();
-
-    if (!rt)
-        return NULL;
-
-    if (!rt->_cache) {
-        rt->_cache = _resolv_cache_create();
-    }
-    return rt->_cache;
-}
-#endif
-
 int*
 __get_h_errno(void)
 {
@@ -177,9 +158,7 @@
     /* nothing to do */
 }
 
-res_static
-__res_get_static(void)
-{
+struct res_static* __res_get_static(void) {
     _res_thread*  rt = _res_thread_get();
 
     return rt ? rt->_rstatic : NULL;
diff --git a/libc/upstream-netbsd/android/include/netbsd-compat.h b/libc/upstream-netbsd/android/include/netbsd-compat.h
index ea630b2..5dd086e 100644
--- a/libc/upstream-netbsd/android/include/netbsd-compat.h
+++ b/libc/upstream-netbsd/android/include/netbsd-compat.h
@@ -17,7 +17,7 @@
 #pragma once
 
 #define _BSD_SOURCE
-#define _GNU_SOURCE
+#define _GNU_SOURCE 1
 
 // NetBSD uses _DIAGASSERT to null-check arguments and the like,
 // but it's clear from the number of mistakes in their assertions
