nameserv: avoid unnecessary getaddrinfo() calls
Check if the name passed to DNS_Name2IPAddress() is an IP address before calling getaddrinfo(), which can be much slower and work differently on different systems.
This commit is contained in:
parent
10c760a80c
commit
579d8c9907
1 changed files with 13 additions and 3 deletions
16
nameserv.c
16
nameserv.c
|
@ -52,9 +52,22 @@ DNS_Name2IPAddress(const char *name, IPAddr *ip_addrs, int max_addrs)
|
||||||
{
|
{
|
||||||
struct addrinfo hints, *res, *ai;
|
struct addrinfo hints, *res, *ai;
|
||||||
int i, result;
|
int i, result;
|
||||||
|
IPAddr ip;
|
||||||
|
|
||||||
max_addrs = MIN(max_addrs, DNS_MAX_ADDRESSES);
|
max_addrs = MIN(max_addrs, DNS_MAX_ADDRESSES);
|
||||||
|
|
||||||
|
for (i = 0; i < max_addrs; i++)
|
||||||
|
ip_addrs[i].family = IPADDR_UNSPEC;
|
||||||
|
|
||||||
|
/* Avoid calling getaddrinfo() if the name is an IP address */
|
||||||
|
if (UTI_StringToIP(name, &ip)) {
|
||||||
|
if (address_family != IPADDR_UNSPEC && ip.family != address_family)
|
||||||
|
return DNS_Failure;
|
||||||
|
if (max_addrs >= 1)
|
||||||
|
ip_addrs[0] = ip;
|
||||||
|
return DNS_Success;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&hints, 0, sizeof (hints));
|
memset(&hints, 0, sizeof (hints));
|
||||||
|
|
||||||
switch (address_family) {
|
switch (address_family) {
|
||||||
|
@ -106,9 +119,6 @@ DNS_Name2IPAddress(const char *name, IPAddr *ip_addrs, int max_addrs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; i < max_addrs; i++)
|
|
||||||
ip_addrs[i].family = IPADDR_UNSPEC;
|
|
||||||
|
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
|
|
||||||
return !max_addrs || ip_addrs[0].family != IPADDR_UNSPEC ? DNS_Success : DNS_Failure;
|
return !max_addrs || ip_addrs[0].family != IPADDR_UNSPEC ? DNS_Success : DNS_Failure;
|
||||||
|
|
Loading…
Reference in a new issue