1 #include "config.h" 2 3 #include "dump-extensions.hpp" 4 #include "dump_internal.hpp" 5 #include "dump_manager.hpp" 6 #include "dump_manager_bmc.hpp" 7 #include "elog_watch.hpp" 8 #include "watch.hpp" 9 #include "xyz/openbmc_project/Common/error.hpp" 10 11 #include <fmt/core.h> 12 13 #include <phosphor-logging/elog-errors.hpp> 14 #include <sdbusplus/bus.hpp> 15 16 #include <memory> 17 #include <vector> 18 19 int main() 20 { 21 using namespace phosphor::logging; 22 using InternalFailure = 23 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 24 25 auto bus = sdbusplus::bus::new_default(); 26 sd_event* event = nullptr; 27 auto rc = sd_event_default(&event); 28 if (rc < 0) 29 { 30 log<level::ERR>( 31 fmt::format("Error occurred during the sd_event_default, rc({})", 32 rc) 33 .c_str()); 34 report<InternalFailure>(); 35 return rc; 36 } 37 phosphor::dump::EventPtr eventP{event}; 38 event = nullptr; 39 40 // Blocking SIGCHLD is needed for calling sd_event_add_child 41 sigset_t mask; 42 if (sigemptyset(&mask) < 0) 43 { 44 log<level::ERR>( 45 fmt::format("Unable to initialize signal set, errno({})", errno) 46 .c_str()); 47 return EXIT_FAILURE; 48 } 49 50 if (sigaddset(&mask, SIGCHLD) < 0) 51 { 52 log<level::ERR>( 53 fmt::format("Unable to add signal to signal set, errno({})", errno) 54 .c_str()); 55 return EXIT_FAILURE; 56 } 57 58 // Block SIGCHLD first, so that the event loop can handle it 59 if (sigprocmask(SIG_BLOCK, &mask, nullptr) < 0) 60 { 61 log<level::ERR>( 62 fmt::format("Unable to block signal, errno({})", errno).c_str()); 63 return EXIT_FAILURE; 64 } 65 66 // Add sdbusplus ObjectManager for the 'root' path of the DUMP manager. 67 sdbusplus::server::manager::manager objManager(bus, DUMP_OBJPATH); 68 bus.request_name(DUMP_BUSNAME); 69 70 try 71 { 72 phosphor::dump::DumpManagerList dumpMgrList{}; 73 std::unique_ptr<phosphor::dump::bmc::Manager> bmcDumpMgr = 74 std::make_unique<phosphor::dump::bmc::Manager>( 75 bus, eventP, BMC_DUMP_OBJPATH, BMC_DUMP_OBJ_ENTRY, 76 BMC_DUMP_PATH); 77 78 phosphor::dump::bmc::internal::Manager mgr(bus, *bmcDumpMgr, 79 OBJ_INTERNAL); 80 dumpMgrList.push_back(std::move(bmcDumpMgr)); 81 82 phosphor::dump::loadExtensions(bus, dumpMgrList); 83 84 // Restore dbus objects of all dumps 85 for (auto& dmpMgr : dumpMgrList) 86 { 87 dmpMgr->restore(); 88 } 89 90 phosphor::dump::elog::Watch eWatch(bus, mgr); 91 bus.attach_event(eventP.get(), SD_EVENT_PRIORITY_NORMAL); 92 93 auto rc = sd_event_loop(eventP.get()); 94 if (rc < 0) 95 { 96 log<level::ERR>( 97 fmt::format("Error occurred during the sd_event_loop, rc({})", 98 rc) 99 .c_str()); 100 elog<InternalFailure>(); 101 } 102 } 103 catch (const InternalFailure& e) 104 { 105 commit<InternalFailure>(); 106 return -1; 107 } 108 109 return 0; 110 } 111