| #include "system_configuration.hpp" | 
 |  | 
 | #include <phosphor-logging/elog-errors.hpp> | 
 | #include <phosphor-logging/lg2.hpp> | 
 | #include <stdplus/pinned.hpp> | 
 | #include <xyz/openbmc_project/Common/error.hpp> | 
 |  | 
 | namespace phosphor | 
 | { | 
 | namespace network | 
 | { | 
 |  | 
 | static constexpr char HOSTNAMED_SVC[] = "org.freedesktop.hostname1"; | 
 | static constexpr char HOSTNAMED_OBJ[] = "/org/freedesktop/hostname1"; | 
 | static constexpr char HOSTNAMED_INTF[] = "org.freedesktop.hostname1"; | 
 |  | 
 | using namespace sdbusplus::xyz::openbmc_project::Common::Error; | 
 |  | 
 | static constexpr char propMatch[] = | 
 |     "type='signal',sender='org.freedesktop.hostname1'," | 
 |     "path='/org/freedesktop/hostname1'," | 
 |     "interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'," | 
 |     "arg0='org.freedesktop.hostname1'"; | 
 |  | 
 | SystemConfiguration::SystemConfiguration( | 
 |     stdplus::PinnedRef<sdbusplus::bus_t> bus, stdplus::const_zstring objPath) : | 
 |     Iface(bus, objPath.c_str(), Iface::action::defer_emit), | 
 |     bus(bus), hostnamePropMatch( | 
 |                   bus, propMatch, | 
 |                   [sc = stdplus::PinnedRef(*this)](sdbusplus::message_t& m) { | 
 |     std::string intf; | 
 |     std::unordered_map<std::string, std::variant<std::string>> values; | 
 |     try | 
 |     { | 
 |         m.read(intf, values); | 
 |         auto it = values.find("Hostname"); | 
 |         if (it == values.end()) | 
 |         { | 
 |             return; | 
 |         } | 
 |         sc.get().Iface::hostName(std::get<std::string>(it->second)); | 
 |     } | 
 |     catch (const std::exception& e) | 
 |     { | 
 |         lg2::error("Hostname match parsing failed: {ERROR}", "ERROR", e); | 
 |     } | 
 |                   }) | 
 | { | 
 |     try | 
 |     { | 
 |         std::variant<std::string> name; | 
 |         auto req = bus.get().new_method_call(HOSTNAMED_SVC, HOSTNAMED_OBJ, | 
 |                                              "org.freedesktop.DBus.Properties", | 
 |                                              "Get"); | 
 |  | 
 |         req.append(HOSTNAMED_INTF, "Hostname"); | 
 |         auto reply = req.call(); | 
 |         reply.read(name); | 
 |         SystemConfigIntf::hostName(std::get<std::string>(name), true); | 
 |     } | 
 |     catch (const std::exception& e) | 
 |     { | 
 |         lg2::error("Failed to get hostname: {ERROR}", "ERROR", e); | 
 |     } | 
 |  | 
 |     emit_object_added(); | 
 | } | 
 |  | 
 | std::string SystemConfiguration::hostName(std::string name) | 
 | { | 
 |     if (SystemConfigIntf::hostName() == name) | 
 |     { | 
 |         return name; | 
 |     } | 
 |     try | 
 |     { | 
 |         auto method = bus.get().new_method_call( | 
 |             HOSTNAMED_SVC, HOSTNAMED_OBJ, HOSTNAMED_INTF, "SetStaticHostname"); | 
 |         method.append(name, /*interactive=*/false); | 
 |         bus.get().call_noreply(method); | 
 |         return SystemConfigIntf::hostName(std::move(name)); | 
 |     } | 
 |     catch (const std::exception& e) | 
 |     { | 
 |         lg2::error("Failed to set hostname: {ERROR}", "ERROR", e); | 
 |     } | 
 |     return SystemConfigIntf::hostName(); | 
 | } | 
 |  | 
 | } // namespace network | 
 | } // namespace phosphor |