for (fde = select_ev->ev->fd_events; fde; fde = fde->next) {
uint16_t flags = 0;
- if (FD_ISSET(fde->fd, &r_fds) && (fde->flags & TEVENT_FD_READ)) {
- flags |= TEVENT_FD_READ;
+ if (FD_ISSET(fde->fd, &r_fds)) {
+ int saved_errno = errno;
+ int available = 0;
+ int ret;
+
+ if (fde->flags & TEVENT_FD_READ) {
+ flags |= TEVENT_FD_READ;
+ }
+
+ /* support for POLLHUP */
+ ret = ioctl(fde->fd, FIONREAD, &available);
+ if ((ret == -1) || (available == 0)) {
+ /*
+ * We should not report TEVENT_FD_WRITE,
+ * after getting EOF.
+ */
+ fde->flags &= ~TEVENT_FD_WRITE;
+ }
+ errno = saved_errno;
+
}
if (FD_ISSET(fde->fd, &w_fds) && (fde->flags & TEVENT_FD_WRITE)) {
flags |= TEVENT_FD_WRITE;