miniupnpd/getifaddr.c: clean up and fix getifaddr_in6()

This commit is contained in:
Thomas Bernard 2014-03-13 10:42:07 +01:00
parent 81fa1bcd57
commit 3ed3478398
1 changed files with 16 additions and 14 deletions

View File

@ -121,9 +121,13 @@ getifaddr(const char * ifname, char * buf, int len,
#ifdef ENABLE_PCP #ifdef ENABLE_PCP
/* XXX I don't know if this function should return /* XXX I don't know if this function should return
* IPv4 or IPv6 if both are enabled... */ * IPv4 or IPv6 if both are enabled... */
int getifaddr_in6(const char * ifname, struct in6_addr * addr){ int getifaddr_in6(const char * ifname, struct in6_addr * addr)
{
struct ifaddrs * ifap; struct ifaddrs * ifap;
struct ifaddrs * ife; struct ifaddrs * ife;
#ifdef ENABLE_IPV6
const struct sockaddr_in6 * tmpaddr;
#endif /* ENABLE_IPV6 */
int found = 0; int found = 0;
if(!ifname || ifname[0]=='\0') if(!ifname || ifname[0]=='\0')
@ -143,27 +147,25 @@ int getifaddr_in6(const char * ifname, struct in6_addr * addr){
switch(ife->ifa_addr->sa_family) switch(ife->ifa_addr->sa_family)
{ {
case AF_INET: case AF_INET:
#if 0 /* IPv4-mapped IPv6 address ::ffff:1.2.3.4 */
addr->s6_addr32[0]=0;
addr->s6_addr32[1]=0;
addr->s6_addr32[2]=htonl(0xffff);
addr->s6_addr32[3]=((struct sockaddr_in *)ife->ifa_addr)->sin_addr.s_addr;
#endif
memset(addr->s6_addr, 0, 10); memset(addr->s6_addr, 0, 10);
addr->s6_addr[10] = 0xff; addr->s6_addr[10] = 0xff;
addr->s6_addr[11] = 0xff; addr->s6_addr[11] = 0xff;
memcpy(addr->s6_addr + 12, &(((struct sockaddr_in *)ife->ifa_addr)->sin_addr.s_addr), 4); memcpy(addr->s6_addr + 12,
/*inet_ntop(ife->ifa_addr->sa_family, &(((struct sockaddr_in *)ife->ifa_addr)->sin_addr.s_addr),
&((struct sockaddr_in *)ife->ifa_addr)->sin_addr, 4);
buf, len);*/
found = 1; found = 1;
break; break;
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
case AF_INET6: case AF_INET6:
if(!IN6_IS_ADDR_LOOPBACK(addr) tmpaddr = (const struct sockaddr_in6 *)ife->ifa_addr;
&& !IN6_IS_ADDR_LINKLOCAL(addr)) { if(!IN6_IS_ADDR_LOOPBACK(&tmpaddr->sin6_addr)
memcpy(addr->s6_addr, &((struct sockaddr_in6 *)ife->ifa_addr)->sin6_addr, 16); && !IN6_IS_ADDR_LINKLOCAL(&tmpaddr->sin6_addr))
{
memcpy(addr->s6_addr,
&tmpaddr->sin6_addr,
16);
found = 1; found = 1;
} }
break; break;