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