Jacek Caban : ws2_32: Return ADDRINFOEXW type from WS_getaddrinfoW.
Alexandre Julliard
julliard at winehq.org
Wed Aug 2 15:31:59 CDT 2017
Module: wine
Branch: master
Commit: 037e6010dac62a6d5cb419aac47d5b8df1ce7da4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=037e6010dac62a6d5cb419aac47d5b8df1ce7da4
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Aug 1 18:29:35 2017 +0200
ws2_32: Return ADDRINFOEXW type from WS_getaddrinfoW.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ws2_32/socket.c | 35 ++++++++++++++++++++++++++---------
1 file changed, 26 insertions(+), 9 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 71241c6..37931a5 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -6733,11 +6733,11 @@ outofmem:
#endif
}
-static struct WS_addrinfoW *addrinfo_AtoW(const struct WS_addrinfo *ai)
+static ADDRINFOEXW *addrinfo_AtoW(const struct WS_addrinfo *ai)
{
- struct WS_addrinfoW *ret;
+ ADDRINFOEXW *ret;
- if (!(ret = HeapAlloc(GetProcessHeap(), 0, sizeof(struct WS_addrinfoW)))) return NULL;
+ if (!(ret = HeapAlloc(GetProcessHeap(), 0, sizeof(ADDRINFOEXW)))) return NULL;
ret->ai_flags = ai->ai_flags;
ret->ai_family = ai->ai_family;
ret->ai_socktype = ai->ai_socktype;
@@ -6745,6 +6745,9 @@ static struct WS_addrinfoW *addrinfo_AtoW(const struct WS_addrinfo *ai)
ret->ai_addrlen = ai->ai_addrlen;
ret->ai_canonname = NULL;
ret->ai_addr = NULL;
+ ret->ai_blob = NULL;
+ ret->ai_bloblen = 0;
+ ret->ai_provider = NULL;
ret->ai_next = NULL;
if (ai->ai_canonname)
{
@@ -6769,16 +6772,16 @@ static struct WS_addrinfoW *addrinfo_AtoW(const struct WS_addrinfo *ai)
return ret;
}
-static struct WS_addrinfoW *addrinfo_list_AtoW(const struct WS_addrinfo *info)
+static ADDRINFOEXW *addrinfo_list_AtoW(const struct WS_addrinfo *info)
{
- struct WS_addrinfoW *ret, *infoW;
+ ADDRINFOEXW *ret, *infoW;
if (!(ret = infoW = addrinfo_AtoW(info))) return NULL;
while (info->ai_next)
{
if (!(infoW->ai_next = addrinfo_AtoW(info->ai_next)))
{
- FreeAddrInfoW(ret);
+ FreeAddrInfoExW(ret);
return NULL;
}
infoW = infoW->ai_next;
@@ -6823,7 +6826,7 @@ static struct WS_addrinfo *addrinfo_WtoA(const struct WS_addrinfoW *ai)
return ret;
}
-static int WS_getaddrinfoW(const WCHAR *nodename, const WCHAR *servname, const struct WS_addrinfo *hints, PADDRINFOW *res)
+static int WS_getaddrinfoW(const WCHAR *nodename, const WCHAR *servname, const struct WS_addrinfo *hints, ADDRINFOEXW **res)
{
int ret = EAI_MEMORY, len, i;
char *nodenameA = NULL, *servnameA = NULL;
@@ -6927,15 +6930,29 @@ int WINAPI GetAddrInfoExCancel(HANDLE *handle)
int WINAPI GetAddrInfoW(LPCWSTR nodename, LPCWSTR servname, const ADDRINFOW *hints, PADDRINFOW *res)
{
struct WS_addrinfo *hintsA = NULL;
+ ADDRINFOEXW *resex;
int ret = EAI_MEMORY;
TRACE("nodename %s, servname %s, hints %p, result %p\n",
debugstr_w(nodename), debugstr_w(servname), hints, res);
+ *res = NULL;
if (hints) hintsA = addrinfo_WtoA(hints);
- ret = WS_getaddrinfoW(nodename, servname, hintsA, res);
+ ret = WS_getaddrinfoW(nodename, servname, hintsA, &resex);
WS_freeaddrinfo(hintsA);
- return ret;
+ if (ret) return ret;
+
+ if (resex)
+ {
+ /* ADDRINFOEXW has layout compatible with ADDRINFOW except for ai_next field,
+ * so we may convert it in place */
+ *res = (ADDRINFOW*)resex;
+ do {
+ ((ADDRINFOW*)resex)->ai_next = (ADDRINFOW*)resex->ai_next;
+ resex = resex->ai_next;
+ } while (resex);
+ }
+ return 0;
}
/***********************************************************************
More information about the wine-cvs
mailing list