[IOMultiplexerV2] fixed win32 EWOULDBLOCK error
[NextIRCd.git] / src / IOHandler / IOSockets.h
index f2d01e2afbe7f338f1dc74e9af7f3eeb5b6da04f..7ec23b33d33bdd8afe11a62b5a9cd4ac213f1cf4 100644 (file)
@@ -21,8 +21,8 @@
 #include "IODNSAddress.struct.h"
 
 struct IOSocketBuffer {
-    char *buffer;
-    size_t bufpos, buflen;
+       char *buffer;
+       size_t bufpos, buflen;
 };
 
 #ifndef _IOHandler_internals
@@ -37,13 +37,13 @@ struct _IODNSQuery;
 struct IODNSEvent;
 
 struct IOEngine {
-    const char *name;
-    int (*init)(void);
-    void (*add)(struct _IOSocket *iosock);
-    void (*remove)(struct _IOSocket *iosock);
-    void (*update)(struct _IOSocket *iosock);
-    void (*loop)(struct timeval *timeout);
-    void (*cleanup)(void);
+       const char *name;
+       int (*init)(void);
+       void (*add)(struct _IOSocket *iosock);
+       void (*remove)(struct _IOSocket *iosock);
+       void (*update)(struct _IOSocket *iosock);
+       void (*loop)(struct timeval *timeout);
+       void (*cleanup)(void);
 };
 
 /* IO Engines */
@@ -87,6 +87,9 @@ extern struct _IOSocket *iosocket_last;
 #define IOSOCKETFLAG_OVERRIDE_WANT_R  0x00100000
 #define IOSOCKETFLAG_OVERRIDE_WANT_W  0x00200000
 
+/* _IOSocket socket_flags */
+#define IOSOCKETFLAG_DYNAMIC_BIND     0x00400000
+
 /* Parent descriptors */
 #define IOSOCKETFLAG_PARENT_PUBLIC    0x10000000
 #define IOSOCKETFLAG_PARENT_DNSENGINE 0x20000000
@@ -101,7 +104,7 @@ struct IOSocketDNSLookup {
 };
 
 struct _IOSocket {
-    int fd;
+       int fd;
        
        unsigned int socket_flags : 32;
        
@@ -117,7 +120,7 @@ struct _IOSocket {
        unsigned int port : 16;
        
        struct IOSocketBuffer readbuf;
-    struct IOSocketBuffer writebuf;
+       struct IOSocketBuffer writebuf;
        
        struct IOSSLDescriptor *sslnode;
        
@@ -127,22 +130,18 @@ struct _IOSocket {
 };
 
 void _init_sockets();
+struct _IOSocket *_create_socket();
+void _free_socket(struct _IOSocket *iosock);
+void iosocket_activate(struct _IOSocket *iosock);
+void iosocket_deactivate(struct _IOSocket *iosock);
+void iosocket_update(struct _IOSocket *iosock);
+
 void iosocket_loop(int usec);
 void iosocket_lookup_callback(struct IOSocketDNSLookup *lookup, struct IODNSEvent *event);
 void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writeable);
 
-#define iosocket_wants_reads(IOSOCK) \
-(\
-       ((IOSOCK->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS)) && !(IOSOCK->socket_flags & IOSOCKETFLAG_SSL_WANTWRITE)) || \
-       (!(IOSOCK->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_RW) || \
-       (IOSOCK->socket_flags & (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_R) == (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_R)) \
-)\r
-#define iosocket_wants_writes(IOSOCK) \
-(\
-       (IOSOCK->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS | IOSOCKETFLAG_SSL_WANTWRITE) > IOSOCKETFLAG_SSL_WANTWRITE) || \
-       (!(IOSOCK->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_RW) && (IOSOCK->writebuf.bufpos || (IOSOCK->socket_flags & IOSOCKETFLAG_CONNECTING))) || \
-       (IOSOCK->socket_flags & (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_W) == (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_W)) \
-)
+int iosocket_wants_reads(struct _IOSocket *iosock);
+int iosocket_wants_writes(struct _IOSocket *iosock);
 
 #endif
 
@@ -152,29 +151,38 @@ struct IOSocketEvent;
 typedef IOSOCKET_CALLBACK(iosocket_callback);
 
 enum IOSocketStatus { 
-    IOSOCKET_CLOSED, /* descriptor is dead (socket waiting for removal or timer) */
-    IOSOCKET_LISTENING, /* descriptor is waiting for connections (server socket) */
-    IOSOCKET_CONNECTING, /* descriptor is waiting for connection approval (connecting client socket) */
-    IOSOCKET_CONNECTED, /* descriptor is connected (connected client socket) */
+       IOSOCKET_CLOSED, /* descriptor is dead (socket waiting for removal or timer) */
+       IOSOCKET_LISTENING, /* descriptor is waiting for connections (server socket) */
+       IOSOCKET_CONNECTING, /* descriptor is waiting for connection approval (connecting client socket) */
+       IOSOCKET_CONNECTED, /* descriptor is connected (connected client socket) */
        IOSOCKET_SSLHANDSHAKE /* descriptor is waiting for ssl (handshake) */
 };
 
 enum IOSocketEventType {
-    IOSOCKETEVENT_IGNORE,
-    IOSOCKETEVENT_RECV, /* client socket received something (read_lines == 1  =>  recv_str valid;  read_lines == 0  =>  recv_buf valid) */
-    IOSOCKETEVENT_CONNECTED, /* client socket connected successful */
-    IOSOCKETEVENT_NOTCONNECTED, /* client socket could not connect (errid valid) */
-    IOSOCKETEVENT_CLOSED, /* client socket lost connection (errid valid) */
-    IOSOCKETEVENT_ACCEPT, /* server socket accepted new connection (accept_socket valid) */
+       IOSOCKETEVENT_IGNORE,
+       IOSOCKETEVENT_RECV, /* client socket received something (read_lines == 1  =>  recv_str valid;  read_lines == 0  =>  recv_buf valid) */
+       IOSOCKETEVENT_CONNECTED, /* client socket connected successful */
+       IOSOCKETEVENT_NOTCONNECTED, /* client socket could not connect (errid valid) */
+       IOSOCKETEVENT_CLOSED, /* client socket lost connection (errid valid) */
+       IOSOCKETEVENT_ACCEPT, /* server socket accepted new connection (accept_socket valid) */
        IOSOCKETEVENT_DNSFAILED /* failed to lookup DNS information (recv_str contains error message) */
 };
 
+#define IOSOCKET_ADDR_IPV4 0x01
+#define IOSOCKET_ADDR_IPV6 0x02 /* overrides IOSOCKET_ADDR_IPV4 */
+#define IOSOCKET_PROTO_UDP 0x04
+
+#if !defined IOSOCKET_CPP
 struct IOSocket {
        void *iosocket;
        
+       struct IODNSAddress *remoteaddr;
+       struct IODNSAddress *localaddr;
+       
        enum IOSocketStatus status;
        int listening : 1;
        int ssl : 1;
+       int ipv6 : 1;
        int parse_delimiter : 1;
        int parse_empty : 1; /* parse "empty" lines (only if parse_delimiter is set) */
        unsigned char delimiters[IOSOCKET_PARSE_DELIMITERS_COUNT];
@@ -184,21 +192,16 @@ struct IOSocket {
 };
 
 struct IOSocketEvent {
-    enum IOSocketEventType type;
-    struct IOSocket *socket;
-    union {
-        char *recv_str;
+       enum IOSocketEventType type;
+       struct IOSocket *socket;
+       union {
+               char *recv_str;
                struct IOSocketBuffer *recv_buf;
-        int errid;
-        struct IOSocket *accept_socket;
-    } data;
+               int errid;
+               struct IOSocket *accept_socket;
+       } data;
 };
 
-
-#define IOSOCKET_ADDR_IPV4 0x01
-#define IOSOCKET_ADDR_IPV6 0x02 /* overrides IOSOCKET_ADDR_IPV4 */
-#define IOSOCKET_PROTO_UDP 0x04
-
 struct IOSocket *iosocket_connect(const char *hostname, unsigned int port, int ssl, const char *bindhost, iosocket_callback *callback);
 struct IOSocket *iosocket_connect_flags(const char *hostname, unsigned int port, int ssl, const char *bindhost, iosocket_callback *callback, int flags);
 struct IOSocket *iosocket_listen(const char *hostname, unsigned int port, iosocket_callback *callback);
@@ -210,4 +213,8 @@ void iosocket_send(struct IOSocket *iosocket, const char *data, size_t datalen);
 void iosocket_printf(struct IOSocket *iosocket, const char *text, ...);
 void iosocket_close(struct IOSocket *iosocket);
 
+struct IODNSAddress *iosocket_get_remote_addr(struct IOSocket *iosocket);
+struct IODNSAddress *iosocket_get_local_addr(struct IOSocket *iosocket);
+
+#endif
 #endif