322 |
|
diskio_stat_t *get_diskio_stats(int *entries){ |
323 |
|
|
324 |
|
static int sizeof_diskio_stats=0; |
325 |
+ |
#ifndef LINUX |
326 |
|
diskio_stat_t *diskio_stats_ptr; |
327 |
+ |
#endif |
328 |
|
|
329 |
|
#ifdef SOLARIS |
330 |
|
kstat_ctl_t *kc; |
335 |
|
FILE *f; |
336 |
|
char *line_ptr; |
337 |
|
int major, minor; |
336 |
– |
char dev_letter; |
338 |
|
int has_pp_stats = 1; |
339 |
|
static partition *parts = NULL; |
340 |
|
static int alloc_parts = 0; |
341 |
|
int i, n; |
342 |
|
time_t now; |
343 |
+ |
const char *format; |
344 |
|
#endif |
345 |
|
#ifdef FREEBSD |
346 |
|
static struct statinfo stats; |
513 |
|
n = 0; |
514 |
|
|
515 |
|
/* Read /proc/partitions to find what devices exist. Recent 2.4 kernels |
516 |
< |
have statistics in here too, so we can use those directly. */ |
516 |
> |
have statistics in here too, so we can use those directly. |
517 |
> |
2.6 kernels have /proc/diskstats instead with almost (but not quite) |
518 |
> |
the same format. */ |
519 |
|
|
520 |
< |
f = fopen("/proc/partitions", "r"); |
520 |
> |
f = fopen("/proc/diskstats", "r"); |
521 |
> |
format = " %d %d %19s %*d %*d %lld %*d %*d %*d %lld"; |
522 |
> |
if (f == NULL) { |
523 |
> |
f = fopen("/proc/partitions", "r"); |
524 |
> |
format = " %d %d %*d %19s %*d %*d %lld %*d %*d %*d %lld"; |
525 |
> |
} |
526 |
|
if (f == NULL) goto out; |
527 |
|
now = time(NULL); |
528 |
|
|
531 |
|
char *s; |
532 |
|
long long rsect, wsect; |
533 |
|
|
534 |
< |
int nr = sscanf(line_ptr, |
526 |
< |
" %d %d %*d %19s %*d %*d %lld %*d %*d %*d %lld", |
534 |
> |
int nr = sscanf(line_ptr, format, |
535 |
|
&major, &minor, name, &rsect, &wsect); |
536 |
|
if (nr < 3) continue; |
529 |
– |
if (nr < 5) { |
530 |
– |
has_pp_stats = 0; |
531 |
– |
rsect = 0; |
532 |
– |
wsect = 0; |
533 |
– |
} |
537 |
|
|
538 |
|
/* Skip device names ending in numbers, since they're |
539 |
|
partitions. */ |
541 |
|
while (*s != '\0') s++; |
542 |
|
--s; |
543 |
|
if (*s >= '0' && *s <= '9') continue; |
544 |
+ |
|
545 |
+ |
if (nr < 5) { |
546 |
+ |
has_pp_stats = 0; |
547 |
+ |
rsect = 0; |
548 |
+ |
wsect = 0; |
549 |
+ |
} |
550 |
|
|
551 |
|
diskio_stats = diskio_stat_malloc(n + 1, &sizeof_diskio_stats, |
552 |
|
diskio_stats); |