X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fio%2Fio.c;h=734cb3939636acbf0922362915c5c804bcc2cb97;hp=faf8b87bfd649b7244e8ee01087651d1039dbbf5;hb=12ab811533406e22b78ce8b227474f1056375ae4;hpb=075120f34490f1b7c55a4ebdc70bbcff17e55a84 diff --git a/ccan/io/io.c b/ccan/io/io.c index faf8b87b..734cb393 100644 --- a/ccan/io/io.c +++ b/ccan/io/io.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -232,6 +231,26 @@ bool io_timeout_(struct io_conn *conn, struct timespec ts, return true; } +/* Always done: call the next thing. */ +static int do_always(int fd, struct io_plan *plan) +{ + return 1; +} + +struct io_plan io_always_(struct io_plan (*cb)(struct io_conn *, void *), + void *arg) +{ + struct io_plan plan; + + assert(cb); + plan.io = do_always; + plan.next = cb; + plan.next_arg = arg; + plan.pollflag = POLLALWAYS; + + return plan; +} + /* Returns true if we're finished. */ static int do_write(int fd, struct io_plan *plan) { @@ -252,6 +271,10 @@ struct io_plan io_write_(const void *data, size_t len, struct io_plan plan; assert(cb); + + if (len == 0) + return io_always_(cb, arg); + plan.u1.const_vp = data; plan.u2.s = len; plan.io = do_write; @@ -281,11 +304,16 @@ struct io_plan io_read_(void *data, size_t len, struct io_plan plan; assert(cb); + + if (len == 0) + return io_always_(cb, arg); + plan.u1.cp = data; plan.u2.s = len; plan.io = do_read; plan.next = cb; plan.next_arg = arg; + plan.pollflag = POLLIN; return plan; @@ -309,6 +337,10 @@ struct io_plan io_read_partial_(void *data, size_t *len, struct io_plan plan; assert(cb); + + if (*len == 0) + return io_always_(cb, arg); + plan.u1.cp = data; plan.u2.vp = len; plan.io = do_read_partial; @@ -337,6 +369,10 @@ struct io_plan io_write_partial_(const void *data, size_t *len, struct io_plan plan; assert(cb); + + if (*len == 0) + return io_always_(cb, arg); + plan.u1.const_vp = data; plan.u2.vp = len; plan.io = do_write_partial;