X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Fio.c;h=b74520444353761451529af0d0467522293f2686;hb=490b63852f281f0d72eb6f6dfa5e0dce36bcbe0d;hp=e2dd44430b79d0f3a0977a92861cb72a86f56df6;hpb=e40f5c50a7a930fc98974936b7366b498ebf984c;p=ccan diff --git a/ccan/io/io.c b/ccan/io/io.c index e2dd4443..b7452044 100644 --- a/ccan/io/io.c +++ b/ccan/io/io.c @@ -46,6 +46,12 @@ struct io_plan io_debug(struct io_plan plan) current->plan = plan; backend_plan_changed(current); + /* If it closed, close duplex. */ + if (!current->plan.next && current->duplex) { + current->duplex->plan = io_close_(); + backend_plan_changed(current->duplex); + } + /* Call back into the loop immediately. */ io_loop_return = do_io_loop(&ready); @@ -441,6 +447,14 @@ void io_ready(struct io_conn *conn) backend_plan_changed(conn); } set_current(NULL); + + /* If it closed, close duplex. */ + if (!conn->plan.next && conn->duplex) { + set_current(conn->duplex); + conn->duplex->plan = io_close(); + backend_plan_changed(conn->duplex); + set_current(NULL); + } } /* Close the connection, we're done. */ @@ -472,6 +486,11 @@ struct io_plan io_break_(void *ret, struct io_plan plan) return plan; } +int io_conn_fd(const struct io_conn *conn) +{ + return conn->fd.fd; +} + void io_set_alloc(void *(*allocfn)(size_t size), void *(*reallocfn)(void *ptr, size_t size), void (*freefn)(void *ptr))