318 |
|
*entries = diff_count; |
319 |
|
return diff; |
320 |
|
} |
321 |
+ |
/* NETWORK INTERFACE STATS */ |
322 |
+ |
|
323 |
+ |
void network_iface_stat_init(int start, int end, network_iface_stat_t *net_stats){ |
324 |
+ |
|
325 |
+ |
for(net_stats+=start; start<end; start++){ |
326 |
+ |
net_stats->interface_name=NULL; |
327 |
+ |
net_stats->speed=0; |
328 |
+ |
net_stats->dup=NO_DUPLEX; |
329 |
+ |
net_stats++; |
330 |
+ |
} |
331 |
+ |
} |
332 |
+ |
|
333 |
+ |
network_iface_stat_t *network_iface_stat_malloc(int needed_entries, int *cur_entries, network_iface_stat_t *net_stats){ |
334 |
+ |
|
335 |
+ |
if(net_stats==NULL){ |
336 |
+ |
|
337 |
+ |
if((net_stats=malloc(needed_entries * sizeof(network_iface_stat_t)))==NULL){ |
338 |
+ |
return NULL; |
339 |
+ |
} |
340 |
+ |
network_iface_stat_init(0, needed_entries, net_stats); |
341 |
+ |
*cur_entries=needed_entries; |
342 |
+ |
|
343 |
+ |
return net_stats; |
344 |
+ |
} |
345 |
+ |
|
346 |
+ |
|
347 |
+ |
if(*cur_entries<needed_entries){ |
348 |
+ |
net_stats=realloc(net_stats, (sizeof(network_iface_stat_t)*needed_entries)); |
349 |
+ |
if(net_stats==NULL){ |
350 |
+ |
return NULL; |
351 |
+ |
} |
352 |
+ |
network_iface_stat_init(*cur_entries, needed_entries, net_stats); |
353 |
+ |
*cur_entries=needed_entries; |
354 |
+ |
} |
355 |
+ |
|
356 |
+ |
return net_stats; |
357 |
+ |
} |
358 |
+ |
|
359 |
+ |
network_iface_stat_t *get_network_iface_stats(int *entries){ |
360 |
+ |
static network_iface_stat_t *network_iface_stats; |
361 |
+ |
network_iface_stat_t *network_iface_stat_ptr; |
362 |
+ |
static int sizeof_network_iface_stats=0; |
363 |
+ |
int ifaces; |
364 |
+ |
|
365 |
+ |
#ifdef SOLARIS |
366 |
+ |
kstat_ctl_t *kc; |
367 |
+ |
kstat_t *ksp; |
368 |
+ |
kstat_named_t *knp; |
369 |
+ |
#endif |
370 |
+ |
|
371 |
+ |
#ifdef SOLARIS |
372 |
+ |
if ((kc = kstat_open()) == NULL) { |
373 |
+ |
return NULL; |
374 |
+ |
} |
375 |
+ |
|
376 |
+ |
ifaces=0; |
377 |
+ |
|
378 |
+ |
for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) { |
379 |
+ |
if (!strcmp(ksp->ks_class, "net")) { |
380 |
+ |
kstat_read(kc, ksp, NULL); |
381 |
+ |
if((knp=kstat_data_lookup(ksp, "ifspeed"))==NULL){ |
382 |
+ |
/* Not a network interface, so skip to the next entry */ |
383 |
+ |
continue; |
384 |
+ |
} |
385 |
+ |
network_iface_stats=network_iface_stat_malloc((ifaces+1), &sizeof_network_iface_stats, network_iface_stats); |
386 |
+ |
if(network_iface_stats==NULL){ |
387 |
+ |
return NULL; |
388 |
+ |
} |
389 |
+ |
network_iface_stat_ptr = network_iface_stats + interfaces; |
390 |
+ |
network_iface_stat_ptr->speed = knp->value.ui64 / (1000*1000); |
391 |
+ |
|
392 |
+ |
if((knp=kstat_data_lookup(ksp, "link_duplex"))==NULL){ |
393 |
+ |
/* Not a network interface, so skip to the next entry */ |
394 |
+ |
continue; |
395 |
+ |
} |
396 |
+ |
|
397 |
+ |
if(knp->value.ui64 == 0){ |
398 |
+ |
network_iface_stat_ptr->dup = FULL_DUPLEX; |
399 |
+ |
}else{ |
400 |
+ |
network_iface_stat_ptr->dup = HALF_DUPLEX; |
401 |
+ |
} |
402 |
+ |
|
403 |
+ |
network_iface_stat_ptr->interface_name = strdup(ksp->ks_name); |
404 |
+ |
interfaces++; |
405 |
+ |
} |
406 |
+ |
} |
407 |
+ |
kstat_close(kc); |
408 |
+ |
|
409 |
+ |
#endif |
410 |
+ |
*entries = interfaces; |
411 |
+ |
return network_iface_stats; |
412 |
+ |
} |
413 |
+ |
|