From: Vijay Kiran Kamuju Subject: [PATCH V2] ws2_32: Implement GetHostNameW() function Message-Id: Date: Mon, 1 Jun 2020 14:57:09 +0200 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49286 Signed-off-by: Vijay Kiran Kamuju From 287840869c9fa3ad10c7c1b1295ede70089aebba Mon Sep 17 00:00:00 2001 From: Vijay Kiran Kamuju Date: Mon, 1 Jun 2020 14:12:49 +0200 Subject: [PATCH V2] ws2_32: Implement GetHostNameW() function Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49286 Signed-off-by: Vijay Kiran Kamuju --- dlls/ws2_32/socket.c | 27 ++++++++++++++++++++++++++- dlls/ws2_32/tests/sock.c | 36 ++++++++++++++++++++++++++++++++++++ dlls/ws2_32/ws2_32.spec | 1 + include/winsock2.h | 2 ++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 199b7187a8..48e431e1ac 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -7339,7 +7339,6 @@ struct WS_servent* WINAPI WS_getservbyport(int port, const char *proto) return retval; } - /*********************************************************************** * gethostname (WS2_32.57) */ @@ -7376,6 +7375,32 @@ int WINAPI WS_gethostname(char *name, int namelen) return 0; } +int WINAPI GetHostNameW(PWSTR name, int namelen) +{ + char *nameA; + int ret; + + TRACE("name %p, len %d\n", name, namelen); + + if (!name) + { + SetLastError(WSAEFAULT); + return SOCKET_ERROR; + } + + if (!(nameA = HeapAlloc(GetProcessHeap(), 0, namelen))) + { + SetLastError(WSAEFAULT); + return WSA_NOT_ENOUGH_MEMORY; + } + + ret = WS_gethostname(nameA, namelen); + if (!ret) + MultiByteToWideChar(CP_ACP, 0, nameA, -1, name, namelen); + + HeapFree(GetProcessHeap(), 0, nameA); + return ret; +} /* ------------------------------------- Windows sockets extensions -- * * * diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index d9ceca98cc..8c8ec569a4 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -75,6 +75,7 @@ static int (WINAPI *pGetAddrInfoExW)(const WCHAR *name, const WCHAR *servname, struct timeval *timeout, OVERLAPPED *overlapped, LPLOOKUPSERVICE_COMPLETION_ROUTINE completion_routine, HANDLE *handle); static int (WINAPI *pGetAddrInfoExOverlappedResult)(OVERLAPPED *overlapped); +static int (WINAPI *pGetHostNameW)(PWSTR,int); static PCSTR (WINAPI *pInetNtop)(INT,LPVOID,LPSTR,ULONG); static PCWSTR(WINAPI *pInetNtopW)(INT,LPVOID,LPWSTR,ULONG); static int (WINAPI *pInetPtonA)(INT,LPCSTR,LPVOID); @@ -1292,6 +1293,7 @@ static void Init (void) pGetAddrInfoW = (void *)GetProcAddress(hws2_32, "GetAddrInfoW"); pGetAddrInfoExW = (void *)GetProcAddress(hws2_32, "GetAddrInfoExW"); pGetAddrInfoExOverlappedResult = (void *)GetProcAddress(hws2_32, "GetAddrInfoExOverlappedResult"); + pGetHostNameW = (void *)GetProcAddress(hws2_32, "GetHostNameW"); pInetNtop = (void *)GetProcAddress(hws2_32, "inet_ntop"); pInetNtopW = (void *)GetProcAddress(hws2_32, "InetNtopW"); pInetPtonA = (void *)GetProcAddress(hws2_32, "inet_pton"); @@ -4565,6 +4567,7 @@ static void test_gethostname(void) { struct hostent *he; char name[256]; + WCHAR nameW[256]; int ret, len; WSASetLastError(0xdeadbeef); @@ -4592,6 +4595,39 @@ static void test_gethostname(void) ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError()); he = gethostbyname(name); ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError()); + + if (!pGetHostNameW) + { + win_skip("GetHostNameW is not found, skipping tests\n"); + return; + } + + WSASetLastError(0xdeadbeef); + ret = pGetHostNameW(NULL, 256); + ok(ret == -1, "GetHostNameW() returned %d\n", ret); + ok(WSAGetLastError() == WSAEFAULT, "GetHostNameW with null buffer " + "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT); + + ret = pGetHostNameW(nameW, sizeof(nameW)); + ok(ret == 0, "GetHostNameW() call failed: %d\n", WSAGetLastError()); + WideCharToMultiByte(CP_ACP, 0, nameW, -1, name, sizeof(name), NULL, NULL); + he = gethostbyname(name); + ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, WSAGetLastError()); + + len = strlen(name); + WSASetLastError(0xdeadbeef); + lstrcpyW(nameW, L"deadbeef"); + ret = pGetHostNameW(nameW, len); + ok(ret == -1, "GetHostNameW() returned %d\n", ret); + ok(!lstrcmpW(nameW, L"deadbeef"), "name changed unexpected!\n"); + ok(WSAGetLastError() == WSAEFAULT, "gethostname with insufficient length " + "failed with %d, expected %d\n", WSAGetLastError(), WSAEFAULT); + + len++; + ret = pGetHostNameW(nameW, len); + ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError()); + WideCharToMultiByte(CP_ACP, 0, nameW, -1, name, sizeof(name), NULL, NULL); + he = gethostbyname(name); } static void test_inet_addr(void) diff --git a/dlls/ws2_32/ws2_32.spec b/dlls/ws2_32/ws2_32.spec index d3c1e6214a..a06e2b0c68 100644 --- a/dlls/ws2_32/ws2_32.spec +++ b/dlls/ws2_32/ws2_32.spec @@ -57,6 +57,7 @@ @ stdcall GetAddrInfoExW(wstr wstr long ptr ptr ptr ptr ptr ptr ptr) @ stdcall GetAddrInfoW(wstr wstr ptr ptr) @ stdcall GetNameInfoW(ptr long ptr long ptr long long) +@ stdcall GetHostNameW(ptr long) @ stdcall InetNtopW(long ptr ptr long) @ stdcall InetPtonW(long wstr ptr) @ stdcall WSApSetPostRoutine(ptr) diff --git a/include/winsock2.h b/include/winsock2.h index e8d033976f..db6306052b 100644 --- a/include/winsock2.h +++ b/include/winsock2.h @@ -695,6 +695,7 @@ typedef SOCKET (WINAPI *LPFN_SOCKET)(int,int,int); * "Winsock2 Function Typedefs" section below. */ #if WS_API_PROTOTYPES +int WINAPI GetHostNameW(PWSTR,int); SOCKET WINAPI WSAAccept(SOCKET,struct WS(sockaddr)*,LPINT,LPCONDITIONPROC,DWORD_PTR); INT WINAPI WSAAddressToStringA(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOA,LPSTR,LPDWORD); INT WINAPI WSAAddressToStringW(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOW,LPWSTR,LPDWORD); @@ -770,6 +771,7 @@ DWORD WINAPI WSAWaitForMultipleEvents(DWORD,const WSAEVENT*,BOOL,DWORD,BOOL); * "Winsock2 Prototypes" section above. */ #if WS_API_TYPEDEFS +typedef int (WINAPI *LPFN_GETHOSTNAMEW)(PWSTR,int); typedef SOCKET (WINAPI *LPFN_WSAACCEPT)(SOCKET,struct WS(sockaddr)*,LPINT,LPCONDITIONPROC,DWORD_PTR); typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGA)(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOA,LPSTR,LPDWORD); typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGW)(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOW,LPWSTR,LPDWORD); -- 2.26.2