From 99dbafacb671f0d9719abb302fdeb0885eb0df52 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 19 Mar 2002 17:12:49 +0000 Subject: [PATCH] * poll.cc (poll): Add support for invalid descriptors. --- winsup/cygwin/ChangeLog | 4 +++ winsup/cygwin/poll.cc | 60 ++++++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a3852cc92..00b50929f 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +2002-03-19 Boris Schaeling + + * poll.cc (poll): Add support for invalid descriptors. + 2002-03-15 Robert Collins * fhandler.h (fhandler_termios::lseek): Override lseek. diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc index 948f14c4b..473689ca8 100644 --- a/winsup/cygwin/poll.cc +++ b/winsup/cygwin/poll.cc @@ -50,41 +50,51 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout) memset (write_fds, 0, fds_size); memset (except_fds, 0, fds_size); + int invalid_fds = 0; for (unsigned int i = 0; i < nfds; ++i) { fds[i].revents = 0; if (!cygheap->fdtab.not_open(fds[i].fd)) - { - if (fds[i].events & POLLIN) - FD_SET(fds[i].fd, read_fds); - if (fds[i].events & POLLOUT) - FD_SET(fds[i].fd, write_fds); - if (fds[i].events & POLLPRI) - FD_SET(fds[i].fd, except_fds); - } + { + if (fds[i].events & POLLIN) + FD_SET(fds[i].fd, read_fds); + if (fds[i].events & POLLOUT) + FD_SET(fds[i].fd, write_fds); + if (fds[i].events & POLLPRI) + FD_SET(fds[i].fd, except_fds); + } + else if (fds[i].fd >= 0) + { + ++invalid_fds; + fds[i].revents = POLLNVAL; + } } - int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds, timeout < 0 ? NULL : &tv); + if (invalid_fds) + return invalid_fds; + + int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds, timeout < 0 ? NULL : &tv); if (ret > 0) for (unsigned int i = 0; i < nfds; ++i) { - if (fds[i].fd < 0) - fds[i].revents = POLLNVAL; - else if (cygheap->fdtab.not_open(fds[i].fd)) - fds[i].revents = POLLHUP; - else - { - if (FD_ISSET(fds[i].fd, read_fds)) - fds[i].revents |= POLLIN; - if (FD_ISSET(fds[i].fd, write_fds)) - fds[i].revents |= POLLOUT; - if (FD_ISSET(fds[i].fd, read_fds) && FD_ISSET(fds[i].fd, write_fds)) - fds[i].revents |= POLLERR; - if (FD_ISSET(fds[i].fd, except_fds)) - fds[i].revents |= POLLPRI; - } + if (fds[i].fd >= 0) + { + if (cygheap->fdtab.not_open(fds[i].fd)) + fds[i].revents = POLLHUP; + else + { + if (FD_ISSET(fds[i].fd, read_fds)) + fds[i].revents |= POLLIN; + if (FD_ISSET(fds[i].fd, write_fds)) + fds[i].revents |= POLLOUT; + if (FD_ISSET(fds[i].fd, read_fds) && FD_ISSET(fds[i].fd, write_fds)) + fds[i].revents |= POLLERR; + if (FD_ISSET(fds[i].fd, except_fds)) + fds[i].revents |= POLLPRI; + } + } } return ret; -} +} \ No newline at end of file