[PATCH] ws2_32: Return a valid value for WSAIoctl SIO_IDEAL_SEND_BACKLOG_QUERY.
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Tue Sep 15 04:45:16 CDT 2020
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/ws2_32/socket.c | 30 ++++++++++++++++++++++++++++++
dlls/ws2_32/tests/sock.c | 14 +++++++++++++-
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 0ed1af3092..a145b8c1f7 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -4784,6 +4784,36 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
break;
}
+ case WS_SIO_IDEAL_SEND_BACKLOG_QUERY:
+ {
+ int ret, proto;
+ unsigned protolen = sizeof(protolen);
+
+ if (!out_buff)
+ {
+ SetLastError(WSAEFAULT);
+ return SOCKET_ERROR;
+ }
+
+ if ( (fd = get_sock_fd( s, 0, NULL )) == -1)
+ return SOCKET_ERROR;
+
+ ret = getsockopt(fd, SOL_SOCKET, SO_PROTOCOL, &proto, &protolen);
+ if(ret || proto != IPPROTO_TCP)
+ {
+ TRACE("ret %d, proto %d\n", ret, proto);
+ release_sock_fd( s, fd );
+ SetLastError(WSAEOPNOTSUPP);
+ return SOCKET_ERROR;
+ }
+
+ total = sizeof(DWORD);
+ *(DWORD*)out_buff = 0x10000; /* 64k */
+
+ release_sock_fd( s, fd );
+ break;
+ }
+
case WS_SIOCATMARK:
{
unsigned int oob = 0, atmark = 0;
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 7835246397..df3e893d10 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -6405,8 +6405,10 @@ static void test_WSASendTo(void)
struct sockaddr_in addr;
char buf[12] = "hello world";
WSABUF data_buf;
- DWORD bytesSent;
+ DWORD bytesSent, size;
int ret;
+ ULONG backlog = 0;
+ int iret;
addr.sin_family = AF_INET;
addr.sin_port = htons(139);
@@ -6436,6 +6438,11 @@ static void test_WSASendTo(void)
}
ok(!WSAGetLastError(), "WSAGetLastError() should return zero after "
"a successful call to WSASendTo()\n");
+
+ iret = WSAIoctl(s, SIO_IDEAL_SEND_BACKLOG_QUERY, NULL, 0, &backlog, sizeof(backlog), &size, NULL, NULL);
+ ok(iret == SOCKET_ERROR && WSAGetLastError() == WSAEOPNOTSUPP,
+ "WSAIoctl() failed: %d/%d\n", iret, WSAGetLastError());
+ closesocket(s);
}
static DWORD WINAPI recv_thread(LPVOID arg)
@@ -6476,6 +6483,7 @@ static void test_WSARecv(void)
DWORD dwret;
BOOL bret;
HANDLE thread, event = NULL, io_port;
+ ULONG backlog = 0, size;
tcp_socketpair(&src, &dest);
if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
@@ -6629,6 +6637,10 @@ static void test_WSARecv(void)
CloseHandle(io_port);
+ iret = WSAIoctl(src, SIO_IDEAL_SEND_BACKLOG_QUERY, NULL, 0, &backlog, sizeof(backlog), &size, NULL, NULL);
+ ok(!iret, "WSAIoctl() failed: %d/%d\n", iret, WSAGetLastError());
+ ok(backlog == 0x10000, "got %08x\n", backlog);
+
end:
if (server != INVALID_SOCKET)
closesocket(server);
--
2.28.0
More information about the wine-devel
mailing list