MINOR: fd: add two flags ERR and SHUT to describe FD states

There's currently a big ambiguity on our use of POLLHUP because we
currently map POLLHUP and POLLRDHUP to FD_POLL_HUP. The first one
indicates a close in *both* directions while the second one indicates
a unidirectional close. Since we don't know from the resulting flag
we always have to read when reported. Furthermore kqueue only reports
unidirectional responses which are mapped to FD_POLL_HUP as well, and
their write closes are mapped to a general error.

We could add a new FD_POLL_RDHUP flag to improve the mapping, or
switch only to the POLL* flags, but that further complicates the
portability for operating systems like FreeBSD which do not have
POLLRDHUP but have its semantics.

Let's instead directly use the per-direction flag values we already
have, and it will be a first step in the direction of finer states.
Thus we introduce an ERR and a SHUT status for each direction, that
the pollers will be able to compute and pass to fd_update_events().

It's worth noting that FD_EV_STATUS already sees the two new flags,
but they are harmless since used only by fd_{recv,send}_state() which
are never called. Thus in its current state this patch must be totally
transparent.
diff --git a/include/types/fd.h b/include/types/fd.h
index 28f0c52..580e180 100644
--- a/include/types/fd.h
+++ b/include/types/fd.h
@@ -50,15 +50,21 @@
 /* FD bits used for different polling states in each direction */
 #define FD_EV_ACTIVE    1U
 #define FD_EV_READY     2U
+#define FD_EV_SHUT      4U
+#define FD_EV_ERR       8U
 
 /* bits positions for a few flags */
 #define FD_EV_ACTIVE_R_BIT 0
-#define FD_EV_READY_R_BIT 1
+#define FD_EV_READY_R_BIT  1
+#define FD_EV_SHUT_R_BIT   2
+#define FD_EV_ERR_R_BIT    3
 
 #define FD_EV_ACTIVE_W_BIT 4
-#define FD_EV_READY_W_BIT 5
+#define FD_EV_READY_W_BIT  5
+#define FD_EV_SHUT_W_BIT   6
+#define FD_EV_ERR_W_BIT    7
 
-#define FD_EV_STATUS    (FD_EV_ACTIVE | FD_EV_READY)
+#define FD_EV_STATUS    (FD_EV_ACTIVE | FD_EV_READY | FD_EV_SHUT | FD_EV_ERR)
 #define FD_EV_STATUS_R  (FD_EV_STATUS)
 #define FD_EV_STATUS_W  (FD_EV_STATUS << 4)
 
@@ -70,6 +76,16 @@
 #define FD_EV_READY_W   (FD_EV_READY << 4)
 #define FD_EV_READY_RW  (FD_EV_READY_R | FD_EV_READY_W)
 
+/* note that when FD_EV_SHUT is set, ACTIVE and READY are cleared */
+#define FD_EV_SHUT_R    (FD_EV_SHUT)
+#define FD_EV_SHUT_W    (FD_EV_SHUT << 4)
+#define FD_EV_SHUT_RW   (FD_EV_SHUT_R | FD_EV_SHUT_W)
+
+/* note that when FD_EV_ERR is set, SHUT is also set */
+#define FD_EV_ERR_R     (FD_EV_ERR)
+#define FD_EV_ERR_W     (FD_EV_ERR << 4)
+#define FD_EV_ERR_RW    (FD_EV_ERR_R | FD_EV_ERR_W)
+
 
 /* This is the value used to mark a file descriptor as dead. This value is
  * negative, this is important so that tests on fd < 0 properly match. It