447
448
CFRelease(store);
449
450
#endif // TARGET_OS_IPHONE
451
/* If no specified servers, try a local named. */
452
if (channel->nservers == 0)
454
channel->servers = malloc(sizeof(struct server_state));
455
memset(channel->servers, '\0', sizeof(struct server_state));
458
channel->servers[0].family = AF_INET;
461
channel->servers[0].addr.s_addr = htonl(INADDR_LOOPBACK);
462
channel->servers[0].default_localhost_server = 1;
463
channel->nservers = 1;
454
#if defined(__ANDROID__)
455
static int init_by_defaults_andriod_nameservers(ares_channel channel)
457
int android_prop_found = 0;
458
char props_dns[2][PROP_VALUE_MAX];
459
char prop_name[PROP_NAME_MAX];
460
const char *prop_keys[2] = { "net.dns1", "net.dns2" };
463
for(i = 0; i < 2; i++)
465
props_dns[android_prop_found][0] = 0;
466
const prop_info *prop = __system_property_find(prop_keys[i]);
469
__system_property_read(prop, NULL, props_dns[android_prop_found]);
470
if(props_dns[android_prop_found][0] != 0)
471
android_prop_found++;
474
if(android_prop_found > 0)
476
channel->servers = malloc( (android_prop_found) * sizeof(struct server_state));
477
if (!channel->servers)
481
memset(channel->servers, '\0', android_prop_found * sizeof(struct server_state));
483
for(i = 0; i < android_prop_found; i++)
485
int rc = inet_pton(AF_INET, props_dns[i], &channel->servers[j].addr.s_addr);
489
channel->servers[j].family = AF_INET;
496
rc = inet_pton(AF_INET6, props_dns[i], &channel->servers[j].addr6.s_addr);
499
channel->servers[j].family = AF_INET6;
505
// how many really are valid IP addresses?
506
channel->nservers = j;
513
static int init_by_defaults_windows_nameservers_getadaptersaddresses(ares_channel channel)
515
DWORD (WINAPI * GetAdaptersAddressesProc)(ULONG, DWORD, VOID *, IP_ADAPTER_ADDRESSES *, ULONG *);
517
DWORD dwRet = ERROR_BUFFER_OVERFLOW;
520
IP_ADAPTER_ADDRESSES *pAdapterAddresses = 0;
521
int rc = ARES_ENOTFOUND;
525
hLib = LoadLibrary(TEXT("iphlpapi.dll"));
531
(void*)GetAdaptersAddressesProc = GetProcAddress(hLib, TEXT("GetAdaptersAddresses"));
532
if(!GetAdaptersAddressesProc)
538
// Allocate 15kb of buffer to avoid calling twice - recommended in MSDN
540
pAdapterAddresses = (IP_ADAPTER_ADDRESSES *) malloc(dwSize);
541
if(!pAdapterAddresses)
547
while(ERROR_BUFFER_OVERFLOW == (dwRet = GetAdaptersAddressesProc( AF_UNSPEC, 0, NULL, pAdapterAddresses, &dwSize )) && trys++ < 5)
549
pAdapterAddresses = (IP_ADAPTER_ADDRESSES *) realloc(pAdapterAddresses, dwSize);
550
if(!pAdapterAddresses)
562
// We have some data - process it
563
// We walk the data twice - the first time is to figure out how many DNS servers there are so that we can allocate
564
// the channel memory. Note: If there are duplicates we may end up allocating more memory than we use - but that is fine.
565
// The seconds walk through the data we add the actual DNS servers to the channel structure
566
while(++loopnum <= 2)
568
IP_ADAPTER_ADDRESSES * AI = NULL;
570
// If this is the 2nd lap through the loop we now know the amount of memory to allocate:
571
// enough for numreturned dns servers
580
channel->servers = malloc( (numreturned) * sizeof(struct server_state));
581
if (!channel->servers)
586
memset(channel->servers, '\0', numreturned * sizeof(struct server_state));
587
channel->nservers = 0;
590
// Process each adapter
591
for (AI = pAdapterAddresses; AI != NULL; AI = AI->Next)
593
PIP_ADAPTER_DNS_SERVER_ADDRESS dnsServers = AI->FirstDnsServerAddress;
595
if(AI->IfType == IF_TYPE_TUNNEL || AI->IfType == IF_TYPE_SOFTWARE_LOOPBACK)
597
// Don't process TUNNEL or LOOPBACK adapters
601
// Process each DNS server for the adapter
602
for (; dnsServers; dnsServers = dnsServers->Next)
604
// Safety check for null sockaddr - shouldn't happen
605
if (! dnsServers->Address.lpSockaddr)
610
if (dnsServers->Address.lpSockaddr->sa_family == AF_INET)
612
struct sockaddr_in *sa4 = (struct sockaddr_in *)dnsServers->Address.lpSockaddr;
613
if((sa4->sin_addr.S_un.S_addr != INADDR_ANY) && (sa4->sin_addr.S_un.S_addr != INADDR_NONE))
621
// add v4 server if it doesn't exist already
622
if (find_server(channel->servers, channel->nservers, sa4->sin_addr) == -1)
624
// printf( "ARES: %s\n", inet_ntop(sa4->sin_addr) );
626
channel->servers[ channel->nservers ].family = AF_INET;
628
channel->servers[channel->nservers].addr = sa4->sin_addr;
630
// Copy over physical address for use in ARES_FLAG_TRY_NEXT_SERVER_ON_RCODE3 mode
631
if (AI->PhysicalAddressLength <= sizeof(channel->servers[channel->nservers].physical_addr))
633
channel->servers[channel->nservers].physical_addr_len = AI->PhysicalAddressLength;
634
memcpy(channel->servers[channel->nservers].physical_addr, &AI->PhysicalAddress[0], AI->PhysicalAddressLength);
642
else if(dnsServers->Address.lpSockaddr->sa_family == AF_INET6)
644
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)dnsServers->Address.lpSockaddr;
645
if (memcmp(&sa6->sin6_addr, &in6addr_any, sizeof(sa6->sin6_addr)) != 0)
653
// add v6 server if it doesn't exist already
654
if (find_server6(channel->servers, channel->nservers, sa6->sin6_addr) == -1)
656
// printf( "ARES: %s\n", inet_ntop6(sa6->sin6_addr) );
657
channel->servers[ channel->nservers ].family = AF_INET6;
658
memcpy(&channel->servers[channel->nservers].addr6, &sa6->sin6_addr, sizeof(channel->servers[channel->nservers].addr6));
660
// Copy over physical address for use in ARES_FLAG_TRY_NEXT_SERVER_ON_RCODE3 mode
661
if (AI->PhysicalAddressLength <= sizeof(channel->servers[channel->nservers].physical_addr))
663
channel->servers[channel->nservers].physical_addr_len = AI->PhysicalAddressLength;
664
memcpy(channel->servers[channel->nservers].physical_addr, &AI->PhysicalAddress[0], AI->PhysicalAddressLength);
677
if (pAdapterAddresses)
679
free(pAdapterAddresses);
688
static int init_by_defaults_windows_nameservers_getnetworkparams(ares_channel channel)
691
* Way of getting nameservers that should work on all Windows from 98 / Server 2000 and on. Doesn't support IPv6 nameservers.
693
FIXED_INFO * FixedInfo = NULL;
694
ULONG ulOutBufLen = 0;
696
IP_ADDR_STRING * pIPAddr;
700
DWORD (WINAPI *GetNetworkParamsProc)(FIXED_INFO*, DWORD*);
702
hLib = LoadLibrary(TEXT("iphlpapi.dll"));
708
(void*)GetNetworkParamsProc = GetProcAddress(hLib, TEXT("GetNetworkParams"));
709
if(!GetNetworkParamsProc)
714
//printf("ARES: figuring out DNS servers\n");
715
while(ERROR_BUFFER_OVERFLOW == (dwRetVal = GetNetworkParamsProc( FixedInfo, &ulOutBufLen )) && trys++ < 5)
717
if(FixedInfo != NULL)
719
GlobalFree( FixedInfo );
721
FixedInfo = (FIXED_INFO *)GlobalAlloc( GPTR, ulOutBufLen );
725
//printf("ARES: couldn't get network params, dwRet=0x%x\n", dwRetVal);
726
if(FixedInfo != NULL)
728
GlobalFree( FixedInfo );
735
printf( "Host Name: %s\n", FixedInfo -> HostName );
736
printf( "Domain Name: %s\n", FixedInfo -> DomainName );
737
printf( "DNS Servers:\n" );
738
printf( "\t%s\n", FixedInfo -> DnsServerList.IpAddress.String );
741
// Count how many nameserver entries we have and allocate memory for them.
743
pIPAddr = &FixedInfo->DnsServerList;
744
while ( pIPAddr && strlen(pIPAddr->IpAddress.String) > 0)
747
pIPAddr = pIPAddr ->Next;
751
// printf("ARES: no nameservers! size=%d\n", ulOutBufLen);
755
// printf("ARES: num nameservers: %d, size=%d\n", num, ulOutBufLen);
759
channel->servers = malloc( (num) * sizeof(struct server_state));
760
if (!channel->servers)
762
GlobalFree( FixedInfo );
766
memset(channel->servers, '\0', num * sizeof(struct server_state));
768
channel->nservers = 0;
769
pIPAddr = &FixedInfo->DnsServerList;
770
while ( pIPAddr && strlen(pIPAddr->IpAddress.String) > 0)
773
addr.s_addr = inet_addr(pIPAddr->IpAddress.String);
774
// append unique only
775
if (find_server(channel->servers, channel->nservers, addr) == -1)
777
// printf( "ARES: %s\n", pIPAddr ->IpAddress.String );
779
channel->servers[ channel->nservers ].family = AF_INET;
781
channel->servers[channel->nservers].addr = addr;
785
pIPAddr = pIPAddr ->Next;
787
//printf("ARES: got all %d nameservers\n",num);
790
GlobalFree( FixedInfo );
468
797
static int init_by_defaults(ares_channel channel)
470
char hostname[MAXHOSTNAMELEN + 1];
472
if (channel->flags == -1)
474
if (channel->timeout == -1)
475
channel->timeout = DEFAULT_TIMEOUT;
476
if (channel->tries == -1)
477
channel->tries = DEFAULT_TRIES;
478
if (channel->ndots == -1)
480
if (channel->udp_port == -1)
481
channel->udp_port = htons(NAMESERVER_PORT);
482
if (channel->tcp_port == -1)
483
channel->tcp_port = htons(NAMESERVER_PORT);
485
if (channel->nservers == -1)
799
char hostname[MAXHOSTNAMELEN + 1];
801
if (channel->flags == -1)
803
if (channel->timeout == -1)
804
channel->timeout = DEFAULT_TIMEOUT;
805
if (channel->tries == -1)
806
channel->tries = DEFAULT_TRIES;
807
if (channel->ndots == -1)
809
if (channel->udp_port == -1)
810
channel->udp_port = htons(NAMESERVER_PORT);
811
if (channel->tcp_port == -1)
812
channel->tcp_port = htons(NAMESERVER_PORT);
814
if (channel->nservers == -1)
816
// OS Specific Inits for nameservers
489
* Way of getting nameservers that should work on all Windows from 98 on.
491
FIXED_INFO * FixedInfo = NULL;
492
ULONG ulOutBufLen = 0;
494
IP_ADDR_STRING * pIPAddr;
498
DWORD (WINAPI *GetNetworkParams)(FIXED_INFO*, DWORD*);
500
hLib = LoadLibrary(TEXT("iphlpapi.dll"));
506
(void*)GetNetworkParams = GetProcAddress(hLib, TEXT("GetNetworkParams"));
507
if(!GetNetworkParams)
512
//printf("ARES: figuring out DNS servers\n");
513
while(ERROR_BUFFER_OVERFLOW == (dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen )) && trys++ < 5)
515
if(FixedInfo != NULL)
517
GlobalFree( FixedInfo );
519
FixedInfo = (FIXED_INFO *)GlobalAlloc( GPTR, ulOutBufLen );
523
//printf("ARES: couldn't get network params, dwRet=0x%x\n", dwRetVal);
524
if(FixedInfo != NULL)
526
GlobalFree( FixedInfo );
534
printf( "Host Name: %s\n", FixedInfo -> HostName );
535
printf( "Domain Name: %s\n", FixedInfo -> DomainName );
536
printf( "DNS Servers:\n" );
537
printf( "\t%s\n", FixedInfo -> DnsServerList.IpAddress.String );
540
// Count how many nameserver entries we have and allocate memory for them.
542
pIPAddr = &FixedInfo->DnsServerList;
543
while ( pIPAddr && strlen(pIPAddr->IpAddress.String) > 0)
546
pIPAddr = pIPAddr ->Next;
550
// printf("ARES: no nameservers! size=%d\n", ulOutBufLen);
554
// printf("ARES: num nameservers: %d, size=%d\n", num, ulOutBufLen);
558
channel->servers = malloc( (num) * sizeof(struct server_state));
559
if (!channel->servers)
561
GlobalFree( FixedInfo );
565
memset(channel->servers, '\0', num * sizeof(struct server_state));
567
channel->nservers = 0;
568
pIPAddr = &FixedInfo->DnsServerList;
569
while ( pIPAddr && strlen(pIPAddr->IpAddress.String) > 0)
572
addr.s_addr = inet_addr(pIPAddr->IpAddress.String);
573
// append unique only
574
if (find_server(channel->servers, channel->nservers, addr) == -1)
576
// printf( "ARES: %s\n", pIPAddr ->IpAddress.String );
578
channel->servers[ channel->nservers ].family = AF_INET;
580
channel->servers[channel->nservers].addr = addr;
581
if ((channel->flags & ARES_FLAG_TRY_NEXT_SERVER_ON_RCODE3))
583
get_physical_address(channel->servers[channel->nservers].physical_addr,
584
MAX_ADAPTER_ADDRESS_LENGTH,
585
&channel->servers[channel->nservers].physical_addr_len,
591
pIPAddr = pIPAddr ->Next;
593
//printf("ARES: got all %d nameservers\n",num);
597
/* If no specified servers, try a local named. */
598
channel->servers = malloc(sizeof(struct server_state));
599
if (!channel->servers)
601
memset(channel->servers, '\0', sizeof(struct server_state));
604
channel->servers[0].family = AF_INET;
607
channel->servers[0].addr.s_addr = htonl(INADDR_LOOPBACK);
608
channel->servers[0].default_localhost_server = 1;
609
channel->nservers = 1;
612
GlobalFree( FixedInfo );
818
if(init_by_defaults_windows_nameservers_getadaptersaddresses(channel) == ARES_ENOMEM)
822
if (channel->nservers <= 0)
824
// If GetAdaptersAddresses approach didn't work then try GetNetworkParams (non IPv6 compatible)
825
if(init_by_defaults_windows_nameservers_getnetworkparams(channel) == ARES_ENOMEM)
615
830
#elif defined(__APPLE__) || defined(__MACH__)
616
init_by_defaults_systemconfiguration(channel);
831
init_by_defaults_apple_nameservers(channel);
617
832
#elif defined(__ANDROID__)
618
int android_prop_found = 0;
619
char props_dns[2][PROP_VALUE_MAX];
620
char prop_name[PROP_NAME_MAX];
621
const char *prop_keys[2] = { "net.dns1", "net.dns2" };
623
for(i = 0; i < 2; i++)
625
props_dns[android_prop_found][0] = 0;
626
const prop_info *prop = __system_property_find(prop_keys[i]);
629
__system_property_read(prop, NULL, props_dns[android_prop_found]);
630
if(props_dns[android_prop_found][0] != 0)
631
android_prop_found++;
634
if(android_prop_found > 0)
636
channel->servers = malloc( (android_prop_found) * sizeof(struct server_state));
637
if (!channel->servers)
641
memset(channel->servers, '\0', android_prop_found * sizeof(struct server_state));
643
for(i = 0; i < android_prop_found; i++)
645
int rc = inet_pton(AF_INET, props_dns[i], &channel->servers[j].addr.s_addr);
649
channel->servers[j].family = AF_INET;
656
rc = inet_pton(AF_INET6, props_dns[i], &channel->servers[j].addr6.s_addr);
659
channel->servers[j].family = AF_INET6;
665
// how many really are valid IP addresses?
666
channel->nservers = j;
669
/* If nobody specified servers, try a local named. */
670
channel->servers = malloc(sizeof(struct server_state));
671
if (!channel->servers)
673
memset(channel->servers, '\0', sizeof(struct server_state));
675
// need a way to test here if v4 or v6 is running
676
// if v4 is running...
677
channel->servers[0].addr.s_addr = htonl(INADDR_LOOPBACK);
678
channel->servers[0].default_localhost_server = 1;
680
channel->servers[0].family = AF_INET;
682
// if v6 is running...
683
// channel->servers[0].addr6.s_addr = htonl6(IN6ADDR_LOOPBACK_INIT);
685
// channel->servers[0].family = AF_INET6;
688
// hard to decide if there is one server or two here
689
channel->nservers = 1;
694
if (channel->ndomains == -1)
833
if(init_by_defaults_andriod_nameservers(channel) == ARES_ENOMEM)
839
/* If no specified servers, try a local named. */
840
if (channel->nservers <= 0)
842
channel->servers = malloc(sizeof(struct server_state));
843
if (!channel->servers)
845
memset(channel->servers, '\0', sizeof(struct server_state));
848
channel->servers[0].family = AF_INET;
851
channel->servers[0].addr.s_addr = htonl(INADDR_LOOPBACK);
852
channel->servers[0].default_localhost_server = 1;
853
channel->nservers = 1;
855
// if v6 is running...
856
// channel->servers[0].family = AF_INET6;
857
// channel->servers[0].addr6.s_addr = htonl6(IN6ADDR_LOOPBACK_INIT);
858
// hard to decide if there is one server or two here
862
if (channel->ndomains == -1)
696
864
/* Derive a default domain search list from the kernel hostname,
697
* or set it to empty if the hostname isn't helpful.
699
if (gethostname(hostname, sizeof(hostname)) == -1
700
|| !strchr(hostname, '.'))
702
channel->domains = 0; // malloc(0);
703
channel->ndomains = 0;
865
* or set it to empty if the hostname isn't helpful.
867
if (gethostname(hostname, sizeof(hostname)) == -1 || !strchr(hostname, '.'))
869
channel->domains = 0; // malloc(0);
870
channel->ndomains = 0;
707
channel->domains = malloc(sizeof(char *));
708
if (!channel->domains)
710
channel->ndomains = 0;
711
channel->domains[0] = strdup(strchr(hostname, '.') + 1);
712
if (!channel->domains[0])
714
channel->ndomains = 1;
874
channel->domains = malloc(sizeof(char *));
875
if (!channel->domains)
877
channel->ndomains = 0;
878
channel->domains[0] = strdup(strchr(hostname, '.') + 1);
879
if (!channel->domains[0])
881
channel->ndomains = 1;
718
if (channel->nsort == -1)
885
if (channel->nsort == -1)
720
887
channel->sortlist = NULL;
721
888
channel->nsort = 0;
724
if (!channel->lookups)
891
if (!channel->lookups)
726
893
channel->lookups = strdup("bf");
727
894
if (!channel->lookups)
734
901
static int config_domain(ares_channel channel, char *str)
998
1165
static int find_server(struct server_state *servers, int nservers, struct in_addr addr)
1005
for (; i < nservers; i++)
1174
for (; i < nservers; i++)
1007
1176
if (servers[i].addr.s_addr == addr.s_addr)
1010
return (i < nservers ? i : -1);
1181
return (i < nservers ? i : -1);
1014
* V4. Get the physical address of the first NIC whose list of DNS servers contain 'addr'.
1015
* return: ARES_SUCCESS, etc.
1186
* Finds a V6 addr in list of servers.
1188
* index i of servers whose servers[i].addr6 == addr
1189
* else -1, failed to find
1017
static int get_physical_address(char *physicalAddr, int physicalAddrBufSz, int* physAddrLen, struct in_addr addr)
1191
static int find_server6(struct server_state *servers, int nservers, struct in6_addr addr)
1020
DWORD (WINAPI * GetAdaptersAddressesProc)(ULONG, DWORD, VOID *, IP_ADAPTER_ADDRESSES *, ULONG *);
1022
DWORD dwRet = ERROR_BUFFER_OVERFLOW;
1024
IP_ADAPTER_ADDRESSES *pAdapterAddresses = 0;
1025
int rc = ARES_ENOTFOUND;
1027
memset(physicalAddr, '\0', physicalAddrBufSz);
1030
hLib = LoadLibrary(TEXT("iphlpapi.dll"));
1032
return ARES_ENOTIMP;
1034
(void*)GetAdaptersAddressesProc = GetProcAddress(hLib, TEXT("GetAdaptersAddresses"));
1035
if(!GetAdaptersAddressesProc)
1041
// Getting buffer size, expects overflow error
1042
dwRet = (*GetAdaptersAddressesProc)(AF_UNSPEC, 0, NULL, NULL, &dwSize);
1043
assert(dwRet == ERROR_BUFFER_OVERFLOW);
1044
if (dwRet == ERROR_BUFFER_OVERFLOW)
1046
pAdapterAddresses = (IP_ADAPTER_ADDRESSES *) LocalAlloc(LMEM_ZEROINIT, dwSize);
1047
if (! pAdapterAddresses)
1055
//printf("ARES: couldn't get adapters addresses, dwRet=0x%x\n", dwRet);
1060
dwRet = (*GetAdaptersAddressesProc)(AF_UNSPEC, 0, NULL, pAdapterAddresses, &dwSize);
1061
if (dwRet != ERROR_SUCCESS)
1063
//printf("ARES: couldn't get adapters addresses (2), dwRet=0x%x\n", dwRet);
1069
IP_ADAPTER_ADDRESSES * AI = NULL;
1070
for (AI = pAdapterAddresses; AI != NULL; AI = AI->Next)
1072
PIP_ADAPTER_DNS_SERVER_ADDRESS dnsServers = AI->FirstDnsServerAddress;
1073
// find 'addr' in adapter's list of dns servers.
1074
for (; dnsServers; dnsServers = dnsServers->Next)
1200
for (; i < nservers; i++)
1202
if (memcmp(&servers[i].addr6, &addr, sizeof(addr)) == 0)
1076
if (! dnsServers->Address.lpSockaddr)
1079
if (dnsServers->Address.lpSockaddr->sa_family == AF_INET)
1081
struct sockaddr_in sockAddr = *(struct sockaddr_in*)(dnsServers->Address.lpSockaddr);
1082
if (memcmp(&addr, &sockAddr.sin_addr.s_addr, sizeof(struct in_addr)) == 0)
1084
*physAddrLen = AI->PhysicalAddressLength;
1085
if (*physAddrLen > physicalAddrBufSz)
1086
*physAddrLen = physicalAddrBufSz;
1087
memcpy(physicalAddr, &AI->PhysicalAddress[0], *physAddrLen);
1095
rc = ARES_ENOTFOUND;
1100
if (pAdapterAddresses)
1101
LocalFree(pAdapterAddresses);
1104
return ARES_ENOTIMP;
1207
return (i < nservers ? i : -1);
1109
1211
#define NS_INT16SZ 2
1110
1212
#define NS_INADDRSZ 4