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