diff options
| author | Federico Angelilli <code@fedang.net> | 2024-11-19 11:17:50 +0100 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-11-19 11:17:50 +0100 |
| commit | afcbe44a7cf454f3588a60180d93f65df9e5fcc7 (patch) | |
| tree | 7a3b94a9c9f7ef8cbd3062b26e31ef25b9d9a742 /src/blocks | |
| parent | 79a32360e76cb0739312e15299fc22941e51b64b (diff) | |
Add byte human readable formatting
Diffstat (limited to 'src/blocks')
| -rw-r--r-- | src/blocks/fs.c | 45 |
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: |
