|  | #include "config.h" | 
|  |  | 
|  | #include "host_state_manager.hpp" | 
|  |  | 
|  | #include <fmt/format.h> | 
|  | #include <getopt.h> | 
|  |  | 
|  | #include <sdbusplus/bus.hpp> | 
|  |  | 
|  | #include <cstdlib> | 
|  | #include <exception> | 
|  | #include <filesystem> | 
|  | #include <iostream> | 
|  |  | 
|  | constexpr auto LEGACY_HOST_STATE_PERSIST_PATH = | 
|  | "/var/lib/phosphor-state-manager/requestedHostTransition"; | 
|  |  | 
|  | int main(int argc, char** argv) | 
|  | { | 
|  | size_t hostId = 0; | 
|  |  | 
|  | int arg; | 
|  | int optIndex = 0; | 
|  |  | 
|  | static struct option longOpts[] = {{"host", required_argument, 0, 'h'}, | 
|  | {0, 0, 0, 0}}; | 
|  |  | 
|  | while ((arg = getopt_long(argc, argv, "h:", longOpts, &optIndex)) != -1) | 
|  | { | 
|  | switch (arg) | 
|  | { | 
|  | case 'h': | 
|  | hostId = std::stoul(optarg); | 
|  | break; | 
|  | default: | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace fs = std::filesystem; | 
|  |  | 
|  | auto bus = sdbusplus::bus::new_default(); | 
|  |  | 
|  | auto hostBusName = std::string{HOST_BUSNAME} + std::to_string(hostId); | 
|  | auto objPathInst = std::string{HOST_OBJPATH} + std::to_string(hostId); | 
|  |  | 
|  | if (hostId == 0) | 
|  | { | 
|  | // Host State Manager was only support single-host and there only one | 
|  | // file to store persist values, to support multi-host state management, | 
|  | // each service instance access new file path format with prefix 'hostN' | 
|  | // now.For backward compatibility if there is a legacy persist file | 
|  | // exist, rename it to the new file format of host0. | 
|  |  | 
|  | fs::path legacyPath{LEGACY_HOST_STATE_PERSIST_PATH}; | 
|  | fs::path newPath{fmt::format(HOST_STATE_PERSIST_PATH, hostId)}; | 
|  | if (fs::exists(legacyPath)) | 
|  | { | 
|  | fs::rename(legacyPath, newPath); | 
|  | } | 
|  | } | 
|  |  | 
|  | // Add sdbusplus ObjectManager. | 
|  | sdbusplus::server::manager::manager objManager(bus, objPathInst.c_str()); | 
|  |  | 
|  | phosphor::state::manager::Host manager(bus, objPathInst.c_str(), hostId); | 
|  |  | 
|  | auto dir = fs::path(HOST_STATE_PERSIST_PATH).parent_path(); | 
|  | fs::create_directories(dir); | 
|  |  | 
|  | // For backwards compatibility, request a busname without host id if | 
|  | // input id is 0. | 
|  | if (hostId == 0) | 
|  | { | 
|  | bus.request_name(HOST_BUSNAME); | 
|  | } | 
|  |  | 
|  | bus.request_name(hostBusName.c_str()); | 
|  |  | 
|  | while (true) | 
|  | { | 
|  | bus.process_discard(); | 
|  | bus.wait(); | 
|  | } | 
|  | return 0; | 
|  | } |