diff options
author | kib <kib@FreeBSD.org> | 2009-08-23 12:44:15 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2009-08-23 12:44:15 +0000 |
commit | 8b1803af930eeefcd9b18b562e0ea5a2ac730837 (patch) | |
tree | 1af9e01d3fbffe5051806f83dd7d429992c00cd0 /sys/kern/sys_generic.c | |
parent | 070a590e2dab584cfe1b087e3a4ff26742654ea9 (diff) | |
download | FreeBSD-src-8b1803af930eeefcd9b18b562e0ea5a2ac730837.zip FreeBSD-src-8b1803af930eeefcd9b18b562e0ea5a2ac730837.tar.gz |
Fix the conformance of poll(2) for sockets after r195423 by
returning POLLHUP instead of POLLIN for several cases. Now, the
tools/regression/poll results for FreeBSD are closer to that of the
Solaris and Linux.
Also, improve the POSIX conformance by explicitely clearing POLLOUT
when POLLHUP is reported in pollscan(), making the fix global.
Submitted by: bde
Reviewed by: rwatson
MFC after: 1 week
Diffstat (limited to 'sys/kern/sys_generic.c')
-rw-r--r-- | sys/kern/sys_generic.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index de70348..bd0f279 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1228,6 +1228,13 @@ pollscan(td, fds, nfd) selfdalloc(td, fds); fds->revents = fo_poll(fp, fds->events, td->td_ucred, td); + /* + * POSIX requires POLLOUT to be never + * set simultaneously with POLLHUP. + */ + if ((fds->revents & POLLHUP) != 0) + fds->revents &= ~POLLOUT; + if (fds->revents != 0) n++; } |