1324c9471Sopenharmony_cidiff --git a/src/lib/ares_init.c b/src/lib/ares_init.c 2324c9471Sopenharmony_ciindex e8902c6..3a5a5f5 100644 3324c9471Sopenharmony_ci--- a/src/lib/ares_init.c 4324c9471Sopenharmony_ci+++ b/src/lib/ares_init.c 5324c9471Sopenharmony_ci@@ -58,6 +58,64 @@ 6324c9471Sopenharmony_ci #undef WIN32 /* Redefined in MingW/MSVC headers */ 7324c9471Sopenharmony_ci #endif 8324c9471Sopenharmony_ci 9324c9471Sopenharmony_ci+ 10324c9471Sopenharmony_ci+#if OHOS_DNS_PROXY_BY_NETSYS 11324c9471Sopenharmony_ci+#include <dlfcn.h> 12324c9471Sopenharmony_ci+#include <stdio.h> 13324c9471Sopenharmony_ci+ 14324c9471Sopenharmony_ci+#if DNS_CONFIG_DEBUG 15324c9471Sopenharmony_ci+#ifndef DNS_CONFIG_PRINT 16324c9471Sopenharmony_ci+#define DNS_CONFIG_PRINT(fmt, ...) printf("DNS " fmt "\n", ##__VA_ARGS__) 17324c9471Sopenharmony_ci+#endif 18324c9471Sopenharmony_ci+#else 19324c9471Sopenharmony_ci+#define DNS_CONFIG_PRINT(fmt, ...) 20324c9471Sopenharmony_ci+#endif 21324c9471Sopenharmony_ci+ 22324c9471Sopenharmony_ci+#define DNS_SO_PATH "libnetsys_client.z.so" 23324c9471Sopenharmony_ci+#define OHOS_GET_CONFIG_FUNC_NAME "NetSysGetResolvConf" 24324c9471Sopenharmony_ci+#define MAX_SERVER_NUM 5 25324c9471Sopenharmony_ci+#define MAX_SERVER_LENGTH 50 26324c9471Sopenharmony_ci+ 27324c9471Sopenharmony_ci+struct resolv_config { 28324c9471Sopenharmony_ci+ int32_t error; 29324c9471Sopenharmony_ci+ int32_t timeout_ms; 30324c9471Sopenharmony_ci+ uint32_t retry_count; 31324c9471Sopenharmony_ci+ char nameservers[MAX_SERVER_NUM][MAX_SERVER_LENGTH + 1]; 32324c9471Sopenharmony_ci+}; 33324c9471Sopenharmony_ci+ 34324c9471Sopenharmony_ci+typedef int32_t (*GetConfig)(uint16_t netId, struct resolv_config *config); 35324c9471Sopenharmony_ci+ 36324c9471Sopenharmony_ci+static void *open_dns_lib(void) 37324c9471Sopenharmony_ci+{ 38324c9471Sopenharmony_ci+ static void *lib = NULL; 39324c9471Sopenharmony_ci+ if (lib != NULL) { 40324c9471Sopenharmony_ci+ return lib; 41324c9471Sopenharmony_ci+ } 42324c9471Sopenharmony_ci+ lib = dlopen(DNS_SO_PATH, RTLD_LAZY); 43324c9471Sopenharmony_ci+ if (lib == NULL) { 44324c9471Sopenharmony_ci+ DNS_CONFIG_PRINT("%s: dlopen %s failed: %s", 45324c9471Sopenharmony_ci+ __func__, DNS_SO_PATH, dlerror()); 46324c9471Sopenharmony_ci+ return NULL; 47324c9471Sopenharmony_ci+ } 48324c9471Sopenharmony_ci+ return lib; 49324c9471Sopenharmony_ci+} 50324c9471Sopenharmony_ci+ 51324c9471Sopenharmony_ci+static void *load_from_dns_lib(const char *symbol) 52324c9471Sopenharmony_ci+{ 53324c9471Sopenharmony_ci+ void *lib_handle = open_dns_lib(); 54324c9471Sopenharmony_ci+ if (lib_handle == NULL) { 55324c9471Sopenharmony_ci+ return NULL; 56324c9471Sopenharmony_ci+ } 57324c9471Sopenharmony_ci+ 58324c9471Sopenharmony_ci+ void *sym_addr = dlsym(lib_handle, symbol); 59324c9471Sopenharmony_ci+ if (sym_addr == NULL) { 60324c9471Sopenharmony_ci+ DNS_CONFIG_PRINT("%s: loading symbol %s with dlsym failed: %s", 61324c9471Sopenharmony_ci+ __func__, symbol, dlerror()); 62324c9471Sopenharmony_ci+ } 63324c9471Sopenharmony_ci+ return sym_addr; 64324c9471Sopenharmony_ci+} 65324c9471Sopenharmony_ci+#endif 66324c9471Sopenharmony_ci+ 67324c9471Sopenharmony_ci static int init_by_options(ares_channel channel, 68324c9471Sopenharmony_ci const struct ares_options *options, 69324c9471Sopenharmony_ci int optmask); 70324c9471Sopenharmony_ci@@ -1705,6 +1763,12 @@ static int init_by_resolv_conf(ares_channel channel) 71324c9471Sopenharmony_ci int error; 72324c9471Sopenharmony_ci int update_domains; 73324c9471Sopenharmony_ci const char *resolvconf_path; 74324c9471Sopenharmony_ci+#if OHOS_DNS_PROXY_BY_NETSYS 75324c9471Sopenharmony_ci+ int netid = 0; 76324c9471Sopenharmony_ci+ int ret = 0; 77324c9471Sopenharmony_ci+ int status_each = -1; 78324c9471Sopenharmony_ci+ GetConfig func = NULL; 79324c9471Sopenharmony_ci+#endif 80324c9471Sopenharmony_ci 81324c9471Sopenharmony_ci /* Don't read resolv.conf and friends if we don't have to */ 82324c9471Sopenharmony_ci if (ARES_CONFIG_CHECK(channel)) 83324c9471Sopenharmony_ci@@ -1720,6 +1784,36 @@ static int init_by_resolv_conf(ares_channel channel) 84324c9471Sopenharmony_ci resolvconf_path = PATH_RESOLV_CONF; 85324c9471Sopenharmony_ci } 86324c9471Sopenharmony_ci 87324c9471Sopenharmony_ci+#if OHOS_DNS_PROXY_BY_NETSYS 88324c9471Sopenharmony_ci+ *(void **) &func = load_from_dns_lib(OHOS_GET_CONFIG_FUNC_NAME); 89324c9471Sopenharmony_ci+ if (!func) { 90324c9471Sopenharmony_ci+ DNS_CONFIG_PRINT("%s: loading %s failed, use %s as a fallback", 91324c9471Sopenharmony_ci+ __func__, OHOS_GET_CONFIG_FUNC_NAME, DNS_RESOLV_CONF_PATH); 92324c9471Sopenharmony_ci+ goto etc_resolv_conf; 93324c9471Sopenharmony_ci+ } 94324c9471Sopenharmony_ci+ struct resolv_config config = {0}; 95324c9471Sopenharmony_ci+ ret = func(netid, &config); 96324c9471Sopenharmony_ci+ if (ret < 0) { 97324c9471Sopenharmony_ci+ DNS_CONFIG_PRINT("__get_resolv_conf OHOS_GET_CONFIG_FUNC_NAME err %d\n", ret); 98324c9471Sopenharmony_ci+ return ARES_ENONAME; 99324c9471Sopenharmony_ci+ } 100324c9471Sopenharmony_ci+ 101324c9471Sopenharmony_ci+ for (int i = 0; i < MAX_SERVER_NUM; ++i) { 102324c9471Sopenharmony_ci+ if (config.nameservers[i] == NULL || config.nameservers[i][0] == 0) { 103324c9471Sopenharmony_ci+ continue; 104324c9471Sopenharmony_ci+ } 105324c9471Sopenharmony_ci+ status_each = config_nameserver(&servers, &nservers, config.nameservers[i]); 106324c9471Sopenharmony_ci+ if (status_each == ARES_SUCCESS) { 107324c9471Sopenharmony_ci+ status = ARES_SUCCESS; 108324c9471Sopenharmony_ci+ } 109324c9471Sopenharmony_ci+ } 110324c9471Sopenharmony_ci+ 111324c9471Sopenharmony_ci+ if (status == ARES_SUCCESS && nservers > 0) { 112324c9471Sopenharmony_ci+ goto get_conf_ok; 113324c9471Sopenharmony_ci+ } 114324c9471Sopenharmony_ci+ 115324c9471Sopenharmony_ci+etc_resolv_conf: 116324c9471Sopenharmony_ci+#endif 117324c9471Sopenharmony_ci fp = fopen(resolvconf_path, "r"); 118324c9471Sopenharmony_ci if (fp) { 119324c9471Sopenharmony_ci while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) 120324c9471Sopenharmony_ci@@ -1866,7 +1960,9 @@ static int init_by_resolv_conf(ares_channel channel) 121324c9471Sopenharmony_ci ares_free(sortlist); 122324c9471Sopenharmony_ci return status; 123324c9471Sopenharmony_ci } 124324c9471Sopenharmony_ci- 125324c9471Sopenharmony_ci+#if OHOS_DNS_PROXY_BY_NETSYS 126324c9471Sopenharmony_ci+get_conf_ok: 127324c9471Sopenharmony_ci+#endif 128324c9471Sopenharmony_ci /* If we got any name server entries, fill them in. */ 129324c9471Sopenharmony_ci if (servers) 130324c9471Sopenharmony_ci { 131