winsock stuff

Daniel Walker diwalker at earthlink.net
Sun Aug 19 09:27: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 get_socket_event() 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 --------------
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/18 22:03:45
@@ -1658,6 +1658,7 @@
 	}
 	SetLastError(wsaErrno());
 	close(fd);
+	return SOCKET_ERROR;
     }
     else SetLastError(WSAENOTSOCK);
     WARN(" -> ERROR\n");
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/18 22:03:50
@@ -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 );
     }
@@ -112,10 +112,16 @@
 static void sock_poll_event( struct object *obj, int event )
 {
     struct sock *sock = (struct sock *)obj;
-    unsigned int emask;
+    unsigned int emask, nBytes;
     assert( sock->obj.ops == &sock_ops );
     if (debug_level)
         fprintf(stderr, "socket %d select event: %x\n", sock->obj.fd, event);
+
+    if (event & POLLIN) {
+     ioctl(sock->obj.fd, FIONREAD, &nBytes);
+     if (nBytes == 0) event = POLLHUP;
+     }
+ 
     if (sock->state & WS_FD_CONNECT)
     {
         /* connecting */
@@ -505,7 +511,14 @@
 	return;
     }
     req->mask    = sock->mask;
-    req->pmask   = sock->pmask;
+
+    /* If they don't want to know about the event
+	then don't tell them . */
+    if (sock->mask & sock->pmask)
+	req->pmask   = sock->pmask & sock->mask;
+    else
+	req->pmask = 0;
+	
     req->state   = sock->state;
     size = min( get_req_data_size(req), sizeof(sock->errors) );
     memcpy( get_req_data(req), sock->errors, size );


More information about the wine-patches mailing list