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