20 #ifdef HAVE_SYS_PARAM_H
21 #include <sys/param.h>
24 #ifdef HAVE_NETINET_IN_H
25 #include <netinet/in.h>
32 #ifdef HAVE_ARPA_INET_H
33 #include <arpa/inet.h>
38 #if defined(ANDROID) || defined(__ANDROID__)
39 #include <sys/system_properties.h>
42 #define DNS_PROP_NAME_PREFIX "net.dns"
43 #define MAX_DNS_PROPERTIES 8
46 #if defined(CARES_USE_LIBRESOLV)
74 static const char *
try_option(
const char *
p,
const char *q,
const char *opt);
83 #if !defined(WIN32) && !defined(WATT32) && \
84 !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV)
87 const char *bindch,
const char *altbindch,
89 static char *
try_config(
char *s,
const char *opt,
char scc);
92 #define ARES_CONFIG_CHECK(x) (x->lookups && x->nsort > -1 && \
95 x->ndots > -1 && x->timeout > -1 && \
133 channel->socket_send_buffer_size = -1;
134 channel->socket_receive_buffer_size = -1;
138 channel->tcp_connection_generation = 0;
144 channel->sock_state_cb_data = NULL;
145 channel->sock_create_cb = NULL;
146 channel->sock_create_cb_data = NULL;
147 channel->sock_config_cb = NULL;
148 channel->sock_config_cb_data = NULL;
150 channel->sock_func_cb_data = NULL;
151 channel->resolvconf_path = NULL;
154 channel->last_timeout_processed = (time_t)
now.tv_sec;
177 DEBUGF(fprintf(
stderr,
"Error: init_by_options failed: %s\n",
184 DEBUGF(fprintf(
stderr,
"Error: init_by_environment failed: %s\n",
189 DEBUGF(fprintf(
stderr,
"Error: init_by_resolv_conf failed: %s\n",
199 DEBUGF(fprintf(
stderr,
"Error: init_by_defaults failed: %s\n",
209 DEBUGF(fprintf(
stderr,
"Error: init_id_key failed: %s\n",
247 int non_v4_default_port = 0;
280 sizeof((*dest)->local_dev_name));
290 non_v4_default_port++;
294 if (non_v4_default_port) {
318 int ipv4_nservers = 0;
355 if ((
channel->servers[
i].addr.family == AF_INET) &&
356 (
channel->servers[
i].addr.udp_port == 0) &&
357 (
channel->servers[
i].addr.tcp_port == 0))
366 if ((
channel->servers[
i].addr.family == AF_INET) &&
367 (
channel->servers[
i].addr.udp_port == 0) &&
368 (
channel->servers[
i].addr.tcp_port == 0))
371 sizeof(
channel->servers[
i].addr.addrV4));
375 options->nservers = ipv4_nservers;
411 if (
channel->resolvconf_path) {
451 &&
channel->socket_send_buffer_size == -1)
452 channel->socket_send_buffer_size =
options->socket_send_buffer_size;
454 &&
channel->socket_receive_buffer_size == -1)
455 channel->socket_receive_buffer_size =
options->socket_receive_buffer_size;
472 channel->servers[
i].addr.family = AF_INET;
473 channel->servers[
i].addr.udp_port = 0;
474 channel->servers[
i].addr.tcp_port = 0;
477 sizeof(
channel->servers[
i].addr.addrV4));
540 const char *localdomain, *res_options;
543 localdomain =
getenv(
"LOCALDOMAIN");
544 if (localdomain &&
channel->ndomains == -1)
551 res_options =
getenv(
"RES_OPTIONS");
577 static int get_REG_SZ(HKEY hKey,
const char *leafKeyName,
char **outptr)
585 res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, NULL, &
size);
586 if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !
size)
596 res = RegQueryValueExA(hKey, leafKeyName, 0, NULL,
597 (
unsigned char *)*outptr, &
size);
598 if ((res != ERROR_SUCCESS) || (
size == 1))
606 *(*outptr +
size) =
'\0';
618 static int get_REG_SZ_9X(HKEY hKey,
const char *leafKeyName,
char **outptr)
627 res = RegQueryValueExA(hKey, leafKeyName, 0, &dataType, NULL, &
size);
628 if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !
size)
638 res = RegQueryValueExA(hKey, leafKeyName, 0, &dataType,
639 (
unsigned char *)*outptr, &
size);
640 if ((res != ERROR_SUCCESS) || (
size == 1))
648 *(*outptr +
size) =
'\0';
668 static int get_enum_REG_SZ(HKEY hKeyParent,
const char *leafKeyName,
671 char enumKeyName[256];
672 DWORD enumKeyNameBuffSize;
673 DWORD enumKeyIdx = 0;
682 enumKeyNameBuffSize =
sizeof(enumKeyName);
683 res = RegEnumKeyExA(hKeyParent, enumKeyIdx++, enumKeyName,
684 &enumKeyNameBuffSize, 0, NULL, NULL, NULL);
685 if (res != ERROR_SUCCESS)
687 res = RegOpenKeyExA(hKeyParent, enumKeyName, 0, KEY_QUERY_VALUE,
689 if (res != ERROR_SUCCESS)
691 gotString = get_REG_SZ(hKeyEnum, leafKeyName, outptr);
692 RegCloseKey(hKeyEnum);
710 static int get_DNS_Registry_9X(
char **outptr)
718 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_9X, 0, KEY_READ,
720 if (res != ERROR_SUCCESS)
723 gotString = get_REG_SZ_9X(hKey_VxD_MStcp, NAMESERVER, outptr);
724 RegCloseKey(hKey_VxD_MStcp);
726 if (!gotString || !*outptr)
741 static int get_DNS_Registry_NT(
char **outptr)
743 HKEY hKey_Interfaces = NULL;
744 HKEY hKey_Tcpip_Parameters;
750 res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
751 &hKey_Tcpip_Parameters);
752 if (res != ERROR_SUCCESS)
762 gotString = get_REG_SZ(hKey_Tcpip_Parameters, NAMESERVER, outptr);
767 gotString = get_REG_SZ(hKey_Tcpip_Parameters, DHCPNAMESERVER, outptr);
772 res = RegOpenKeyExA(hKey_Tcpip_Parameters,
"Interfaces", 0,
773 KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,
775 if (res != ERROR_SUCCESS)
777 hKey_Interfaces = NULL;
782 gotString = get_enum_REG_SZ(hKey_Interfaces, NAMESERVER, outptr);
787 gotString = get_enum_REG_SZ(hKey_Interfaces, DHCPNAMESERVER, outptr);
791 RegCloseKey(hKey_Interfaces);
793 RegCloseKey(hKey_Tcpip_Parameters);
795 if (!gotString || !*outptr)
812 static int get_DNS_Registry(
char **outptr)
822 gotString = get_DNS_Registry_NT(outptr);
824 gotString = get_DNS_Registry_9X(outptr);
832 static void commanjoin(
char**
dst,
const char*
const src,
const size_t len)
838 newsize =
len + (*
dst ? (strlen(*
dst) + 2) : 1);
845 if (strlen(*
dst) != 0)
855 static void commajoin(
char **
dst,
const char *src)
857 commanjoin(
dst, src, strlen(src));
876 static int get_DNS_NetworkParams(
char **outptr)
878 FIXED_INFO *fi, *newfi;
881 IP_ADDR_STRING *ipAddr;
883 DWORD
size =
sizeof (*fi);
888 if (ares_fpGetNetworkParams ==
ZERO_NULL)
895 res = (*ares_fpGetNetworkParams) (fi, &
size);
896 if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
904 res = (*ares_fpGetNetworkParams) (fi, &
size);
905 if (res != ERROR_SUCCESS)
908 for (ipAddr = &fi->DnsServerList; ipAddr; ipAddr = ipAddr->Next)
910 txtaddr = &ipAddr->IpAddress.String[0];
915 if ((namesrvr.addrV4.S_un.S_addr == INADDR_ANY) ||
922 sizeof(namesrvr.addrV6)) == 0)
928 commajoin(outptr, txtaddr);
944 static BOOL ares_IsWindowsVistaOrGreater(
void)
947 memset(&vinfo, 0,
sizeof(vinfo));
948 vinfo.dwOSVersionInfoSize =
sizeof(vinfo);
950 #pragma warning(push)
951 #pragma warning(disable:4996)
953 if (!GetVersionEx(&vinfo) || vinfo.dwMajorVersion < 6)
976 char text[
sizeof(
"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
982 static int compareAddresses(
const void *arg1,
985 const Address *
const left = arg1;
986 const Address *
const right = arg2;
988 if(left->metric < right->metric)
return -1;
989 if(left->metric > right->metric)
return 1;
991 if(left->orig_idx < right->orig_idx)
return -1;
992 if(left->orig_idx > right->orig_idx)
return 1;
1029 static ULONG getBestRouteMetric(IF_LUID *
const luid,
1030 const SOCKADDR_INET *
const dest,
1031 const ULONG interfaceMetric)
1034 MIB_IPFORWARD_ROW2 row;
1035 SOCKADDR_INET ignored;
1036 if(!ares_fpGetBestRoute2 ||
1037 ares_fpGetBestRoute2(
1050 &ignored) != NO_ERROR
1054 || row.Metric == (ULONG)-1
1055 || row.Metric > ((ULONG)-1) - interfaceMetric) {
1066 return row.Metric + interfaceMetric;
1083 #define IPAA_INITIAL_BUF_SZ 15 * 1024
1084 #define IPAA_MAX_TRIES 3
1085 static int get_DNS_AdaptersAddresses(
char **outptr)
1087 IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr;
1088 IP_ADAPTER_ADDRESSES *ipaa, *newipaa, *ipaaEntry;
1089 ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ;
1090 ULONG Bufsz = IPAA_INITIAL_BUF_SZ;
1091 ULONG AddrFlags = 0;
1092 int trying = IPAA_MAX_TRIES;
1096 size_t addressesSize;
1098 size_t addressesIndex = 0;
1103 struct sockaddr *sa;
1104 struct sockaddr_in *sa4;
1111 if (ares_fpGetAdaptersAddresses ==
ZERO_NULL)
1123 if(addresses == NULL) {
1130 res = (*ares_fpGetAdaptersAddresses) (AF_UNSPEC, AddrFlags, NULL,
1132 if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
1135 while ((res == ERROR_BUFFER_OVERFLOW) && (--trying))
1137 if (Bufsz < ReqBufsz)
1145 res = (*ares_fpGetAdaptersAddresses) (AF_UNSPEC, AddrFlags, NULL,
1147 if (res == ERROR_SUCCESS)
1150 if (res != ERROR_SUCCESS)
1153 for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next)
1155 if(ipaaEntry->OperStatus != IfOperStatusUp)
1164 for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress;
1166 ipaDNSAddr = ipaDNSAddr->Next)
1168 namesrvr.sa = ipaDNSAddr->Address.lpSockaddr;
1170 if (namesrvr.sa->sa_family == AF_INET)
1172 if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) ||
1173 (namesrvr.sa4->sin_addr.S_un.S_addr ==
INADDR_NONE))
1177 if(addressesIndex == addressesSize) {
1178 const size_t newSize = addressesSize + 4;
1181 if(newMem == NULL) {
1185 addressesSize = newSize;
1189 if (ares_IsWindowsVistaOrGreater())
1192 addresses[addressesIndex].metric =
1193 getBestRouteMetric(&ipaaEntry->Luid,
1194 (SOCKADDR_INET*)(namesrvr.sa),
1195 ipaaEntry->Ipv4Metric);
1199 addresses[addressesIndex].metric = (ULONG)-1;
1203 addresses[addressesIndex].orig_idx = addressesIndex;
1206 addresses[addressesIndex].text,
1207 sizeof(addresses[0].text))) {
1212 else if (namesrvr.sa->sa_family ==
AF_INET6)
1215 sizeof(namesrvr.sa6->sin6_addr)) == 0)
1219 if(addressesIndex == addressesSize) {
1220 const size_t newSize = addressesSize + 4;
1223 if(newMem == NULL) {
1227 addressesSize = newSize;
1231 if (ares_IsWindowsVistaOrGreater())
1234 addresses[addressesIndex].metric =
1235 getBestRouteMetric(&ipaaEntry->Luid,
1236 (SOCKADDR_INET*)(namesrvr.sa),
1237 ipaaEntry->Ipv6Metric);
1241 addresses[addressesIndex].metric = (ULONG)-1;
1245 addresses[addressesIndex].orig_idx = addressesIndex;
1248 addresses[addressesIndex].text,
1249 sizeof(addresses[0].text))) {
1263 qsort(addresses, addressesIndex,
sizeof(*addresses), compareAddresses);
1268 for(
i = 0;
i < addressesIndex; ++
i) {
1271 for(j = 0;
j <
i; ++
j) {
1272 if(strcmp(addresses[j].
text, addresses[
i].
text) == 0) {
1279 commajoin(outptr, addresses[
i].
text);
1311 static int get_DNS_Windows(
char **outptr)
1315 if (get_DNS_AdaptersAddresses(outptr))
1319 if (get_DNS_NetworkParams(outptr))
1323 return get_DNS_Registry(outptr);
1339 static int get_SuffixList_Windows(
char **outptr)
1341 HKEY hKey, hKeyEnum;
1343 DWORD keyNameBuffSize;
1349 if (ares__getplatform() != WIN_NT)
1353 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
1354 KEY_READ, &hKey) == ERROR_SUCCESS)
1356 get_REG_SZ(hKey, SEARCHLIST_KEY, outptr);
1357 if (get_REG_SZ(hKey, DOMAIN_KEY, &
p))
1359 commajoin(outptr,
p);
1366 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0,
1367 KEY_READ, &hKey) == ERROR_SUCCESS)
1369 if (get_REG_SZ(hKey, SEARCHLIST_KEY, &
p))
1371 commajoin(outptr,
p);
1380 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0,
1381 KEY_READ, &hKey) == ERROR_SUCCESS)
1383 if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &
p))
1385 commajoin(outptr,
p);
1393 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY
"\\" INTERFACES_KEY, 0,
1394 KEY_READ, &hKey) == ERROR_SUCCESS)
1398 keyNameBuffSize =
sizeof(keyName);
1399 if (RegEnumKeyExA(hKey, keyIdx++, keyName, &keyNameBuffSize,
1400 0, NULL, NULL, NULL)
1403 if (RegOpenKeyExA(hKey, keyName, 0, KEY_QUERY_VALUE, &hKeyEnum)
1407 if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &
p))
1409 commajoin(outptr,
p);
1413 if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &
p))
1415 commajoin(outptr,
p);
1419 if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &
p))
1421 commajoin(outptr,
p);
1425 RegCloseKey(hKeyEnum);
1430 return *outptr != NULL;
1437 #if !defined(ANDROID) && !defined(__ANDROID__) && !defined(WATT32) && \
1438 !defined(CARES_USE_LIBRESOLV)
1441 int status = -1, nservers = 0, nsort = 0;
1450 if (get_DNS_Windows(&
line))
1456 if (
channel->ndomains == -1 && get_SuffixList_Windows(&
line))
1468 #elif defined(__MVS__)
1470 struct __res_state *res = 0;
1475 int rc = res_init();
1476 while (rc == -1 && h_errno == TRY_AGAIN) {
1485 v6 = res->__res_extIPv6;
1486 count4 = res->nscount;
1488 count6 = v6->__stat_nscount;
1493 nservers = count4 + count6;
1501 for (
int i = 0;
i < count4; ++
i, ++pserver) {
1502 struct sockaddr_in *addr_in = &(res->nsaddr_list[
i]);
1503 pserver->addr.addrV4.s_addr = addr_in->sin_addr.s_addr;
1504 pserver->addr.family = AF_INET;
1505 pserver->addr.udp_port = addr_in->sin_port;
1506 pserver->addr.tcp_port = addr_in->sin_port;
1509 for (
int j = 0; j < count6; ++j, ++pserver) {
1510 struct sockaddr_in6 *addr_in = &(v6->__stat_nsaddr_list[j]);
1514 pserver->addr.udp_port = addr_in->
sin6_port;
1515 pserver->addr.tcp_port = addr_in->
sin6_port;
1520 #elif defined(__riscos__)
1535 space = strchr(
pos,
' ');
1550 #elif defined(WATT32)
1554 for (
i = 0; def_nameservers[
i];
i++)
1565 for (
i = 0; def_nameservers[
i];
i++)
1567 servers[
i].addr.addrV4.s_addr = htonl(def_nameservers[
i]);
1574 #elif defined(ANDROID) || defined(__ANDROID__)
1586 dns_servers = ares_get_android_server_list(MAX_DNS_PROPERTIES, &num_servers);
1587 if (dns_servers != NULL)
1589 for (
i = 0;
i < num_servers;
i++)
1596 for (
i = 0;
i < num_servers;
i++)
1604 domains = ares_get_android_search_domains_list();
1609 # ifdef HAVE___SYSTEM_PROPERTY_GET
1618 char propname[PROP_NAME_MAX];
1619 char propvalue[PROP_VALUE_MAX]=
"";
1620 for (
i = 1;
i <= MAX_DNS_PROPERTIES;
i++) {
1621 snprintf(propname,
sizeof(propname),
"%s%u", DNS_PROP_NAME_PREFIX,
i);
1622 if (__system_property_get(propname, propvalue) < 1) {
1634 #elif defined(CARES_USE_LIBRESOLV)
1635 struct __res_state res;
1636 memset(&res, 0,
sizeof(res));
1637 int result = res_ninit(&res);
1638 if (
result == 0 && (res.options & RES_INIT)) {
1641 if (
channel->nservers == -1) {
1642 union res_sockaddr_union
addr[MAXNS];
1643 int nscount = res_getservers(&res,
addr, MAXNS);
1645 for (
i = 0;
i < nscount; ++
i) {
1646 char str[INET6_ADDRSTRLEN];
1648 sa_family_t family =
addr[
i].sin.sin_family;
1649 if (family == AF_INET) {
1664 if (
channel->ndomains == -1) {
1666 while ((entries < MAXDNSRCH) && res.dnsrch[entries])
1688 channel->rotate = res.options & RES_ROTATE;
1690 channel->timeout = res.retrans * 1000;
1701 const char *resolvconf_path;
1708 update_domains = (
channel->ndomains == -1);
1711 if(
channel->resolvconf_path) {
1712 resolvconf_path =
channel->resolvconf_path;
1717 fp = fopen(resolvconf_path,
"r");
1750 DEBUGF(fprintf(
stderr,
"fopen() failed with error: %d %s\n",
1759 fp = fopen(
"/etc/nsswitch.conf",
"r");
1776 DEBUGF(fprintf(
stderr,
"fopen() failed with error: %d %s\n",
1779 "/etc/nsswitch.conf"));
1789 fp = fopen(
"/etc/host.conf",
"r");
1807 DEBUGF(fprintf(
stderr,
"fopen() failed with error: %d %s\n",
1820 fp = fopen(
"/etc/svc.conf",
"r");
1838 DEBUGF(fprintf(
stderr,
"fopen() failed with error: %d %s\n",
1840 DEBUGF(fprintf(
stderr,
"Error opening file: %s\n",
"/etc/svc.conf"));
1859 if (sortlist != NULL)
1883 char *hostname = NULL;
1885 #ifdef HAVE_GETHOSTNAME
1907 if (
channel->nservers == -1) {
1914 channel->servers[0].addr.family = AF_INET;
1915 channel->servers[0].addr.addrV4.s_addr = htonl(INADDR_LOOPBACK);
1916 channel->servers[0].addr.udp_port = 0;
1917 channel->servers[0].addr.tcp_port = 0;
1921 #if defined(USE_WINSOCK)
1922 #define toolong(x) (x == -1) && (SOCKERRNO == WSAEFAULT)
1923 #elif defined(ENAMETOOLONG)
1924 #define toolong(x) (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || \
1925 (SOCKERRNO == EINVAL))
1927 #define toolong(x) (x == -1) && (SOCKERRNO == EINVAL)
1930 if (
channel->ndomains == -1) {
1934 #ifndef HAVE_GETHOSTNAME
1949 res = gethostname(hostname, lenv);
1972 dot = strchr(hostname,
'.');
2020 if(
channel->resolvconf_path) {
2022 channel->resolvconf_path = NULL;
2032 #if !defined(WIN32) && !defined(WATT32) && \
2033 !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV)
2046 #if defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 910) && \
2047 defined(__OPTIMIZE__) && defined(__unix__) && defined(__i386__)
2049 # define vqualifier volatile
2055 const char *bindch,
const char *altbindch,
2058 char lookups[3], *
l;
2062 if (altbindch == NULL)
2074 if ((*
p == *bindch || *
p == *altbindch || *
p == *filech) &&
l < lookups + 2) {
2075 if (*
p == *bindch || *
p == *altbindch) *
l++ =
'b';
2098 unsigned char netmask,
2099 const unsigned char ipaddr[16])
2101 unsigned char mask[16] = { 0 };
2109 memset(mask, 0xFF, netmask / 8);
2113 mask[netmask / 8] = (
unsigned char)(0xff << (8 - (netmask % 8)));
2116 for (
i=0;
i<16;
i++) {
2117 if ((netbase[
i] & mask[
i]) != (ipaddr[
i] & mask[
i]))
2129 const unsigned char netbase[16];
2130 unsigned char netmask;
2138 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2147 for (
i = 0;
i <
sizeof(blacklist) /
sizeof(blacklist[0]); ++
i) {
2149 blacklist[
i].netbase, blacklist[
i].netmask, ipaddr))
2200 (
const unsigned char *)&host.addrV6))
2215 if (host.
family == AF_INET)
2216 memcpy(&newserv[*nservers].
addr.addrV4, &host.addrV4,
2217 sizeof(host.addrV4));
2219 memcpy(&newserv[*nservers].
addr.addrV6, &host.addrV6,
2220 sizeof(host.addrV6));
2238 while (*
str && *
str !=
';')
2241 char ipbuf[16], ipbufpfx[32];
2244 while (*q && *q !=
'/' && *q !=
';' && !
ISSPACE(*q))
2247 ipbuf[q-
str] =
'\0';
2251 const char *str2 = q+1;
2252 while (*q && *q !=
';' && !
ISSPACE(*q))
2255 ipbufpfx[q-
str] =
'\0';
2264 sizeof(pat.addrV6))) > 0)
2275 else if (ipbufpfx[0] &&
2277 sizeof(pat.addrV4))) > 0)
2289 else if (
ip_addr(ipbuf, q-
str, &pat.addrV4) == 0)
2294 ipbuf[q-
str] =
'\0';
2310 while (*q && *q !=
';' && !
ISSPACE(*q))
2345 const char *
p, *q, *val;
2354 if (val &&
channel->ndots == -1)
2357 if (val &&
channel->timeout == -1)
2360 if (val &&
channel->tries == -1)
2363 if (val &&
channel->rotate == -1)
2373 static const char *
try_option(
const char *
p,
const char *q,
const char *opt)
2375 size_t len = strlen(opt);
2376 return ((
size_t)(q -
p) >=
len && !strncmp(
p, opt,
len)) ? &
p[
len] : NULL;
2379 #if !defined(WIN32) && !defined(WATT32) && \
2380 !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV)
2397 while (*
p && (*
p !=
'#') && (*
p != scc))
2400 while (*
p && (*
p !=
'#'))
2406 while ((q >= s) &&
ISSPACE(*q))
2419 if ((
len = strlen(opt)) == 0)
2423 if (strncmp(
p, opt,
len) != 0)
2467 struct in_addr
addr;
2472 addr.s_addr = ntohl(pat->addrV4.s_addr);
2477 if (IN_CLASSA(
addr.s_addr))
2478 pat->
mask.
addr4.s_addr = htonl(IN_CLASSA_NET);
2479 else if (IN_CLASSB(
addr.s_addr))
2480 pat->
mask.
addr4.s_addr = htonl(IN_CLASSB_NET);
2482 pat->
mask.
addr4.s_addr = htonl(IN_CLASSC_NET);
2492 newsort[*nsort] = *pat;
2493 *sortlist = newsort;
2511 if (ares_fpSystemFunction036)
2513 res = (*ares_fpSystemFunction036) (
key, key_data_len);
2518 #ifdef CARES_RANDOM_FILE
2519 FILE *
f = fopen(CARES_RANDOM_FILE,
"rb");
2521 setvbuf(
f, NULL, _IONBF, 0);
2536 unsigned char index1;
2537 unsigned char index2;
2538 unsigned char*
state;
2540 unsigned char *key_data_ptr = 0;
2545 memset(key_data_ptr, 0, key_data_len);
2558 index2 = (
unsigned char)((key_data_ptr[index1] +
state[
counter] +
2562 index1 = (
unsigned char)((index1 + 1) % key_data_len);
2570 channel->local_ip4 = local_ip;
2575 const unsigned char* local_ip6)
2582 const char* local_dev_name)
2584 strncpy(
channel->local_dev_name, local_dev_name,
2585 sizeof(
channel->local_dev_name));
2586 channel->local_dev_name[
sizeof(
channel->local_dev_name) - 1] = 0;
2643 server->tcp_connection_generation = ++
channel->tcp_connection_generation;
2644 server->tcp_lenbuf_pos = 0;
2645 server->tcp_buffer_pos = 0;
2646 server->tcp_buffer = NULL;