Mail Archives: cygwin/2002/11/19/08:33:43
Hi
The current implementation of poll() does not behave correctly with
listen sockets. It always gives a POLLERR revent when a connection
request is received. I believe the error is in poll.cc lines 96-108:
switch (sock->recvfrom (peek, sizeof (peek), MSG_PEEK,
NULL, NULL))
{
case -1: /* Something weird happened */
fds[i].revents |= POLLERR;
break;
case 0: /* Closed on the read side. */
fds[i].revents |= POLLHUP;
break;
default:
fds[i].revents |= POLLIN;
break;
}
the recvfrom call always returns -1 for a listen socket, and so we
always get POLLERR. I could not see an easy way of detecting a listen
socket at this point in the code, since the fhandler_socket class
records listen and connected sockets as the same thing (type ==
CONNECTED).
Because glib uses poll() to detect connection requests in a server, all
glib-based servers now fail in cygwin. I guess most cygwin ported
servers must be using select() rather than poll() as this behaviour
first appeared in cygwin 1.3.13-1 but has not been reported to the list
until now.
My apologies for not providing a patch, but hopefully someone with
better knowledge of cygwin internals will be able to detect a listen
socket in the above code and provide a special case for it.
Regards,
Steven
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -