diff options
Diffstat (limited to 'winsup/cygwin/select.cc')
-rw-r--r-- | winsup/cygwin/select.cc | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 46f0c6963..30e082a2e 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -336,11 +336,20 @@ set_bits (select_record *me, fd_set *readfds, fd_set *writefds, if (me->write_selected && me->write_ready) { UNIX_FD_SET (me->fd, writefds); + if (me->except_on_write && me->fh->get_device () == FH_SOCKET) + ((fhandler_socket *) me->fh)->set_connect_state (CONNECTED); ready++; } - if (me->except_selected && me->except_ready) + if ((me->except_selected || me->except_on_write) && me->except_ready) { - UNIX_FD_SET (me->fd, exceptfds); + if (me->except_on_write) /* Only on sockets */ + { + UNIX_FD_SET (me->fd, writefds); + if (me->fh->get_device () == FH_SOCKET) + ((fhandler_socket *) me->fh)->set_connect_state (CONNECTED); + } + if (me->except_selected) + UNIX_FD_SET (me->fd, exceptfds); ready++; } select_printf ("ready %d", ready); @@ -1192,7 +1201,7 @@ peek_socket (select_record *me, bool) me->fd); WINSOCK_FD_SET (h, &ws_writefds); } - if (me->except_selected && !me->except_ready) + if ((me->except_selected || me->except_on_write) && !me->except_ready) { select_printf ("adding except fd_set %s, fd %d", me->fh->get_name (), me->fd); @@ -1201,7 +1210,7 @@ peek_socket (select_record *me, bool) int r; if ((me->read_selected && !me->read_ready) || (me->write_selected && !me->write_ready) - || (me->except_selected && !me->except_ready)) + || ((me->except_selected || me->except_on_write) && !me->except_ready)) { r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv); select_printf ("WINSOCK_SELECT returned %d", r); @@ -1215,7 +1224,7 @@ peek_socket (select_record *me, bool) me->read_ready = true; if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready)) me->write_ready = true; - if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || (me->except_selected && me->except_ready)) + if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || ((me->except_selected || me->except_on_write) && me->except_ready)) me->except_ready = true; } return me->read_ready || me->write_ready || me->except_ready; @@ -1295,7 +1304,7 @@ start_thread_socket (select_record *me, select_stuff *stuff) WINSOCK_FD_SET (h, &si->writefds); select_printf ("Added to writefds"); } - if (s->except_selected && !s->except_ready) + if ((s->except_selected || s->except_on_write) && !s->except_ready) { WINSOCK_FD_SET (h, &si->exceptfds); select_printf ("Added to exceptfds"); @@ -1415,8 +1424,13 @@ fhandler_socket::select_write (select_record *s) s->cleanup = socket_cleanup; } s->peek = peek_socket; - s->write_ready = saw_shutdown_write () || !is_connected (); + s->write_ready = saw_shutdown_write () || is_unconnected (); s->write_selected = true; + if (is_connect_pending ()) + { + s->except_ready = saw_shutdown_write () || saw_shutdown_read (); + s->except_on_write = true; + } return s; } |