DWORD getNumTcpEntries(void) { #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_NETINET_IN_PCB_H) return getNumWithOneHeader ("net.inet.tcp.pcblist"); #else return getNumWithOneHeader ("/proc/net/tcp"); #endif }
DWORD getNumRoutes(void) { #if defined(HAVE_SYS_SYSCTL_H) && defined(NET_RT_DUMP) int mib[6] = {CTL_NET, PF_ROUTE, 0, PF_INET, NET_RT_DUMP, 0}; size_t needed; char *buf, *lim, *next; struct rt_msghdr *rtm; DWORD RouteCount = 0; if (sysctl (mib, 6, NULL, &needed, NULL, 0) < 0) { ERR ("sysctl 1 failed!\n"); return 0; } buf = HeapAlloc (GetProcessHeap (), 0, needed); if (!buf) return 0; if (sysctl (mib, 6, buf, &needed, NULL, 0) < 0) { ERR ("sysctl 2 failed!\n"); HeapFree (GetProcessHeap (), 0, buf); return 0; } lim = buf + needed; for (next = buf; next < lim; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)next; if (rtm->rtm_type != RTM_GET) { WARN ("Got unexpected message type 0x%x!\n", rtm->rtm_type); continue; } /* Ignore all entries except for gateway routes which aren't multicast */ if (!(rtm->rtm_flags & RTF_GATEWAY) || (rtm->rtm_flags & RTF_MULTICAST)) continue; RouteCount++; } HeapFree (GetProcessHeap (), 0, buf); return RouteCount; #else return getNumWithOneHeader("/proc/net/route"); #endif }
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"); }
DWORD getNumTcpEntries(void) { return getNumWithOneHeader("/proc/net/tcp"); }
DWORD getNumUdpEntries(void) { return getNumWithOneHeader("/proc/net/udp"); }