[IOMultiplexer] Added asynchronous DNS Lookups
[IOMultiplexer.git] / src / IOHandler.h
index 208b854b79e52567b22c786a6806eaca922098b4..b52f55260bc043f6ab8bf213114c45d6315d1568 100644 (file)
@@ -27,6 +27,8 @@ struct timeval;
 struct IODescriptor;
 struct IOEvent;
 struct IOSSLNode;
+struct IODNSQuery;
+struct IODNSEvent;
 
 enum IOLogType {
     IOLOG_DEBUG,
@@ -52,6 +54,7 @@ enum IOType {
 };
 
 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) */
@@ -66,9 +69,14 @@ enum IOEventType {
     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 {
@@ -76,23 +84,29 @@ 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 {
@@ -100,15 +114,30 @@ 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, ...);
@@ -117,5 +146,6 @@ void iohandler_update(struct IODescriptor *iofd);
 void iohandler_set_timeout(struct IODescriptor *iofd, struct timeval *timeout);
 
 void iohandler_poll();
+void iohandler_poll_timeout(struct timeval timeout);
 
 #endif