blob: 1bd70c2b439bd3303b483c832bf3bd6f2bfbf311 [file] [log] [blame]
Adriana Kobylak88d7cf82017-01-24 12:30:15 -06001#include "elog_entry.hpp"
Patrick Venturef18bf832018-10-26 18:14:00 -07002
Deepak Kodihalli97431892017-06-12 09:14:57 -05003#include "elog_serialize.hpp"
Patrick Venturef18bf832018-10-26 18:14:00 -07004#include "log_manager.hpp"
Adriana Kobylak88d7cf82017-01-24 12:30:15 -06005
Adriana Kobylakeb5d3f22021-02-04 14:03:28 -06006#include <unistd.h>
7
8#include <xyz/openbmc_project/Common/File/error.hpp>
9
Adriana Kobylak88d7cf82017-01-24 12:30:15 -060010namespace phosphor
11{
12namespace logging
13{
14
Adriana Kobylak88d7cf82017-01-24 12:30:15 -060015// TODO Add interfaces to handle the error log id numbering
16
Deepak Kodihalli36db46c2017-03-31 06:28:44 -050017void Entry::delete_()
18{
19 parent.erase(id());
20}
21
Deepak Kodihalli97431892017-06-12 09:14:57 -050022bool Entry::resolved(bool value)
23{
Patrick Venturef18bf832018-10-26 18:14:00 -070024 auto current =
25 sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolved();
Deepak Kodihalli97431892017-06-12 09:14:57 -050026 if (value != current)
27 {
Patrick Venturef18bf832018-10-26 18:14:00 -070028 value ? associations({}) : associations(assocs);
29 current =
30 sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolved(
31 value);
Matt Spinler1e71a4d2020-03-04 13:40:22 -060032
33 uint64_t ms = std::chrono::duration_cast<std::chrono::milliseconds>(
34 std::chrono::system_clock::now().time_since_epoch())
35 .count();
36 updateTimestamp(ms);
37
Deepak Kodihalli97431892017-06-12 09:14:57 -050038 serialize(*this);
39 }
40
41 return current;
42}
43
Vijay Lobod354a392021-06-01 16:21:02 -050044std::string Entry::eventId(std::string value)
45{
46 auto current =
47 sdbusplus::xyz::openbmc_project::Logging::server::Entry::eventId();
48 if (value != current)
49 {
50 current =
51 sdbusplus::xyz::openbmc_project::Logging::server::Entry::eventId(
52 value);
53 serialize(*this);
54 }
55
56 return current;
57}
58
Vijay Lobo593a4c62021-06-16 14:25:26 -050059std::string Entry::resolution(std::string value)
60{
61 auto current =
62 sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolution();
63 if (value != current)
64 {
65 current =
66 sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolution(
67 value);
68 serialize(*this);
69 }
70
71 return current;
72}
73
Adriana Kobylakeb5d3f22021-02-04 14:03:28 -060074sdbusplus::message::unix_fd Entry::getEntry()
75{
76 FILE* fp = fopen(path().c_str(), "rb");
77 if (fp == nullptr)
78 {
79 auto e = errno;
80 log<level::ERR>("Failed to open Entry File", entry("ERRNO=%d", e),
81 entry("PATH=%s", path().c_str()));
82 throw sdbusplus::xyz::openbmc_project::Common::File::Error::Open();
83 }
84
85 auto fd = fileno(fp);
86
87 // Schedule the fd to be closed by sdbusplus when it sends it back over
88 // D-Bus.
89 sdeventplus::Event event = sdeventplus::Event::get_default();
90 fdCloseEventSource = std::make_unique<sdeventplus::source::Defer>(
91 event, std::bind(std::mem_fn(&Entry::closeFD), this, fd,
92 std::placeholders::_1));
93
94 return fd;
95}
96
Patrick Williamsf40323d2021-04-16 15:35:17 -050097void Entry::closeFD(int fd, sdeventplus::source::EventBase& /*source*/)
Adriana Kobylakeb5d3f22021-02-04 14:03:28 -060098{
99 close(fd);
100 fdCloseEventSource.reset();
101}
102
Adriana Kobylak88d7cf82017-01-24 12:30:15 -0600103} // namespace logging
Patrick Venturef18bf832018-10-26 18:14:00 -0700104} // namespace phosphor