From ca12f40c8cf6473b0abd64e445e098e33a24a891 Mon Sep 17 00:00:00 2001 From: hater <7element@mail.bg> Date: Wed, 4 Nov 2015 11:46:18 +0200 Subject: [PATCH] Implement WSAEnumprotocolsA/W --- reactos/dll/win32/ws2_32_new/src/enumprot.c | 62 +++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/reactos/dll/win32/ws2_32_new/src/enumprot.c b/reactos/dll/win32/ws2_32_new/src/enumprot.c index bfa889a..6f8828f 100644 --- a/reactos/dll/win32/ws2_32_new/src/enumprot.c +++ b/reactos/dll/win32/ws2_32_new/src/enumprot.c @@ -10,7 +10,7 @@ #include -//#define NDEBUG +#define NDEBUG #include /* FUNCTIONS *****************************************************************/ @@ -188,7 +188,7 @@ WSCEnumProtocols(IN LPINT lpiProtocols, } /* - * @unimplemented + * @implemented */ INT WSAAPI @@ -196,14 +196,47 @@ WSAEnumProtocolsA(IN LPINT lpiProtocols, OUT LPWSAPROTOCOL_INFOA lpProtocolBuffer, IN OUT LPDWORD lpdwBufferLength) { - DPRINT("WSAEnumProtocolsA: %p\n", lpiProtocols); - UNIMPLEMENTED; - SetLastError(WSAEINVAL); - return SOCKET_ERROR; + INT error, i, count; + LPWSAPROTOCOL_INFOW protocolInfoW; + DWORD size; + DPRINT("WSAEnumProtocolsA: %p %p %p\n", lpiProtocols, lpProtocolBuffer, lpdwBufferLength); + if (!lpdwBufferLength) + { + SetLastError(WSAENOBUFS); + return SOCKET_ERROR; + } + count = WSCEnumProtocols(lpiProtocols, NULL, &size, &error); + if (!lpProtocolBuffer || *lpdwBufferLength < (size/sizeof(WSAPROTOCOL_INFOW))*sizeof(WSAPROTOCOL_INFOA)) + { + *lpdwBufferLength = (size/sizeof(WSAPROTOCOL_INFOW))*sizeof(WSAPROTOCOL_INFOA); + SetLastError(WSAENOBUFS); + return SOCKET_ERROR; + } + protocolInfoW = HeapAlloc(WsSockHeap, 0, size); + count = WSCEnumProtocols(lpiProtocols, protocolInfoW, &size, &error); + if (SOCKET_ERROR == count) + { + HeapFree(WsSockHeap, 0, protocolInfoW); + SetLastError(error); + return SOCKET_ERROR; + } + *lpdwBufferLength = 0; + for (i = 0; i < count; i++) + { + error = MapUnicodeProtocolInfoToAnsi(&protocolInfoW[i], &lpProtocolBuffer[i]); + if (error) + { + SetLastError(error); + return SOCKET_ERROR; + } + *lpdwBufferLength += sizeof(WSAPROTOCOL_INFOA); + } + HeapFree(WsSockHeap, 0, protocolInfoW); + return count; } /* - * @unimplemented + * @implemented */ INT WSAAPI @@ -211,14 +243,20 @@ WSAEnumProtocolsW(IN LPINT lpiProtocols, OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer, IN OUT LPDWORD lpdwBufferLength) { - DPRINT("WSAEnumProtocolsW: %p\n", lpiProtocols); - UNIMPLEMENTED; - SetLastError(WSAEINVAL); - return SOCKET_ERROR; + INT error, count; + DPRINT("WSAEnumProtocolsW: %p %p %p\n", lpiProtocols, lpProtocolBuffer, lpdwBufferLength); + count = WSCEnumProtocols(lpiProtocols, lpProtocolBuffer, lpdwBufferLength, &error); + if (SOCKET_ERROR == count) + { + SetLastError(error); + return SOCKET_ERROR; + } + return count; } + /* - * @unimplemented + * @implemented */ INT WSPAPI -- 1.9.5.msysgit.0