libc: more poll(3) wrapper fixes

- POLLRDBAND is reported by select(2) as errorfd, not readfd;
- POLLERR is not the same as errorfd of select(2);
- flags that are not requested should not be returned.

Change-Id: I9cb3c2c260ead5a2852a2fbbc10280c2b5b0dff9
This commit is contained in:
David van Moolenbroek 2017-02-15 19:13:43 +00:00
parent 68804c208e
commit 44fdeb7a62

View File

@ -67,11 +67,12 @@ poll(struct pollfd *p, nfds_t nfds, int timout)
if (p[i].fd > highfd) if (p[i].fd > highfd)
highfd = p[i].fd; highfd = p[i].fd;
if (p[i].events & (POLLIN|POLLRDNORM|POLLRDBAND|POLLPRI)) if (p[i].events & (POLLIN|POLLRDNORM))
FD_SET(p[i].fd, &rd); FD_SET(p[i].fd, &rd);
if (p[i].events & (POLLOUT|POLLWRNORM|POLLWRBAND)) if (p[i].events & (POLLOUT|POLLWRNORM|POLLWRBAND))
FD_SET(p[i].fd, &wr); FD_SET(p[i].fd, &wr);
FD_SET(p[i].fd, &except); if (p[i].events & (POLLRDBAND|POLLPRI))
FD_SET(p[i].fd, &except);
} }
tv.tv_sec = timout / 1000; tv.tv_sec = timout / 1000;
@ -87,12 +88,13 @@ poll(struct pollfd *p, nfds_t nfds, int timout)
if (p[i].fd < 0) if (p[i].fd < 0)
continue; continue;
if (FD_ISSET(p[i].fd, &rd)) if (FD_ISSET(p[i].fd, &rd))
p[i].revents |= POLLIN|POLLRDNORM|POLLRDBAND|POLLPRI; p[i].revents |= p[i].events & (POLLIN|POLLRDNORM);
if (FD_ISSET(p[i].fd, &wr)) if (FD_ISSET(p[i].fd, &wr))
p[i].revents |= POLLOUT|POLLWRNORM|POLLWRBAND; p[i].revents |=
p[i].events & (POLLOUT|POLLWRNORM|POLLWRBAND);
if (FD_ISSET(p[i].fd, &except)) if (FD_ISSET(p[i].fd, &except))
p[i].revents |= POLLERR; p[i].revents |= p[i].events & (POLLRDBAND|POLLPRI);
/* XXX: POLLHUP/POLLNVAL? */ /* XXX: POLLERR/POLLHUP/POLLNVAL? */
if (p[i].revents != 0) if (p[i].revents != 0)
rval++; rval++;
} }