- assert(v6->sin6_family == AF_INET6);
- memcpy(&irc->addr.in6_16[0], &v6->sin6_addr, sizeof(v6->sin6_addr));
- irc->port = ntohs(v6->sin6_port);
+ if (v6->sin6_family == AF_INET6) {
+ memcpy(&irc->addr.in6_16[0], &v6->sin6_addr, sizeof(v6->sin6_addr));
+ irc->port = ntohs(v6->sin6_port);
+ }
+ else if (v6->sin6_family == AF_INET) {
+ const struct sockaddr_in *v4 = (const struct sockaddr_in*)v6;
+ memset(&irc->addr, 0, 5*sizeof(int16_t));
+ irc->addr.in6_16[5] = 0xffff;
+ memcpy(&irc->addr.in6_16[6], &v4->sin_addr, sizeof(v4->sin_addr));
+ irc->port = ntohs(v4->sin_port);
+ }
+ else assert(0 && "Unhandled native address family");