1 /* IOHandler.h - IOMultiplexer
2 * Copyright (C) 2012 Philipp Kreil (pk910)
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <sys/time.h> /* struct timeval */
22 #define IO_READ_BUFLEN 1024
23 #define IO_MAX_TIMEOUT 10
24 #define IO_LINE_LEN 1024
38 #define IOHANDLER_CALLBACK(NAME) void NAME(struct IOEvent *event)
39 typedef IOHANDLER_CALLBACK(iohandler_callback);
41 #define IOHANDLER_LOG_BACKEND(NAME) void NAME(enum IOLogType type, const char *line)
42 typedef IOHANDLER_LOG_BACKEND(iohandler_log_callback);
44 extern iohandler_log_callback *iolog_backend;
47 IOTYPE_UNKNOWN, /* ignore descriptor (uninitialized) */
48 IOTYPE_SERVER, /* server socket */
49 IOTYPE_CLIENT, /* client socket */
50 IOTYPE_STDIN, /* stdin */
51 IOTYPE_TIMER /* timer */
55 IO_CLOSED, /* descriptor is dead (socket waiting for removal or timer) */
56 IO_LISTENING, /* descriptor is waiting for connections (server socket) */
57 IO_CONNECTING, /* descriptor is waiting for connection approval (connecting client socket) */
58 IO_CONNECTED, /* descriptor is connected (connected client socket) */
59 IO_SSLWAIT /* waiting for SSL backend (e.g. handshake) */
64 IOEVENT_READABLE, /* socket is readable - not read anything yet, could also be disconnect notification */
65 IOEVENT_RECV, /* client socket received something (recv_str valid) */
66 IOEVENT_CONNECTED, /* client socket connected successful */
67 IOEVENT_NOTCONNECTED, /* client socket could not connect (errid valid) */
68 IOEVENT_CLOSED, /* client socket lost connection (errid valid) */
69 IOEVENT_ACCEPT, /* server socket accepted new connection (accept_fd valid) */
70 IOEVENT_SSLACCEPT, /* SSL server socket accepted new connection (accept_iofd valid) */
71 IOEVENT_TIMEOUT, /* timer timed out */
72 IOEVENT_SSLFAILED /* failed to initialize SSL session */
77 size_t bufpos, buflen;
84 struct timeval timeout;
85 iohandler_callback *callback;
86 struct IOBuffer readbuf;
87 struct IOBuffer writebuf;
91 int ssl_server_hs : 1;
95 struct IOSSLNode *sslnode;
97 struct IODescriptor *next, *prev;
101 enum IOEventType type;
102 struct IODescriptor *iofd;
107 struct IODescriptor *accept_iofd;
111 #define IOHANDLER_LISTEN_IPV4 0x01
112 #define IOHANDLER_LISTEN_IPV6 0x02 /* overrides IOHANDLER_LISTEN_IPV4 */
114 #define IOHANDLER_CONNECT_IPV4 0x01
115 #define IOHANDLER_CONNECT_IPV6 0x02 /* overrides IOHANDLER_CONNECT_IPV4 */
117 struct IODescriptor *iohandler_add(int sockfd, enum IOType type, struct timeval *timeout, iohandler_callback *callback);
118 struct IODescriptor *iohandler_timer(struct timeval timeout, iohandler_callback *callback);
119 struct IODescriptor *iohandler_connect(const char *hostname, unsigned int port, int ssl, const char *bind, iohandler_callback *callback);
120 struct IODescriptor *iohandler_connect_flags(const char *hostname, unsigned int port, int ssl, const char *bindhost, iohandler_callback *callback, int flags);
121 struct IODescriptor *iohandler_listen(const char *hostname, unsigned int port, iohandler_callback *callback);
122 struct IODescriptor *iohandler_listen_flags(const char *hostname, unsigned int port, iohandler_callback *callback, int flags);
123 struct IODescriptor *iohandler_listen_ssl(const char *hostname, unsigned int port, const char *certfile, const char *keyfile, iohandler_callback *callback);
124 struct IODescriptor *iohandler_listen_ssl_flags(const char *hostname, unsigned int port, const char *certfile, const char *keyfile, iohandler_callback *callback, int flags);
125 void iohandler_write(struct IODescriptor *iofd, const char *line);
126 void iohandler_send(struct IODescriptor *iofd, const char *data, size_t datalen);
127 void iohandler_printf(struct IODescriptor *iofd, const char *text, ...);
128 void iohandler_close(struct IODescriptor *iofd);
129 void iohandler_update(struct IODescriptor *iofd);
130 void iohandler_set_timeout(struct IODescriptor *iofd, struct timeval *timeout);
132 void iohandler_poll();
133 void iohandler_poll_timeout(struct timeval timeout);