bool add_conn(struct io_conn *c);
bool add_duplex(struct io_conn *c);
void del_listener(struct io_listener *l);
+void cleanup_conn_without_close(struct io_conn *c);
void backend_new_always(struct io_conn *conn);
void backend_new_plan(struct io_conn *conn);
void remove_from_always(struct io_conn *conn);
return io_close(conn);
}
+struct io_plan *io_close_taken_fd(struct io_conn *conn)
+{
+ set_blocking(conn->fd.fd, true);
+
+ cleanup_conn_without_close(conn);
+ return io_close(conn);
+}
+
/* Exit the loop, returning this (non-NULL) arg. */
void io_break(const void *ret)
{
/**
* io_close_taken_fd - close a connection, but remove the filedescriptor first.
- * @conn: the connection to take the file descriptor from and close,
+ * @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)
* {
* 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);
return true;
}
-struct io_plan *io_close_taken_fd(struct io_conn *conn)
+void cleanup_conn_without_close(struct io_conn *conn)
{
tal_del_destructor(conn, destroy_conn_close_fd);
destroy_conn(conn, false);
- return io_close(conn);
}
static void accept_conn(struct io_listener *l)