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