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