# HG changeset patch # User Timo Sirainen # Date 1160929157 -10800 # Node ID 4f1df4b905005dc0af2b1d706cb3ef07bfb4ab5e # Parent b60a8aec99ed88b9050e6a1abb6e04ec8edd159a Added net_ipv6_mapped_ipv4_convert(). diff -r b60a8aec99ed -r 4f1df4b90500 src/lib/network.c --- a/src/lib/network.c Sun Oct 15 18:55:00 2006 +0300 +++ b/src/lib/network.c Sun Oct 15 19:19:17 2006 +0300 @@ -570,6 +570,25 @@ return 0; } +int net_ipv6_mapped_ipv4_convert(const struct ip_addr *src, + struct ip_addr *dest) +{ +#ifdef HAVE_IPV6 + if (!IPADDR_IS_V6(src)) + return -1; + if (src->ip.in6_u.u6_addr32[0] != 0 || + src->ip.in6_u.u6_addr32[1] != 0 || + src->ip.in6_u.u6_addr32[2] != 0xffff0000) + return -1; + + dest->family = AF_INET; + memcpy(&dest->ip, &src->ip.in6_u.u6_addr32[3], 4); + return 0; +#else + return -1; +#endif +} + /* Get socket error */ int net_geterror(int fd) { diff -r b60a8aec99ed -r 4f1df4b90500 src/lib/network.h --- a/src/lib/network.h Sun Oct 15 18:55:00 2006 +0300 +++ b/src/lib/network.h Sun Oct 15 19:19:17 2006 +0300 @@ -93,6 +93,10 @@ const char *net_ip2addr(const struct ip_addr *ip); /* char* -> struct ip_addr translation. */ int net_addr2ip(const char *addr, struct ip_addr *ip); +/* Convert IPv6 mapped IPv4 address to an actual IPv4 address. Returns 0 if + successful, -1 if the source address isn't IPv6 mapped IPv4 address. */ +int net_ipv6_mapped_ipv4_convert(const struct ip_addr *src, + struct ip_addr *dest); /* Get socket error */ int net_geterror(int fd);