Use dlopen() and dlsym() for resolver functions

This is a workaround to allow us to use libnetd_resolv.so from
the resolver APEX before b/120661824 is fixed.

Test: builds, boots
Test: system/netd/tests/runtests.sh
Test: atest FrameworksNetTests android.net.cts.ConnectivityManagerTest
Change-Id: I752ae248bb59545b0a4fbc1a7b8c9bcd697a31d4
diff --git a/server/ResolverController.cpp b/server/ResolverController.cpp
index 5d1a694..5e88f78 100644
--- a/server/ResolverController.cpp
+++ b/server/ResolverController.cpp
@@ -48,6 +48,7 @@
 #include "ResolverStats.h"
 #include "netd_resolv/params.h"
 #include "netd_resolv/resolv.h"
+#include "netd_resolv/resolv_stub.h"
 #include "netd_resolv/stats.h"
 
 namespace android {
@@ -121,16 +122,17 @@
     if (DBG) {
         ALOGD("setDnsServers netId = %u, numservers = %d", netId, numservers);
     }
-    return -resolv_set_nameservers_for_net(netId, servers, numservers, searchDomains, params);
+    return -RESOLV_STUB.resolv_set_nameservers_for_net(netId, servers, numservers, searchDomains,
+                                                       params);
 }
 
 int ResolverController::clearDnsServers(unsigned netId) {
-    resolv_set_nameservers_for_net(netId, nullptr, 0, "", nullptr);
+    RESOLV_STUB.resolv_set_nameservers_for_net(netId, nullptr, 0, "", nullptr);
     if (DBG) {
         ALOGD("clearDnsServers netId = %u\n", netId);
     }
     mDns64Configuration.stopPrefixDiscovery(netId);
-    resolv_delete_private_dns_for_net(netId);
+    RESOLV_STUB.resolv_delete_private_dns_for_net(netId);
     return 0;
 }
 
@@ -139,7 +141,7 @@
         ALOGD("flushDnsCache netId = %u\n", netId);
     }
 
-    resolv_flush_cache_for_net(netId);
+    RESOLV_STUB.resolv_delete_cache_for_net(netId);
 
     return 0;
 }
@@ -167,8 +169,8 @@
     domains->clear();
     *params = __res_params{};
     stats->clear();
-    int revision_id = android_net_res_stats_get_info_for_net(netId, &nscount, res_servers, &dcount,
-            res_domains, params, res_stats);
+    int revision_id = RESOLV_STUB.android_net_res_stats_get_info_for_net(
+            netId, &nscount, res_servers, &dcount, res_domains, params, res_stats);
 
     // If the netId is unknown (which can happen for valid net IDs for which no DNS servers have
     // yet been configured), there is no revision ID. In this case there is no data to return.
@@ -185,7 +187,7 @@
     // Determine which servers are considered usable by the resolver.
     bool valid_servers[MAXNS];
     std::fill_n(valid_servers, MAXNS, false);
-    android_net_res_stats_get_usable_servers(params, res_stats, nscount, valid_servers);
+    RESOLV_STUB.android_net_res_stats_get_usable_servers(params, res_stats, nscount, valid_servers);
 
     // Convert the server sockaddr structures to std::string.
     stats->resize(nscount);
@@ -202,9 +204,9 @@
         }
         servers->push_back(std::move(server_str));
         android::net::ResolverStats& cur_stats = (*stats)[i];
-        android_net_res_stats_aggregate(&res_stats[i], &cur_stats.successes, &cur_stats.errors,
-                &cur_stats.timeouts, &cur_stats.internal_errors, &cur_stats.rtt_avg,
-                &cur_stats.last_sample_time);
+        RESOLV_STUB.android_net_res_stats_aggregate(
+                &res_stats[i], &cur_stats.successes, &cur_stats.errors, &cur_stats.timeouts,
+                &cur_stats.internal_errors, &cur_stats.rtt_avg, &cur_stats.last_sample_time);
         cur_stats.usable = valid_servers[i];
     }
 
@@ -251,13 +253,13 @@
     fwmark.protectedFromVpn = true;
     fwmark.permission = PERMISSION_SYSTEM;
 
-    const int err = resolv_set_private_dns_for_net(
+    const int err = RESOLV_STUB.resolv_set_private_dns_for_net(
             netId, fwmark.intValue, server_ptrs.data(), server_ptrs.size(), tlsName.c_str(),
             fingerprint_ptrs.data(), fingerprint_ptrs.size());
     if (err != 0) {
         return err;
     }
-    resolv_register_private_dns_callback(&onPrivateDnsValidation);
+    RESOLV_STUB.resolv_register_private_dns_callback(&onPrivateDnsValidation);
 
     // Convert network-assigned server list to bionic's format.
     server_ptrs.clear();
@@ -328,7 +330,7 @@
     ResolverStats::encodeAll(res_stats, stats);
 
     ExternalPrivateDnsStatus privateDnsStatus = {PrivateDnsMode::OFF, 0, {}};
-    resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
+    RESOLV_STUB.resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
     for (unsigned i = 0; i < privateDnsStatus.numServers; i++) {
         std::string tlsServer_str = addrToString(&(privateDnsStatus.serverStatus[i].ss));
         tlsServers->push_back(std::move(tlsServer_str));
@@ -418,7 +420,7 @@
 
         mDns64Configuration.dump(dw, netId);
         ExternalPrivateDnsStatus privateDnsStatus = {PrivateDnsMode::OFF, 0, {}};
-        resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
+        RESOLV_STUB.resolv_get_private_dns_status_for_net(netId, &privateDnsStatus);
         dw.println("Private DNS mode: %s",
                    getPrivateDnsModeString(static_cast<PrivateDnsMode>(privateDnsStatus.mode)));
         if (!privateDnsStatus.numServers) {