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