+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, (socklen_t *)&iosock->bind.addr.addresslen);
+ }
+ }
+}
+