aboutsummaryrefslogtreecommitdiff
path: root/src/blocks/fs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blocks/fs.c')
-rw-r--r--src/blocks/fs.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/src/blocks/fs.c b/src/blocks/fs.c
index 7163cc5..a0e1133 100644
--- a/src/blocks/fs.c
+++ b/src/blocks/fs.c
@@ -25,10 +25,26 @@ typedef enum {
FS_USED_PERC,
} block_fs_mark_t;
+#define FS_SHIFT 12
+
+static const format_pair_t block_fs_units[] = {
+ { "-si", UNIT_SI << FS_SHIFT },
+ { "-b", UNIT_B << FS_SHIFT },
+ { "-kib", UNIT_KB << FS_SHIFT },
+ { "-mib", UNIT_MB << FS_SHIFT },
+ { "-gib", UNIT_GB << FS_SHIFT },
+ { "-tib", UNIT_TB << FS_SHIFT },
+ { "-kb", (UNIT_KB | UNIT_SI) << FS_SHIFT },
+ { "-mb", (UNIT_MB | UNIT_SI) << FS_SHIFT },
+ { "-gb", (UNIT_GB | UNIT_SI) << FS_SHIFT },
+ { "-tb", (UNIT_TB | UNIT_SI) << FS_SHIFT },
+ { NULL },
+};
+
static const format_option_t block_fs_options[] = {
- { { "total", FS_TOTAL } },
- { { "free", FS_FREE } },
- { { "used", FS_USED } },
+ { { "total", FS_TOTAL }, .suffixes = block_fs_units },
+ { { "free", FS_FREE }, .suffixes = block_fs_units },
+ { { "used", FS_USED }, .suffixes = block_fs_units },
{ { "free-percentage", FS_FREE_PERC } },
{ { "used-percentage", FS_USED_PERC } },
{ { NULL } },
@@ -45,13 +61,19 @@ static void block_fs_update(block_t *block)
struct statvfs sbuf;
if (statvfs(fs->path, &sbuf) < 0) {
- log_value_debug("Failed to read filesystem",
+ log_value_debug("Failed to read filesystem info",
"s:label", block->label,
"s:path", fs->path,
"i:errno", errno);
return;
}
+ uint64_t total = sbuf.f_bsize * sbuf.f_blocks;
+ uint64_t available = sbuf.f_bsize * sbuf.f_bavail;
+ uint64_t used = sbuf.f_bsize * (sbuf.f_blocks - sbuf.f_bavail);
+ uint64_t free_perc = (100 * sbuf.f_bavail) / sbuf.f_blocks;
+ uint64_t used_perc = (100 * (sbuf.f_blocks - sbuf.f_bavail)) / sbuf.f_blocks;
+
char buffer[256] = { 0 };
size_t start = 0, size = sizeof(buffer);
@@ -59,28 +81,31 @@ static void block_fs_update(block_t *block)
size_t rest = start >= size ? 0 : size - start;
if (rest == 0) break;
- switch (fs->format.parts[i].mark) {
+ unit_t mask = UNIT_MASK << FS_SHIFT;
+ unit_t unit = (fs->format.parts[i].mark & mask) >> FS_SHIFT;
+
+ switch (fs->format.parts[i].mark & ~mask) {
case FS_STRING:
start += snprintf(buffer + start, rest, "%s", fs->format.parts[i].string);
break;
case FS_TOTAL:
- start += snprintf(buffer + start, rest, "%ld", sbuf.f_bsize * (uint64_t)sbuf.f_blocks);
+ start += snprintf_units(buffer + start, rest, total, unit);
break;
case FS_FREE:
- start += snprintf(buffer + start, rest, "%ld", sbuf.f_bsize * (uint64_t)sbuf.f_bavail);
+ start += snprintf_units(buffer + start, rest, available, unit);
break;
case FS_USED:
- start += snprintf(buffer + start, rest, "%ld", sbuf.f_bsize * (sbuf.f_blocks - sbuf.f_bavail));
+ start += snprintf_units(buffer + start, rest, used, unit);
break;
case FS_FREE_PERC:
- start += snprintf(buffer + start, rest, "%ld", (100 * sbuf.f_bavail) / sbuf.f_blocks);
+ start += snprintf(buffer + start, rest, "%ld", free_perc);
break;
case FS_USED_PERC:
- start += snprintf(buffer + start, rest, "%ld", (100 * (sbuf.f_blocks - sbuf.f_bavail)) / sbuf.f_blocks);
+ start += snprintf(buffer + start, rest, "%ld", used_perc);
break;
default: