ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ipstats_reactos.c
Go to the documentation of this file.
00001 /* Copyright (C) 2003 Art Yerkes
00002  * A reimplementation of ifenum.c by Juan Lang
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00017  *
00018  * This file is implemented on the IOCTL_TCP_QUERY_INFORMATION_EX ioctl on
00019  * tcpip.sys
00020  */
00021 
00022 #include "iphlpapi_private.h"
00023 
00024 WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
00025 
00026 #ifndef TCPS_ESTABLISHED
00027 # define TCPS_ESTABLISHED TCP_ESTABLISHED
00028 #endif
00029 #ifndef TCPS_SYN_SENT
00030 # define TCPS_SYN_SENT TCP_SYN_SENT
00031 #endif
00032 #ifndef TCPS_SYN_RECEIVED
00033 # define TCPS_SYN_RECEIVED TCP_SYN_RECV
00034 #endif
00035 #ifndef TCPS_FIN_WAIT_1
00036 # define TCPS_FIN_WAIT_1 TCP_FIN_WAIT1
00037 #endif
00038 #ifndef TCPS_FIN_WAIT_2
00039 # define TCPS_FIN_WAIT_2 TCP_FIN_WAIT2
00040 #endif
00041 #ifndef TCPS_TIME_WAIT
00042 # define TCPS_TIME_WAIT TCP_TIME_WAIT
00043 #endif
00044 #ifndef TCPS_CLOSED
00045 # define TCPS_CLOSED TCP_CLOSE
00046 #endif
00047 #ifndef TCPS_CLOSE_WAIT
00048 # define TCPS_CLOSE_WAIT TCP_CLOSE_WAIT
00049 #endif
00050 #ifndef TCPS_LAST_ACK
00051 # define TCPS_LAST_ACK TCP_LAST_ACK
00052 #endif
00053 #ifndef TCPS_LISTEN
00054 # define TCPS_LISTEN TCP_LISTEN
00055 #endif
00056 #ifndef TCPS_CLOSING
00057 # define TCPS_CLOSING TCP_CLOSING
00058 #endif
00059 
00060 BOOL isIpEntity( HANDLE tcpFile, TDIEntityID *ent ) {
00061     return (ent->tei_entity == CL_NL_ENTITY ||
00062             ent->tei_entity == CO_NL_ENTITY);
00063 }
00064 
00065 NTSTATUS getNthIpEntity( HANDLE tcpFile, DWORD index, TDIEntityID *ent ) {
00066     DWORD numEntities = 0;
00067     DWORD numRoutes = 0;
00068     TDIEntityID *entitySet = 0;
00069     NTSTATUS status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
00070     int i;
00071 
00072     if( !NT_SUCCESS(status) )
00073         return status;
00074 
00075     for( i = 0; i < numEntities; i++ ) {
00076         if( isIpEntity( tcpFile, &entitySet[i] ) ) {
00077             TRACE("Entity %d is an IP Entity\n", i);
00078             if( numRoutes == index ) break;
00079             else numRoutes++;
00080         }
00081     }
00082 
00083     if( numRoutes == index && i < numEntities ) {
00084         TRACE("Index %d is entity #%d - %04x:%08x\n", index, i,
00085                entitySet[i].tei_entity, entitySet[i].tei_instance );
00086         memcpy( ent, &entitySet[i], sizeof(*ent) );
00087         tdiFreeThingSet( entitySet );
00088         return STATUS_SUCCESS;
00089     } else {
00090         tdiFreeThingSet( entitySet );
00091         return STATUS_UNSUCCESSFUL;
00092     }
00093 }
00094 
00095 NTSTATUS tdiGetMibForIpEntity
00096 ( HANDLE tcpFile, TDIEntityID *ent, IPSNMPInfo *entry ) {
00097     TCP_REQUEST_QUERY_INFORMATION_EX req = TCP_REQUEST_QUERY_INFORMATION_INIT;
00098     NTSTATUS status = STATUS_SUCCESS;
00099     DWORD returnSize;
00100 
00101     memset( entry, 0, sizeof( *entry ) );
00102 
00103     TRACE("TdiGetMibForIpEntity(tcpFile %x,entityId %x)\n",
00104            (DWORD)tcpFile, ent->tei_instance);
00105 
00106     req.ID.toi_class                = INFO_CLASS_PROTOCOL;
00107     req.ID.toi_type                 = INFO_TYPE_PROVIDER;
00108     req.ID.toi_id                   = IP_MIB_STATS_ID;
00109     req.ID.toi_entity               = *ent;
00110 
00111     status = DeviceIoControl( tcpFile,
00112                               IOCTL_TCP_QUERY_INFORMATION_EX,
00113                               &req,
00114                               sizeof(req),
00115                               entry,
00116                               sizeof(*entry),
00117                               &returnSize,
00118                               NULL );
00119 
00120     TRACE("TdiGetMibForIpEntity() => {\n"
00121            "  ipsi_forwarding ............ %d\n"
00122            "  ipsi_defaultttl ............ %d\n"
00123            "  ipsi_inreceives ............ %d\n"
00124            "  ipsi_indelivers ............ %d\n"
00125            "  ipsi_outrequests ........... %d\n"
00126            "  ipsi_routingdiscards ....... %d\n"
00127            "  ipsi_outdiscards ........... %d\n"
00128            "  ipsi_outnoroutes ........... %d\n"
00129            "  ipsi_numif ................. %d\n"
00130            "  ipsi_numaddr ............... %d\n"
00131            "  ipsi_numroutes ............. %d\n"
00132            "} status %08x\n",
00133            entry->ipsi_forwarding,
00134            entry->ipsi_defaultttl,
00135            entry->ipsi_inreceives,
00136            entry->ipsi_indelivers,
00137            entry->ipsi_outrequests,
00138            entry->ipsi_routingdiscards,
00139            entry->ipsi_outdiscards,
00140            entry->ipsi_outnoroutes,
00141            entry->ipsi_numif,
00142            entry->ipsi_numaddr,
00143            entry->ipsi_numroutes,
00144            status);
00145 
00146     return status;
00147 }
00148 
00149 NTSTATUS tdiGetRoutesForIpEntity
00150 ( HANDLE tcpFile, TDIEntityID *ent, IPRouteEntry **routes, PDWORD numRoutes ) {
00151     NTSTATUS status = STATUS_SUCCESS;
00152 
00153     TRACE("TdiGetRoutesForIpEntity(tcpFile %x,entityId %x)\n",
00154            (DWORD)tcpFile, ent->tei_instance);
00155 
00156     status = tdiGetSetOfThings( tcpFile,
00157                                 INFO_CLASS_PROTOCOL,
00158                                 INFO_TYPE_PROVIDER,
00159                                 IP_MIB_ARPTABLE_ENTRY_ID,
00160                                 CL_NL_ENTITY,
00161                 ent->tei_instance,
00162                                 0,
00163                                 sizeof(IPRouteEntry),
00164                                 (PVOID *)routes,
00165                                 numRoutes);
00166 
00167     return status;
00168 }
00169 
00170 NTSTATUS tdiGetIpAddrsForIpEntity
00171 ( HANDLE tcpFile, TDIEntityID *ent, IPAddrEntry **addrs, PDWORD numAddrs ) {
00172     NTSTATUS status;
00173 
00174     TRACE("TdiGetIpAddrsForIpEntity(tcpFile %x,entityId %x)\n",
00175            (DWORD)tcpFile, ent->tei_instance);
00176 
00177     status = tdiGetSetOfThings( tcpFile,
00178                                 INFO_CLASS_PROTOCOL,
00179                                 INFO_TYPE_PROVIDER,
00180                                 IP_MIB_ADDRTABLE_ENTRY_ID,
00181                                 CL_NL_ENTITY,
00182                 ent->tei_instance,
00183                                 0,
00184                                 sizeof(IPAddrEntry),
00185                                 (PVOID *)addrs,
00186                                 numAddrs );
00187 
00188     return status;
00189 }
00190 
00191 DWORD getInterfaceStatsByName(const char *name, PMIB_IFROW entry)
00192 {
00193   if (!name)
00194     return ERROR_INVALID_PARAMETER;
00195   if (!entry)
00196     return ERROR_INVALID_PARAMETER;
00197 
00198   return NO_ERROR;
00199 }
00200 
00201 DWORD getInterfaceStatsByIndex(DWORD index, PMIB_IFROW entry)
00202 {
00203     return ERROR_INVALID_PARAMETER;
00204 }
00205 
00206 DWORD getICMPStats(MIB_ICMP *stats)
00207 {
00208   FILE *fp;
00209 
00210   if (!stats)
00211     return ERROR_INVALID_PARAMETER;
00212 
00213   memset(stats, 0, sizeof(MIB_ICMP));
00214   /* get most of these stats from /proc/net/snmp, no error if can't */
00215   fp = fopen("/proc/net/snmp", "r");
00216   if (fp) {
00217     const char hdr[] = "Icmp:";
00218     char buf[512] = { 0 }, *ptr;
00219 
00220     do {
00221       ptr = fgets(buf, sizeof(buf), fp);
00222     } while (ptr && strncasecmp(buf, hdr, sizeof(hdr) - 1));
00223     if (ptr) {
00224       /* last line was a header, get another */
00225       ptr = fgets(buf, sizeof(buf), fp);
00226       if (ptr && strncasecmp(buf, hdr, sizeof(hdr) - 1) == 0) {
00227         char *endPtr;
00228 
00229         ptr += sizeof(hdr);
00230         if (ptr && *ptr) {
00231           stats->stats.icmpInStats.dwMsgs = strtoul(ptr, &endPtr, 10);
00232           ptr = endPtr;
00233         }
00234         if (ptr && *ptr) {
00235           stats->stats.icmpInStats.dwErrors = strtoul(ptr, &endPtr, 10);
00236           ptr = endPtr;
00237         }
00238         if (ptr && *ptr) {
00239           stats->stats.icmpInStats.dwDestUnreachs = strtoul(ptr, &endPtr, 10);
00240           ptr = endPtr;
00241         }
00242         if (ptr && *ptr) {
00243           stats->stats.icmpInStats.dwTimeExcds = strtoul(ptr, &endPtr, 10);
00244           ptr = endPtr;
00245         }
00246         if (ptr && *ptr) {
00247           stats->stats.icmpInStats.dwParmProbs = strtoul(ptr, &endPtr, 10);
00248           ptr = endPtr;
00249         }
00250         if (ptr && *ptr) {
00251           stats->stats.icmpInStats.dwSrcQuenchs = strtoul(ptr, &endPtr, 10);
00252           ptr = endPtr;
00253         }
00254         if (ptr && *ptr) {
00255           stats->stats.icmpInStats.dwRedirects = strtoul(ptr, &endPtr, 10);
00256           ptr = endPtr;
00257         }
00258         if (ptr && *ptr) {
00259           stats->stats.icmpInStats.dwEchoReps = strtoul(ptr, &endPtr, 10);
00260           ptr = endPtr;
00261         }
00262         if (ptr && *ptr) {
00263           stats->stats.icmpInStats.dwTimestamps = strtoul(ptr, &endPtr, 10);
00264           ptr = endPtr;
00265         }
00266         if (ptr && *ptr) {
00267           stats->stats.icmpInStats.dwTimestampReps = strtoul(ptr, &endPtr, 10);
00268           ptr = endPtr;
00269         }
00270         if (ptr && *ptr) {
00271           stats->stats.icmpInStats.dwAddrMasks = strtoul(ptr, &endPtr, 10);
00272           ptr = endPtr;
00273         }
00274         if (ptr && *ptr) {
00275           stats->stats.icmpInStats.dwAddrMaskReps = strtoul(ptr, &endPtr, 10);
00276           ptr = endPtr;
00277         }
00278         if (ptr && *ptr) {
00279           stats->stats.icmpOutStats.dwMsgs = strtoul(ptr, &endPtr, 10);
00280           ptr = endPtr;
00281         }
00282         if (ptr && *ptr) {
00283           stats->stats.icmpOutStats.dwErrors = strtoul(ptr, &endPtr, 10);
00284           ptr = endPtr;
00285         }
00286         if (ptr && *ptr) {
00287           stats->stats.icmpOutStats.dwDestUnreachs = strtoul(ptr, &endPtr, 10);
00288           ptr = endPtr;
00289         }
00290         if (ptr && *ptr) {
00291           stats->stats.icmpOutStats.dwTimeExcds = strtoul(ptr, &endPtr, 10);
00292           ptr = endPtr;
00293         }
00294         if (ptr && *ptr) {
00295           stats->stats.icmpOutStats.dwParmProbs = strtoul(ptr, &endPtr, 10);
00296           ptr = endPtr;
00297         }
00298         if (ptr && *ptr) {
00299           stats->stats.icmpOutStats.dwSrcQuenchs = strtoul(ptr, &endPtr, 10);
00300           ptr = endPtr;
00301         }
00302         if (ptr && *ptr) {
00303           stats->stats.icmpOutStats.dwRedirects = strtoul(ptr, &endPtr, 10);
00304           ptr = endPtr;
00305         }
00306         if (ptr && *ptr) {
00307           stats->stats.icmpOutStats.dwEchoReps = strtoul(ptr, &endPtr, 10);
00308           ptr = endPtr;
00309         }
00310         if (ptr && *ptr) {
00311           stats->stats.icmpOutStats.dwTimestamps = strtoul(ptr, &endPtr, 10);
00312           ptr = endPtr;
00313         }
00314         if (ptr && *ptr) {
00315           stats->stats.icmpOutStats.dwTimestampReps = strtoul(ptr, &endPtr, 10);
00316           ptr = endPtr;
00317         }
00318         if (ptr && *ptr) {
00319           stats->stats.icmpOutStats.dwAddrMasks = strtoul(ptr, &endPtr, 10);
00320           ptr = endPtr;
00321         }
00322         if (ptr && *ptr) {
00323           stats->stats.icmpOutStats.dwAddrMaskReps = strtoul(ptr, &endPtr, 10);
00324           ptr = endPtr;
00325         }
00326       }
00327     }
00328     fclose(fp);
00329   }
00330   return NO_ERROR;
00331 }
00332 
00333 DWORD getIPStats(PMIB_IPSTATS stats, DWORD family)
00334 {
00335   if (!stats)
00336     return ERROR_INVALID_PARAMETER;
00337   return NO_ERROR;
00338 }
00339 
00340 DWORD getTCPStats(MIB_TCPSTATS *stats, DWORD family)
00341 {
00342   if (!stats)
00343     return ERROR_INVALID_PARAMETER;
00344   return NO_ERROR;
00345 }
00346 
00347 DWORD getUDPStats(MIB_UDPSTATS *stats, DWORD family)
00348 {
00349   if (!stats)
00350     return ERROR_INVALID_PARAMETER;
00351   return NO_ERROR;
00352 }
00353 
00354 static DWORD getNumWithOneHeader(const char *filename)
00355 {
00356     return 0;
00357 }
00358 
00359 DWORD getNumRoutes(void)
00360 {
00361     DWORD numEntities, numRoutes = 0;
00362     TDIEntityID *entitySet;
00363     HANDLE tcpFile;
00364     int i;
00365     NTSTATUS status;
00366 
00367     TRACE("called.\n");
00368 
00369     status = openTcpFile( &tcpFile );
00370 
00371     if( !NT_SUCCESS(status) ) {
00372         TRACE("failure: %08x\n", (int)status );
00373         return 0;
00374     }
00375 
00376     status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
00377 
00378     if( !NT_SUCCESS(status) ) {
00379         TRACE("failure: %08x\n", (int)status );
00380         closeTcpFile( tcpFile );
00381         return 0;
00382     }
00383 
00384     for( i = 0; i < numEntities; i++ ) {
00385         if( isIpEntity( tcpFile, &entitySet[i] ) ) {
00386             IPSNMPInfo isnmp;
00387             memset( &isnmp, 0, sizeof( isnmp ) );
00388             status = tdiGetMibForIpEntity( tcpFile, &entitySet[i], &isnmp );
00389             if( !NT_SUCCESS(status) ) {
00390                 tdiFreeThingSet( entitySet );
00391                 closeTcpFile( tcpFile );
00392                 return status;
00393             }
00394             numRoutes += isnmp.ipsi_numroutes;
00395         }
00396     }
00397 
00398     TRACE("numRoutes: %d\n", (int)numRoutes);
00399 
00400     closeTcpFile( tcpFile );
00401 
00402     return numRoutes;
00403 }
00404 
00405 VOID HexDump( PCHAR Data, DWORD Len ) {
00406     int i;
00407 
00408     for( i = 0; i < Len; i++ ) {
00409         if( !(i & 0xf) ) {
00410             if( i ) fprintf(stderr,"\n");
00411             fprintf(stderr,"%08x:", i);
00412         }
00413         fprintf( stderr, " %02x", Data[i] & 0xff );
00414     }
00415     fprintf(stderr,"\n");
00416 }
00417 
00418 RouteTable *getRouteTable(void)
00419 {
00420     RouteTable *out_route_table;
00421     DWORD numRoutes = getNumRoutes(), routesAdded = 0;
00422     TDIEntityID ent;
00423     HANDLE tcpFile;
00424     NTSTATUS status = openTcpFile( &tcpFile );
00425     int i;
00426 
00427     if( !NT_SUCCESS(status) )
00428         return 0;
00429 
00430     TRACE("GETTING ROUTE TABLE\n");
00431 
00432     out_route_table = HeapAlloc( GetProcessHeap(), 0,
00433                                  sizeof(RouteTable) +
00434                                  (sizeof(RouteEntry) * (numRoutes - 1)) );
00435     if (!out_route_table) {
00436         closeTcpFile(tcpFile);
00437         return NULL;
00438     }
00439 
00440     out_route_table->numRoutes = numRoutes;
00441 
00442     for( i = 0; routesAdded < out_route_table->numRoutes; i++ ) {
00443         int j;
00444         IPRouteEntry *route_set;
00445 
00446         getNthIpEntity( tcpFile, i, &ent );
00447 
00448         tdiGetRoutesForIpEntity( tcpFile, &ent, &route_set, &numRoutes );
00449         
00450         if( !route_set ) {
00451             closeTcpFile( tcpFile );
00452             HeapFree( GetProcessHeap(), 0, out_route_table );
00453             return 0;
00454         }
00455 
00456         TRACE( "%d routes in instance %d\n", numRoutes, i );
00457 #if 0
00458         HexDump( route_set,
00459                  sizeof( IPRouteEntry ) *
00460                  snmpInfo.ipsi_numroutes );
00461 #endif
00462 
00463         for( j = 0; j < numRoutes; j++ ) {
00464             int routeNum = j + routesAdded;
00465             out_route_table->routes[routeNum].dest =
00466                 route_set[j].ire_dest;
00467             out_route_table->routes[routeNum].mask =
00468                 route_set[j].ire_mask;
00469             out_route_table->routes[routeNum].gateway =
00470                 route_set[j].ire_gw;
00471             out_route_table->routes[routeNum].ifIndex =
00472                 route_set[j].ire_index;
00473             out_route_table->routes[routeNum].metric =
00474                 route_set[j].ire_metric1;
00475         }
00476 
00477         if( route_set ) tdiFreeThingSet( route_set );
00478 
00479         routesAdded += numRoutes;
00480     }
00481 
00482     closeTcpFile( tcpFile );
00483 
00484     TRACE("Return: %08x, %08x\n", status, out_route_table);
00485 
00486     return out_route_table;
00487 }
00488 
00489 DWORD getNumArpEntries(void)
00490 {
00491     DWORD numEntities;
00492     TDIEntityID *entitySet = NULL;
00493     HANDLE tcpFile;
00494     int i, totalNumber = 0;
00495     NTSTATUS status;
00496     PMIB_IPNETROW IpArpTable = NULL;
00497     DWORD returnSize;
00498 
00499     TRACE("called.\n");
00500 
00501     status = openTcpFile( &tcpFile );
00502 
00503     if( !NT_SUCCESS(status) ) {
00504         TRACE("failure: %08x\n", (int)status );
00505         return 0;
00506     }
00507 
00508     status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
00509 
00510     for( i = 0; i < numEntities; i++ ) {
00511         if( isInterface( &entitySet[i] ) &&
00512         hasArp( tcpFile, &entitySet[i] ) ) {
00513 
00514         status = tdiGetSetOfThings( tcpFile,
00515                     INFO_CLASS_PROTOCOL,
00516                     INFO_TYPE_PROVIDER,
00517                     IP_MIB_ARPTABLE_ENTRY_ID,
00518                     AT_ENTITY,
00519                     entitySet[i].tei_instance,
00520                     0,
00521                     sizeof(MIB_IPNETROW),
00522                     (PVOID *)&IpArpTable,
00523                     &returnSize );
00524 
00525         if( status == STATUS_SUCCESS ) totalNumber += returnSize;
00526         if( IpArpTable ) {
00527             tdiFreeThingSet( IpArpTable );
00528             IpArpTable = NULL;
00529         }
00530     }
00531     }
00532 
00533     closeTcpFile( tcpFile );
00534     if( IpArpTable ) tdiFreeThingSet( IpArpTable );
00535     if( entitySet ) tdiFreeThingSet( entitySet );
00536     return totalNumber;
00537 }
00538 
00539 PMIB_IPNETTABLE getArpTable(void)
00540 {
00541     DWORD numEntities, returnSize;
00542     TDIEntityID *entitySet;
00543     HANDLE tcpFile;
00544     int i, totalNumber, TmpIdx, CurrIdx = 0;
00545     NTSTATUS status;
00546     PMIB_IPNETTABLE IpArpTable = NULL;
00547     PMIB_IPNETROW AdapterArpTable = NULL;
00548 
00549     TRACE("called.\n");
00550 
00551     totalNumber = getNumArpEntries();
00552 
00553     status = openTcpFile( &tcpFile );
00554 
00555     if( !NT_SUCCESS(status) ) {
00556         TRACE("failure: %08x\n", (int)status );
00557         return 0;
00558     }
00559 
00560     IpArpTable = HeapAlloc
00561     ( GetProcessHeap(), 0,
00562       sizeof(DWORD) + (sizeof(MIB_IPNETROW) * totalNumber) );
00563     if (!IpArpTable) {
00564         closeTcpFile(tcpFile);
00565         return NULL;
00566     }
00567 
00568     status = tdiGetEntityIDSet( tcpFile, &entitySet, &numEntities );
00569 
00570     for( i = 0; i < numEntities; i++ ) {
00571         if( isInterface( &entitySet[i] ) &&
00572         hasArp( tcpFile, &entitySet[i] ) ) {
00573 
00574         status = tdiGetSetOfThings( tcpFile,
00575                     INFO_CLASS_PROTOCOL,
00576                     INFO_TYPE_PROVIDER,
00577                     IP_MIB_ARPTABLE_ENTRY_ID,
00578                     AT_ENTITY,
00579                     entitySet[i].tei_instance,
00580                     0,
00581                     sizeof(MIB_IPNETROW),
00582                     (PVOID *)&AdapterArpTable,
00583                     &returnSize );
00584 
00585         if( status == STATUS_SUCCESS ) {
00586         for( TmpIdx = 0; TmpIdx < returnSize; TmpIdx++, CurrIdx++ )
00587             IpArpTable->table[CurrIdx] = AdapterArpTable[TmpIdx];
00588         }
00589 
00590         if( AdapterArpTable ) tdiFreeThingSet( AdapterArpTable );
00591     }
00592     }
00593 
00594     closeTcpFile( tcpFile );
00595 
00596     tdiFreeThingSet( entitySet );
00597     IpArpTable->dwNumEntries = CurrIdx;
00598 
00599     return IpArpTable;
00600 }
00601 
00602 DWORD getNumUdpEntries(void)
00603 {
00604   return getNumWithOneHeader("/proc/net/udp");
00605 }
00606 
00607 PMIB_UDPTABLE getUdpTable(void)
00608 {
00609   DWORD numEntries = getNumUdpEntries();
00610   PMIB_UDPTABLE ret;
00611 
00612   ret = (PMIB_UDPTABLE)calloc(1, sizeof(MIB_UDPTABLE) +
00613    (numEntries - 1) * sizeof(MIB_UDPROW));
00614   if (ret) {
00615     FILE *fp;
00616 
00617     /* get from /proc/net/udp, no error if can't */
00618     fp = fopen("/proc/net/udp", "r");
00619     if (fp) {
00620       char buf[512] = { 0 }, *ptr;
00621 
00622       /* skip header line */
00623       ptr = fgets(buf, sizeof(buf), fp);
00624       while (ptr && ret->dwNumEntries < numEntries) {
00625         ptr = fgets(buf, sizeof(buf), fp);
00626         if (ptr) {
00627           char *endPtr;
00628 
00629           if (ptr && *ptr) {
00630             strtoul(ptr, &endPtr, 16); /* skip */
00631             ptr = endPtr;
00632           }
00633           if (ptr && *ptr) {
00634             ptr++;
00635             ret->table[ret->dwNumEntries].dwLocalAddr = strtoul(ptr, &endPtr,
00636              16);
00637             ptr = endPtr;
00638           }
00639           if (ptr && *ptr) {
00640             ptr++;
00641             ret->table[ret->dwNumEntries].dwLocalPort = strtoul(ptr, &endPtr,
00642              16);
00643             ptr = endPtr;
00644           }
00645           ret->dwNumEntries++;
00646         }
00647       }
00648       fclose(fp);
00649     }
00650   }
00651   return ret;
00652 }
00653 
00654 DWORD getNumTcpEntries(void)
00655 {
00656   return getNumWithOneHeader("/proc/net/tcp");
00657 }
00658 
00659 PMIB_TCPTABLE getTcpTable(void)
00660 {
00661     return 0;
00662 }

Generated on Sat May 26 2012 04:22:43 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.