Qian Hong : server: Automatically sets a socket to non-blocking mode when WSAAsyncSelect or WSAEventSelect is called even when lEvent is zero .
Alexandre Julliard
julliard at winehq.org
Tue May 28 15:16:59 CDT 2013
Module: wine
Branch: master
Commit: 31b9455b7e6d29f8cc46c59c1252d6e266e86f8f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=31b9455b7e6d29f8cc46c59c1252d6e266e86f8f
Author: Qian Hong <qhong at codeweavers.com>
Date: Wed May 22 16:51:38 2013 +0800
server: Automatically sets a socket to non-blocking mode when WSAAsyncSelect or WSAEventSelect is called even when lEvent is zero.
---
dlls/ws2_32/tests/sock.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++
server/sock.c | 3 +-
2 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 4612116..ff0d538 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -3571,6 +3571,8 @@ static void test_events(int useMessages)
goto end;
}
+ ok(!set_blocking(src, TRUE), "set_blocking failed, error %d\n", WSAGetLastError());
+
src2 = socket(AF_INET, SOCK_STREAM, 0);
if (src2 == INVALID_SOCKET)
{
@@ -3578,6 +3580,8 @@ static void test_events(int useMessages)
goto end;
}
+ ok(!set_blocking(src2, TRUE), "set_blocking failed, error %d\n", WSAGetLastError());
+
len = sizeof(BOOL);
if (getsockopt(src, SOL_SOCKET, SO_OOBINLINE, (void *)&bret, &len) == SOCKET_ERROR)
{
@@ -3618,12 +3622,18 @@ static void test_events(int useMessages)
goto end;
}
+ ok(set_blocking(src, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
+ ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
+
ret = WSAAsyncSelect(src2, hWnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
if (ret)
{
ok(0, "WSAAsyncSelect failed, error %d\n", ret);
goto end;
}
+
+ ok(set_blocking(src2, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
+ ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
}
else
{
@@ -3650,12 +3660,18 @@ static void test_events(int useMessages)
goto end;
}
+ ok(set_blocking(src, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
+ ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
+
ret = WSAEventSelect(src2, hEvent2, FD_CONNECT | FD_READ | FD_OOB | FD_WRITE | FD_CLOSE);
if (ret)
{
ok(0, "WSAEventSelect failed, error %d\n", ret);
goto end;
}
+
+ ok(set_blocking(src2, TRUE) == SOCKET_ERROR, "set_blocking should failed!\n");
+ ok(WSAGetLastError() == WSAEINVAL, "expect WSAEINVAL, returned %x\n", WSAGetLastError());
}
server = socket(AF_INET, SOCK_STREAM, 0);
@@ -3988,6 +4004,47 @@ static void test_events(int useMessages)
ok(ret == 1, "Sending to half-closed socket failed %d err %d\n", ret, GetLastError());
ok_event_seq(src2, hEvent2, empty_seq, NULL, 0);
+ if (useMessages)
+ {
+ ret = WSAAsyncSelect(src, hWnd, WM_SOCKET, 0);
+ if (ret)
+ {
+ ok(0, "WSAAsyncSelect failed, error %d\n", ret);
+ goto end;
+ }
+
+ ok(!set_blocking(src, TRUE), "set_blocking failed, error %d\n", WSAGetLastError());
+
+ ret = WSAAsyncSelect(src2, hWnd, WM_SOCKET, 0);
+ if (ret)
+ {
+ ok(0, "WSAAsyncSelect failed, error %d\n", ret);
+ goto end;
+ }
+
+ ok(!set_blocking(src2, TRUE), "set_blocking failed, error %d\n", WSAGetLastError());
+ }
+ else
+ {
+ ret = WSAEventSelect(src, hEvent2, 0);
+ if (ret)
+ {
+ ok(0, "WSAAsyncSelect failed, error %d\n", ret);
+ goto end;
+ }
+
+ ok(!set_blocking(src, TRUE), "set_blocking failed, error %d\n", WSAGetLastError());
+
+ ret = WSAEventSelect(src2, hEvent2, 0);
+ if (ret)
+ {
+ ok(0, "WSAAsyncSelect failed, error %d\n", ret);
+ goto end;
+ }
+
+ ok(!set_blocking(src2, TRUE), "set_blocking failed, error %d\n", WSAGetLastError());
+ }
+
end:
if (src != INVALID_SOCKET)
{
diff --git a/server/sock.c b/server/sock.c
index ba18a66..5cb6d31 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -978,8 +978,7 @@ DECL_HANDLER(set_socket_event)
sock_reselect( sock );
- if (sock->mask)
- sock->state |= FD_WINE_NONBLOCKING;
+ sock->state |= FD_WINE_NONBLOCKING;
/* if a network event is pending, signal the event object
it is possible that FD_CONNECT or FD_ACCEPT network events has happened
More information about the wine-cvs
mailing list