* poll.cc (poll): Add support for invalid descriptors.
This commit is contained in:
		| @@ -1,3 +1,7 @@ | |||||||
|  | 2002-03-19  Boris Schaeling  <boriss@web.de> | ||||||
|  |  | ||||||
|  |         * poll.cc (poll): Add support for invalid descriptors. | ||||||
|  |  | ||||||
| 2002-03-15  Robert Collins  <rbtcollins@hotmail.com> | 2002-03-15  Robert Collins  <rbtcollins@hotmail.com> | ||||||
|  |  | ||||||
| 	* fhandler.h (fhandler_termios::lseek): Override lseek. | 	* fhandler.h (fhandler_termios::lseek): Override lseek. | ||||||
|   | |||||||
| @@ -50,6 +50,7 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout) | |||||||
|   memset (write_fds, 0, fds_size); |   memset (write_fds, 0, fds_size); | ||||||
|   memset (except_fds, 0, fds_size); |   memset (except_fds, 0, fds_size); | ||||||
|  |  | ||||||
|  |   int invalid_fds = 0;  | ||||||
|   for (unsigned int i = 0; i < nfds; ++i)  |   for (unsigned int i = 0; i < nfds; ++i)  | ||||||
|     {  |     {  | ||||||
|       fds[i].revents = 0;  |       fds[i].revents = 0;  | ||||||
| @@ -62,16 +63,24 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout) | |||||||
|           if (fds[i].events & POLLPRI)  |           if (fds[i].events & POLLPRI)  | ||||||
|             FD_SET(fds[i].fd, except_fds);  |             FD_SET(fds[i].fd, except_fds);  | ||||||
|         }  |         }  | ||||||
|  |       else if (fds[i].fd >= 0)  | ||||||
|  |         {  | ||||||
|  |           ++invalid_fds;  | ||||||
|  |           fds[i].revents = POLLNVAL;  | ||||||
|         }  |         }  | ||||||
|  |     }  | ||||||
|  |  | ||||||
|  |   if (invalid_fds)  | ||||||
|  |     return invalid_fds;  | ||||||
|  |  | ||||||
|   int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds, timeout < 0 ? NULL : &tv);  |   int ret = cygwin_select (max_fd + 1, read_fds, write_fds, except_fds, timeout < 0 ? NULL : &tv);  | ||||||
|  |  | ||||||
|   if (ret > 0)  |   if (ret > 0)  | ||||||
|     for (unsigned int i = 0; i < nfds; ++i)  |     for (unsigned int i = 0; i < nfds; ++i)  | ||||||
|       {  |       {  | ||||||
| 	if (fds[i].fd < 0)  |         if (fds[i].fd >= 0)  | ||||||
| 	  fds[i].revents = POLLNVAL;  |           {  | ||||||
| 	else if (cygheap->fdtab.not_open(fds[i].fd))  |             if (cygheap->fdtab.not_open(fds[i].fd))  | ||||||
|               fds[i].revents = POLLHUP;  |               fds[i].revents = POLLHUP;  | ||||||
|             else  |             else  | ||||||
|               {  |               {  | ||||||
| @@ -85,6 +94,7 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout) | |||||||
|                   fds[i].revents |= POLLPRI;  |                   fds[i].revents |= POLLPRI;  | ||||||
|               }  |               }  | ||||||
|           }  |           }  | ||||||
|  |       }  | ||||||
|  |  | ||||||
|   return ret;  |   return ret;  | ||||||
| }  | }  | ||||||
		Reference in New Issue
	
	Block a user