ccan/io: put explicit poll flags in the plan.
[ccan] / ccan / io / backend.h
1 /* Licensed under LGPLv2.1+ - see LICENSE file for details */
2 #ifndef CCAN_IO_BACKEND_H
3 #define CCAN_IO_BACKEND_H
4 #include <stdbool.h>
5 #include <ccan/timer/timer.h>
6
7 struct fd {
8         int fd;
9         bool listener;
10         size_t backend_info;
11
12         struct io_plan *(*next)(struct io_conn *, void *arg);
13         void *next_arg;
14
15         void (*finish)(struct io_conn *, void *arg);
16         void *finish_arg;
17 };
18
19
20 /* Listeners create connections. */
21 struct io_listener {
22         struct fd fd;
23 };
24
25 enum io_state {
26         /* These wait for something to input */
27         READ,
28         READPART,
29
30         /* These wait for room to output */
31         WRITE,
32         WRITEPART,
33
34         NEXT, /* eg starting, woken from idle, return from io_break. */
35         IDLE,
36         FINISHED,
37         PROCESSING /* We expect them to change this now. */
38 };
39
40 static inline enum io_state from_ioplan(struct io_plan *op)
41 {
42         return (enum io_state)(long)op;
43 }
44
45 struct io_state_read {
46         char *buf;
47         size_t len;
48 };
49
50 struct io_state_write {
51         const char *buf;
52         size_t len;
53 };
54
55 struct io_state_readpart {
56         char *buf;
57         size_t *lenp;
58 };
59
60 struct io_state_writepart {
61         const char *buf;
62         size_t *lenp;
63 };
64
65 struct io_timeout {
66         struct timer timer;
67         struct io_conn *conn;
68
69         struct io_plan *(*next)(struct io_conn *, void *arg);
70         void *next_arg;
71 };
72
73 /* One connection per client. */
74 struct io_conn {
75         struct fd fd;
76
77         struct io_conn *duplex;
78         struct io_timeout *timeout;
79
80         int pollflag; /* 0, POLLIN or POLLOUT */
81         enum io_state state;
82         union {
83                 struct io_state_read read;
84                 struct io_state_write write;
85                 struct io_state_readpart readpart;
86                 struct io_state_writepart writepart;
87         } u;
88 };
89
90 static inline bool timeout_active(const struct io_conn *conn)
91 {
92         return conn->timeout && conn->timeout->conn;
93 }
94
95 extern void *io_loop_return;
96
97 bool add_listener(struct io_listener *l);
98 bool add_conn(struct io_conn *c);
99 bool add_duplex(struct io_conn *c);
100 void del_listener(struct io_listener *l);
101 void backend_set_state(struct io_conn *conn, struct io_plan *op);
102 void backend_add_timeout(struct io_conn *conn, struct timespec ts);
103 void backend_del_timeout(struct io_conn *conn);
104
105 struct io_plan *do_ready(struct io_conn *conn);
106 #endif /* CCAN_IO_BACKEND_H */