Query libnetd_client for the appropriate netId for host resolution.

If libnetd_client can't be found, operate as before and use the default netId
potentially overriden by a more specific netId passed in to
android_get*fornet().

(cherry picked from commit 559c7842cc6862568d9b5799fc0bcf74d58b596b)

Change-Id: I42ef3293172651870fb46d2de22464c4f03e8e0b
diff --git a/libc/bionic/NetdClient.cpp b/libc/bionic/NetdClient.cpp
index 75e84ee..36796a2 100644
--- a/libc/bionic/NetdClient.cpp
+++ b/libc/bionic/NetdClient.cpp
@@ -43,6 +43,8 @@
     netdClientInitFunction(netdClientHandle, "netdClientInitAccept", &__netdClientDispatch.accept);
     netdClientInitFunction(netdClientHandle, "netdClientInitConnect",
                            &__netdClientDispatch.connect);
+    netdClientInitFunction(netdClientHandle, "netdClientInitNetIdForResolv",
+                           &__netdClientDispatch.netIdForResolv);
 }
 
 static pthread_once_t netdClientInitOnce = PTHREAD_ONCE_INIT;
diff --git a/libc/bionic/NetdClientDispatch.cpp b/libc/bionic/NetdClientDispatch.cpp
index 6bd2357..17bbd9d 100644
--- a/libc/bionic/NetdClientDispatch.cpp
+++ b/libc/bionic/NetdClientDispatch.cpp
@@ -25,9 +25,14 @@
 extern "C" __socketcall int __accept(int, sockaddr*, socklen_t*);
 extern "C" __socketcall int __connect(int, const sockaddr*, socklen_t);
 
+static unsigned fallBackNetIdForResolv(unsigned netId) {
+    return netId;
+}
+
 // This structure is modified only at startup (when libc.so is loaded) and never
 // afterwards, so it's okay that it's read later at runtime without a lock.
 __LIBC_HIDDEN__ NetdClientDispatch __netdClientDispatch __attribute__((aligned(32))) = {
     __accept,
     __connect,
+    fallBackNetIdForResolv,
 };
diff --git a/libc/dns/gethnamaddr.c b/libc/dns/gethnamaddr.c
index 4da99b2..1afad6d 100644
--- a/libc/dns/gethnamaddr.c
+++ b/libc/dns/gethnamaddr.c
@@ -60,6 +60,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <arpa/nameser.h>
+#include "NetdClientDispatch.h"
 #include "resolv_netid.h"
 #include "resolv_private.h"
 #include "resolv_cache.h"
@@ -760,6 +761,8 @@
 	proxy = android_open_proxy();
 	if (proxy == NULL) goto exit;
 
+	netid = __netdClientDispatch.netIdForResolv(netid);
+
 	/* This is writing to system/netd/DnsProxyListener.cpp and changes
 	 * here need to be matched there */
 	if (fprintf(proxy, "gethostbyname %u %s %d",
@@ -796,6 +799,8 @@
 	const char * addrStr = inet_ntop(af, addr, buf, sizeof(buf));
 	if (addrStr == NULL) goto exit;
 
+	netid = __netdClientDispatch.netIdForResolv(netid);
+
 	if (fprintf(proxy, "gethostbyaddr %s %d %d %u",
 			addrStr, len, af, netid) < 0) {
 		goto exit;
diff --git a/libc/dns/net/getaddrinfo.c b/libc/dns/net/getaddrinfo.c
index 4c120d9..be692e3 100644
--- a/libc/dns/net/getaddrinfo.c
+++ b/libc/dns/net/getaddrinfo.c
@@ -92,6 +92,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include <netdb.h>
+#include "NetdClientDispatch.h"
 #include "resolv_cache.h"
 #include "resolv_netid.h"
 #include "resolv_private.h"
@@ -449,6 +450,8 @@
 		return EAI_NODATA;
 	}
 
+	netid = __netdClientDispatch.netIdForResolv(netid);
+
 	// Send the request.
 	proxy = fdopen(sock, "r+");
 	if (fprintf(proxy, "getaddrinfo %s %s %d %d %d %d %u",
diff --git a/libc/private/NetdClientDispatch.h b/libc/private/NetdClientDispatch.h
index 0390bfb..c256288 100644
--- a/libc/private/NetdClientDispatch.h
+++ b/libc/private/NetdClientDispatch.h
@@ -25,6 +25,7 @@
 struct NetdClientDispatch {
     int (*accept)(int, struct sockaddr*, socklen_t*);
     int (*connect)(int, const struct sockaddr*, socklen_t);
+    unsigned (*netIdForResolv)(unsigned);
 };
 
 extern __LIBC_HIDDEN__ struct NetdClientDispatch __netdClientDispatch;