#include #include #include "dump_manager.hpp" #include "dump_internal.hpp" #include "xyz/openbmc_project/Common/error.hpp" #include "config.h" namespace phosphor { namespace dump { using namespace sdbusplus::xyz::openbmc_project::Common::Error; using namespace phosphor::logging; namespace internal { void Manager::create( Type type, std::vector fullPaths) { // TODO openbmc/openbmc#1795 // Add implementaion of internal create function. } } //namepsace internal uint32_t Manager::createDump() { std::vector paths; return captureDump(Type::UserRequested, paths); } uint32_t Manager::captureDump( Type type, const std::vector& fullPaths) { pid_t pid = fork(); // TODO openbmc/openbmc#1795 // Add Dump location info. if (pid == 0) { execl("/usr/bin/ffdc", "ffdc", nullptr); //ffdc script execution is failed. auto error = errno; log("Error occurred during ffdc function execution", entry("ERRNO=%d", error)); elog(); } else if (pid > 0) { auto rc = sd_event_add_child(eventLoop.get(), nullptr, pid, WEXITED | WSTOPPED, callback, nullptr); if (0 > rc) { // Failed to add to event loop log("Error occurred during the sd_event_add_child call", entry("rc=%d", rc)); elog(); } } else { auto error = errno; log("Error occurred during fork", entry("ERRNO=%d", error)); elog(); } return ++lastEntryId; } void Manager::createEntry(const fs::path& file) { // TODO openbmc/openbmc#1795 // Get Dump ID and Epoch time from Dump file name. // Validate the Dump file name. auto id = lastEntryId; //Get Epoch time. auto ms = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); // Entry Object path. auto objPath = fs::path(OBJ_ENTRY) / std::to_string(id); auto size = fs::file_size(file); entries.insert(std::make_pair(id, std::make_unique( bus, objPath.c_str(), id, ms, size, file, *this))); } void Manager::erase(uint32_t entryId) { entries.erase(entryId); } } //namespace dump } //namespace phosphor