14f7b9bd3SJayanth Othayoth #include "temporary_file.hpp" 24f7b9bd3SJayanth Othayoth 34f7b9bd3SJayanth Othayoth #include <unistd.h> 44f7b9bd3SJayanth Othayoth 54f7b9bd3SJayanth Othayoth #include <phosphor-logging/elog-errors.hpp> 64f7b9bd3SJayanth Othayoth 74f7b9bd3SJayanth Othayoth #include <cerrno> 84f7b9bd3SJayanth Othayoth #include <cstdlib> 94f7b9bd3SJayanth Othayoth #include <stdexcept> 104f7b9bd3SJayanth Othayoth #include <string> 114f7b9bd3SJayanth Othayoth 124f7b9bd3SJayanth Othayoth namespace openpower::util 134f7b9bd3SJayanth Othayoth { 144f7b9bd3SJayanth Othayoth using namespace phosphor::logging; 154f7b9bd3SJayanth Othayoth TemporaryFile()164f7b9bd3SJayanth OthayothTemporaryFile::TemporaryFile() 174f7b9bd3SJayanth Othayoth { 184f7b9bd3SJayanth Othayoth // Build template path required by mkstemp() 19*00dd33efSPatrick Williams std::string templatePath = fs::temp_directory_path() / 20*00dd33efSPatrick Williams "openpower-proc-control-XXXXXX"; 214f7b9bd3SJayanth Othayoth 224f7b9bd3SJayanth Othayoth // Generate unique file name, create file, and open it. The XXXXXX 234f7b9bd3SJayanth Othayoth // characters are replaced by mkstemp() to make the file name unique. 244f7b9bd3SJayanth Othayoth int fd = mkstemp(templatePath.data()); 254f7b9bd3SJayanth Othayoth if (fd == -1) 264f7b9bd3SJayanth Othayoth { 274f7b9bd3SJayanth Othayoth throw std::runtime_error{ 284f7b9bd3SJayanth Othayoth std::string{"Unable to create temporary file: "} + strerror(errno)}; 294f7b9bd3SJayanth Othayoth } 304f7b9bd3SJayanth Othayoth 314f7b9bd3SJayanth Othayoth // Store path to temporary file 324f7b9bd3SJayanth Othayoth path = templatePath; 334f7b9bd3SJayanth Othayoth 344f7b9bd3SJayanth Othayoth // Close file descriptor 354f7b9bd3SJayanth Othayoth if (close(fd) == -1) 364f7b9bd3SJayanth Othayoth { 374f7b9bd3SJayanth Othayoth // Save errno value; will likely change when we delete temporary file 384f7b9bd3SJayanth Othayoth int savedErrno = errno; 394f7b9bd3SJayanth Othayoth 404f7b9bd3SJayanth Othayoth // Delete temporary file. The destructor won't be called because 414f7b9bd3SJayanth Othayoth // the exception below causes this constructor to exit without 424f7b9bd3SJayanth Othayoth // completing. 434f7b9bd3SJayanth Othayoth remove(); 444f7b9bd3SJayanth Othayoth 454f7b9bd3SJayanth Othayoth throw std::runtime_error{ 464f7b9bd3SJayanth Othayoth std::string{"Unable to close temporary file: "} + 474f7b9bd3SJayanth Othayoth strerror(savedErrno)}; 484f7b9bd3SJayanth Othayoth } 494f7b9bd3SJayanth Othayoth } 504f7b9bd3SJayanth Othayoth remove()514f7b9bd3SJayanth Othayothvoid TemporaryFile::remove() 524f7b9bd3SJayanth Othayoth { 534f7b9bd3SJayanth Othayoth if (!path.empty()) 544f7b9bd3SJayanth Othayoth { 554f7b9bd3SJayanth Othayoth // Delete temporary file from file system 564f7b9bd3SJayanth Othayoth fs::remove(path); 574f7b9bd3SJayanth Othayoth 584f7b9bd3SJayanth Othayoth // Clear path to indicate file has been deleted 594f7b9bd3SJayanth Othayoth path.clear(); 604f7b9bd3SJayanth Othayoth } 614f7b9bd3SJayanth Othayoth } 624f7b9bd3SJayanth Othayoth 634f7b9bd3SJayanth Othayoth } // namespace openpower::util 64