Module: wine Branch: master Commit: 5fa343047f187d9a3733d460277be541f70f53de URL: http://source.winehq.org/git/wine.git/?a=commit;h=5fa343047f187d9a3733d46027...
Author: Bruno Jesus 00cpxxx@gmail.com Date: Wed Aug 7 00:18:17 2013 -0300
ws2_32: Implement WSAEnumProtocols[A|W] using a helper function.
---
dlls/ws2_32/protocol.c | 61 ++++++++++++++++++++++------------------------- 1 files changed, 29 insertions(+), 32 deletions(-)
diff --git a/dlls/ws2_32/protocol.c b/dlls/ws2_32/protocol.c index 98e7c38..c039e7c 100644 --- a/dlls/ws2_32/protocol.c +++ b/dlls/ws2_32/protocol.c @@ -204,22 +204,23 @@ static INT WINSOCK_EnterSingleProtocolA( INT protocol, WSAPROTOCOL_INFOA* info ) return ret; }
-/***************************************************************************** - * WSAEnumProtocolsA [WS2_32.@] - * - * see function WSAEnumProtocolsW - */ -INT WINAPI WSAEnumProtocolsA( LPINT protocols, LPWSAPROTOCOL_INFOA buffer, LPDWORD len ) +static INT WINSOCK_EnumProtocols( BOOL unicode, LPINT protocols, LPWSAPROTOCOL_INFOW buffer, LPDWORD len ) { INT i = 0; DWORD size = 0; INT local[] = { WS_IPPROTO_TCP, WS_IPPROTO_UDP, NSPROTO_IPX, NSPROTO_SPX, NSPROTO_SPXII, 0 }; + union _info + { + LPWSAPROTOCOL_INFOA a; + LPWSAPROTOCOL_INFOW w; + } info; + info.w = buffer;
if (!protocols) protocols = local;
while (protocols[i]) i++;
- size = i * sizeof(WSAPROTOCOL_INFOA); + size = i * (unicode ? sizeof(WSAPROTOCOL_INFOW) : sizeof(WSAPROTOCOL_INFOA));
if (*len < size || !buffer) { @@ -230,13 +231,31 @@ INT WINAPI WSAEnumProtocolsA( LPINT protocols, LPWSAPROTOCOL_INFOA buffer, LPDWO
for (i = 0; protocols[i]; i++) { - if (WINSOCK_EnterSingleProtocolA( protocols[i], &buffer[i] ) == SOCKET_ERROR) - return i; + if (unicode) + { + if (WINSOCK_EnterSingleProtocolW( protocols[i], &info.w[i] ) == SOCKET_ERROR) + break; + } + else + { + if (WINSOCK_EnterSingleProtocolA( protocols[i], &info.a[i] ) == SOCKET_ERROR) + break; + } } return i; }
/***************************************************************************** + * WSAEnumProtocolsA [WS2_32.@] + * + * see function WSAEnumProtocolsW + */ +INT WINAPI WSAEnumProtocolsA( LPINT protocols, LPWSAPROTOCOL_INFOA buffer, LPDWORD len ) +{ + return WINSOCK_EnumProtocols( FALSE, protocols, (LPWSAPROTOCOL_INFOW) buffer, len); +} + +/***************************************************************************** * WSAEnumProtocolsW [WS2_32.@] * * Retrieves information about specified set of active network protocols. @@ -275,29 +294,7 @@ INT WINAPI WSAEnumProtocolsA( LPINT protocols, LPWSAPROTOCOL_INFOA buffer, LPDWO */ INT WINAPI WSAEnumProtocolsW( LPINT protocols, LPWSAPROTOCOL_INFOW buffer, LPDWORD len ) { - INT i = 0; - DWORD size = 0; - INT local[] = { WS_IPPROTO_TCP, WS_IPPROTO_UDP, NSPROTO_IPX, NSPROTO_SPX, NSPROTO_SPXII, 0 }; - - if (!protocols) protocols = local; - - while (protocols[i]) i++; - - size = i * sizeof(WSAPROTOCOL_INFOW); - - if (*len < size || !buffer) - { - *len = size; - WSASetLastError(WSAENOBUFS); - return SOCKET_ERROR; - } - - for (i = 0; protocols[i]; i++) - { - if (WINSOCK_EnterSingleProtocolW( protocols[i], &buffer[i] ) == SOCKET_ERROR) - return i; - } - return i; + return WINSOCK_EnumProtocols( TRUE, protocols, buffer, len); }
/*****************************************************************************