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