[PATCH 1/5] ws2_32: Move the getsockopt(IPX_PTYPE) implementation to ntdll.
Zebediah Figura
zfigura at codeweavers.com
Fri Jul 30 18:55:36 CDT 2021
From: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/ntdll/unix/socket.c | 22 ++++++++++++++++++++++
dlls/ws2_32/socket.c | 27 ++++-----------------------
include/wine/afd.h | 1 +
3 files changed, 27 insertions(+), 23 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c
index 24090c1a17b..c2cbaff24e1 100644
--- a/dlls/ntdll/unix/socket.c
+++ b/dlls/ntdll/unix/socket.c
@@ -1922,6 +1922,28 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc
return ret ? sock_errno_to_status( errno ) : STATUS_SUCCESS;
}
+#ifdef SOL_IPX
+ case IOCTL_AFD_WINE_GET_IPX_PTYPE:
+ return do_getsockopt( handle, io, SOL_IPX, IPX_TYPE, out_buffer, out_size );
+#elif defined(SO_DEFAULT_HEADERS)
+ case IOCTL_AFD_WINE_GET_IPX_PTYPE:
+ {
+ int fd, needs_close = FALSE;
+ struct ipx value;
+ socklen_t len = sizeof(value);
+ int ret;
+
+ if ((status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL )))
+ return status;
+
+ ret = getsockopt( fd, 0, SO_DEFAULT_HEADERS, &value, &len );
+ if (needs_close) close( fd );
+ if (ret) return sock_errno_to_status( errno );
+ *(DWORD *)out_buffer = value.ipx_pt;
+ return STATUS_SUCCESS;
+ }
+#endif
+
default:
{
if ((code >> 16) == FILE_DEVICE_NETWORK)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index a28c25ec697..71b5e9a8658 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -2158,7 +2158,7 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
return SOCKET_ERROR;
} /* end switch(optname) */
}/* end case WS_SOL_SOCKET */
-#ifdef HAS_IPX
+
case WS_NSPROTO_IPX:
{
struct WS_sockaddr_ipx addr;
@@ -2166,27 +2166,6 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
int namelen;
switch(optname)
{
- case WS_IPX_PTYPE:
- if ((fd = get_sock_fd( s, 0, NULL )) == -1) return SOCKET_ERROR;
-#ifdef SOL_IPX
- if(getsockopt(fd, SOL_IPX, IPX_TYPE, optval, (socklen_t *)optlen) == -1)
- {
- ret = SOCKET_ERROR;
- }
-#else
- {
- struct ipx val;
- socklen_t len=sizeof(struct ipx);
- if(getsockopt(fd, 0, SO_DEFAULT_HEADERS, &val, &len) == -1 )
- ret = SOCKET_ERROR;
- else
- *optval = (int)val.ipx_pt;
- }
-#endif
- TRACE("ptype: %d (fd: %d)\n", *(int*)optval, fd);
- release_sock_fd( s, fd );
- return ret;
-
case WS_IPX_ADDRESS:
/*
* On a Win2000 system with one network card there are usually
@@ -2217,12 +2196,14 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
*(int*)optval = 1; /* As noted under IPX_ADDRESS we have just one card. */
return 0;
+ case WS_IPX_PTYPE:
+ return server_getsockopt( s, IOCTL_AFD_WINE_GET_IPX_PTYPE, optval, optlen );
+
default:
FIXME("IPX optname:%x\n", optname);
return SOCKET_ERROR;
}/* end switch(optname) */
} /* end case WS_NSPROTO_IPX */
-#endif
#ifdef HAS_IRDA
#define MAX_IRDA_DEVICES 10
diff --git a/include/wine/afd.h b/include/wine/afd.h
index 9a1edb1fda6..6630a6402fc 100644
--- a/include/wine/afd.h
+++ b/include/wine/afd.h
@@ -223,6 +223,7 @@ struct afd_get_events_params
#define IOCTL_AFD_WINE_SET_IPV6_UNICAST_IF WINE_AFD_IOC(278)
#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)
struct afd_create_params
{
--
2.30.2
More information about the wine-devel
mailing list