Zebediah Figura : ws2_32: Use ws_protocol_info() in getsockopt(SO_LINGER).
Alexandre Julliard
julliard at winehq.org
Thu Jul 1 15:53:48 CDT 2021
Module: wine
Branch: master
Commit: 1ccab719ee6e87b7399876d4d5b30eb889c49e32
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1ccab719ee6e87b7399876d4d5b30eb889c49e32
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Jun 30 20:24:36 2021 -0500
ws2_32: Use ws_protocol_info() in getsockopt(SO_LINGER).
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ws2_32/socket.c | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 9f32e7eaf96..84f7f06036f 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -694,14 +694,6 @@ static inline void release_sock_fd( SOCKET s, int fd )
close( fd );
}
-static int _get_fd_type(int fd)
-{
- int sock_type = -1;
- socklen_t optlen = sizeof(sock_type);
- getsockopt(fd, SOL_SOCKET, SO_TYPE, (char*) &sock_type, &optlen);
- return sock_type;
-}
-
static BOOL set_dont_fragment(SOCKET s, int level, BOOL value)
{
int fd, optname;
@@ -2176,22 +2168,24 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
case WS_SO_LINGER:
{
+ WSAPROTOCOL_INFOW info;
+ int size;
+
/* struct linger and LINGER have different sizes */
if (!optlen || *optlen < sizeof(LINGER) || !optval)
{
SetLastError(WSAEFAULT);
return SOCKET_ERROR;
}
- if ( (fd = get_sock_fd( s, 0, NULL )) == -1)
- return SOCKET_ERROR;
- if (_get_fd_type(fd) == SOCK_DGRAM)
+ if (!ws_protocol_info( s, TRUE, &info, &size ))
+ return -1;
+
+ if (info.iSocketType == SOCK_DGRAM)
{
- release_sock_fd( s, fd );
SetLastError( WSAENOPROTOOPT );
return -1;
}
- release_sock_fd( s, fd );
return server_getsockopt( s, IOCTL_AFD_WINE_GET_SO_LINGER, optval, optlen );
}
More information about the wine-cvs
mailing list