X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FIOHandler%2FIOSockets.h;h=7ec23b33d33bdd8afe11a62b5a9cd4ac213f1cf4;hb=0f7daad2c06bc06a9d66fc5d6b6e65585b767866;hp=f2d01e2afbe7f338f1dc74e9af7f3eeb5b6da04f;hpb=6d94611a64ceef3401522a0ad404facd82146315;p=NextIRCd.git diff --git a/src/IOHandler/IOSockets.h b/src/IOHandler/IOSockets.h index f2d01e2..7ec23b3 100644 --- a/src/IOHandler/IOSockets.h +++ b/src/IOHandler/IOSockets.h @@ -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)) \ -) -#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