Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenipstats_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
1.7.6.1
|