From 1ccab719ee6e87b7399876d4d5b30eb889c49e32 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Wed, 30 Jun 2021 20:24:36 -0500 Subject: [PATCH] ws2_32: Use ws_protocol_info() in getsockopt(SO_LINGER). Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- 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 ); } -- 2.11.4.GIT