]> git.ozlabs.org Git - ccan/blobdiff - ccan/io/poll.c
ccan/io: save errno on io_close, for finish functions.
[ccan] / ccan / io / poll.c
index 06e3b59104d0f4e4d9d010e86109f31d59af7c04..3ed6321bc7f4a0309ca2c2a55f41ab17ae328511 100644 (file)
@@ -7,6 +7,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <limits.h>
+#include <errno.h>
 
 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);