diff options
Diffstat (limited to 'rfc1035/rfc1035ipv6to4.c')
| -rw-r--r-- | rfc1035/rfc1035ipv6to4.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/rfc1035/rfc1035ipv6to4.c b/rfc1035/rfc1035ipv6to4.c new file mode 100644 index 0000000..d63e9e4 --- /dev/null +++ b/rfc1035/rfc1035ipv6to4.c @@ -0,0 +1,51 @@ +/* +** Copyright 2000-2003 Double Precision, Inc. +** See COPYING for distribution information. +*/ + +#include "config.h" +#include "rfc1035.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <arpa/inet.h> + + +#if RFC1035_FREEBSD40 +#define s6_addr16 __u6_addr.__u6_addr16 +#define s6_addr32 __u6_addr.__u6_addr32 +#endif + +#if RFC1035_SOLARIS8 +#define s6_addr32 _S6_un._S6_u32 +#endif + +#if RFC1035_IPV6 + +void rfc1035_ipv6to4(struct in_addr *ip4, const struct in6_addr *ip6) +{ + ip4->s_addr=ip6->s6_addr32[3]; +} + +void rfc1035_ipv4to6(struct in6_addr *ip6, const struct in_addr *ip4) +{ + memset(ip6, 0, sizeof(*ip6)); + +#if RFC1035_SOLARIS8 + + /* No 16-bit union <grumble>... */ + + ip6->_S6_un._S6_u8[10]= ~0; + ip6->_S6_un._S6_u8[11]= ~0; + +#else + ip6->s6_addr16[5]= ~0; +#endif + + ip6->s6_addr32[3]= ip4->s_addr; + + if (ip4->s_addr == INADDR_ANY) + *ip6= in6addr_any; +} +#endif + |
