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