From bdbf78c0d578484b407abcc86ba22808cce2e7d6 Mon Sep 17 00:00:00 2001 From: repolho Date: Wed, 9 Nov 2011 17:37:26 -0200 Subject: Implemented unix version of libnet_get_ipaddr6() --- libnet/include/libnet/libnet-functions.h | 6 +++- libnet/src/libnet_resolve.c | 48 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/libnet/include/libnet/libnet-functions.h b/libnet/include/libnet/libnet-functions.h index eccc35d..6f98ab0 100644 --- a/libnet/include/libnet/libnet-functions.h +++ b/libnet/include/libnet/libnet-functions.h @@ -1869,7 +1869,11 @@ uint32_t libnet_get_ipaddr4(libnet_t *l); /** - * This function is not yet implemented under IPv6. + * Returns the IPv6 address for the device libnet was initialized with. If + * libnet was initialized without a device (in raw socket mode) the function + * will attempt to find one. If the function fails and returns in6addr_error, a + * call to libnet_geterrror() will tell you why. + * This function is not yet implemented for Win32 platforms. * @param l pointer to a libnet context * @return well, nothing yet */ diff --git a/libnet/src/libnet_resolve.c b/libnet/src/libnet_resolve.c index 642fcd5..961d710 100644 --- a/libnet/src/libnet_resolve.c +++ b/libnet/src/libnet_resolve.c @@ -294,6 +294,53 @@ libnet_name2addr6(libnet_t *l, char *host_name, uint8_t use_name) } } +#if !defined(__WIN32__) + +#include + +struct libnet_in6_addr +libnet_get_ipaddr6(libnet_t *l) +{ + struct ifaddrs *ifaddr, *p; + struct libnet_in6_addr addr; + + if (l == NULL) + { + return (in6addr_error); + } + + if (getifaddrs(&ifaddr) != 0) + { + snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, + "%s(): getifaddrs(): %s\n", __func__, strerror(errno)); + return (in6addr_error); + } + + if (l->device == NULL) + { + if (libnet_select_device(l) == -1) + { + /* error msg set in libnet_select_device() */ + return (in6addr_error); + } + } + + for (p = ifaddr; p != NULL; p = p->ifa_next) + { + if ((strcmp(p->ifa_name, l->device) == 0) && (p->ifa_addr != NULL) && + (p->ifa_addr->sa_family == AF_INET6)) + { + memcpy(&addr.__u6_addr, + ((struct sockaddr_in6*)p->ifa_addr)->sin6_addr.s6_addr, 16); + freeifaddrs(ifaddr); + return (addr); + } + } + + freeifaddrs(ifaddr); + return (in6addr_error); +} +#else struct libnet_in6_addr libnet_get_ipaddr6(libnet_t *l) { @@ -301,6 +348,7 @@ libnet_get_ipaddr6(libnet_t *l) "%s(): not yet Implemented\n", __func__); return (in6addr_error); } +#endif /* WIN32 */ #if !defined(__WIN32__) uint32_t -- cgit v1.2.1