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 Othayoth TemporaryFile::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 Othayoth void 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