changeset 5588:866c497d9abd libavformat

Load the proper getaddrinfo functions from ws2_32.dll, if they're present. Patch by Martin Storsj <martin at martin dot st>.
author ramiro
date Mon, 25 Jan 2010 01:28:01 +0000
parents 0ab98b4a3778
children dca2836e09b8
files os_support.c
diffstat 1 files changed, 31 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/os_support.c	Sun Jan 24 22:07:32 2010 +0000
+++ b/os_support.c	Mon Jan 25 01:28:01 2010 +0000
@@ -68,6 +68,16 @@
     struct addrinfo *ai;
     struct sockaddr_in *sin;
 
+#if HAVE_WINSOCK2_H
+    int (WSAAPI *win_getaddrinfo)(const char *node, const char *service,
+                                  const struct addrinfo *hints,
+                                  struct addrinfo **res);
+    HMODULE ws2mod = GetModuleHandle("ws2_32.dll");
+    win_getaddrinfo = GetProcAddress(ws2mod, "getaddrinfo");
+    if (win_getaddrinfo)
+        return win_getaddrinfo(node, service, hints, res);
+#endif
+
     sin = av_mallocz(sizeof(struct sockaddr_in));
     if (!sin)
         return EAI_FAIL;
@@ -124,6 +134,17 @@
 
 void ff_freeaddrinfo(struct addrinfo *res)
 {
+#if HAVE_WINSOCK2_H
+    void (WSAAPI *win_freeaddrinfo)(struct addrinfo *res);
+    HMODULE ws2mod = GetModuleHandle("ws2_32.dll");
+    win_freeaddrinfo = (void (WSAAPI *)(struct addrinfo *res))
+                       GetProcAddress(ws2mod, "freeaddrinfo");
+    if (win_freeaddrinfo) {
+        win_freeaddrinfo(res);
+        return;
+    }
+#endif
+
     av_free(res->ai_canonname);
     av_free(res->ai_addr);
     av_free(res);
@@ -135,6 +156,16 @@
 {
     const struct sockaddr_in *sin = (const struct sockaddr_in *)sa;
 
+#if HAVE_WINSOCK2_H
+    int (WSAAPI *win_getnameinfo)(const struct sockaddr *sa, socklen_t salen,
+                                  char *host, DWORD hostlen,
+                                  char *serv, DWORD servlen, int flags);
+    HMODULE ws2mod = GetModuleHandle("ws2_32.dll");
+    win_getnameinfo = GetProcAddress(ws2mod, "getnameinfo");
+    if (win_getnameinfo)
+        return win_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
+#endif
+
     if (sa->sa_family != AF_INET)
         return EAI_FAMILY;
     if (!host && !serv)