OPTIM: epoll: make use of EPOLLRDHUP

epoll may report pending shutdowns using EPOLLRDHUP. Since this
flag is missing from a number of libcs despite being available
since kernel 2.6.17, let's define it ourselves.

Doing so saves one syscall by allow us to avoid the read()==0 when
the server closes with the respose.
diff --git a/src/ev_epoll.c b/src/ev_epoll.c
index 90efaee..034ec4c 100644
--- a/src/ev_epoll.c
+++ b/src/ev_epoll.c
@@ -40,6 +40,11 @@
  */
 static struct epoll_event ev;
 
+#ifndef EPOLLRDHUP
+/* EPOLLRDHUP was defined late in libc, and it appeared in kernel 2.6.17 */
+#define EPOLLRDHUP 0x2000
+#endif
+
 /*
  * speculative epoll() poller
  */
@@ -76,7 +81,7 @@
 				/* construct the epoll events based on new state */
 				ev.events = 0;
 				if (en & FD_EV_POLLED_R)
-					ev.events |= EPOLLIN;
+					ev.events |= EPOLLIN | EPOLLRDHUP;
 
 				if (en & FD_EV_POLLED_W)
 					ev.events |= EPOLLOUT;
@@ -137,8 +142,8 @@
 	/* process polled events */
 
 	for (count = 0; count < status; count++) {
-		unsigned char n;
-		unsigned char e = epoll_events[count].events;
+		unsigned int n;
+		unsigned int e = epoll_events[count].events;
 		fd = epoll_events[count].data.fd;
 
 		if (!fdtab[fd].owner)
@@ -161,6 +166,10 @@
 				((e & EPOLLHUP) ? FD_POLL_HUP : 0);
 		}
 
+		/* always remap RDHUP to HUP as they're used similarly */
+		if (e & EPOLLRDHUP)
+			n |= FD_POLL_HUP;
+
 		if (!n)
 			continue;