Module: wine Branch: master Commit: b406213c42793cc166b90ab2f7d4fc70445b0103 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b406213c42793cc166b90ab2f7...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Mar 2 12:51:48 2009 +0100
iphlpapi: Moved AllocateAndGetIpNetTableFromStack implementation to ipstats.c.
---
dlls/iphlpapi/iphlpapi_main.c | 50 +---------------------------------------- dlls/iphlpapi/ipstats.c | 39 ++++++++++++++++++++++++++++++- dlls/iphlpapi/ipstats.h | 6 +---- 3 files changed, 39 insertions(+), 56 deletions(-)
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c index 1d2735f..f0ca8ad 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -246,51 +246,6 @@ DWORD WINAPI AllocateAndGetIpForwardTableFromStack(PMIB_IPFORWARDTABLE * }
-static int IpNetTableSorter(const void *a, const void *b) -{ - int ret; - - if (a && b) - ret = ((const MIB_IPNETROW*)a)->dwAddr - ((const MIB_IPNETROW*)b)->dwAddr; - else - ret = 0; - return ret; -} - - -/****************************************************************** - * AllocateAndGetIpNetTableFromStack (IPHLPAPI.@) - * - * Get the IP-to-physical address mapping table. - * Like GetIpNetTable(), but allocate the returned table from heap. - * - * PARAMS - * ppIpNetTable [Out] pointer into which the MIB_IPNETTABLE is - * allocated and returned. - * bOrder [In] whether to sort the table - * heap [In] heap from which the table is allocated - * flags [In] flags to HeapAlloc - * - * RETURNS - * ERROR_INVALID_PARAMETER if ppIpNetTable is NULL, other error codes - * on failure, NO_ERROR on success. - */ -DWORD WINAPI AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable, - BOOL bOrder, HANDLE heap, DWORD flags) -{ - DWORD ret; - - TRACE("ppIpNetTable %p, bOrder %d, heap %p, flags 0x%08x\n", - ppIpNetTable, bOrder, heap, flags); - ret = getArpTable(ppIpNetTable, heap, flags); - if (!ret && bOrder) - qsort((*ppIpNetTable)->table, (*ppIpNetTable)->dwNumEntries, - sizeof(MIB_IPADDRROW), IpNetTableSorter); - TRACE("returning %d\n", ret); - return ret; -} - - /****************************************************************** * CreateIpForwardEntry (IPHLPAPI.@) * @@ -1196,7 +1151,7 @@ DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, BOOL bOr
if (!pdwSize) return ERROR_INVALID_PARAMETER;
- ret = getArpTable(&table, GetProcessHeap(), 0); + ret = AllocateAndGetIpNetTableFromStack( &table, bOrder, GetProcessHeap(), 0 ); if (!ret) { DWORD size = FIELD_OFFSET( MIB_IPNETTABLE, table[table->dwNumEntries] ); if (!pIpNetTable || *pdwSize < size) { @@ -1206,9 +1161,6 @@ DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, BOOL bOr else { *pdwSize = size; memcpy(pIpNetTable, table, size); - if (bOrder) - qsort(pIpNetTable->table, pIpNetTable->dwNumEntries, - sizeof(MIB_IPNETROW), IpNetTableSorter); } HeapFree(GetProcessHeap(), 0, table); } diff --git a/dlls/iphlpapi/ipstats.c b/dlls/iphlpapi/ipstats.c index 1a3086f..58ec76f 100644 --- a/dlls/iphlpapi/ipstats.c +++ b/dlls/iphlpapi/ipstats.c @@ -1296,12 +1296,41 @@ static MIB_IPNETTABLE *append_ipnet_row( HANDLE heap, DWORD flags, MIB_IPNETTABL return table; }
-DWORD getArpTable(PMIB_IPNETTABLE *ppIpNetTable, HANDLE heap, DWORD flags) +static int compare_ipnet_rows(const void *a, const void *b) +{ + const MIB_IPNETROW *rowA = a; + const MIB_IPNETROW *rowB = b; + + return ntohl(rowA->dwAddr) - ntohl(rowB->dwAddr); +} + + +/****************************************************************** + * AllocateAndGetIpNetTableFromStack (IPHLPAPI.@) + * + * Get the IP-to-physical address mapping table. + * Like GetIpNetTable(), but allocate the returned table from heap. + * + * PARAMS + * ppIpNetTable [Out] pointer into which the MIB_IPNETTABLE is + * allocated and returned. + * bOrder [In] whether to sort the table + * heap [In] heap from which the table is allocated + * flags [In] flags to HeapAlloc + * + * RETURNS + * ERROR_INVALID_PARAMETER if ppIpNetTable is NULL, other error codes + * on failure, NO_ERROR on success. + */ +DWORD WINAPI AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable, BOOL bOrder, + HANDLE heap, DWORD flags) { MIB_IPNETTABLE *table; MIB_IPNETROW row; DWORD ret = NO_ERROR, count = 16;
+ TRACE("table %p, bOrder %d, heap %p, flags 0x%08x\n", ppIpNetTable, bOrder, heap, flags); + if (!ppIpNetTable) return ERROR_INVALID_PARAMETER;
if (!(table = HeapAlloc( heap, flags, FIELD_OFFSET(MIB_IPNETTABLE, table[count] )))) @@ -1420,8 +1449,14 @@ done: #endif
if (!table) return ERROR_OUTOFMEMORY; - if (!ret) *ppIpNetTable = table; + if (!ret) + { + if (bOrder && table->dwNumEntries) + qsort( table->table, table->dwNumEntries, sizeof(row), compare_ipnet_rows ); + *ppIpNetTable = table; + } else HeapFree( heap, flags, table ); + TRACE( "returning ret %u table %p\n", ret, table ); return ret; }
diff --git a/dlls/iphlpapi/ipstats.h b/dlls/iphlpapi/ipstats.h index bc2fe7b..30b78b2 100644 --- a/dlls/iphlpapi/ipstats.h +++ b/dlls/iphlpapi/ipstats.h @@ -64,11 +64,6 @@ DWORD getRouteTable(PMIB_IPFORWARDTABLE *ppIpForwardTable, HANDLE heap, /* Returns the number of entries in the arp table. */ DWORD getNumArpEntries(void);
-/* Allocates the arp table from heap and returns it to you in *ppIpNetTable. - * Returns NO_ERROR on success, something else on failure. - */ -DWORD getArpTable(PMIB_IPNETTABLE *ppIpNetTable, HANDLE heap, DWORD flags); - /* Returns the number of entries in the UDP state table. */ DWORD getNumUdpEntries(void);
@@ -77,5 +72,6 @@ DWORD getNumTcpEntries(void);
DWORD WINAPI AllocateAndGetUdpTableFromStack(PMIB_UDPTABLE *ppUdpTable, BOOL bOrder, HANDLE heap, DWORD flags); DWORD WINAPI AllocateAndGetTcpTableFromStack(PMIB_TCPTABLE *ppTcpTable, BOOL bOrder, HANDLE heap, DWORD flags); +DWORD WINAPI AllocateAndGetIpNetTableFromStack(PMIB_IPNETTABLE *ppIpNetTable, BOOL bOrder, HANDLE heap, DWORD flags);
#endif /* ndef WINE_IPSTATS_H_ */