From 22e64caaff3d5877b7a494980a8ee3f17ea8f824 Mon Sep 17 00:00:00 2001 From: Jonathan Fouquart Date: Fri, 25 Aug 2023 09:37:49 +0200 Subject: [PATCH] Fix getting zfs pool name with '.' char in freebsd --- src/freebsd/btop_collect.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/freebsd/btop_collect.cpp b/src/freebsd/btop_collect.cpp index d69eab9..47598f0 100644 --- a/src/freebsd/btop_collect.cpp +++ b/src/freebsd/btop_collect.cpp @@ -543,14 +543,16 @@ namespace Mem { // find all zpools in the system. Do this only at startup. void get_zpools() { + std::regex toReplace("\\."); PipeWrapper poolPipe = PipeWrapper("zpool list -H -o name", "r"); + while (not std::feof(poolPipe())) { char poolName[512]; size_t len = 512; if (fgets(poolName, len, poolPipe())) { poolName[strcspn(poolName, "\n")] = 0; Logger::debug("zpool found: " + string(poolName)); - Mem::zpools.push_back(poolName); + Mem::zpools.push_back(std::regex_replace(poolName, toReplace, "%25")); } } } @@ -583,7 +585,7 @@ namespace Mem { } // this code is for ZFS mounts - for (string poolName : Mem::zpools) { + for (const auto &poolName : Mem::zpools) { char sysCtl[1024]; snprintf(sysCtl, sizeof(sysCtl), "sysctl kstat.zfs.%s.dataset | egrep \'dataset_name|nread|nwritten\'", poolName.c_str()); PipeWrapper f = PipeWrapper(sysCtl, "r");