1 #include "elog_entry.hpp"
2 
3 #include "elog_serialize.hpp"
4 #include "log_manager.hpp"
5 
6 #include <unistd.h>
7 
8 #include <xyz/openbmc_project/Common/File/error.hpp>
9 
10 namespace phosphor
11 {
12 namespace logging
13 {
14 
15 // TODO Add interfaces to handle the error log id numbering
16 
17 void Entry::delete_()
18 {
19     parent.erase(id());
20 }
21 
22 bool Entry::resolved(bool value)
23 {
24     auto current =
25         sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolved();
26     if (value != current)
27     {
28         value ? associations({}) : associations(assocs);
29         current =
30             sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolved(
31                 value);
32 
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 
38         serialize(*this);
39     }
40 
41     return current;
42 }
43 
44 std::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 
59 std::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 
74 sdbusplus::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 
97 void Entry::closeFD(int fd, sdeventplus::source::EventBase& /*source*/)
98 {
99     close(fd);
100     fdCloseEventSource.reset();
101 }
102 
103 } // namespace logging
104 } // namespace phosphor
105