df168d9f2b696202265de7bec1c96f35e1b65bca
[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
13 /* Listeners create connections. */
14 struct io_listener {
15         struct fd fd;
16
17         /* These are for connections we create. */
18         void (*init)(int fd, void *arg);
19         void *arg;
20 };
21
22 struct io_timeout {
23         struct timer timer;
24         struct io_conn *conn;
25
26         struct io_plan (*next)(struct io_conn *, void *arg);
27         void *next_arg;
28 };
29
30 /* One connection per client. */
31 struct io_conn {
32         struct fd fd;
33
34         void (*finish)(struct io_conn *, void *arg);
35         void *finish_arg;
36
37         struct io_conn *duplex;
38         struct io_timeout *timeout;
39
40         struct io_plan plan;
41 };
42
43 static inline bool timeout_active(const struct io_conn *conn)
44 {
45         return conn->timeout && conn->timeout->conn;
46 }
47
48 extern void *io_loop_return;
49
50 #ifdef DEBUG
51 extern struct io_conn *current;
52 static inline void set_current(struct io_conn *conn)
53 {
54         current = conn;
55 }
56 static inline bool doing_debug(void)
57 {
58         return io_debug_conn != NULL;
59 }
60 #else
61 static inline void set_current(struct io_conn *conn)
62 {
63 }
64 static inline bool doing_debug(void)
65 {
66         return false;
67 }
68 #endif
69
70 bool add_listener(struct io_listener *l);
71 bool add_conn(struct io_conn *c);
72 bool add_duplex(struct io_conn *c);
73 void del_listener(struct io_listener *l);
74 void backend_plan_changed(struct io_conn *conn);
75 void backend_add_timeout(struct io_conn *conn, struct timespec ts);
76 void backend_del_timeout(struct io_conn *conn);
77
78 void io_ready(struct io_conn *conn);
79 #endif /* CCAN_IO_BACKEND_H */