PMIB_UDPTABLE getUdpTable(void) { DWORD numEntries = getNumUdpEntries(); PMIB_UDPTABLE ret; ret = (PMIB_UDPTABLE)calloc(1, sizeof(MIB_UDPTABLE) + (numEntries - 1) * sizeof(MIB_UDPROW)); if (ret) { FILE *fp; /* get from /proc/net/udp, no error if can't */ fp = fopen("/proc/net/udp", "r"); if (fp) { char buf[512] = { 0 }, *ptr; /* skip header line */ ptr = fgets(buf, sizeof(buf), fp); while (ptr && ret->dwNumEntries < numEntries) { ptr = fgets(buf, sizeof(buf), fp); if (ptr) { char *endPtr; if (ptr && *ptr) { strtoul(ptr, &endPtr, 16); /* skip */ ptr = endPtr; } if (ptr && *ptr) { ptr++; ret->table[ret->dwNumEntries].dwLocalAddr = strtoul(ptr, &endPtr, 16); ptr = endPtr; } if (ptr && *ptr) { ptr++; ret->table[ret->dwNumEntries].dwLocalPort = strtoul(ptr, &endPtr, 16); ptr = endPtr; } ret->dwNumEntries++; } } fclose(fp); } } return ret; }
DWORD getUDPStats(MIB_UDPSTATS *stats) { #if defined(HAVE_SYS_SYSCTL_H) && defined(UDPCTL_STATS) int mib[] = {CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_STATS}; #define MIB_LEN (sizeof(mib) / sizeof(mib[0])) struct udpstat udp_stat; size_t needed; if (!stats) return ERROR_INVALID_PARAMETER; needed = sizeof(udp_stat); if(sysctl(mib, MIB_LEN, &udp_stat, &needed, NULL, 0) == -1) { ERR ("failed to get udpstat\n"); return ERROR_NOT_SUPPORTED; } stats->dwInDatagrams = udp_stat.udps_ipackets; stats->dwOutDatagrams = udp_stat.udps_opackets; stats->dwNoPorts = udp_stat.udps_noport; stats->dwInErrors = udp_stat.udps_hdrops + udp_stat.udps_badsum + udp_stat.udps_fullsock + udp_stat.udps_badlen; stats->dwNumAddrs = getNumUdpEntries(); return NO_ERROR; #else FILE *fp; if (!stats) return ERROR_INVALID_PARAMETER; memset(stats, 0, sizeof(MIB_UDPSTATS)); /* get from /proc/net/snmp, no error if can't */ fp = fopen("/proc/net/snmp", "r"); if (fp) { static const char hdr[] = "Udp:"; char buf[512] = { 0 }, *ptr; do { ptr = fgets(buf, sizeof(buf), fp); } while (ptr && strncasecmp(buf, hdr, sizeof(hdr) - 1)); if (ptr) { /* last line was a header, get another */ ptr = fgets(buf, sizeof(buf), fp); if (ptr && strncasecmp(buf, hdr, sizeof(hdr) - 1) == 0) { char *endPtr; ptr += sizeof(hdr); if (ptr && *ptr) { stats->dwInDatagrams = strtoul(ptr, &endPtr, 10); ptr = endPtr; } if (ptr && *ptr) { stats->dwNoPorts = strtoul(ptr, &endPtr, 10); ptr = endPtr; } if (ptr && *ptr) { stats->dwInErrors = strtoul(ptr, &endPtr, 10); ptr = endPtr; } if (ptr && *ptr) { stats->dwOutDatagrams = strtoul(ptr, &endPtr, 10); ptr = endPtr; } if (ptr && *ptr) { stats->dwNumAddrs = strtoul(ptr, &endPtr, 10); ptr = endPtr; } } } fclose(fp); } else { ERR ("unimplemented!\n"); return ERROR_NOT_SUPPORTED; } return NO_ERROR; #endif }
DWORD getUdpTable(PMIB_UDPTABLE *ppUdpTable, HANDLE heap, DWORD flags) { DWORD ret; #if defined(HAVE_SYS_SYSCTL_H) && defined(NET_RT_DUMP) ERR ("unimplemented!\n"); return ERROR_NOT_SUPPORTED; #endif if (!ppUdpTable) ret = ERROR_INVALID_PARAMETER; else { DWORD numEntries = getNumUdpEntries(); DWORD size = sizeof(MIB_UDPTABLE); PMIB_UDPTABLE table; if (numEntries > 1) size += (numEntries - 1) * sizeof(MIB_UDPROW); table = HeapAlloc(heap, flags, size); if (table) { FILE *fp; ret = NO_ERROR; *ppUdpTable = table; table->dwNumEntries = 0; /* get from /proc/net/udp, no error if can't */ fp = fopen("/proc/net/udp", "r"); if (fp) { char buf[512] = { 0 }, *ptr; /* skip header line */ ptr = fgets(buf, sizeof(buf), fp); while (ptr && table->dwNumEntries < numEntries) { memset(&table->table[table->dwNumEntries], 0, sizeof(MIB_UDPROW)); ptr = fgets(buf, sizeof(buf), fp); if (ptr) { char *endPtr; if (ptr && *ptr) { strtoul(ptr, &endPtr, 16); /* skip */ ptr = endPtr; } if (ptr && *ptr) { ptr++; table->table[table->dwNumEntries].dwLocalAddr = strtoul(ptr, &endPtr, 16); ptr = endPtr; } if (ptr && *ptr) { ptr++; table->table[table->dwNumEntries].dwLocalPort = strtoul(ptr, &endPtr, 16); ptr = endPtr; } table->dwNumEntries++; } } fclose(fp); } else ret = ERROR_NOT_SUPPORTED; } else ret = ERROR_OUTOFMEMORY; } return ret; }