diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | sysfs.cpp | 54 | ||||
-rw-r--r-- | sysfs.hpp | 13 |
3 files changed, 68 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index 6325121..ab4d373 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,6 +11,7 @@ libhwmon_la_SOURCES = \ directory.cpp \ sensorset.cpp \ mainloop.cpp \ + sysfs.cpp \ xyz.openbmc_project.Sensor.Value.cpp SUBDIRS = . test diff --git a/sysfs.cpp b/sysfs.cpp new file mode 100644 index 0000000..f1f46db --- /dev/null +++ b/sysfs.cpp @@ -0,0 +1,54 @@ +/** + * Copyright © 2016 IBM Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <cstdlib> +#include <memory> +#include "sysfs.hpp" +#include "util.hpp" +#include "directory.hpp" + +std::string findHwmon(const std::string& ofNode) +{ + static constexpr auto hwmonRoot = "/sys/class/hwmon"; + + std::string fullOfPath{"/sys/firmware/devicetree/base"}; + fullOfPath.append(ofNode); + + std::string hwmonInst; + Directory d(hwmonRoot); + + while (d.next(hwmonInst)) + { + std::string hwmonPath{hwmonRoot}; + hwmonPath.append(1, '/'); + hwmonPath.append(hwmonInst); + std::string path{hwmonPath}; + path.append(1, '/'); + path.append("of_node"); + + auto real = std::unique_ptr<char, phosphor::utility::Free<char>>(realpath( + path.c_str(), nullptr)); + if (!real || real.get() != fullOfPath) + { + continue; + } + + return hwmonPath; + } + + return std::string(); +} + +// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 @@ -27,4 +27,17 @@ inline const std::string make_sysfs_path(const std::string& path, return path + "/"s + type + id + "_"s + entry; } + +/** @brief Find hwmon instances + * + * Look for a matching hwmon instance given an + * open firmware device path. + * + * @param[in] ofNode- The open firmware device path. + * + * @returns[in] - The hwmon instance path or an empty + * string if no match is found. + */ +std::string findHwmon(const std::string& ofNode); + // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 |