1#include "base.h" 2#include "inet_ntop_cache.h" 3#include "sys-socket.h" 4 5#include <sys/types.h> 6 7#include <string.h> 8 9const char * inet_ntop_cache_get_ip(server *srv, sock_addr *addr) { 10#ifdef HAVE_IPV6 11 size_t ndx = 0, i; 12 for (i = 0; i < INET_NTOP_CACHE_MAX; i++) { 13 if (srv->inet_ntop_cache[i].ts != 0 && srv->inet_ntop_cache[i].family == addr->plain.sa_family) { 14 if (srv->inet_ntop_cache[i].family == AF_INET6 && 15 0 == memcmp(srv->inet_ntop_cache[i].addr.ipv6.s6_addr, addr->ipv6.sin6_addr.s6_addr, 16)) { 16 /* IPv6 found in cache */ 17 break; 18 } else if (srv->inet_ntop_cache[i].family == AF_INET && 19 srv->inet_ntop_cache[i].addr.ipv4.s_addr == addr->ipv4.sin_addr.s_addr) { 20 /* IPv4 found in cache */ 21 break; 22 23 } 24 } 25 } 26 27 if (i == INET_NTOP_CACHE_MAX) { 28 /* not found in cache */ 29 30 i = ndx; 31 inet_ntop(addr->plain.sa_family, 32 addr->plain.sa_family == AF_INET6 ? 33 (const void *) &(addr->ipv6.sin6_addr) : 34 (const void *) &(addr->ipv4.sin_addr), 35 srv->inet_ntop_cache[i].b2, INET6_ADDRSTRLEN); 36 37 srv->inet_ntop_cache[i].ts = srv->cur_ts; 38 srv->inet_ntop_cache[i].family = addr->plain.sa_family; 39 40 if (srv->inet_ntop_cache[i].family == AF_INET) { 41 srv->inet_ntop_cache[i].addr.ipv4.s_addr = addr->ipv4.sin_addr.s_addr; 42 } else if (srv->inet_ntop_cache[i].family == AF_INET6) { 43 memcpy(srv->inet_ntop_cache[i].addr.ipv6.s6_addr, addr->ipv6.sin6_addr.s6_addr, 16); 44 } 45 } 46 47 return srv->inet_ntop_cache[i].b2; 48#else 49 UNUSED(srv); 50 return inet_ntoa(addr->ipv4.sin_addr); 51#endif 52} 53