struct IODescriptor;
struct IOEvent;
struct IOSSLNode;
+struct IODNSQuery;
+struct IODNSEvent;
enum IOLogType {
IOLOG_DEBUG,
};
enum IOStatus {
+ IO_PENDING, /* descriptor is initializing */
IO_CLOSED, /* descriptor is dead (socket waiting for removal or timer) */
IO_LISTENING, /* descriptor is waiting for connections (server socket) */
IO_CONNECTING, /* descriptor is waiting for connection approval (connecting client socket) */
IOEVENT_CONNECTED, /* client socket connected successful */
IOEVENT_NOTCONNECTED, /* client socket could not connect (errid valid) */
IOEVENT_CLOSED, /* client socket lost connection (errid valid) */
- IOEVENT_ACCEPT, /* server socket accepted new connection (accept_fd valid) */
+ IOEVENT_ACCEPT, /* server socket accepted new connection (accept_iofd valid) */
+ IOEVENT_SSLACCEPT, /* SSL server socket accepted new connection (accept_iofd valid) */
IOEVENT_TIMEOUT, /* timer timed out */
- IOEVENT_SSLFAILED /* failed to initialize SSL session */
+ IOEVENT_SSLFAILED, /* failed to initialize SSL session */
+ IOEVENT_DNS_FAILED,
+ IOEVENT_SOCKET_ERROR, /* socket() call failed (errid valid) */
+ IOEVENT_BIND_ERROR, /* bind() call failed (errid valid) */
+
};
struct IOBuffer {
size_t bufpos, buflen;
};
+struct IOLowlevelDescriptor;
+
struct IODescriptor {
- int fd;
+ union {
+ struct IOLowlevelDescriptor *iold;
+ struct IODescriptorStartup *iostartup;
+ } fd;
+ unsigned int flags; /* internal flags! see IOEngine.h */
enum IOType type;
enum IOStatus state;
- struct timeval timeout;
+ int constant_timeout;
iohandler_callback *callback;
struct IOBuffer readbuf;
struct IOBuffer writebuf;
void *data;
int read_lines : 1;
int ssl : 1;
+ int ssl_server_hs : 1;
int ssl_active : 1;
int ssl_hs_read : 1;
int ssl_hs_write : 1;
- struct IOSSLNode *sslnode;
-
- struct IODescriptor *next, *prev;
+ int iofd_free_lock : 1;
+ int iofd_want_free : 1;
};
struct IOEvent {
struct IODescriptor *iofd;
union {
char *recv_str;
- int accept_fd;
int errid;
+ struct IODescriptor *accept_iofd;
} data;
};
+#define IOHANDLER_LISTEN_IPV4 0x01
+#define IOHANDLER_LISTEN_IPV6 0x02 /* overrides IOHANDLER_LISTEN_IPV4 */
+
+#define IOHANDLER_CONNECT_IPV4 0x01
+#define IOHANDLER_CONNECT_IPV6 0x02 /* overrides IOHANDLER_CONNECT_IPV4 */
+
+#define IOHANDLER_SETTING_HIGH_PRECISION_TIMER 0x01
+
+void iohandler_set(int setting, int value);
+
struct IODescriptor *iohandler_add(int sockfd, enum IOType type, struct timeval *timeout, iohandler_callback *callback);
struct IODescriptor *iohandler_timer(struct timeval timeout, iohandler_callback *callback);
+struct IODescriptor *iohandler_constant_timer(int msec, iohandler_callback *callback);
struct IODescriptor *iohandler_connect(const char *hostname, unsigned int port, int ssl, const char *bind, iohandler_callback *callback);
+struct IODescriptor *iohandler_connect_flags(const char *hostname, unsigned int port, int ssl, const char *bindhost, iohandler_callback *callback, int flags);
struct IODescriptor *iohandler_listen(const char *hostname, unsigned int port, iohandler_callback *callback);
+struct IODescriptor *iohandler_listen_flags(const char *hostname, unsigned int port, iohandler_callback *callback, int flags);
+struct IODescriptor *iohandler_listen_ssl(const char *hostname, unsigned int port, const char *certfile, const char *keyfile, iohandler_callback *callback);
+struct IODescriptor *iohandler_listen_ssl_flags(const char *hostname, unsigned int port, const char *certfile, const char *keyfile, iohandler_callback *callback, int flags);
void iohandler_write(struct IODescriptor *iofd, const char *line);
void iohandler_send(struct IODescriptor *iofd, const char *data, size_t datalen);
void iohandler_printf(struct IODescriptor *iofd, const char *text, ...);
void iohandler_set_timeout(struct IODescriptor *iofd, struct timeval *timeout);
void iohandler_poll();
+void iohandler_poll_timeout(struct timeval timeout);
#endif