1 #pragma once 2 3 #include <stdio.h> 4 5 #include <filesystem> 6 namespace phosphor 7 { 8 namespace user 9 { 10 11 /** @class File 12 * @brief Responsible for handling file pointer 13 * Needed by putspent(3) 14 */ 15 class File 16 { 17 private: 18 /** @brief handler for operating on file */ 19 FILE* fp = NULL; 20 21 /** @brief File name. Needed in the case where the temp 22 * needs to be removed 23 */ 24 const std::string& name; 25 26 /** @brief Should the file be removed at exit */ 27 bool removeOnExit = false; 28 29 public: 30 File() = delete; 31 File(const File&) = delete; 32 File& operator=(const File&) = delete; 33 File(File&&) = delete; 34 File& operator=(File&&) = delete; 35 36 /** @brief Opens file and uses it to do file operation 37 * 38 * @param[in] name - File name 39 * @param[in] mode - File open mode 40 * @param[in] removeOnExit - File to be removed at exit or no 41 */ File(const std::string & name,const std::string & mode,bool removeOnExit=false)42 File(const std::string& name, const std::string& mode, 43 bool removeOnExit = false) : name(name), removeOnExit(removeOnExit) 44 { 45 fp = fopen(name.c_str(), mode.c_str()); 46 } 47 48 /** @brief Opens file using provided file descriptor 49 * 50 * @param[in] fd - File descriptor 51 * @param[in] name - File name 52 * @param[in] mode - File open mode 53 * @param[in] removeOnExit - File to be removed at exit or no 54 */ File(int fd,const std::string & name,const std::string & mode,bool removeOnExit=false)55 File(int fd, const std::string& name, const std::string& mode, 56 bool removeOnExit = false) : name(name), removeOnExit(removeOnExit) 57 { 58 fp = fdopen(fd, mode.c_str()); 59 } 60 ~File()61 ~File() 62 { 63 if (fp) 64 { 65 fclose(fp); 66 } 67 68 // Needed for exception safety 69 if (removeOnExit && std::filesystem::exists(name)) 70 { 71 std::filesystem::remove(name); 72 } 73 } 74 operator ()()75 auto operator()() 76 { 77 return fp; 78 } 79 }; 80 81 } // namespace user 82 } // namespace phosphor 83