[2.] Full description of the problem/report:
If a program is waiting in epoll_wait() for EPOLLOUT event on a
socket and the socket is closed, epoll_wait() returns EPOLLHUP|EPOLLERR,
but *not* EPOLLOUT.
This differs from the expected behavior in several ways:
1. epoll_wait is not returning the events it was told to wait for.
Why not return EPOLLOUT? select() returns an FD as writable on EOF.
2. epoll_wait() is returning events it was not told to wait for.
3. EPOLLHUP is not returned if EPOLLIN was requested, why
do so on EPOLLOUT?
Also a minor issue - epoll_ctl doesn't check if the fd in events.data.fd
is the same as the fd that's been passed in as argument 3. If they differ
(due to programmer error), epoll_wait will return an event with the
incorrect events.data.fd specified to epoll_ctl().