wsock32: Make EnumProtocols a wrapper around WSAEnumProtocols instead of forwarding directly.
This commit is contained in:
parent
59dde0d9a7
commit
bc5dd3022a
|
@ -2,6 +2,7 @@
|
||||||
* WSOCK32 specific functions
|
* WSOCK32 specific functions
|
||||||
*
|
*
|
||||||
* Copyright (C) 2001 Stefan Leichter
|
* Copyright (C) 2001 Stefan Leichter
|
||||||
|
* Copyright (C) 2008 Hans Leidekker
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -36,9 +37,13 @@
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winsock2.h"
|
#include "winsock2.h"
|
||||||
|
#include "nspapi.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
#include "wine/unicode.h"
|
#include "wine/unicode.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(winsock);
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* inet_network [WSOCK32.1100]
|
* inet_network [WSOCK32.1100]
|
||||||
*/
|
*/
|
||||||
|
@ -62,3 +67,131 @@ struct netent * WINAPI WSOCK32_getnetbyname(const char *name)
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DWORD map_service(DWORD wsaflags)
|
||||||
|
{
|
||||||
|
DWORD flags = 0;
|
||||||
|
|
||||||
|
if (wsaflags & XP1_CONNECTIONLESS) flags |= XP_CONNECTIONLESS;
|
||||||
|
if (wsaflags & XP1_GUARANTEED_DELIVERY) flags |= XP_GUARANTEED_DELIVERY;
|
||||||
|
if (wsaflags & XP1_GUARANTEED_ORDER) flags |= XP_GUARANTEED_ORDER;
|
||||||
|
if (wsaflags & XP1_MESSAGE_ORIENTED) flags |= XP_MESSAGE_ORIENTED;
|
||||||
|
if (wsaflags & XP1_PSEUDO_STREAM) flags |= XP_PSEUDO_STREAM;
|
||||||
|
if (wsaflags & XP1_GRACEFUL_CLOSE) flags |= XP_GRACEFUL_CLOSE;
|
||||||
|
if (wsaflags & XP1_EXPEDITED_DATA) flags |= XP_EXPEDITED_DATA;
|
||||||
|
if (wsaflags & XP1_CONNECT_DATA) flags |= XP_CONNECT_DATA;
|
||||||
|
if (wsaflags & XP1_DISCONNECT_DATA) flags |= XP_DISCONNECT_DATA;
|
||||||
|
if (wsaflags & XP1_SUPPORT_BROADCAST) flags |= XP_SUPPORTS_BROADCAST;
|
||||||
|
if (wsaflags & XP1_SUPPORT_MULTIPOINT) flags |= XP_SUPPORTS_MULTICAST;
|
||||||
|
if (wsaflags & XP1_QOS_SUPPORTED) flags |= XP_BANDWITH_ALLOCATION;
|
||||||
|
if (wsaflags & XP1_PARTIAL_MESSAGE) flags |= XP_FRAGMENTATION;
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* EnumProtocolsA [WSOCK32.1111]
|
||||||
|
*/
|
||||||
|
INT WINAPI EnumProtocolsA(LPINT protocols, LPVOID buffer, LPDWORD buflen)
|
||||||
|
{
|
||||||
|
INT ret;
|
||||||
|
DWORD size, string_size = WSAPROTOCOL_LEN + 1;
|
||||||
|
|
||||||
|
TRACE("%p, %p, %p\n", protocols, buffer, buflen);
|
||||||
|
|
||||||
|
if (!buflen) return SOCKET_ERROR;
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
ret = WSAEnumProtocolsA(protocols, NULL, &size);
|
||||||
|
|
||||||
|
if (ret == SOCKET_ERROR && WSAGetLastError() == WSAENOBUFS)
|
||||||
|
{
|
||||||
|
DWORD num_protocols = size / sizeof(WSAPROTOCOL_INFOA);
|
||||||
|
if (*buflen < num_protocols * (sizeof(PROTOCOL_INFOA) + string_size))
|
||||||
|
{
|
||||||
|
*buflen = num_protocols * (sizeof(PROTOCOL_INFOA) + string_size);
|
||||||
|
return SOCKET_ERROR;
|
||||||
|
}
|
||||||
|
if (buffer)
|
||||||
|
{
|
||||||
|
WSAPROTOCOL_INFOA *wsabuf;
|
||||||
|
PROTOCOL_INFOA *pi = buffer;
|
||||||
|
unsigned int i, string_offset;
|
||||||
|
|
||||||
|
if (!(wsabuf = HeapAlloc(GetProcessHeap(), 0, size))) return SOCKET_ERROR;
|
||||||
|
|
||||||
|
ret = WSAEnumProtocolsA(protocols, wsabuf, &size);
|
||||||
|
string_offset = ret * sizeof(PROTOCOL_INFOA);
|
||||||
|
|
||||||
|
for (i = 0; i < ret; i++)
|
||||||
|
{
|
||||||
|
pi[i].dwServiceFlags = map_service(wsabuf[i].dwServiceFlags1);
|
||||||
|
pi[i].iAddressFamily = wsabuf[i].iAddressFamily;
|
||||||
|
pi[i].iMaxSockAddr = wsabuf[i].iMaxSockAddr;
|
||||||
|
pi[i].iMinSockAddr = wsabuf[i].iMinSockAddr;
|
||||||
|
pi[i].iSocketType = wsabuf[i].iSocketType;
|
||||||
|
pi[i].iProtocol = wsabuf[i].iProtocol;
|
||||||
|
pi[i].dwMessageSize = wsabuf[i].dwMessageSize;
|
||||||
|
|
||||||
|
memcpy((char *)buffer + string_offset, wsabuf[i].szProtocol, string_size);
|
||||||
|
pi[i].lpProtocol = (char *)buffer + string_offset;
|
||||||
|
string_offset += string_size;
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, wsabuf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* EnumProtocolsW [WSOCK32.1112]
|
||||||
|
*/
|
||||||
|
INT WINAPI EnumProtocolsW(LPINT protocols, LPVOID buffer, LPDWORD buflen)
|
||||||
|
{
|
||||||
|
INT ret;
|
||||||
|
DWORD size, string_size = (WSAPROTOCOL_LEN + 1) * sizeof(WCHAR);
|
||||||
|
|
||||||
|
TRACE("%p, %p, %p\n", protocols, buffer, buflen);
|
||||||
|
|
||||||
|
if (!buflen) return SOCKET_ERROR;
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
ret = WSAEnumProtocolsW(protocols, NULL, &size);
|
||||||
|
|
||||||
|
if (ret == SOCKET_ERROR && WSAGetLastError() == WSAENOBUFS)
|
||||||
|
{
|
||||||
|
DWORD num_protocols = size / sizeof(WSAPROTOCOL_INFOW);
|
||||||
|
if (*buflen < num_protocols * (sizeof(PROTOCOL_INFOW) + string_size))
|
||||||
|
{
|
||||||
|
*buflen = num_protocols * (sizeof(PROTOCOL_INFOW) + string_size);
|
||||||
|
return SOCKET_ERROR;
|
||||||
|
}
|
||||||
|
if (buffer)
|
||||||
|
{
|
||||||
|
WSAPROTOCOL_INFOW *wsabuf;
|
||||||
|
PROTOCOL_INFOW *pi = buffer;
|
||||||
|
unsigned int i, string_offset;
|
||||||
|
|
||||||
|
if (!(wsabuf = HeapAlloc(GetProcessHeap(), 0, size))) return SOCKET_ERROR;
|
||||||
|
|
||||||
|
ret = WSAEnumProtocolsW(protocols, wsabuf, &size);
|
||||||
|
string_offset = ret * sizeof(PROTOCOL_INFOW);
|
||||||
|
|
||||||
|
for (i = 0; i < ret; i++)
|
||||||
|
{
|
||||||
|
pi[i].dwServiceFlags = map_service(wsabuf[i].dwServiceFlags1);
|
||||||
|
pi[i].iAddressFamily = wsabuf[i].iAddressFamily;
|
||||||
|
pi[i].iMaxSockAddr = wsabuf[i].iMaxSockAddr;
|
||||||
|
pi[i].iMinSockAddr = wsabuf[i].iMinSockAddr;
|
||||||
|
pi[i].iSocketType = wsabuf[i].iSocketType;
|
||||||
|
pi[i].iProtocol = wsabuf[i].iProtocol;
|
||||||
|
pi[i].dwMessageSize = wsabuf[i].dwMessageSize;
|
||||||
|
|
||||||
|
memcpy((char *)buffer + string_offset, wsabuf[i].szProtocol, string_size);
|
||||||
|
pi[i].lpProtocol = (WCHAR *)(char *)buffer + string_offset;
|
||||||
|
string_offset += string_size;
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, wsabuf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -62,8 +62,8 @@
|
||||||
1108 stdcall s_perror(str)
|
1108 stdcall s_perror(str)
|
||||||
1109 stdcall GetAddressByNameA(long ptr str ptr long ptr ptr ptr ptr ptr)
|
1109 stdcall GetAddressByNameA(long ptr str ptr long ptr ptr ptr ptr ptr)
|
||||||
1110 stdcall GetAddressByNameW(long ptr wstr ptr long ptr ptr ptr ptr ptr)
|
1110 stdcall GetAddressByNameW(long ptr wstr ptr long ptr ptr ptr ptr ptr)
|
||||||
1111 stdcall EnumProtocolsA(ptr ptr ptr) ws2_32.WSAEnumProtocolsA
|
1111 stdcall EnumProtocolsA(ptr ptr ptr)
|
||||||
1112 stdcall EnumProtocolsW(ptr ptr ptr) ws2_32.WSAEnumProtocolsW
|
1112 stdcall EnumProtocolsW(ptr ptr ptr)
|
||||||
1113 stdcall GetTypeByNameA(str ptr)
|
1113 stdcall GetTypeByNameA(str ptr)
|
||||||
1114 stdcall GetTypeByNameW(wstr ptr)
|
1114 stdcall GetTypeByNameW(wstr ptr)
|
||||||
#1115 stub GetNameByTypeA
|
#1115 stub GetNameByTypeA
|
||||||
|
|
Loading…
Reference in New Issue