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