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