Add findHwmonFromDevPath()
This function can find the hwmon path from a /devices
path. This path is similar to what udev lists as the
device path, but with the /hwmon/hwmonN directories
removed from the end. In addition, any ':' characters
in the path have been converted to '--', so the code
needs to convert them back.
This is done because some devices are not in the device
tree, and hence wouldn't have the open firmware device
path that the code previously only supported.
Tested: Tested with the new /devices path.
Change-Id: Ic26646c6f609323cff86d4cd10bbe0a44d7d61ac
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/sysfs.cpp b/sysfs.cpp
index 4ea32b2..0eb7863 100644
--- a/sysfs.cpp
+++ b/sysfs.cpp
@@ -19,6 +19,7 @@
#include <experimental/filesystem>
#include <fstream>
#include <memory>
+#include <phosphor-logging/log.hpp>
#include <thread>
#include "sysfs.hpp"
@@ -238,6 +239,43 @@
return emptyString;
}
+std::string findHwmonFromDevPath(const std::string& devPath)
+{
+ fs::path p{"/sys"};
+ p /= devPath;
+ p /= "hwmon";
+
+ try
+ {
+ //This path is also used as a filesystem path to an environment
+ //file, and that has issues with ':'s in the path so they've
+ //been converted to '--'s. Convert them back now.
+ size_t pos = 0;
+ std::string path = p;
+ while ((pos = path.find("--")) != std::string::npos)
+ {
+ path.replace(pos, 2, ":");
+ }
+
+ for (const auto& hwmonInst : fs::directory_iterator(path))
+ {
+ if ((hwmonInst.path().filename().string().find("hwmon") !=
+ std::string::npos))
+ {
+ return hwmonInst.path();
+ }
+ }
+ }
+ catch (const std::exception& e)
+ {
+ using namespace phosphor::logging;
+ log<level::ERR>(
+ "Unable to find hwmon directory from the dev path",
+ entry("PATH=%s", devPath.c_str()));
+ }
+ return emptyString;
+}
+
namespace hwmonio
{