Commit c86517fc authored by Daniel Walker's avatar Daniel Walker Committed by Alexandre Julliard

- 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.
parent ffb0d94e
...@@ -2603,7 +2603,7 @@ int WINAPI WSAEnumNetworkEvents(SOCKET s, WSAEVENT hEvent, LPWSANETWORKEVENTS lp ...@@ -2603,7 +2603,7 @@ int WINAPI WSAEnumNetworkEvents(SOCKET s, WSAEVENT hEvent, LPWSANETWORKEVENTS lp
req->c_event = hEvent; req->c_event = hEvent;
if (!(ret = SERVER_CALL())) 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) ); memcpy(lpEvent->iErrorCode, server_data_ptr(req), server_data_size(req) );
} }
} }
......
...@@ -84,7 +84,7 @@ static void sock_reselect( struct sock *sock ) ...@@ -84,7 +84,7 @@ static void sock_reselect( struct sock *sock )
if (sock->obj.select == -1) { if (sock->obj.select == -1) {
/* previously unconnected socket, is this reselect supposed to connect it? */ /* 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 */ /* ok, it is, attach it to the wineserver's main poll loop */
add_select_user( &sock->obj ); add_select_user( &sock->obj );
} }
...@@ -161,12 +161,20 @@ static void sock_poll_event( struct object *obj, int event ) ...@@ -161,12 +161,20 @@ static void sock_poll_event( struct object *obj, int event )
/* normal data flow */ /* normal data flow */
if (event & POLLIN) if (event & POLLIN)
{ {
/* incoming data */ char dummy;
sock->pmask |= FD_READ;
sock->hmask |= FD_READ; /* Linux 2.4 doesn't report POLLHUP if only one side of the socket
sock->errors[FD_READ_BIT] = 0; * has been closed, so we need to check for it explicitly here */
if (debug_level) if (!recv( sock->obj.fd, &dummy, 1, MSG_PEEK )) event = POLLHUP;
fprintf(stderr, "socket %d is readable\n", sock->obj.fd ); else
{
/* incoming data */
sock->pmask |= FD_READ;
sock->hmask |= FD_READ;
sock->errors[FD_READ_BIT] = 0;
if (debug_level)
fprintf(stderr, "socket %d is readable\n", sock->obj.fd );
}
} }
if (event & POLLOUT) if (event & POLLOUT)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment