changeset 5515:fa3115c9b043 libavformat

Use getaddrinfo(), if available, in resolve_host(). Patch by Martin Storsj <$firstname()$firstname,st>.
author rbultje
date Mon, 11 Jan 2010 17:14:16 +0000
parents 52c7b29eca31
children afe4a96b6832
files os_support.c
diffstat 1 files changed, 22 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/os_support.c	Mon Jan 11 05:51:09 2010 +0000
+++ b/os_support.c	Mon Jan 11 17:14:16 2010 +0000
@@ -63,13 +63,34 @@
 /* resolve host with also IP address parsing */
 int resolve_host(struct in_addr *sin_addr, const char *hostname)
 {
-    struct hostent *hp;
 
     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);
         if (!hp)
             return -1;
         memcpy(sin_addr, hp->h_addr_list[0], sizeof(struct in_addr));
+#endif
     }
     return 0;
 }