X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FIOHandler%2FIOSockets.h;h=7ec23b33d33bdd8afe11a62b5a9cd4ac213f1cf4;hb=0f7daad2c06bc06a9d66fc5d6b6e65585b767866;hp=2d8dd7738fac1acd0dc6beeff97f90d911a323a9;hpb=2c089146f08538afd3a83998ba37cbb6dd2c8f6e;p=NextIRCd.git diff --git a/src/IOHandler/IOSockets.h b/src/IOHandler/IOSockets.h index 2d8dd77..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 */ @@ -58,27 +58,42 @@ extern struct _IOSocket *iosocket_first; extern struct _IOSocket *iosocket_last; /* _IOSocket socket_flags */ -#define IOSOCKETFLAG_ACTIVE 0x0001 -#define IOSOCKETFLAG_LISTENING 0x0002 -#define IOSOCKETFLAG_PENDING_BINDDNS 0x0004 -#define IOSOCKETFLAG_PENDING_DESTDNS 0x0008 -#define IOSOCKETFLAG_DNSDONE_BINDDNS 0x0010 -#define IOSOCKETFLAG_DNSDONE_DESTDNS 0x0020 -#define IOSOCKETFLAG_DNSERROR 0x0040 -#define IOSOCKETFLAG_IPV6SOCKET 0x0080 -#define IOSOCKETFLAG_PARENT_PUBLIC 0x0100 -#define IOSOCKETFLAG_PARENT_DNSENGINE 0x0200 -#define IOSOCKETFLAG_SSLSOCKET 0x0400 /* use ssl after connecting */ -#define IOSOCKETFLAG_SSL_HANDSHAKE 0x0800 /* SSL Handshake in progress */ -#define IOSOCKETFLAG_SSL_WANTWRITE 0x1000 -#define IOSOCKETFLAG_SSL_READHS 0x2000 /* ssl read rehandshake */ -#define IOSOCKETFLAG_SSL_WRITEHS 0x4000 /* ssl write rehandshake */ -#define IOSOCKETFLAG_SSL_ESTABLISHED 0x8000 -#define IOSOCKETFLAG_SHUTDOWN 0x10000 /* disconnect pending */ -#define IOSOCKETFLAG_CONNECTING 0x20000 -#define IOSOCKETFLAG_INCOMING 0x40000 /* incoming (accepted) connection */ -#define IOSOCKETFLAG_DEAD 0x80000 -#define IOSOCKETFLAG_RECONNECT_IPV4 0x100000 /* possible fallback to ipv4 connect if ipv6 fails */ +#define IOSOCKETFLAG_ACTIVE 0x00000001 +#define IOSOCKETFLAG_LISTENING 0x00000002 +#define IOSOCKETFLAG_IPV6SOCKET 0x00000004 +#define IOSOCKETFLAG_INCOMING 0x00000008 /* incoming (accepted) connection */ +#define IOSOCKETFLAG_CONNECTING 0x00000010 +#define IOSOCKETFLAG_SHUTDOWN 0x00000020 /* disconnect pending */ +#define IOSOCKETFLAG_DEAD 0x00000040 /* socket dead (disconnected) */ +#define IOSOCKETFLAG_RECONNECT_IPV4 0x00000080 /* possible fallback to ipv4 connect if ipv6 fails */ + +/* DNS Flags */ +#define IOSOCKETFLAG_PENDING_BINDDNS 0x00000100 +#define IOSOCKETFLAG_PENDING_DESTDNS 0x00000200 +#define IOSOCKETFLAG_DNSDONE_BINDDNS 0x00000400 +#define IOSOCKETFLAG_DNSDONE_DESTDNS 0x00000800 +#define IOSOCKETFLAG_DNSERROR 0x00001000 + +/* SSL Flags */ +#define IOSOCKETFLAG_SSLSOCKET 0x00002000 /* use ssl after connecting */ +#define IOSOCKETFLAG_SSL_HANDSHAKE 0x00004000 /* SSL Handshake in progress */ +#define IOSOCKETFLAG_SSL_WANTWRITE 0x00008000 /* ssl module wants write access */ +#define IOSOCKETFLAG_SSL_READHS 0x00010000 /* ssl read rehandshake */ +#define IOSOCKETFLAG_SSL_WRITEHS 0x00020000 /* ssl write rehandshake */ +#define IOSOCKETFLAG_SSL_ESTABLISHED 0x00040000 /* ssl connection established */ + +/* WANT_READ / WANT_WRITE override */ +#define IOSOCKETFLAG_OVERRIDE_WANT_RW 0x00080000 +#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 +/* reserved flags for additional descriptor types? */ struct IOSocketDNSLookup { unsigned int bindlookup : 1; @@ -89,9 +104,9 @@ struct IOSocketDNSLookup { }; struct _IOSocket { - int fd; + int fd; - unsigned int socket_flags : 24; + unsigned int socket_flags : 32; struct { struct IODNSAddress addr; @@ -105,7 +120,7 @@ struct _IOSocket { unsigned int port : 16; struct IOSocketBuffer readbuf; - struct IOSocketBuffer writebuf; + struct IOSocketBuffer writebuf; struct IOSSLDescriptor *sslnode; @@ -115,11 +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_writes(IOSOCK) ((IOSOCK->writebuf.bufpos && !(IOSOCK->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS))) || (IOSOCK->socket_flags & (IOSOCKETFLAG_CONNECTING | IOSOCKETFLAG_SSL_WANTWRITE))) + +int iosocket_wants_reads(struct _IOSocket *iosock); +int iosocket_wants_writes(struct _IOSocket *iosock); #endif @@ -129,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]; @@ -161,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); @@ -187,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