diff -urp src.old/winsup/cygwin/net.cc src/winsup/cygwin/net.cc --- src.old/winsup/cygwin/net.cc Tue Jun 11 04:52:07 2002 +++ src/winsup/cygwin/net.cc Mon Jul 1 12:47:31 2002 @@ -23,6 +23,7 @@ details. */ #include #define USE_SYS_TYPES_FD_SET #include +#include "select.h" #include "cygerrno.h" #include "security.h" #include "fhandler.h" @@ -1203,6 +1204,44 @@ cygwin_accept (int fd, struct sockaddr * */ if (len && ((unsigned) *len < sizeof (struct sockaddr_in))) *len = sizeof (struct sockaddr_in); + + if (!sock->is_nonblocking()) + { + for (;;) + { + struct timeval timeout; + winsock_fd_set read_fd_set; + + // check for signal every 100 ms + timeout.tv_sec = 0; + timeout.tv_usec = 100 * 1000; + + WINSOCK_FD_ZERO (&read_fd_set); + WINSOCK_FD_SET ((HANDLE)sock->get_socket (), &read_fd_set); + + res = WINSOCK_SELECT (0, &read_fd_set, NULL, NULL, &timeout); + if( res == SOCKET_ERROR ) + { + // Error occured: stop select loop + debug_printf ("WinSock select failed"); + break; + } + else if (res == 0) + { + // Timeout: check for pending signal + if (WaitForSingleObject (signal_arrived, 0) == WAIT_OBJECT_0) + { + debug_printf ("signal received during accept"); + set_errno (EINTR); + res = -1; + goto done; + } + } + else if (WINSOCK_FD_ISSET ((HANDLE)sock->get_socket (), &read_fd_set)) + // connect is pending + break; + } + } res = accept (sock->get_socket (), peer, len); // can't use a blocking call inside a lock