xref: /openbmc/phosphor-user-manager/file.hpp (revision 9f630d9e)
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, const std::string& mode,
44          bool removeOnExit = false) :
45         name(name),
46         removeOnExit(removeOnExit)
47     {
48         fp = fopen(name.c_str(), mode.c_str());
49     }
50 
51     /** @brief Opens file using provided file descriptor
52      *
53      *  @param[in] fd           - File descriptor
54      *  @param[in] name         - File name
55      *  @param[in] mode         - File open mode
56      *  @param[in] removeOnExit - File to be removed at exit or no
57      */
58     File(int fd, const std::string& name, const std::string& mode,
59          bool removeOnExit = false) :
60         name(name),
61         removeOnExit(removeOnExit)
62     {
63         fp = fdopen(fd, mode.c_str());
64     }
65 
66     ~File()
67     {
68         if (fp)
69         {
70             fclose(fp);
71         }
72 
73         // Needed for exception safety
74         if (removeOnExit && fs::exists(name))
75         {
76             fs::remove(name);
77         }
78     }
79 
80     auto operator()()
81     {
82         return fp;
83     }
84 };
85 
86 } // namespace user
87 } // namespace phosphor
88