From 6023d84a2b7aa6d5f02de91541c514c36e553de0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin@martin.st>
Date: Mon, 25 Jan 2010 01:28:01 +0000
Subject: [PATCH] Load the proper getaddrinfo functions from ws2_32.dll, if
 they're present.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Patch by Martin Storsjö <martin at martin dot st>.

Originally committed as revision 21443 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavformat/os_support.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/libavformat/os_support.c b/libavformat/os_support.c
index 120f23469fa..58215ec1986 100644
--- a/libavformat/os_support.c
+++ b/libavformat/os_support.c
@@ -68,6 +68,16 @@ int ff_getaddrinfo(const char *node, const char *service,
     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 @@ int ff_getaddrinfo(const char *node, const char *service,
 
 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 @@ int ff_getnameinfo(const struct sockaddr *sa, int salen,
 {
     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)
-- 
GitLab