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