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