xref: /openbmc/phosphor-user-manager/file.hpp (revision 16c2b681dd3ce7c2d71a150c11138fd65c6c4f21)
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