* @arg: the argument to @init.
*
* When @fd becomes readable, we accept(), create a new connection,
- * (tal'ocated off @ctx) and pass that to init().
+ * (tal'ocated off @ctx) and pass that to init(). Note that if there is
+ * an error on this file descriptor, it will be freed.
*
* Returns NULL on error (and sets errno).
*
*/
struct io_plan *io_close_cb(struct io_conn *, void *unused);
+/**
+ * io_close_taken_fd - close a connection, but remove the filedescriptor first.
+ * @conn: the connection to take the file descriptor from and close.
+ *
+ * io_close closes the file descriptor underlying the io_conn; this version does
+ * not. Presumably you have used io_conn_fd() on it beforehand and will take
+ * care of the fd yourself.
+ *
+ * Note that this also turns off O_NONBLOCK on the fd.
+ *
+ * Example:
+ * static struct io_plan *steal_fd(struct io_conn *conn, int *fd)
+ * {
+ * *fd = io_conn_fd(conn);
+ * printf("stealing fd %i and closing\n", *fd);
+ * return io_close_taken_fd(conn);
+ * }
+ */
+struct io_plan *io_close_taken_fd(struct io_conn *conn);
+
/**
* io_loop - process fds until all closed on io_break.
* @timers - timers which are waiting to go off (or NULL for none)
* io_conn_fd - get the fd from a connection.
* @conn: the connection.
*
- * Sometimes useful, eg for getsockname().
+ * Sometimes useful, eg for getsockname(). Note that the fd is O_NONBLOCK.
+ *
+ * See Also:
+ * io_close_taken_fd
*/
int io_conn_fd(const struct io_conn *conn);
+/**
+ * io_flush_sync - (synchronously) complete any outstanding output.
+ * @conn: the connection.
+ *
+ * This is generally used as an emergency escape, for example when we
+ * want to write an error message on a socket before terminating, but it may
+ * be in the middle of existing I/O. We don't want to service any other
+ * IO, either.
+ *
+ * This returns true if all pending output is complete, false on error.
+ * The next callback is not called on the conn, but will be as soon as
+ * io_loop() is called.
+ *
+ * See Also:
+ * io_close_taken_fd
+ */
+bool io_flush_sync(struct io_conn *conn);
+
/**
* io_time_override - override the normal call for time.
* @nowfn: the function to call.