From 53058e86e83b4b6c9cf3994378287e0761039732 Mon Sep 17 00:00:00 2001 From: Eric Durbin Date: Tue, 24 Jun 2008 22:42:51 -0500 Subject: [PATCH] iphlpapi: Implement getInterfaceStatsByName on FreeBSD. --- dlls/iphlpapi/ipstats.c | 57 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c index a7fd40d7bf0..3a537b11bdf 100644 --- a/dlls/iphlpapi/ipstats.c +++ b/dlls/iphlpapi/ipstats.c @@ -43,6 +43,9 @@ #ifdef HAVE_NET_IF_H #include #endif +#ifdef HAVE_NET_IF_TYPES_H +#include +#endif #ifdef HAVE_NET_ROUTE_H #include #endif @@ -102,15 +105,60 @@ WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi); DWORD getInterfaceStatsByName(const char *name, PMIB_IFROW entry) { - FILE *fp; +#if defined(HAVE_SYS_SYSCTL_H) && defined(NET_RT_IFLIST) + int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_IFLIST, if_nametoindex(name)}; +#define MIB_LEN (sizeof(mib) / sizeof(mib[0])) - if (!name) - return ERROR_INVALID_PARAMETER; - if (!entry) + size_t needed; + char *buf, *end; + struct if_msghdr *ifm; + struct if_data ifdata; + if (!name || !entry) return ERROR_INVALID_PARAMETER; + if(sysctl(mib, MIB_LEN, NULL, &needed, NULL, 0) == -1) + { + ERR ("failed to get size of iflist\n"); + return ERROR_NOT_SUPPORTED; + } + buf = HeapAlloc (GetProcessHeap (), 0, needed); + if (!buf) return ERROR_NOT_SUPPORTED; + if(sysctl(mib, MIB_LEN, buf, &needed, NULL, 0) == -1) + { + ERR ("failed to get iflist\n"); + HeapFree (GetProcessHeap (), 0, buf); + return ERROR_NOT_SUPPORTED; + } + else + for ( end = buf + needed; buf < end; buf += ifm->ifm_msglen) + { + ifm = (struct if_msghdr *) buf; + if(ifm->ifm_type == RTM_IFINFO && ifm->ifm_data.ifi_type == IFT_ETHER) + { + ifdata = ifm->ifm_data; + entry->dwMtu = ifdata.ifi_mtu; + entry->dwSpeed = ifdata.ifi_baudrate; + entry->dwInOctets = ifdata.ifi_ibytes; + entry->dwInErrors = ifdata.ifi_ierrors; + entry->dwInDiscards = ifdata.ifi_iqdrops; + entry->dwInUcastPkts = ifdata.ifi_ipackets; + entry->dwInNUcastPkts = ifdata.ifi_imcasts; + entry->dwOutOctets = ifdata.ifi_obytes; + entry->dwOutUcastPkts = ifdata.ifi_opackets; + entry->dwOutErrors = ifdata.ifi_oerrors; + HeapFree (GetProcessHeap (), 0, buf); + return NO_ERROR; + } + } + HeapFree (GetProcessHeap (), 0, buf); + return ERROR_NOT_SUPPORTED; +#else /* get interface stats from /proc/net/dev, no error if can't no inUnknownProtos, outNUcastPkts, outQLen */ + FILE *fp; + + if (!name || !entry) + return ERROR_INVALID_PARAMETER; fp = fopen("/proc/net/dev", "r"); if (fp) { char buf[512] = { 0 }, *ptr; @@ -188,6 +236,7 @@ DWORD getInterfaceStatsByName(const char *name, PMIB_IFROW entry) } return NO_ERROR; +#endif } DWORD getICMPStats(MIB_ICMP *stats)