/* This function is copied directly from the * apr_sockaddr_ip_get() function and modified to take a static * buffer instead of needing to malloc memory from a pool */ APR_DECLARE(apr_status_t) apr_sockaddr_ip_buffer_get(char *addr, int len, apr_sockaddr_t *sockaddr) { if(!sockaddr || !addr || len < sockaddr->addr_str_len) { return APR_EINVAL; } /* this function doesn't malloc memory from the sockaddr pool... * old code... *addr = apr_palloc(sockaddr->pool, sockaddr->addr_str_len); */ apr_inet_ntop(sockaddr->family, sockaddr->ipaddr_ptr, addr, sockaddr->addr_str_len); #if APR_HAVE_IPV6 if (sockaddr->family == AF_INET6 && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)sockaddr->ipaddr_ptr)) { /* This is an IPv4-mapped IPv6 address; drop the leading * part of the address string so we're left with the familiar * IPv4 format. */ /* use memmove since the memory areas overlap */ memmove( addr, addr+7, strlen(addr+7) + 1);/* +1 for \0 */ /* old code *addr += strlen("::ffff:"); */ } #endif return APR_SUCCESS; }
APR_DECLARE(apr_status_t) apr_sockaddr_ip_get(char **addr, apr_sockaddr_t *sockaddr) { *addr = apr_palloc(sockaddr->pool, sockaddr->addr_str_len); apr_inet_ntop(sockaddr->family, sockaddr->ipaddr_ptr, *addr, sockaddr->addr_str_len); #if APR_HAVE_IPV6 if (sockaddr->family == AF_INET6 && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)sockaddr->ipaddr_ptr)) { /* This is an IPv4-mapped IPv6 address; drop the leading * part of the address string so we're left with the familiar * IPv4 format. */ *addr += strlen("::ffff:"); } #endif return APR_SUCCESS; }