1 #pragma once 2 3 #include <sdbusplus/bus.hpp> 4 #include <unistd.h> 5 #include <fcntl.h> 6 #include <phosphor-logging/log.hpp> 7 #include <phosphor-logging/elog.hpp> 8 #include <phosphor-logging/elog-errors.hpp> 9 #include <xyz/openbmc_project/Common/error.hpp> 10 11 12 using namespace phosphor::logging; 13 using InternalFailure = sdbusplus::xyz::openbmc_project::Common:: 14 Error::InternalFailure; 15 16 namespace phosphor 17 { 18 namespace fan 19 { 20 namespace util 21 { 22 23 constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper"; 24 constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper"; 25 constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper"; 26 27 constexpr auto INVENTORY_PATH = "/xyz/openbmc_project/inventory"; 28 constexpr auto INVENTORY_INTF = "xyz.openbmc_project.Inventory.Manager"; 29 30 constexpr auto OPERATIONAL_STATUS_INTF = 31 "xyz.openbmc_project.State.Decorator.OperationalStatus"; 32 constexpr auto FUNCTIONAL_PROPERTY = "Functional"; 33 34 class FileDescriptor 35 { 36 public: 37 FileDescriptor() = delete; 38 FileDescriptor(const FileDescriptor&) = delete; 39 FileDescriptor(FileDescriptor&&) = default; 40 FileDescriptor& operator=(const FileDescriptor&) = delete; 41 FileDescriptor& operator=(FileDescriptor&&) = default; 42 43 FileDescriptor(int fd) : fd(fd) 44 { 45 } 46 47 ~FileDescriptor() 48 { 49 if (fd != -1) 50 { 51 close(fd); 52 } 53 } 54 55 int operator()() 56 { 57 return fd; 58 } 59 60 void open(const std::string& pathname, int flags) 61 { 62 fd = ::open(pathname.c_str(), flags); 63 if (-1 == fd) 64 { 65 log<level::ERR>( 66 "Failed to open file device: ", 67 entry("PATHNAME=%s", pathname.c_str())); 68 elog<InternalFailure>(); 69 } 70 } 71 72 bool is_open() 73 { 74 return fd != -1; 75 } 76 77 private: 78 int fd = -1; 79 80 }; 81 82 /** 83 * @brief Get the service name from the mapper for the 84 * interface and path passed in. 85 * 86 * @param[in] path - the dbus path name 87 * @param[in] interface - the dbus interface name 88 * @param[in] bus - the dbus object 89 * 90 * @return The service name 91 */ 92 std::string getService(const std::string& path, 93 const std::string& interface, 94 sdbusplus::bus::bus& bus); 95 96 /** 97 * @brief Get the object map for creating or updating an object property 98 * 99 * @param[in] path - The dbus object path name 100 * @param[in] intf - The dbus interface 101 * @param[in] prop - The dbus property 102 * @param[in] value - The property value 103 * 104 * @return - The full object path containing the property value 105 */ 106 template <typename T> 107 auto getObjMap(const std::string& path, 108 const std::string& intf, 109 const std::string& prop, 110 const T& value) 111 { 112 using Property = std::string; 113 using Value = sdbusplus::message::variant<T>; 114 using PropertyMap = std::map<Property, Value>; 115 116 using Interface = std::string; 117 using InterfaceMap = std::map<Interface, PropertyMap>; 118 119 using Object = sdbusplus::message::object_path; 120 using ObjectMap = std::map<Object, InterfaceMap>; 121 122 ObjectMap objectMap; 123 InterfaceMap interfaceMap; 124 PropertyMap propertyMap; 125 126 propertyMap.emplace(prop, value); 127 interfaceMap.emplace(intf, std::move(propertyMap)); 128 objectMap.emplace(path, std::move(interfaceMap)); 129 130 return objectMap; 131 } 132 133 } 134 } 135 } 136