Zebediah Figura : ws2_32: Move the setsockopt(IPX_PTYPE) implementation to ntdll.
Alexandre Julliard
julliard at winehq.org
Mon Aug 2 16:43:35 CDT 2021
Module: wine
Branch: master
Commit: 55c761540dc7cf96904fabc407e439c03b0eb15d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=55c761540dc7cf96904fabc407e439c03b0eb15d
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Fri Jul 30 18:55:37 2021 -0500
ws2_32: Move the setsockopt(IPX_PTYPE) implementation to ntdll.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/socket.c | 12 ++++++++++++
dlls/ws2_32/socket.c | 40 +---------------------------------------
include/wine/afd.h | 1 +
3 files changed, 14 insertions(+), 39 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c
index c2cbaff24e1..a63209e6ae6 100644
--- a/dlls/ntdll/unix/socket.c
+++ b/dlls/ntdll/unix/socket.c
@@ -1925,6 +1925,9 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc
#ifdef SOL_IPX
case IOCTL_AFD_WINE_GET_IPX_PTYPE:
return do_getsockopt( handle, io, SOL_IPX, IPX_TYPE, out_buffer, out_size );
+
+ case IOCTL_AFD_WINE_SET_IPX_PTYPE:
+ return do_setsockopt( handle, io, SOL_IPX, IPX_TYPE, in_buffer, in_size );
#elif defined(SO_DEFAULT_HEADERS)
case IOCTL_AFD_WINE_GET_IPX_PTYPE:
{
@@ -1942,6 +1945,15 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc
*(DWORD *)out_buffer = value.ipx_pt;
return STATUS_SUCCESS;
}
+
+ case IOCTL_AFD_WINE_SET_IPX_PTYPE:
+ {
+ struct ipx value = {0};
+
+ /* FIXME: should we retrieve SO_DEFAULT_HEADERS first and modify it? */
+ value.ipx_pt = *(DWORD *)in_buffer;
+ return do_setsockopt( handle, io, 0, SO_DEFAULT_HEADERS, &value, sizeof(value) );
+ }
#endif
default:
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 71b5e9a8658..da45734803c 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -825,42 +825,6 @@ convert_socktype_u2w(int unixsocktype) {
return -1;
}
-static int set_ipx_packettype(int sock, int ptype)
-{
-#ifdef HAS_IPX
- int fd = get_sock_fd( sock, 0, NULL ), ret = 0;
- TRACE("trying to set IPX_PTYPE: %d (fd: %d)\n", ptype, fd);
-
- if (fd == -1) return SOCKET_ERROR;
-
- /* We try to set the ipx type on ipx socket level. */
-#ifdef SOL_IPX
- if(setsockopt(fd, SOL_IPX, IPX_TYPE, &ptype, sizeof(ptype)) == -1)
- {
- ERR("IPX: could not set ipx option type; expect weird behaviour\n");
- ret = SOCKET_ERROR;
- }
-#else
- {
- struct ipx val;
- /* Should we retrieve val using a getsockopt call and then
- * set the modified one? */
- val.ipx_pt = ptype;
- setsockopt(fd, 0, SO_DEFAULT_HEADERS, &val, sizeof(struct ipx));
- }
-#endif
- release_sock_fd( sock, fd );
- return ret;
-#else
- WARN("IPX support is not enabled, can't set packet type\n");
- return SOCKET_ERROR;
-#endif
-}
-
-/* ----------------------------------- API -----
- *
- * Init / cleanup / error checking.
- */
/***********************************************************************
* WSAStartup (WS2_32.115)
@@ -3453,12 +3417,11 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname,
}
break; /* case WS_SOL_SOCKET */
-#ifdef HAS_IPX
case WS_NSPROTO_IPX:
switch(optname)
{
case WS_IPX_PTYPE:
- return set_ipx_packettype(s, *(int*)optval);
+ return server_setsockopt( s, IOCTL_AFD_WINE_SET_IPX_PTYPE, optval, optlen );
case WS_IPX_FILTERPTYPE:
/* Sets the receive filter packet type, at the moment we don't support it */
@@ -3471,7 +3434,6 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname,
return SOCKET_ERROR;
}
break; /* case WS_NSPROTO_IPX */
-#endif
/* Levels WS_IPPROTO_TCP and WS_IPPROTO_IP convert directly */
case WS_IPPROTO_TCP:
diff --git a/include/wine/afd.h b/include/wine/afd.h
index 6630a6402fc..4db6525a7d8 100644
--- a/include/wine/afd.h
+++ b/include/wine/afd.h
@@ -224,6 +224,7 @@ struct afd_get_events_params
#define IOCTL_AFD_WINE_GET_IPV6_V6ONLY WINE_AFD_IOC(279)
#define IOCTL_AFD_WINE_SET_IPV6_V6ONLY WINE_AFD_IOC(280)
#define IOCTL_AFD_WINE_GET_IPX_PTYPE WINE_AFD_IOC(281)
+#define IOCTL_AFD_WINE_SET_IPX_PTYPE WINE_AFD_IOC(282)
struct afd_create_params
{
More information about the wine-cvs
mailing list