X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Fpoll.c;h=3ed6321bc7f4a0309ca2c2a55f41ab17ae328511;hb=7bfb7a1cf4f7c5eaf4081ef7128b7fc7d1cf926e;hp=06e3b59104d0f4e4d9d010e86109f31d59af7c04;hpb=3a7b8a8a8081ebbb6457527de376dec6264bc381;p=ccan diff --git a/ccan/io/poll.c b/ccan/io/poll.c index 06e3b591..3ed6321b 100644 --- a/ccan/io/poll.c +++ b/ccan/io/poll.c @@ -7,6 +7,7 @@ #include #include #include +#include static size_t num_fds = 0, max_fds = 0, num_closing = 0, num_waiting = 0; static struct pollfd *pollfds = NULL; @@ -173,8 +174,10 @@ bool add_duplex(struct io_conn *c) static void del_conn(struct io_conn *conn) { - if (conn->finish) + if (conn->finish) { + errno = conn->plan.u.close.saved_errno; conn->finish(conn, conn->finish_arg); + } if (timeout_active(conn)) backend_del_timeout(conn); free(conn->timeout); @@ -338,9 +341,10 @@ void *io_loop(void) /* debug can recurse; anything can change. */ if (doing_debug()) break; - } else if (events & POLLHUP) { + } else if (events & (POLLHUP|POLLNVAL|POLLERR)) { r--; set_current(c); + errno = EBADF; set_plan(c, io_close()); if (c->duplex) { set_current(c->duplex);