ws2_32: Make getsockopt(SO_TYPE) convert the returned socket type

Bruno Jesus 00cpxxx at gmail.com
Wed Sep 18 15:36:25 CDT 2013


This is a general fix but Solaris is the current OS suffering from this issue.

It defines SOCK_STREAM 2, SOCK_DGRAM 1 while linux and windows declare
SOCK_STREAM 1, SOCK_DGRAM 2.

Should fix all errors from [1] like:
sock.c:1952: Test failed: Wrong socket type, expected 2 received 1
sock.c:1963: Test failed: Wrong socket type, expected 1 received 2



[1] http://test.winehq.org/data/2034f515981ead985c4c24fac7b6935326cdb490/solaris_fg-sol10u5-vm/ws2_32:sock.html
-------------- next part --------------
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 8a790f3..2cb077e 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -2937,7 +2937,6 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
         case WS_SO_RCVBUF:
         case WS_SO_REUSEADDR:
         case WS_SO_SNDBUF:
-        case WS_SO_TYPE:
             if ( (fd = get_sock_fd( s, 0, NULL )) == -1)
                 return SOCKET_ERROR;
             convert_sockopt(&level, &optname);
@@ -3136,6 +3135,27 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level,
             return ret;
         }
 #endif
+        case WS_SO_TYPE:
+        {
+            if (!optlen || *optlen < sizeof(int) || !optval)
+            {
+                SetLastError(WSAEFAULT);
+                return SOCKET_ERROR;
+            }
+            if ( (fd = get_sock_fd( s, 0, NULL )) == -1)
+                return SOCKET_ERROR;
+
+            if (getsockopt(fd, SOL_SOCKET, SO_TYPE, optval, (socklen_t *)optlen) != 0 )
+            {
+                SetLastError((errno == EBADF) ? WSAENOTSOCK : wsaErrno());
+                ret = SOCKET_ERROR;
+            }
+            else
+                (*(int *)optval) = convert_socktype_u2w(*(int *)optval);
+
+            release_sock_fd( s, fd );
+            return ret;
+        }
         default:
             TRACE("Unknown SOL_SOCKET optname: 0x%08x\n", optname);
             SetLastError(WSAENOPROTOOPT);


More information about the wine-patches mailing list