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 inventory service name from the mapper object 84 * 85 * @return The inventory manager service name 86 */ 87 std::string getInvService(sdbusplus::bus::bus& bus); 88 89 90 /** 91 * @brief Get the service name from the mapper for the 92 * interface and path passed in. 93 * 94 * @param[in] path - the dbus path name 95 * @param[in] interface - the dbus interface name 96 * @param[in] bus - the dbus object 97 * 98 * @return The service name 99 */ 100 std::string getService(const std::string& path, 101 const std::string& interface, 102 sdbusplus::bus::bus& bus); 103 104 /** 105 * @brief Get the object map for creating or updating an object property 106 * 107 * @param[in] path - The dbus object path name 108 * @param[in] intf - The dbus interface 109 * @param[in] prop - The dbus property 110 * @param[in] value - The property value 111 * 112 * @return - The full object path containing the property value 113 */ 114 template <typename T> 115 auto getObjMap(const std::string& path, 116 const std::string& intf, 117 const std::string& prop, 118 const T& value) 119 { 120 using Property = std::string; 121 using Value = sdbusplus::message::variant<T>; 122 using PropertyMap = std::map<Property, Value>; 123 124 using Interface = std::string; 125 using InterfaceMap = std::map<Interface, PropertyMap>; 126 127 using Object = sdbusplus::message::object_path; 128 using ObjectMap = std::map<Object, InterfaceMap>; 129 130 ObjectMap objectMap; 131 InterfaceMap interfaceMap; 132 PropertyMap propertyMap; 133 134 propertyMap.emplace(prop, value); 135 interfaceMap.emplace(intf, std::move(propertyMap)); 136 objectMap.emplace(path, std::move(interfaceMap)); 137 138 return objectMap; 139 } 140 141 } 142 } 143 } 144