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 sdbusplus::message::unix_fd Entry::getEntry() 60 { 61 FILE* fp = fopen(path().c_str(), "rb"); 62 if (fp == nullptr) 63 { 64 auto e = errno; 65 log<level::ERR>("Failed to open Entry File", entry("ERRNO=%d", e), 66 entry("PATH=%s", path().c_str())); 67 throw sdbusplus::xyz::openbmc_project::Common::File::Error::Open(); 68 } 69 70 auto fd = fileno(fp); 71 72 // Schedule the fd to be closed by sdbusplus when it sends it back over 73 // D-Bus. 74 sdeventplus::Event event = sdeventplus::Event::get_default(); 75 fdCloseEventSource = std::make_unique<sdeventplus::source::Defer>( 76 event, std::bind(std::mem_fn(&Entry::closeFD), this, fd, 77 std::placeholders::_1)); 78 79 return fd; 80 } 81 82 void Entry::closeFD(int fd, sdeventplus::source::EventBase& /*source*/) 83 { 84 close(fd); 85 fdCloseEventSource.reset(); 86 } 87 88 } // namespace logging 89 } // namespace phosphor 90