- assert(conn->state == IDLE);
- conn->fd.next = next;
- conn->fd.next_arg = arg;
- backend_set_state(conn, to_ioop(NEXT));
-}
-
-static struct io_op *do_next(struct io_conn *conn)
-{
- return conn->fd.next(conn, conn->fd.next_arg);
-}
-
-struct io_op *do_writeable(struct io_conn *conn)
-{
- ssize_t ret;
- bool finished;
-
- switch (conn->state) {
- case WRITE:
- ret = write(conn->fd.fd, conn->u.write.buf, conn->u.write.len);
- if (ret < 0)
- return io_close(conn, NULL);
- conn->u.write.buf += ret;
- conn->u.write.len -= ret;
- finished = (conn->u.write.len == 0);
- break;
- case WRITEPART:
- ret = write(conn->fd.fd, conn->u.writepart.buf,
- *conn->u.writepart.lenp);
- if (ret < 0)
- return io_close(conn, NULL);
- *conn->u.writepart.lenp = ret;
- finished = true;
- break;
- default:
- /* Shouldn't happen. */
- abort();
- }
+ /* It was idle, right? */
+ assert(!conn->plan.io);
+ conn->plan = plan;
+ backend_plan_changed(conn);
+}