blob: 0086e2f01e537aad9fc0f5a496a4e0f5651debb0 [file] [log] [blame]
#include "ffdc_file.hpp"
#include <errno.h> // for errno
#include <fcntl.h> // for open()
#include <fmt/format.h>
#include <string.h> // for strerror()
#include <sys/stat.h> // for open()
#include <sys/types.h> // for open()
#include <phosphor-logging/log.hpp>
#include <stdexcept>
#include <string>
namespace watchdog
{
namespace dump
{
using namespace phosphor::logging;
FFDCFile::FFDCFile(const json& calloutDataObject) :
calloutData(calloutDataObject.dump())
{
prepareFFDCFile();
}
FFDCFile::~FFDCFile()
{
// Close file descriptor. Does nothing if descriptor was already closed.
if (descriptor.close() == -1)
{
log<level::ERR>(fmt::format("Unable to close FFDC file: errormsg({})",
strerror(errno))
.c_str());
}
// Delete temporary file. Does nothing if file was already deleted.
tempFile.remove();
}
void FFDCFile::prepareFFDCFile()
{
// Open the temporary file for both reading and writing
int fd = open(tempFile.getPath().c_str(), O_RDWR);
if (fd == -1)
{
throw std::runtime_error{std::string{"Unable to open FFDC file: "} +
strerror(errno)};
}
ssize_t rc = write(fd, calloutData.c_str(), calloutData.size());
if (rc == -1)
{
log<level::ERR>(fmt::format("Failed to write callout info "
"in file({}), errorno({}), errormsg({})",
tempFile.getPath().c_str(), errno,
strerror(errno))
.c_str());
throw std::runtime_error("Failed to write phalPELCallouts info");
}
else if (rc != static_cast<ssize_t>(calloutData.size()))
{
log<level::WARNING>(fmt::format("Could not write all callout "
"info in file({}), written byte({}) "
"and total byte({})",
tempFile.getPath().c_str(), rc,
calloutData.size())
.c_str());
}
int retCode = lseek(fd, 0, SEEK_SET);
if (retCode == -1)
{
log<level::ERR>(
fmt::format("Failed to seek file postion to the beginning"
"in file({}), errorno({}) "
"and errormsg({})",
tempFile.getPath().c_str(), errno, strerror(errno))
.c_str());
throw std::runtime_error(
"Failed to seek file postion to the beginning of the file");
}
// Store file descriptor in FileDescriptor object
descriptor.set(fd);
}
} // namespace dump
} // namespace watchdog