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