From: pk910 Date: Sun, 20 Jul 2014 23:21:00 +0000 (+0200) Subject: Merge remote-tracking branch 'remotes/IOMultiplexer/v2' X-Git-Url: http://git.pk910.de/?p=NextIRCd.git;a=commitdiff_plain;h=20455ed400c62ab7c3f7e6e3c6422d155d98a748;hp=-c Merge remote-tracking branch 'remotes/IOMultiplexer/v2' --- 20455ed400c62ab7c3f7e6e3c6422d155d98a748 diff --combined src/IOHandler/IOSockets.c index a98dc5a,9344de5..d83d0fc --- a/src/IOHandler/IOSockets.c +++ b/src/IOHandler/IOSockets.c @@@ -486,6 -486,29 +486,29 @@@ static void iosocket_prepare_fd(int soc #endif } + static void iosocket_update_parent(struct _IOSocket *iosock) { + if((iosock->socket_flags & IOSOCKETFLAG_PARENT_PUBLIC)) { + struct IOSocket *iosocket = iosock->parent; + iosocket->ipv6 = ((iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET) ? 1 : 0); + if(!(iosock->socket_flags & IOSOCKETFLAG_LISTENING)) + iosocket->remoteaddr = &iosock->dest.addr; + iosocket->localaddr = &iosock->bind.addr; + if(iosock->bind.addr.addresslen && (iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) { + free(iosock->bind.addr.address); + iosock->bind.addr.addresslen = 0; + } + if(!iosock->bind.addr.addresslen) { + iosock->socket_flags |= IOSOCKETFLAG_DYNAMIC_BIND; + if(iosocket->ipv6) + iosock->bind.addr.addresslen = sizeof(struct sockaddr_in6); + else + iosock->bind.addr.addresslen = sizeof(struct sockaddr_in); + iosock->bind.addr.address = malloc(iosock->bind.addr.addresslen); + getsockname(iosock->fd, (struct sockaddr *)iosock->bind.addr.address, &iosock->bind.addr.addresslen); + } + } + } + static void iosocket_connect_finish(struct _IOSocket *iosock) { int sockfd; if((iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET)) @@@ -505,7 -528,7 +528,7 @@@ ip6->sin6_family = AF_INET6; ip6->sin6_port = htons(iosock->port); - if(iosock->bind.addr.addresslen) { + if(iosock->bind.addr.addresslen && !(iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) { struct sockaddr_in6 *ip6bind = (void*) iosock->bind.addr.address; ip6bind->sin6_family = AF_INET6; ip6bind->sin6_port = htons(0); @@@ -517,7 -540,7 +540,7 @@@ ip4->sin_family = AF_INET; ip4->sin_port = htons(iosock->port); - if(iosock->bind.addr.addresslen) { + if(iosock->bind.addr.addresslen && !(iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) { struct sockaddr_in *ip4bind = (void*) iosock->bind.addr.address; ip4bind->sin_family = AF_INET; ip4bind->sin_port = htons(0); @@@ -575,6 -598,7 +598,7 @@@ static void iosocket_listen_finish(stru listen(sockfd, 1); iosock->fd = sockfd; + iosocket_update_parent(iosock); iosocket_activate(iosock); } @@@ -641,6 -665,7 +665,7 @@@ struct _IOSocket *iosocket_accept_clien iosocket_increase_buffer(&iosock->readbuf, 1024); } + iosocket_update_parent(new_iosock); iosocket_activate(new_iosock); return new_iosock; } @@@ -800,32 -825,6 +825,32 @@@ void iosocket_close(struct IOSocket *io iogc_add(iosocket); } +struct IODNSAddress *iosocket_get_remote_addr(struct IOSocket *iosocket) { + struct _IOSocket *iosock = iosocket->iosocket; + if(iosock == NULL) { + iolog_trigger(IOLOG_WARNING, "called iosocket_get_remote_addr for destroyed IOSocket in %s:%d", __FILE__, __LINE__); + return NULL; + } + if(iosock->socket_flags & IOSOCKETFLAG_PENDING_DESTDNS) + return NULL; + if(!iosock->dest.addr.addresslen) + return NULL; + return &iosock->dest.addr; +} + +struct IODNSAddress *iosocket_get_local_addr(struct IOSocket *iosocket) { + struct _IOSocket *iosock = iosocket->iosocket; + if(iosock == NULL) { + iolog_trigger(IOLOG_WARNING, "called iosocket_get_local_addr for destroyed IOSocket in %s:%d", __FILE__, __LINE__); + return NULL; + } + if(iosock->socket_flags & IOSOCKETFLAG_PENDING_BINDDNS) + return NULL; + if(!iosock->bind.addr.addresslen) + return NULL; + return &iosock->bind.addr; +} + static int iosocket_try_write(struct _IOSocket *iosock) { if(!iosock->writebuf.bufpos && !(iosock->socket_flags & IOSOCKETFLAG_SSL_WRITEHS)) return 0; @@@ -1014,6 -1013,8 +1039,8 @@@ void iosocket_events_callback(struct _I callback_event.type = IOSOCKETEVENT_CONNECTED; engine->update(iosock); + iosocket_update_parent(iosock); + //initialize readbuf iosocket_increase_buffer(&iosock->readbuf, 1024); } diff --combined src/IOHandler/IOSockets.h index f804fb6,8a9048a..7ec23b3 --- a/src/IOHandler/IOSockets.h +++ b/src/IOHandler/IOSockets.h @@@ -87,6 -87,9 +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 @@@ -173,9 -176,13 +176,13 @@@ enum IOSocketEventType 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]; @@@ -206,8 -213,5 +213,8 @@@ void iosocket_send(struct IOSocket *ios 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