Module: wine Branch: master Commit: 6ea3796cdb09c741eb37ab44842846d303b5bf69 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6ea3796cdb09c741eb37ab4484...
Author: Eric Durbin eadurbin@freebsd.org Date: Tue Jun 24 22:49:15 2008 -0500
iphlpapi: Implement getNumArpEntries on FreeBSD.
---
configure | 2 ++ configure.ac | 1 + dlls/iphlpapi/ipstats.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ include/config.h.in | 3 +++ 4 files changed, 52 insertions(+), 0 deletions(-)
diff --git a/configure b/configure index ca119ac..11d49ad 100755 --- a/configure +++ b/configure @@ -7088,6 +7088,7 @@ done
+ for ac_header in \ AudioUnit/AudioUnit.h \ Carbon/Carbon.h \ @@ -7136,6 +7137,7 @@ for ac_header in \ mntent.h \ ncurses.h \ netdb.h \ + netinet/if_ether.h \ netinet/in.h \ netinet/in_systm.h \ netinet/ip_icmp.h \ diff --git a/configure.ac b/configure.ac index 192dd03..c71427e 100644 --- a/configure.ac +++ b/configure.ac @@ -273,6 +273,7 @@ AC_CHECK_HEADERS(\ mntent.h \ ncurses.h \ netdb.h \ + netinet/if_ether.h \ netinet/in.h \ netinet/in_systm.h \ netinet/ip_icmp.h \ diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c index 2b6c0f7..89ffa04 100644 --- a/dlls/iphlpapi/ipstats.c +++ b/dlls/iphlpapi/ipstats.c @@ -46,6 +46,9 @@ #ifdef HAVE_NET_IF_H #include <net/if.h> #endif +#ifdef HAVE_NET_IF_DL_H +#include <net/if_dl.h> +#endif #ifdef HAVE_NET_IF_TYPES_H #include <net/if_types.h> #endif @@ -55,6 +58,9 @@ #ifdef HAVE_NET_IF_ARP_H #include <net/if_arp.h> #endif +#ifdef HAVE_NETINET_IF_ETHER_H +#include <netinet/if_ether.h> +#endif #ifdef HAVE_NETINET_TCP_H #include <netinet/tcp.h> #endif @@ -1234,6 +1240,46 @@ DWORD getRouteTable(PMIB_IPFORWARDTABLE *ppIpForwardTable, HANDLE heap,
DWORD getNumArpEntries(void) { +#if defined(HAVE_SYS_SYSCTL_H) && defined(NET_RT_DUMP) + int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_LLINFO}; +#define MIB_LEN (sizeof(mib) / sizeof(mib[0])) + DWORD arpEntries = 0; + size_t needed; + char *buf, *lim, *next; + struct rt_msghdr *rtm; + struct sockaddr_inarp *sinarp; + struct sockaddr_dl *sdl; + + if (sysctl (mib, MIB_LEN, NULL, &needed, NULL, 0) == -1) + { + ERR ("failed to get size of arp table\n"); + return 0; + } + + buf = HeapAlloc (GetProcessHeap (), 0, needed); + if (!buf) return 0; + + if (sysctl (mib, MIB_LEN, buf, &needed, NULL, 0) == -1) + { + ERR ("failed to get arp table\n"); + HeapFree (GetProcessHeap (), 0, buf); + return 0; + } + + lim = buf + needed; + next = buf; + while(next < lim) + { + rtm = (struct rt_msghdr *)next; + sinarp=(struct sockaddr_inarp *)(rtm + 1); + sdl = (struct sockaddr_dl *)((char *)sinarp + ROUNDUP(sinarp->sin_len)); + if(sdl->sdl_alen) /* arp entry */ + arpEntries++; + next += rtm->rtm_msglen; + } + HeapFree (GetProcessHeap (), 0, buf); + return arpEntries; +#endif return getNumWithOneHeader("/proc/net/arp"); }
diff --git a/include/config.h.in b/include/config.h.in index 40f62a9..63e8e89 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -441,6 +441,9 @@ /* Define to 1 if you have the <netinet/icmp_var.h> header file. */ #undef HAVE_NETINET_ICMP_VAR_H
+/* Define to 1 if you have the <netinet/if_ether.h> header file. */ +#undef HAVE_NETINET_IF_ETHER_H + /* Define to 1 if you have the <netinet/in.h> header file. */ #undef HAVE_NETINET_IN_H