From: Stefan Metzmacher Date: Thu, 28 Feb 2013 13:44:22 +0000 (+0100) Subject: select HUP X-Git-Url: http://git.samba.org/?p=metze%2Fsamba%2Fwip.git;a=commitdiff_plain;h=9d49c0b583a289b3f60f8ba03945a83ea3cee953 select HUP --- diff --git a/lib/tevent/tevent_select.c b/lib/tevent/tevent_select.c index 9dfe70379323..9c292ed84de5 100644 --- a/lib/tevent/tevent_select.c +++ b/lib/tevent/tevent_select.c @@ -214,8 +214,26 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru 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;