blob: 9c5d2134634284585224efd6067581796cef0f03 [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
Adriana Kobylakeb5d3f22021-02-04 14:03:28 -060044sdbusplus::message::unix_fd Entry::getEntry()
45{
46 FILE* fp = fopen(path().c_str(), "rb");
47 if (fp == nullptr)
48 {
49 auto e = errno;
50 log<level::ERR>("Failed to open Entry File", entry("ERRNO=%d", e),
51 entry("PATH=%s", path().c_str()));
52 throw sdbusplus::xyz::openbmc_project::Common::File::Error::Open();
53 }
54
55 auto fd = fileno(fp);
56
57 // Schedule the fd to be closed by sdbusplus when it sends it back over
58 // D-Bus.
59 sdeventplus::Event event = sdeventplus::Event::get_default();
60 fdCloseEventSource = std::make_unique<sdeventplus::source::Defer>(
61 event, std::bind(std::mem_fn(&Entry::closeFD), this, fd,
62 std::placeholders::_1));
63
64 return fd;
65}
66
67void Entry::closeFD(int fd, sdeventplus::source::EventBase& source)
68{
69 close(fd);
70 fdCloseEventSource.reset();
71}
72
Adriana Kobylak88d7cf82017-01-24 12:30:15 -060073} // namespace logging
Patrick Venturef18bf832018-10-26 18:14:00 -070074} // namespace phosphor