Index: metrics_daemon_main.cc |
diff --git a/metrics_daemon_main.cc b/metrics_daemon_main.cc |
index 899256cffccbd6948d2699b4b12ebbfbff5951fc..1ee06117745126415ca1143cf67042c14f19967a 100644 |
--- a/metrics_daemon_main.cc |
+++ b/metrics_daemon_main.cc |
@@ -3,20 +3,44 @@ |
// found in the LICENSE file. |
+#include <base/logging.h> |
+#include <base/string_util.h> |
#include <gflags/gflags.h> |
+#include <rootdev/rootdev.h> |
#include "metrics_daemon.h" |
DEFINE_bool(daemon, true, "run as daemon (use -nodaemon for debugging)"); |
-// Path to disk stats. This may be system dependent. |
-const char kMetricsMainDiskStatsPath[] = "/sys/class/block/sda/stat"; |
+// Return the path to the disk stats in the sysfs. |
+static |
+const std::string MetricsMainDiskStatsPath() { |
+ char dev_path_cstr[PATH_MAX]; |
+ std::string dev_prefix = "/dev/"; |
+ std::string dev_path; |
+ std::string dev_name; |
+ |
+ int ret = rootdev(dev_path_cstr, sizeof(dev_path_cstr), true, true); |
+ if (ret != 0) { |
+ LOG(WARNING) << "error " << ret << " determining root device"; |
+ return ""; |
+ } |
+ dev_path = dev_path_cstr; |
+ // Check that rootdev begins with "/dev/". |
+ if (!StartsWithASCII(dev_path, dev_prefix, false)) { |
+ LOG(WARNING) << "unexpected root device " << dev_path; |
+ return ""; |
+ } |
+ // Get the device name, e.g. "sda" from "/dev/sda". |
+ dev_name = dev_path.substr(dev_prefix.length()); |
+ return "/sys/class/block/" + dev_name + "/stat"; |
+} |
int main(int argc, char** argv) { |
google::ParseCommandLineFlags(&argc, &argv, true); |
MetricsLibrary metrics_lib; |
metrics_lib.Init(); |
MetricsDaemon daemon; |
- daemon.Init(false, &metrics_lib, kMetricsMainDiskStatsPath); |
+ daemon.Init(false, &metrics_lib, MetricsMainDiskStatsPath()); |
daemon.Run(FLAGS_daemon); |
} |