make iostats functions usable with device path

This commit is contained in:
Doug MacEachern 2007-10-10 04:40:52 +00:00
parent 3badfe1723
commit 1a974c02f2
1 changed files with 35 additions and 6 deletions

View File

@ -1174,7 +1174,8 @@ int sigar_file_system_list_get(sigar_t *sigar,
return SIGAR_OK;
}
#define FSDEV_IS_DEV(dev) strnEQ(dev, "/dev/", 5)
#define FSDEV_PREFIX "/dev/"
#define FSDEV_IS_DEV(dev) strnEQ(dev, FSDEV_PREFIX, 5)
#define ST_MAJOR(sb) major((sb).st_rdev)
#define ST_MINOR(sb) minor((sb).st_rdev)
@ -1190,8 +1191,23 @@ static iodev_t *get_fsdev(sigar_t *sigar,
struct stat sb;
sigar_uint64_t id;
sigar_file_system_list_t fslist;
int i, status;
int i, status, is_dev=0;
int debug = SIGAR_LOG_IS_DEBUG(sigar);
char dev_name[SIGAR_FS_NAME_LEN];
if (!sigar->fsdev) {
sigar->fsdev = sigar_cache_new(15);
}
if (*dirname != '/') {
snprintf(dev_name, sizeof(dev_name),
FSDEV_PREFIX "%s", dirname);
dirname = dev_name;
is_dev = 1;
}
else if (FSDEV_IS_DEV(dirname)) {
is_dev = 1;
}
if (stat(dirname, &sb) < 0) {
if (debug) {
@ -1202,10 +1218,11 @@ static iodev_t *get_fsdev(sigar_t *sigar,
return NULL;
}
id = SIGAR_FSDEV_ID(sb);
if (!sigar->fsdev) {
sigar->fsdev = sigar_cache_new(15);
if (is_dev) {
id = sb.st_rdev;
}
else {
id = SIGAR_FSDEV_ID(sb);
}
entry = sigar_cache_get(sigar->fsdev, id);
@ -1214,6 +1231,18 @@ static iodev_t *get_fsdev(sigar_t *sigar,
return (iodev_t *)entry->value;
}
if (is_dev) {
iodev_t *iodev;
entry->value = iodev = malloc(sizeof(*iodev));
SIGAR_ZERO(iodev);
SIGAR_SSTRCPY(iodev->name, dirname);
if (debug) {
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
"[fsdev] %s is_dev=true", dirname);
}
return iodev;
}
status = sigar_file_system_list_get(sigar, &fslist);
if (status != SIGAR_OK) {