blob: cd767420eb3762e64b478dd14776c64ec84940cc [file] [log] [blame]
Jayanth Othayotha320c7c2017-06-14 07:17:21 -05001#include "config.h"
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -05002
Jayanth Othayotha320c7c2017-06-14 07:17:21 -05003#include "dump_internal.hpp"
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -05004#include "dump_manager.hpp"
Jayanth Othayothd0f00642017-09-04 06:26:30 -05005#include "elog_watch.hpp"
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -05006#include "watch.hpp"
7#include "xyz/openbmc_project/Common/error.hpp"
8
9#include <phosphor-logging/elog-errors.hpp>
10#include <sdbusplus/bus.hpp>
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050011
Ramesh Iyyarbb410df2020-08-03 03:13:04 -050012int main()
Jayanth Othayoth224882b2017-05-04 05:46:45 -050013{
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050014 using namespace phosphor::logging;
15 using InternalFailure =
16 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
17
Jayanth Othayoth671fc7f2017-06-14 08:01:41 -050018 auto bus = sdbusplus::bus::new_default();
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050019 sd_event* event = nullptr;
20 auto rc = sd_event_default(&event);
21 if (rc < 0)
22 {
23 log<level::ERR>("Error occurred during the sd_event_default",
Gunnar Mills11eaab72017-10-19 16:07:31 -050024 entry("RC=%d", rc));
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050025 report<InternalFailure>();
26 return rc;
27 }
28 phosphor::dump::EventPtr eventP{event};
29 event = nullptr;
Jayanth Othayoth224882b2017-05-04 05:46:45 -050030
Alexander Filippov19ad0e82020-06-26 13:22:01 +030031 // Blocking SIGCHLD is needed for calling sd_event_add_child
32 sigset_t mask;
33 if (sigemptyset(&mask) < 0)
34 {
35 log<level::ERR>("Unable to initialize signal set",
36 entry("ERRNO=%d", errno));
37 return EXIT_FAILURE;
38 }
39
40 if (sigaddset(&mask, SIGCHLD) < 0)
41 {
42 log<level::ERR>("Unable to add signal to signal set",
43 entry("ERRNO=%d", errno));
44 return EXIT_FAILURE;
45 }
46
47 // Block SIGCHLD first, so that the event loop can handle it
48 if (sigprocmask(SIG_BLOCK, &mask, nullptr) < 0)
49 {
50 log<level::ERR>("Unable to block signal", entry("ERRNO=%d", errno));
51 return EXIT_FAILURE;
52 }
53
Jayanth Othayoth224882b2017-05-04 05:46:45 -050054 // Add sdbusplus ObjectManager for the 'root' path of the DUMP manager.
55 sdbusplus::server::manager::manager objManager(bus, DUMP_OBJPATH);
Jayanth Othayoth224882b2017-05-04 05:46:45 -050056 bus.request_name(DUMP_BUSNAME);
57
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050058 try
Jayanth Othayoth224882b2017-05-04 05:46:45 -050059 {
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050060 phosphor::dump::Manager manager(bus, eventP, DUMP_OBJPATH);
Jayanth Othayothcb65ffc2018-10-16 08:29:32 -050061 // Restore dump d-bus objects.
Jayanth Othayoth43096592017-07-20 02:17:37 -050062 manager.restore();
Jayanth Othayothd3273ea2017-07-12 22:55:32 -050063 phosphor::dump::internal::Manager mgr(bus, manager, OBJ_INTERNAL);
Jayanth Othayothd0f00642017-09-04 06:26:30 -050064 phosphor::dump::elog::Watch eWatch(bus, mgr);
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050065 bus.attach_event(eventP.get(), SD_EVENT_PRIORITY_NORMAL);
Jayanth Othayothbcb174b2017-07-02 06:29:24 -050066
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050067 auto rc = sd_event_loop(eventP.get());
68 if (rc < 0)
69 {
70 log<level::ERR>("Error occurred during the sd_event_loop",
Gunnar Mills11eaab72017-10-19 16:07:31 -050071 entry("RC=%d", rc));
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050072 elog<InternalFailure>();
73 }
74 }
Jayanth Othayotha320c7c2017-06-14 07:17:21 -050075 catch (InternalFailure& e)
76 {
77 commit<InternalFailure>();
78 return -1;
Jayanth Othayoth224882b2017-05-04 05:46:45 -050079 }
80
81 return 0;
82}