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> |
55 |
|
#include <sys/ucred.h> |
56 |
|
#include <sys/mount.h> |
53 |
– |
#define VALID_FS_TYPES {"ufs", "mfs", "ffs"} |
57 |
|
#endif |
58 |
|
#ifdef FREEBSD |
59 |
|
#include <sys/dkstat.h> |
60 |
|
#include <devstat.h> |
61 |
+ |
#define VALID_FS_TYPES {"hpfs", "msdosfs", "ntfs", "udf", "ext2fs", \ |
62 |
+ |
"ufs", "mfs"} |
63 |
|
#endif |
64 |
|
#ifdef NETBSD |
65 |
|
#include <sys/param.h> |
66 |
|
#include <sys/sysctl.h> |
67 |
|
#include <sys/disk.h> |
68 |
+ |
#define VALID_FS_TYPES {"ffs", "mfs", "msdos", "lfs", "adosfs", "ext2fs", \ |
69 |
+ |
"ntfs"} |
70 |
|
#endif |
71 |
|
|
72 |
|
#define START_VAL 1 |
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; |
333 |
– |
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; |
394 |
|
rbytes = stats[i].dk_rbytes; |
395 |
|
wbytes = stats[i].dk_wbytes; |
396 |
|
#else |
397 |
< |
/* Before 1.6.1, NetBSD merged reads and writes. */ |
397 |
> |
/* Before 1.7, NetBSD merged reads and writes. */ |
398 |
|
rbytes = wbytes = stats[i].dk_bytes; |
399 |
|
#endif |
400 |
|
|
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, |
523 |
< |
" %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; |
526 |
– |
if (nr < 5) { |
527 |
– |
has_pp_stats = 0; |
528 |
– |
rsect = 0; |
529 |
– |
wsect = 0; |
530 |
– |
} |
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); |