Use getaddrinfo(), if available, in resolve_host(). Patch by Martin
Storsjö <$firstname()$firstname,st>. Originally committed as revision 21143 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@@ -63,13 +63,34 @@ int inet_aton (const char * str, struct in_addr * add)
|
|||||||
/* resolve host with also IP address parsing */
|
/* resolve host with also IP address parsing */
|
||||||
int resolve_host(struct in_addr *sin_addr, const char *hostname)
|
int resolve_host(struct in_addr *sin_addr, const char *hostname)
|
||||||
{
|
{
|
||||||
struct hostent *hp;
|
|
||||||
|
|
||||||
if (!inet_aton(hostname, sin_addr)) {
|
if (!inet_aton(hostname, sin_addr)) {
|
||||||
|
#if HAVE_GETADDRINFO
|
||||||
|
struct addrinfo *ai, *cur;
|
||||||
|
struct addrinfo hints;
|
||||||
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_family = AF_INET;
|
||||||
|
if (getaddrinfo(hostname, NULL, &hints, &ai))
|
||||||
|
return -1;
|
||||||
|
/* getaddrinfo returns a linked list of addrinfo structs.
|
||||||
|
* Even if we set ai_family = AF_INET above, make sure
|
||||||
|
* that the returned one actually is of the correct type. */
|
||||||
|
for (cur = ai; cur; cur = cur->ai_next) {
|
||||||
|
if (cur->ai_family == AF_INET) {
|
||||||
|
*sin_addr = ((struct sockaddr_in *)cur->ai_addr)->sin_addr;
|
||||||
|
freeaddrinfo(ai);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
freeaddrinfo(ai);
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
struct hostent *hp;
|
||||||
hp = gethostbyname(hostname);
|
hp = gethostbyname(hostname);
|
||||||
if (!hp)
|
if (!hp)
|
||||||
return -1;
|
return -1;
|
||||||
memcpy(sin_addr, hp->h_addr_list[0], sizeof(struct in_addr));
|
memcpy(sin_addr, hp->h_addr_list[0], sizeof(struct in_addr));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user