winsock stuff

Daniel Walker diwalker at earthlink.net
Wed Aug 22 15:05:08 CDT 2001


Changelog:
Daniel Walker (diwalker at earthlink.net)
 -Added a cosmetic return() in WSOCK32_recv()
 -Fix for nonblocking sockets using WSAEventSelect() (patch from Ove
Kaaven)
 -changed WSAEnumNetworkEvents() so it only returns events that
        the application is looking for.
 -Changed sock_poll_event() to interpret a POLLIN event with
        zero bytes waiting to be read as a POLLHUP.

modified files:
 server/sock.c
 dlls/winsock/socket.c
-------------- next part --------------
? include/qos.h
Index: dlls/winsock/socket.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/socket.c,v
retrieving revision 1.56
diff -u -r1.56 socket.c
--- dlls/winsock/socket.c	2001/08/09 21:21:13	1.56
+++ dlls/winsock/socket.c	2001/08/22 16:32:48
@@ -1658,6 +1658,7 @@
 	}
 	SetLastError(wsaErrno());
 	close(fd);
+	return SOCKET_ERROR;
     }
     else SetLastError(WSAENOTSOCK);
     WARN(" -> ERROR\n");
@@ -2603,7 +2604,7 @@
         req->c_event = hEvent;
         if (!(ret = SERVER_CALL()))
         {
-            lpEvent->lNetworkEvents = req->pmask;
+            lpEvent->lNetworkEvents = req->pmask & req->mask;
             memcpy(lpEvent->iErrorCode, server_data_ptr(req), server_data_size(req) );
         }
     }
Index: server/sock.c
===================================================================
RCS file: /home/wine/wine/server/sock.c,v
retrieving revision 1.18
diff -u -r1.18 sock.c
--- server/sock.c	2001/05/14 20:09:39	1.18
+++ server/sock.c	2001/08/22 16:32:52
@@ -84,7 +84,7 @@
 
     if (sock->obj.select == -1) {
         /* previously unconnected socket, is this reselect supposed to connect it? */
-        if (!sock->state) return;
+        if (!(sock->state & ~WS_FD_NONBLOCKING)) return;
         /* ok, it is, attach it to the wineserver's main poll loop */
         add_select_user( &sock->obj );
     }
@@ -113,9 +113,14 @@
 {
     struct sock *sock = (struct sock *)obj;
     unsigned int emask;
+    char rBuf;
     assert( sock->obj.ops == &sock_ops );
     if (debug_level)
         fprintf(stderr, "socket %d select event: %x\n", sock->obj.fd, event);
+ 
+    if (event == POLLIN && !recvfrom(sock->obj.fd, &rBuf, sizeof(rBuf), MSG_PEEK, NULL, NULL))
+	event = POLLHUP;
+
     if (sock->state & WS_FD_CONNECT)
     {
         /* connecting */


More information about the wine-patches mailing list