| 35 |
|
#endif |
| 36 |
|
|
| 37 |
|
#ifdef LINUX |
| 38 |
+ |
#include <time.h> |
| 39 |
|
#include <sys/vfs.h> |
| 40 |
|
#include <mntent.h> |
| 41 |
|
#include "tools.h" |
| 42 |
< |
#define VALID_FS_TYPES {"ext2", "ext3", "xfs", "reiserfs", "vfat", "tmpfs"} |
| 42 |
> |
#define VALID_FS_TYPES {"adfs", "affs", "befs", "bfs", "efs", "ext2", \ |
| 43 |
> |
"ext3", "vxfs", "hfs", "hfsplus", "hpfs", "jffs", \ |
| 44 |
> |
"jffs2", "minix", "msdos", "ntfs", "qnx4", "ramfs", \ |
| 45 |
> |
"rootfs", "reiserfs", "sysv", "v7", "udf", "ufs", \ |
| 46 |
> |
"umsdos", "vfat", "xfs", "jfs"} |
| 47 |
|
#endif |
| 48 |
|
|
| 49 |
< |
#ifdef FREEBSD |
| 49 |
> |
#ifdef ALLBSD |
| 50 |
|
#include <sys/param.h> |
| 51 |
|
#include <sys/ucred.h> |
| 52 |
|
#include <sys/mount.h> |
| 53 |
+ |
#endif |
| 54 |
+ |
#ifdef FREEBSD |
| 55 |
|
#include <sys/dkstat.h> |
| 56 |
|
#include <devstat.h> |
| 57 |
< |
#define VALID_FS_TYPES {"ufs", "mfs"} |
| 57 |
> |
#define VALID_FS_TYPES {"hpfs", "msdosfs", "ntfs", "udf", "ext2fs", \ |
| 58 |
> |
"ufs", "mfs"} |
| 59 |
|
#endif |
| 60 |
+ |
#ifdef NETBSD |
| 61 |
+ |
#include <sys/param.h> |
| 62 |
+ |
#include <sys/sysctl.h> |
| 63 |
+ |
#include <sys/disk.h> |
| 64 |
+ |
#define VALID_FS_TYPES {"ffs", "mfs", "msdos", "lfs", "adosfs", "ext2fs", \ |
| 65 |
+ |
"ntfs"} |
| 66 |
+ |
#endif |
| 67 |
+ |
|
| 68 |
|
#define START_VAL 1 |
| 69 |
|
|
| 70 |
|
char *copy_string(char *orig_ptr, const char *newtext){ |
| 113 |
|
struct mntent *mp; |
| 114 |
|
struct statfs fs; |
| 115 |
|
#endif |
| 116 |
< |
#ifdef FREEBSD |
| 116 |
> |
#ifdef ALLBSD |
| 117 |
|
int nummnt; |
| 118 |
|
struct statfs *mp; |
| 119 |
|
#endif |
| 126 |
|
watermark=START_VAL; |
| 127 |
|
init_disk_stat(0, watermark-1, disk_stats); |
| 128 |
|
} |
| 129 |
< |
#ifdef FREEBSD |
| 129 |
> |
#ifdef ALLBSD |
| 130 |
|
nummnt=getmntinfo(&mp , MNT_LOCAL); |
| 131 |
|
if (nummnt<=0){ |
| 132 |
|
return NULL; |
| 190 |
|
} |
| 191 |
|
|
| 192 |
|
disk_ptr=disk_stats+num_disks; |
| 193 |
< |
#ifdef FREEBSD |
| 193 |
> |
#ifdef ALLBSD |
| 194 |
|
if((disk_ptr->device_name=copy_string(disk_ptr->device_name, mp->f_mntfromname))==NULL){ |
| 195 |
|
return NULL; |
| 196 |
|
} |
| 341 |
|
time_t now; |
| 342 |
|
#endif |
| 343 |
|
#ifdef FREEBSD |
| 344 |
< |
struct statinfo stats; |
| 344 |
> |
static struct statinfo stats; |
| 345 |
> |
static int stats_init = 0; |
| 346 |
|
int counter; |
| 347 |
|
struct device_selection *dev_sel = NULL; |
| 348 |
|
int n_selected, n_selections; |
| 349 |
|
long sel_gen; |
| 350 |
|
struct devstat *dev_ptr; |
| 351 |
|
#endif |
| 352 |
+ |
#ifdef NETBSD |
| 353 |
+ |
struct disk_sysctl *stats; |
| 354 |
+ |
int num_disks, i; |
| 355 |
+ |
int mib[3]; |
| 356 |
+ |
size_t size; |
| 357 |
+ |
#endif |
| 358 |
+ |
|
| 359 |
|
num_diskio=0; |
| 360 |
|
|
| 361 |
+ |
#ifdef NETBSD |
| 362 |
+ |
mib[0] = CTL_HW; |
| 363 |
+ |
mib[1] = HW_DISKSTATS; |
| 364 |
+ |
mib[2] = sizeof(struct disk_sysctl); |
| 365 |
+ |
|
| 366 |
+ |
if (sysctl(mib, 3, NULL, &size, NULL, 0) < 0) { |
| 367 |
+ |
return NULL; |
| 368 |
+ |
} |
| 369 |
+ |
num_disks = size / sizeof(struct disk_sysctl); |
| 370 |
+ |
|
| 371 |
+ |
stats = malloc(size); |
| 372 |
+ |
if (stats == NULL) { |
| 373 |
+ |
return NULL; |
| 374 |
+ |
} |
| 375 |
+ |
|
| 376 |
+ |
if (sysctl(mib, 3, stats, &size, NULL, 0) < 0) { |
| 377 |
+ |
return NULL; |
| 378 |
+ |
} |
| 379 |
+ |
|
| 380 |
+ |
for (i = 0; i < num_disks; i++) { |
| 381 |
+ |
u_int64_t rbytes, wbytes; |
| 382 |
+ |
|
| 383 |
+ |
#ifdef HAVE_DK_RBYTES |
| 384 |
+ |
rbytes = stats[i].dk_rbytes; |
| 385 |
+ |
wbytes = stats[i].dk_wbytes; |
| 386 |
+ |
#else |
| 387 |
+ |
/* Before 1.7, NetBSD merged reads and writes. */ |
| 388 |
+ |
rbytes = wbytes = stats[i].dk_bytes; |
| 389 |
+ |
#endif |
| 390 |
+ |
|
| 391 |
+ |
/* Don't keep stats for disks that have never been used. */ |
| 392 |
+ |
if (rbytes == 0 && wbytes == 0) { |
| 393 |
+ |
continue; |
| 394 |
+ |
} |
| 395 |
+ |
|
| 396 |
+ |
diskio_stats = diskio_stat_malloc(num_diskio + 1, |
| 397 |
+ |
&sizeof_diskio_stats, |
| 398 |
+ |
diskio_stats); |
| 399 |
+ |
if (diskio_stats == NULL) { |
| 400 |
+ |
return NULL; |
| 401 |
+ |
} |
| 402 |
+ |
diskio_stats_ptr = diskio_stats + num_diskio; |
| 403 |
+ |
|
| 404 |
+ |
diskio_stats_ptr->read_bytes = rbytes; |
| 405 |
+ |
diskio_stats_ptr->write_bytes = wbytes; |
| 406 |
+ |
if (diskio_stats_ptr->disk_name != NULL) { |
| 407 |
+ |
free(diskio_stats_ptr->disk_name); |
| 408 |
+ |
} |
| 409 |
+ |
diskio_stats_ptr->disk_name = strdup(stats[i].dk_name); |
| 410 |
+ |
diskio_stats_ptr->systime = time(NULL); |
| 411 |
+ |
|
| 412 |
+ |
num_diskio++; |
| 413 |
+ |
} |
| 414 |
+ |
|
| 415 |
+ |
free(stats); |
| 416 |
+ |
#endif |
| 417 |
+ |
|
| 418 |
|
#ifdef FREEBSD |
| 419 |
< |
stats.dinfo=malloc(sizeof(struct devinfo)); |
| 420 |
< |
if(stats.dinfo==NULL) return NULL; |
| 419 |
> |
if (!stats_init) { |
| 420 |
> |
stats.dinfo=malloc(sizeof(struct devinfo)); |
| 421 |
> |
if(stats.dinfo==NULL) return NULL; |
| 422 |
> |
bzero(stats.dinfo, sizeof(struct devinfo)); |
| 423 |
> |
stats_init = 1; |
| 424 |
> |
} |
| 425 |
> |
#ifdef FREEBSD5 |
| 426 |
> |
if ((devstat_getdevs(NULL, &stats)) < 0) return NULL; |
| 427 |
> |
/* Not aware of a get all devices, so i said 999. If we ever |
| 428 |
> |
* find a machine with more than 999 disks, then i'll change |
| 429 |
> |
* this number :) |
| 430 |
> |
*/ |
| 431 |
> |
if (devstat_selectdevs(&dev_sel, &n_selected, &n_selections, &sel_gen, stats.dinfo->generation, stats.dinfo->devices, stats.dinfo->numdevs, NULL, 0, NULL, 0, DS_SELECT_ONLY, 999, 1) < 0) return NULL; |
| 432 |
> |
#else |
| 433 |
|
if ((getdevs(&stats)) < 0) return NULL; |
| 434 |
|
/* Not aware of a get all devices, so i said 999. If we ever |
| 435 |
|
* find a machine with more than 999 disks, then i'll change |
| 436 |
|
* this number :) |
| 437 |
|
*/ |
| 438 |
|
if (selectdevs(&dev_sel, &n_selected, &n_selections, &sel_gen, stats.dinfo->generation, stats.dinfo->devices, stats.dinfo->numdevs, NULL, 0, NULL, 0, DS_SELECT_ONLY, 999, 1) < 0) return NULL; |
| 439 |
+ |
#endif |
| 440 |
|
|
| 441 |
|
for(counter=0;counter<stats.dinfo->numdevs;counter++){ |
| 442 |
|
dev_ptr=&stats.dinfo->devices[dev_sel[counter].position]; |
| 445 |
|
* devices.. like mem, proc.. and also doesn't report floppy |
| 446 |
|
* drives etc unless they are doing stuff :) |
| 447 |
|
*/ |
| 448 |
+ |
#ifdef FREEBSD5 |
| 449 |
+ |
if((dev_ptr->bytes[DEVSTAT_READ]==0) && (dev_ptr->bytes[DEVSTAT_WRITE]==0)) continue; |
| 450 |
+ |
#else |
| 451 |
|
if((dev_ptr->bytes_read==0) && (dev_ptr->bytes_written==0)) continue; |
| 452 |
+ |
#endif |
| 453 |
|
if((diskio_stats=diskio_stat_malloc(num_diskio+1, &sizeof_diskio_stats, diskio_stats))==NULL){ |
| 454 |
|
return NULL; |
| 455 |
|
} |
| 456 |
|
diskio_stats_ptr=diskio_stats+num_diskio; |
| 457 |
< |
|
| 457 |
> |
|
| 458 |
> |
#ifdef FREEBSD5 |
| 459 |
> |
diskio_stats_ptr->read_bytes=dev_ptr->bytes[DEVSTAT_READ]; |
| 460 |
> |
diskio_stats_ptr->write_bytes=dev_ptr->bytes[DEVSTAT_WRITE]; |
| 461 |
> |
#else |
| 462 |
|
diskio_stats_ptr->read_bytes=dev_ptr->bytes_read; |
| 463 |
|
diskio_stats_ptr->write_bytes=dev_ptr->bytes_written; |
| 464 |
+ |
#endif |
| 465 |
|
if(diskio_stats_ptr->disk_name!=NULL) free(diskio_stats_ptr->disk_name); |
| 466 |
|
asprintf((&diskio_stats_ptr->disk_name), "%s%d", dev_ptr->device_name, dev_ptr->unit_number); |
| 467 |
|
diskio_stats_ptr->systime=time(NULL); |
| 469 |
|
num_diskio++; |
| 470 |
|
} |
| 471 |
|
free(dev_sel); |
| 369 |
– |
free(stats.dinfo); |
| 472 |
|
|
| 473 |
|
#endif |
| 474 |
|
#ifdef SOLARIS |