78523: Subject: ws2_32: Fix support for SIO_KEEPALIVE_VALS
buildbot at kegel.com
buildbot at kegel.com
Wed Sep 7 20:03:53 CDT 2011
This is an experimental automated build and test service.
Please feel free to ignore this email while we work the kinks out.
The Buildbot has detected a failed build on builder runtests-default while building Wine.
Full details are available at: http://buildbot.kegel.com/builders/runtests-default/builds/90 (though maybe not for long, as I'm still reinstalling the buildbot periodically while experimenting)
BUILD FAILED: failed shell_3
For more info about this message, see http://wiki.winehq.org/BuildBot
-------------- next part --------------
From: Bruno Jesus <00cpxxx at gmail.com>
Subject: ws2_32: Fix support for SIO_KEEPALIVE_VALS
Message-Id: <CALF_nUTZNGzqEdQTmTjUnZDvqU-V+Y_e230e427zsz57pX+0qQ at mail.gmail.com>
Date: Wed, 7 Sep 2011 21:53:22 -0300
From a683e3703bc42124bbf919979b0497b210236f43 Mon Sep 17 00:00:00 2001
From: Bruno Jesus <00cpxxx at gmail.com>
Date: Wed, 7 Sep 2011 21:20:37 -0300
Subject: ws2_32: Fix support for SIO_KEEPALIVE_VALS
Fix the ms to seconds conversion allowing the function to work if values < 1000 are passed.
Set keepalive time and interval only if keep alive is enabled.
Fixes bug #21271
Bibliography:
http://msdn.microsoft.com/en-us/library/dd877220%28v=vs.85%29.aspx
http://linux.die.net/man/7/tcp
http://www.yolinux.com/TUTORIALS/Sockets.html
http://docstore.mik.ua/manuals/hp-ux/en/B2355-60130/TCP.7P.html
http://www.faqs.org/rfcs/rfc1122.html
---
dlls/ws2_32/socket.c | 16 ++++++++++++----
dlls/ws2_32/tests/sock.c | 31 +++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index ff3c282..4ed4227 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -3379,16 +3379,24 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
keepidle = k->keepalivetime / 1000;
keepintvl = k->keepaliveinterval / 1000;
+ /* round values lower than 1000ms to 1 second */
+ if (!keepidle && k->keepalivetime) keepidle = 1;
+ if (!keepintvl && k->keepaliveinterval) keepintvl = 1;
+
TRACE("onoff: %d, keepalivetime: %d, keepaliveinterval: %d\n", keepalive, keepidle, keepintvl);
fd = get_sock_fd(s, 0, NULL);
if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof(int)) == -1)
status = WSAEINVAL;
#if defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTVL)
- else if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&keepidle, sizeof(int)) == -1)
- status = WSAEINVAL;
- else if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepintvl, sizeof(int)) == -1)
- status = WSAEINVAL;
+ /* these values need to be set only if SO_KEEPALIVE is enabled */
+ else if(keepalive)
+ {
+ if (keepidle && setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&keepidle, sizeof(int)) == -1)
+ status = WSAEINVAL;
+ else if (keepintvl && setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepintvl, sizeof(int)) == -1)
+ status = WSAEINVAL;
+ }
#else
else
FIXME("ignoring keepalive interval and timeout\n");
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index fd6b8c2..3766186 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -53,6 +53,11 @@
ok ( cond tmp, msg, GetCurrentThreadId(), err); \
} while (0);
+#define make_keepalive(k, enable, time, interval) \
+ k.onoff = enable; \
+ k.keepalivetime = time; \
+ k.keepaliveinterval = interval;
+
/* Function pointers */
static void (WINAPI *pFreeAddrInfoW)(PADDRINFOW) = 0;
static int (WINAPI *pGetAddrInfoW)(LPCWSTR,LPCWSTR,const ADDRINFOW *,PADDRINFOW *) = 0;
@@ -2933,6 +2938,7 @@ static void test_addr_to_print(void)
static void test_ioctlsocket(void)
{
SOCKET sock;
+ struct tcp_keepalive kalive;
int ret;
static const LONG cmds[] = {FIONBIO, FIONREAD, SIOCATMARK};
UINT i;
@@ -2972,6 +2978,31 @@ static void test_ioctlsocket(void)
ret = WSAGetLastError();
ok(ret == WSAEFAULT || broken(ret == WSAEINVAL), "expected WSAEFAULT, got %d instead\n", ret);
+ /* broken used to catch W95, W98, NT4 */
+ make_keepalive(kalive, 0, 0, 0);
+ ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
+ ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
+
+ make_keepalive(kalive, 1, 0, 0);
+ ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
+ ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
+
+ make_keepalive(kalive, 1, 1000, 1000);
+ ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
+ ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
+
+ make_keepalive(kalive, 1, 10000, 10000);
+ ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
+ ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
+
+ make_keepalive(kalive, 1, 100, 100);
+ ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
+ ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
+
+ make_keepalive(kalive, 0, 100, 100);
+ ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(struct tcp_keepalive), NULL, 0, &arg, NULL, NULL);
+ ok(ret == 0 || broken(ret == SOCKET_ERROR), "WSAIoctl failed unexpectedly\n");
+
closesocket(sock);
}
--
1.7.5.4
More information about the wine-tests-results
mailing list