-#ifdef HAVE_GETNAMEINFO
- char sz_ip[INET6_ADDRSTRLEN + 2];
- int i;
-
- if( (cl->sock.ss_family == AF_INET6) &&
- IN6_IS_ADDR_V4MAPPED( &((const struct sockaddr_in6 *)
- &cl->sock)->sin6_addr) )
- {
- /* If client is using IPv4 but server is using IPv6 */
- struct sockaddr_in a;
-
- memset( &a, 0, sizeof( a ) );
- a.sin_family = AF_INET;
- a.sin_port = ((const struct sockaddr_in6 *)&cl->sock)->sin6_port;
- a.sin_addr.s_addr = ((const uint32_t *)&((const struct sockaddr_in6 *)
- &cl->sock)->sin6_addr)[3];
- i = getnameinfo( (const struct sockaddr *)&a, sizeof( a ),
- &sz_ip[1], INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST );
- }
- else
- i = getnameinfo( (const struct sockaddr *)&cl->sock, cl->i_sock_size,
- &sz_ip[1], INET6_ADDRSTRLEN, NULL, 0,
- NI_NUMERICHOST );
-
- if( i != 0 )
- /* FIXME: msg_Err */
- return NULL;
-
- if( strchr( &sz_ip[1], ':' ) != NULL )
- {
- *sz_ip = '[';
- i = strlen( sz_ip );
- sz_ip[i++] = ']';
- sz_ip[i] = '\0';
-
- return strdup( sz_ip );
- }
-
- return strdup( &sz_ip[1] );