X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Fio.h;h=fe42b53736005c4459c3b56afbbaa87ffe46f04a;hb=d00c9d1be5a56fbf990882f9a6da5704b3f1ea75;hp=8efc0024c9d230a580bd7838de4d7ad30503e381;hpb=17a81baf84a9c8f89603173be3169a0a2017702d;p=ccan diff --git a/ccan/io/io.h b/ccan/io/io.h index 8efc0024..fe42b537 100644 --- a/ccan/io/io.h +++ b/ccan/io/io.h @@ -109,7 +109,8 @@ void io_set_finish_(struct io_conn *conn, * @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). * @@ -629,12 +630,14 @@ 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, + * @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) * { @@ -663,10 +666,31 @@ void *io_loop(struct timers *timers, struct timer **expired); * 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.