-#define io_new_conn(fd, plan, finish, arg) \
- (io_plan_other(), io_new_conn_((fd), (plan), \
- typesafe_cb_preargs(void, void *, \
- (finish), (arg), \
- struct io_conn *), \
- (arg)))
-struct io_conn *io_new_conn_(int fd,
- struct io_plan plan,
- void (*finish)(struct io_conn *, void *),
- void *arg);
+#define io_new_conn(fd, plan) \
+ (io_plan_other(), io_new_conn_((fd), (plan)))
+struct io_conn *io_new_conn_(int fd, struct io_plan plan);
+
+/**
+ * io_set_finish - set finish function on a connection.
+ * @conn: the connection.
+ * @finish: the function to call when it's closed or fails.
+ * @arg: the argument to @finish.
+ *
+ * @finish will be called when an I/O operation fails, or you call
+ * io_close() on the connection.
+ */
+#define io_set_finish(conn, finish, arg) \
+ io_set_finish_((conn), \
+ typesafe_cb_preargs(void, void *, \
+ (finish), (arg), \
+ struct io_conn *), \
+ (arg))
+void io_set_finish_(struct io_conn *conn,
+ void (*finish)(struct io_conn *, void *),
+ void *arg);