1diff --git a/src/lib/ares_getaddrinfo.c b/src/lib/ares_getaddrinfo.c 2index 0a0225a..4c3668e 100644 3--- a/src/lib/ares_getaddrinfo.c 4+++ b/src/lib/ares_getaddrinfo.c 5@@ -57,6 +57,80 @@ 6 # include "ares_platform.h" 7 #endif 8 9+#if OHOS_DNS_PROXY_BY_NETSYS 10+#include <dlfcn.h> 11+#include <stdio.h> 12+ 13+#if DNS_CONFIG_DEBUG 14+#ifndef DNS_CONFIG_PRINT 15+#define DNS_CONFIG_PRINT(fmt, ...) printf("DNS " fmt "\n", ##__VA_ARGS__) 16+#endif 17+#else 18+#define DNS_CONFIG_PRINT(fmt, ...) 19+#endif 20+ 21+#define DNS_SO_PATH "libnetsys_client.z.so" 22+#define OHOS_JUDGE_IPV6_FUNC_NAME "NetSysIsIpv6Enable" 23+typedef int (*JudgeIpv6)(uint16_t netId); 24+ 25+static void *open_dns_lib(void) 26+{ 27+ static void *lib = NULL; 28+ if (lib != NULL) { 29+ return lib; 30+ } 31+ 32+ lib = dlopen(DNS_SO_PATH, RTLD_LAZY); 33+ if (lib == NULL) { 34+ DNS_CONFIG_PRINT("%s: dlopen %s failed: %s", __func__, DNS_SO_PATH, dlerror()); 35+ return NULL; 36+ } 37+ return lib; 38+} 39+ 40+static void *load_from_dns_lib(const char *symbol) 41+{ 42+ void *lib_handle = open_dns_lib(); 43+ if (lib_handle == NULL) { 44+ return NULL; 45+ } 46+ 47+ void *sym_addr = dlsym(lib_handle, symbol); 48+ if (sym_addr == NULL) { 49+ DNS_CONFIG_PRINT("%s: loading symbol %s with dlsym failed: %s", __func__, symbol, dlerror()); 50+ } 51+ return sym_addr; 52+} 53+ 54+static JudgeIpv6 load_ipv6_judger(void) 55+{ 56+ static JudgeIpv6 ipv6_judger = NULL; 57+ if (ipv6_judger != NULL) { 58+ return ipv6_judger; 59+ } 60+ ipv6_judger = (JudgeIpv6)load_from_dns_lib(OHOS_JUDGE_IPV6_FUNC_NAME); 61+ return ipv6_judger; 62+} 63+#endif 64+ 65+static int IsIpv6Enable() 66+{ 67+ int ret = 0; 68+#if OHOS_DNS_PROXY_BY_NETSYS 69+ JudgeIpv6 func = load_ipv6_judger(); 70+ if (!func) { 71+ return 0; 72+ } 73+ 74+ uint16_t netid = 0; 75+ ret = func(netid); 76+ if (ret < 0) { 77+ return 0; 78+ } 79+#endif 80+ return ret; 81+} 82+ 83 struct host_query 84 { 85 ares_channel channel; 86@@ -744,13 +818,18 @@ static int next_dns_lookup(struct host_query *hquery) 87 ares_query(hquery->channel, s, C_IN, T_A, host_callback, hquery); 88 break; 89 case AF_INET6: 90- hquery->remaining += 1; 91- ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery); 92+ if (IsIpv6Enable()) { 93+ hquery->remaining += 1; 94+ ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery); 95+ } 96 break; 97 case AF_UNSPEC: 98- hquery->remaining += 2; 99+ hquery->remaining += 1; 100 ares_query(hquery->channel, s, C_IN, T_A, host_callback, hquery); 101- ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery); 102+ if (IsIpv6Enable()) { 103+ hquery->remaining += 1; 104+ ares_query(hquery->channel, s, C_IN, T_AAAA, host_callback, hquery); 105+ } 106 break; 107 default: break; 108 } 109