From 869dc1528e64604e9264c6f12e0f2cb79bf3d79e Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 14 Oct 2013 21:31:18 +1030 Subject: [PATCH] ccan/io: simplify I/O callbacks. Use a -1 for error codes. This makes it easier to write your own io funcs. Signed-off-by: Rusty Russell --- ccan/io/io.c | 51 +++++++++++++++---------------- ccan/io/io.h | 2 +- ccan/io/test/run-17-homemade-io.c | 8 ++--- 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/ccan/io/io.c b/ccan/io/io.c index 70e4f1b5..1c0af6b9 100644 --- a/ccan/io/io.c +++ b/ccan/io/io.c @@ -151,14 +151,11 @@ bool io_timeout_(struct io_conn *conn, struct timespec ts, } /* Returns true if we're finished. */ -static bool do_write(int fd, struct io_plan *plan) +static int do_write(int fd, struct io_plan *plan) { ssize_t ret = write(fd, plan->u.write.buf, plan->u.write.len); - if (ret < 0) { - /* Override next function to close us. */ - plan->next = io_close; - return true; - } + if (ret < 0) + return -1; plan->u.write.buf += ret; plan->u.write.len -= ret; @@ -184,14 +181,11 @@ struct io_plan io_write_(const void *data, size_t len, return plan; } -static bool do_read(int fd, struct io_plan *plan) +static int do_read(int fd, struct io_plan *plan) { ssize_t ret = read(fd, plan->u.read.buf, plan->u.read.len); - if (ret <= 0) { - /* Override next function to close us. */ - plan->next = io_close; - return true; - } + if (ret <= 0) + return -1; plan->u.read.buf += ret; plan->u.read.len -= ret; @@ -217,17 +211,14 @@ struct io_plan io_read_(void *data, size_t len, return plan; } -static bool do_read_partial(int fd, struct io_plan *plan) +static int do_read_partial(int fd, struct io_plan *plan) { ssize_t ret = read(fd, plan->u.readpart.buf, *plan->u.readpart.lenp); - if (ret <= 0) { - /* Override next function to close us. */ - plan->next = io_close; - return true; - } + if (ret <= 0) + return -1; *plan->u.readpart.lenp = ret; - return true; + return 1; } /* Queue a partial request to read into a buffer. */ @@ -249,17 +240,14 @@ struct io_plan io_read_partial_(void *data, size_t *len, return plan; } -static bool do_write_partial(int fd, struct io_plan *plan) +static int do_write_partial(int fd, struct io_plan *plan) { ssize_t ret = write(fd, plan->u.writepart.buf, *plan->u.writepart.lenp); - if (ret < 0) { - /* Override next function to close us. */ - plan->next = io_close; - return true; - } + if (ret < 0) + return -1; *plan->u.writepart.lenp = ret; - return true; + return 1; } /* Queue a partial write request. */ @@ -310,7 +298,16 @@ void io_wake_(struct io_conn *conn, struct io_plan plan) void io_ready(struct io_conn *conn) { - if (conn->plan.io(conn->fd.fd, &conn->plan)) { + switch (conn->plan.io(conn->fd.fd, &conn->plan)) { + case -1: /* Failure means a new plan: close up. */ + set_current(conn); + conn->plan = io_close(NULL, NULL); + backend_plan_changed(conn); + set_current(NULL); + break; + case 0: /* Keep going with plan. */ + break; + case 1: /* Done: get next plan. */ set_current(conn); if (timeout_active(conn)) backend_del_timeout(conn); diff --git a/ccan/io/io.h b/ccan/io/io.h index 5820f877..105a9082 100644 --- a/ccan/io/io.h +++ b/ccan/io/io.h @@ -16,7 +16,7 @@ struct io_conn; struct io_plan { int pollflag; /* Only NULL if idle. */ - bool (*io)(int fd, struct io_plan *plan); + int (*io)(int fd, struct io_plan *plan); /* Only NULL if closing. */ struct io_plan (*next)(struct io_conn *, void *arg); void *next_arg; diff --git a/ccan/io/test/run-17-homemade-io.c b/ccan/io/test/run-17-homemade-io.c index 8b6f17ad..de7ce751 100644 --- a/ccan/io/test/run-17-homemade-io.c +++ b/ccan/io/test/run-17-homemade-io.c @@ -23,7 +23,7 @@ static void finish_ok(struct io_conn *conn, struct packet *pkt) io_break(pkt, io_idle()); } -static bool do_read_packet(int fd, struct io_plan *plan) +static int do_read_packet(int fd, struct io_plan *plan) { struct packet *pkt = plan->u.ptr_len.p; char *dest; @@ -41,7 +41,7 @@ static bool do_read_packet(int fd, struct io_plan *plan) ok1(pkt->state == 2); pkt->state++; if (pkt->len == 0) - return true; + return 1; if (!pkt->contents && !(pkt->contents = malloc(pkt->len))) goto fail; else { @@ -63,9 +63,7 @@ static bool do_read_packet(int fd, struct io_plan *plan) fail: free(pkt->contents); - /* Override next function to close us. */ - plan->next = io_close; - return true; + return -1; } static struct io_plan io_read_packet(struct packet *pkt, -- 2.39.2