Bruno Jesus : ws2_32: Turn SIO_GET_EXTENSION_FUNCTION_POINTER into a table.
Alexandre Julliard
julliard at winehq.org
Thu Mar 2 16:09:56 CST 2017
Module: wine
Branch: master
Commit: 914e401aa9d5401893c3807d51e3f19fc7a7ab38
URL: http://source.winehq.org/git/wine.git/?a=commit;h=914e401aa9d5401893c3807d51e3f19fc7a7ab38
Author: Bruno Jesus <bjesus at codeweavers.com>
Date: Thu Mar 2 02:38:15 2017 -0300
ws2_32: Turn SIO_GET_EXTENSION_FUNCTION_POINTER into a table.
Signed-off-by: Bruno Jesus <bjesus at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ws2_32/socket.c | 94 ++++++++++++++++++++++------------------------------
1 file changed, 40 insertions(+), 54 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 32f187a..451c505 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -4908,68 +4908,54 @@ 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) )
- {
- *(LPFN_WSARECVMSG *)out_buff = WS2_WSARecvMsg;
- break;
+ case WS_SIO_GET_EXTENSION_FUNCTION_POINTER:
+ {
+#define EXTENSION_FUNCTION(x, y) { x, y, #y },
+ static const struct
+ {
+ 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
+ BOOL found = FALSE;
+ unsigned int i;
+
+ for (i = 0; i < sizeof(guid_funcs) / sizeof(guid_funcs[0]); i++)
+ {
+ 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;
+ TRACE("-> got %s\n", guid_funcs[i].name);
+ *(void **)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;
More information about the wine-cvs
mailing list