diff options
Diffstat (limited to 'lib/sockunion.c')
-rw-r--r-- | lib/sockunion.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/sockunion.c b/lib/sockunion.c index cfd3bf9a..3052063f 100644 --- a/lib/sockunion.c +++ b/lib/sockunion.c @@ -225,6 +225,27 @@ sockunion_su2str (union sockunion *su) #endif /* HAVE_IPV6 */ } return XSTRDUP (MTYPE_TMP, str); +<<<<<<< HEAD:lib/sockunion.c +======= +} + +/* Convert IPv4 compatible IPv6 address to IPv4 address. */ +static void +sockunion_normalise_mapped (union sockunion *su) +{ + struct sockaddr_in sin; + +#ifdef HAVE_IPV6 + if (su->sa.sa_family == AF_INET6 + && IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) + { + memset (&sin, 0, sizeof (struct sockaddr_in)); + sin.sin_family = AF_INET; + memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); + memcpy (su, &sin, sizeof (struct sockaddr_in)); + } +#endif /* HAVE_IPV6 */ +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:lib/sockunion.c } /* Return socket of sockunion. */ @@ -253,6 +274,7 @@ sockunion_accept (int sock, union sockunion *su) len = sizeof (union sockunion); client_sock = accept (sock, (struct sockaddr *) su, &len); +<<<<<<< HEAD:lib/sockunion.c /* Convert IPv4 compatible IPv6 address to IPv4 address. */ #if 0 #ifdef HAVE_IPV6 @@ -270,6 +292,8 @@ sockunion_accept (int sock, union sockunion *su) } #endif /* HAVE_IPV6 */ #endif +======= +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:lib/sockunion.c return client_sock; } @@ -592,6 +616,7 @@ sockunion_getsockname (int fd) { su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion)); memcpy (su, &name, sizeof (struct sockaddr_in6)); +<<<<<<< HEAD:lib/sockunion.c #if 0 if (IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) @@ -604,6 +629,9 @@ sockunion_getsockname (int fd) memcpy (su, &sin, sizeof (struct sockaddr_in)); } #endif +======= + sockunion_normalise_mapped (su); +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:lib/sockunion.c return su; } #endif /* HAVE_IPV6 */ @@ -648,6 +676,7 @@ sockunion_getpeername (int fd) { su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion)); memcpy (su, &name, sizeof (struct sockaddr_in6)); +<<<<<<< HEAD:lib/sockunion.c #if 0 if (IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) { @@ -659,6 +688,9 @@ sockunion_getpeername (int fd) memcpy (su, &sin, sizeof (struct sockaddr_in)); } #endif +======= + sockunion_normalise_mapped (su); +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:lib/sockunion.c return su; } #endif /* HAVE_IPV6 */ |