39 |
|
#include <sys/vfs.h> |
40 |
|
#include <mntent.h> |
41 |
|
#include "tools.h" |
42 |
+ |
#ifdef CYGWIN |
43 |
+ |
#define VALID_FS_TYPES {"user"} |
44 |
+ |
#else |
45 |
|
#define VALID_FS_TYPES {"adfs", "affs", "befs", "bfs", "efs", "ext2", \ |
46 |
|
"ext3", "vxfs", "hfs", "hfsplus", "hpfs", "jffs", \ |
47 |
|
"jffs2", "minix", "msdos", "ntfs", "qnx4", "ramfs", \ |
48 |
|
"rootfs", "reiserfs", "sysv", "v7", "udf", "ufs", \ |
49 |
|
"umsdos", "vfat", "xfs", "jfs"} |
50 |
|
#endif |
51 |
+ |
#endif |
52 |
|
|
53 |
|
#ifdef ALLBSD |
54 |
|
#include <sys/param.h> |
270 |
|
|
271 |
|
*entries=num_disks; |
272 |
|
|
273 |
< |
/* If this fails, there is very little i can do about it, so i'll ignore it :) */ |
274 |
< |
#if defined(LINUX) || defined(SOLARIS) |
273 |
> |
/* If this fails, there is very little i can do about it, so |
274 |
> |
I'll ignore it :) */ |
275 |
> |
#if defined(LINUX) |
276 |
> |
endmntent(f); |
277 |
> |
#endif |
278 |
> |
#if defined(SOLARIS) |
279 |
|
fclose(f); |
280 |
|
#endif |
281 |
|
|
330 |
|
diskio_stat_t *get_diskio_stats(int *entries){ |
331 |
|
|
332 |
|
static int sizeof_diskio_stats=0; |
333 |
+ |
#ifndef LINUX |
334 |
|
diskio_stat_t *diskio_stats_ptr; |
335 |
+ |
#endif |
336 |
|
|
337 |
|
#ifdef SOLARIS |
338 |
|
kstat_ctl_t *kc; |
343 |
|
FILE *f; |
344 |
|
char *line_ptr; |
345 |
|
int major, minor; |
336 |
– |
char dev_letter; |
346 |
|
int has_pp_stats = 1; |
347 |
|
static partition *parts = NULL; |
348 |
|
static int alloc_parts = 0; |
349 |
|
int i, n; |
350 |
|
time_t now; |
351 |
+ |
const char *format; |
352 |
|
#endif |
353 |
|
#ifdef FREEBSD |
354 |
|
static struct statinfo stats; |
521 |
|
n = 0; |
522 |
|
|
523 |
|
/* Read /proc/partitions to find what devices exist. Recent 2.4 kernels |
524 |
< |
have statistics in here too, so we can use those directly. */ |
524 |
> |
have statistics in here too, so we can use those directly. |
525 |
> |
2.6 kernels have /proc/diskstats instead with almost (but not quite) |
526 |
> |
the same format. */ |
527 |
|
|
528 |
< |
f = fopen("/proc/partitions", "r"); |
528 |
> |
f = fopen("/proc/diskstats", "r"); |
529 |
> |
format = " %d %d %19s %*d %*d %lld %*d %*d %*d %lld"; |
530 |
> |
if (f == NULL) { |
531 |
> |
f = fopen("/proc/partitions", "r"); |
532 |
> |
format = " %d %d %*d %19s %*d %*d %lld %*d %*d %*d %lld"; |
533 |
> |
} |
534 |
|
if (f == NULL) goto out; |
535 |
|
now = time(NULL); |
536 |
|
|
539 |
|
char *s; |
540 |
|
long long rsect, wsect; |
541 |
|
|
542 |
< |
int nr = sscanf(line_ptr, |
526 |
< |
" %d %d %*d %19s %*d %*d %lld %*d %*d %*d %lld", |
542 |
> |
int nr = sscanf(line_ptr, format, |
543 |
|
&major, &minor, name, &rsect, &wsect); |
544 |
|
if (nr < 3) continue; |
529 |
– |
if (nr < 5) { |
530 |
– |
has_pp_stats = 0; |
531 |
– |
rsect = 0; |
532 |
– |
wsect = 0; |
533 |
– |
} |
545 |
|
|
546 |
|
/* Skip device names ending in numbers, since they're |
547 |
|
partitions. */ |
549 |
|
while (*s != '\0') s++; |
550 |
|
--s; |
551 |
|
if (*s >= '0' && *s <= '9') continue; |
552 |
+ |
|
553 |
+ |
if (nr < 5) { |
554 |
+ |
has_pp_stats = 0; |
555 |
+ |
rsect = 0; |
556 |
+ |
wsect = 0; |
557 |
+ |
} |
558 |
|
|
559 |
|
diskio_stats = diskio_stat_malloc(n + 1, &sizeof_diskio_stats, |
560 |
|
diskio_stats); |