Module: wine Branch: master Commit: 4c7216fc775fbddf5653a3c72e8d92372636f21c URL: http://source.winehq.org/git/wine.git/?a=commit;h=4c7216fc775fbddf5653a3c72e...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 5 14:24:39 2009 +0100
iphlpapi: Simplify parsing of UDP stats. Only try to open /proc on Linux.
---
dlls/iphlpapi/ipstats.c | 129 ++++++++++++++++++---------------------------- 1 files changed, 51 insertions(+), 78 deletions(-)
diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c index 7d31e43..3884cfc 100644 --- a/dlls/iphlpapi/ipstats.c +++ b/dlls/iphlpapi/ipstats.c @@ -612,92 +612,65 @@ DWORD WINAPI GetTcpStatistics(PMIB_TCPSTATS stats) */ DWORD WINAPI GetUdpStatistics(PMIB_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; - MIB_UDPTABLE *udp_table; - 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; - if (!AllocateAndGetUdpTableFromStack( &udp_table, FALSE, GetProcessHeap(), 0 )) - { - stats->dwNumAddrs = udp_table->dwNumEntries; - HeapFree( GetProcessHeap(), 0, udp_table ); - } - else stats->dwNumAddrs = 0; - - return NO_ERROR; -#else - FILE *fp; - - if (!stats) - return ERROR_INVALID_PARAMETER; - - memset(stats, 0, sizeof(MIB_UDPSTATS)); + DWORD ret = ERROR_NOT_SUPPORTED;
- /* 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; + if (!stats) return ERROR_INVALID_PARAMETER; + memset( stats, 0, sizeof(*stats) );
+#ifdef __linux__ + { + FILE *fp;
- 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; + if ((fp = fopen("/proc/net/snmp", "r"))) + { + static const char hdr[] = "Udp:"; + char buf[512], *ptr;
- 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; + while ((ptr = fgets(buf, sizeof(buf), fp))) + { + if (strncasecmp(buf, hdr, sizeof(hdr) - 1)) continue; + /* last line was a header, get another */ + if (!(ptr = fgets(buf, sizeof(buf), fp))) break; + if (!strncasecmp(buf, hdr, sizeof(hdr) - 1)) + { + ptr += sizeof(hdr); + sscanf( ptr, "%u %u %u %u %u", + &stats->dwInDatagrams, &stats->dwNoPorts, + &stats->dwInErrors, &stats->dwOutDatagrams, &stats->dwNumAddrs ); + break; + } + } + fclose(fp); + ret = NO_ERROR; } - if (ptr && *ptr) { - stats->dwNumAddrs = strtoul(ptr, &endPtr, 10); - ptr = endPtr; + } +#elif 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; + MIB_UDPTABLE *udp_table; + size_t needed = sizeof(udp_stat); + + if(sysctl(mib, MIB_LEN, &udp_stat, &needed, NULL, 0) != -1) + { + 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; + if (!AllocateAndGetUdpTableFromStack( &udp_table, FALSE, GetProcessHeap(), 0 )) + { + stats->dwNumAddrs = udp_table->dwNumEntries; + HeapFree( GetProcessHeap(), 0, udp_table ); + } + ret = NO_ERROR; } - } + else ERR ("failed to get udpstat\n"); } - fclose(fp); - } - else - { - ERR ("unimplemented!\n"); - return ERROR_NOT_SUPPORTED; - } - - return NO_ERROR; +#else + FIXME( "unimplemented\n" ); #endif + return ret; }