summaryrefslogtreecommitdiff
path: root/src/libnet_if_addr.c
diff options
context:
space:
mode:
authordohnuts <dohnuts@users.noreply.github.com>2019-05-09 09:41:42 -0400
committerJoachim Nilsson <troglobit@gmail.com>2019-09-25 06:19:40 +0200
commit648bd33d5d4c456303e2b8351717da92e8b70aeb (patch)
tree05cba207773a1450126106dab2ba46e100986a45 /src/libnet_if_addr.c
parent1d4fa4593b10e783c846e66c0beb0f554c44a2de (diff)
downloadlibnet-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.c51
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)
{