Support multiple address resolution in DNS requests

Add two new functions to the IP class that returns all addresses/aliases associated with a given address.

This is a cherry-pick merge from 010a3433df which was merged in 2.1, and has been updated to build with the latest code.

This merge adds two new methods IP.resolve_hostname_addresses and IP.get_resolve_item_addresses that returns a List of all addresses returned from the DNS request.
This commit is contained in:
Chuck 2021-05-24 16:27:50 +07:00
parent f3d931410b
commit 17ee8ff0d9
5 changed files with 118 additions and 47 deletions

View file

@ -89,7 +89,7 @@ static IP_Address _sockaddr2ip(struct sockaddr *p_addr) {
return ip;
};
IP_Address IP_Unix::_resolve_hostname(const String &p_hostname, Type p_type) {
void IP_Unix::_resolve_hostname(List<IP_Address> &r_addresses, const String &p_hostname, Type p_type) const {
struct addrinfo hints;
struct addrinfo *result;
@ -108,7 +108,7 @@ IP_Address IP_Unix::_resolve_hostname(const String &p_hostname, Type p_type) {
int s = getaddrinfo(p_hostname.utf8().get_data(), nullptr, &hints, &result);
if (s != 0) {
ERR_PRINT("getaddrinfo failed! Cannot resolve hostname.");
return IP_Address();
return;
};
if (result == nullptr || result->ai_addr == nullptr) {
@ -116,14 +116,24 @@ IP_Address IP_Unix::_resolve_hostname(const String &p_hostname, Type p_type) {
if (result) {
freeaddrinfo(result);
}
return IP_Address();
return;
};
IP_Address ip = _sockaddr2ip(result->ai_addr);
struct addrinfo *next = result;
do {
if (next->ai_addr == NULL) {
next = next->ai_next;
continue;
}
IP_Address ip = _sockaddr2ip(next->ai_addr);
if (!r_addresses.find(ip)) {
r_addresses.push_back(ip);
}
next = next->ai_next;
} while (next);
freeaddrinfo(result);
return ip;
}
#if defined(WINDOWS_ENABLED)