diff options
author | dohnuts <dohnuts@users.noreply.github.com> | 2019-05-09 09:41:42 -0400 |
---|---|---|
committer | Joachim Nilsson <troglobit@gmail.com> | 2019-09-25 06:19:40 +0200 |
commit | 648bd33d5d4c456303e2b8351717da92e8b70aeb (patch) | |
tree | 05cba207773a1450126106dab2ba46e100986a45 /src/libnet_if_addr.c | |
parent | 1d4fa4593b10e783c846e66c0beb0f554c44a2de (diff) | |
download | libnet-648bd33d5d4c456303e2b8351717da92e8b70aeb.tar.gz |
Use getiffaddrs(3) on OpenBSD and Linux
* In GLIBC since 2002
* Available in recetn uClibc,
https://github.com/hwoarang/uClibc/blob/master-metag/libc/inet/ifaddrs.c
* In OpenBSD since 2.7
Tested on OpenBSD with arping, compiled on linux by @sgeto
Diffstat (limited to 'src/libnet_if_addr.c')
-rw-r--r-- | src/libnet_if_addr.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/libnet_if_addr.c b/src/libnet_if_addr.c index 6805ec5..e3f807f 100644 --- a/src/libnet_if_addr.c +++ b/src/libnet_if_addr.c @@ -83,6 +83,55 @@ libnet_check_iface(libnet_t *l) return (res); } +#endif + +#if defined(__OpenBSD__) || defined(__linux__) +#include <sys/types.h> + #ifdef __OpenBSD__ + #include <sys/socket.h> + #endif +#include <ifaddrs.h> + +int +libnet_ifaddrlist(register struct libnet_ifaddr_list **ipaddrp, char *dev, register char *errbuf) +{ + static struct libnet_ifaddr_list ifaddrlist[MAX_IPADDR]; + struct ifaddrs *ifap, *ifa; + int i = 0, nipaddr; + memset (ifaddrlist, 0 , sizeof(ifaddrlist)); + + if (getifaddrs(&ifap) != 0) + { + snprintf(errbuf, LIBNET_ERRBUF_SIZE, "%s(): getifaddrs: %s", + __func__, strerror(errno)); + return 0; + } + for (ifa = ifap; ifa; ifa = ifa->ifa_next) + { + if (ifa->ifa_flags & IFF_LOOPBACK) + continue; + + if (ifa->ifa_addr->sa_family == AF_INET ) + { + ifaddrlist[i].device = strdup(ifa->ifa_name); + if (ifaddrlist[i].device == NULL) { + snprintf(errbuf, LIBNET_ERRBUF_SIZE, "%s(): OOM", __func__); + continue; + } + ifaddrlist[i].addr = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr; + ++i; + } + } + + freeifaddrs(ifap); + *ipaddrp = ifaddrlist; + return (i); +} + + +#else +#if !(__WIN32__) + /* * Return the interface list @@ -347,6 +396,8 @@ libnet_ifaddrlist(register struct libnet_ifaddr_list **ipaddrp, char *dev_unused } #endif /* __WIN32__ */ +#endif /* __OpenBSD__ */ + int libnet_select_device(libnet_t *l) { |