[PATCH] ws2_32: Turn SIO_GET_EXTENSION_FUNCTION_POINTER into a table
Bruno Jesus
00cpxxx at gmail.com
Wed Mar 1 23:38:15 CST 2017
From: Bruno Jesus <bjesus at codeweavers.com>
I could not find any better way to avoid compilation warning than using a typedef for the function pointer. If there is a better way I'm all ears.
Signed-off-by: Bruno Jesus <bjesus at codeweavers.com>
---
dlls/ws2_32/socket.c | 94 +++++++++++++++++++++++-----------------------------
1 file changed, 41 insertions(+), 53 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 32f187a..8459c44 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -4908,68 +4908,56 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
break;
}
- case WS_SIO_FLUSH:
- FIXME("SIO_FLUSH: stub.\n");
- break;
+ case WS_SIO_FLUSH:
+ FIXME("SIO_FLUSH: stub.\n");
+ break;
- case WS_SIO_GET_EXTENSION_FUNCTION_POINTER:
- {
- static const GUID connectex_guid = WSAID_CONNECTEX;
- static const GUID disconnectex_guid = WSAID_DISCONNECTEX;
- static const GUID acceptex_guid = WSAID_ACCEPTEX;
- static const GUID getaccepexsockaddrs_guid = WSAID_GETACCEPTEXSOCKADDRS;
- static const GUID transmitfile_guid = WSAID_TRANSMITFILE;
- static const GUID transmitpackets_guid = WSAID_TRANSMITPACKETS;
- static const GUID wsarecvmsg_guid = WSAID_WSARECVMSG;
- static const GUID wsasendmsg_guid = WSAID_WSASENDMSG;
-
- if ( IsEqualGUID(&connectex_guid, in_buff) )
- {
- *(LPFN_CONNECTEX *)out_buff = WS2_ConnectEx;
- break;
- }
- else if ( IsEqualGUID(&disconnectex_guid, in_buff) )
- {
- *(LPFN_DISCONNECTEX *)out_buff = WS2_DisconnectEx;
- break;
- }
- else if ( IsEqualGUID(&acceptex_guid, in_buff) )
- {
- *(LPFN_ACCEPTEX *)out_buff = WS2_AcceptEx;
- break;
- }
- else if ( IsEqualGUID(&getaccepexsockaddrs_guid, in_buff) )
- {
- *(LPFN_GETACCEPTEXSOCKADDRS *)out_buff = WS2_GetAcceptExSockaddrs;
- break;
- }
- else if ( IsEqualGUID(&transmitfile_guid, in_buff) )
- {
- *(LPFN_TRANSMITFILE *)out_buff = WS2_TransmitFile;
- break;
- }
- else if ( IsEqualGUID(&transmitpackets_guid, in_buff) )
- {
- FIXME("SIO_GET_EXTENSION_FUNCTION_POINTER: unimplemented TransmitPackets\n");
- }
- else if ( IsEqualGUID(&wsarecvmsg_guid, in_buff) )
+ case WS_SIO_GET_EXTENSION_FUNCTION_POINTER:
+ {
+#define EXTENSION_FUNCTION(x, y) { x, y, #y },
+ static const struct
+ {
+ const GUID guid;
+ void *func_ptr;
+ const char *name;
+ } guid_funcs[] = {
+ EXTENSION_FUNCTION(WSAID_CONNECTEX, WS2_ConnectEx)
+ EXTENSION_FUNCTION(WSAID_DISCONNECTEX, WS2_DisconnectEx)
+ EXTENSION_FUNCTION(WSAID_ACCEPTEX, WS2_AcceptEx)
+ EXTENSION_FUNCTION(WSAID_GETACCEPTEXSOCKADDRS, WS2_GetAcceptExSockaddrs)
+ EXTENSION_FUNCTION(WSAID_TRANSMITFILE, WS2_TransmitFile)
+ /* EXTENSION_FUNCTION(WSAID_TRANSMITPACKETS, WS2_TransmitPackets) */
+ EXTENSION_FUNCTION(WSAID_WSARECVMSG, WS2_WSARecvMsg)
+ EXTENSION_FUNCTION(WSAID_WSASENDMSG, WSASendMsg)
+ };
+#undef EXTENSION_FUNCTION
+ BOOLEAN found = FALSE;
+ int i;
+
+ for (i = 0; i < sizeof(guid_funcs) / sizeof(guid_funcs[0]); i++)
{
- *(LPFN_WSARECVMSG *)out_buff = WS2_WSARecvMsg;
- break;
+ if (IsEqualGUID(&guid_funcs[i].guid, in_buff))
+ {
+ found = TRUE;
+ break;
+ }
}
- else if ( IsEqualGUID(&wsasendmsg_guid, in_buff) )
+
+ if (found)
{
- *(LPFN_WSASENDMSG *)out_buff = WSASendMsg;
+ typedef void (*func_ptr)(void);
+
+ TRACE("-> got %s\n", guid_funcs[i].name);
+ *(func_ptr *)out_buff = guid_funcs[i].func_ptr;
break;
}
- else
- FIXME("SIO_GET_EXTENSION_FUNCTION_POINTER %s: stub\n", debugstr_guid(in_buff));
+ FIXME("SIO_GET_EXTENSION_FUNCTION_POINTER %s: stub\n", debugstr_guid(in_buff));
status = WSAEOPNOTSUPP;
break;
- }
- case WS_SIO_KEEPALIVE_VALS:
- {
+ }
+ case WS_SIO_KEEPALIVE_VALS:
+ {
struct tcp_keepalive *k;
int keepalive, keepidle, keepintvl;
--
2.9.3
More information about the wine-patches
mailing list