blob: 7b22b3e5a9db557b71400bb99342ec221e672ce2 [file] [log] [blame]
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +05301#pragma once
2
3#include <stdio.h>
4#include <experimental/filesystem>
5namespace phosphor
6{
7namespace user
8{
9
10namespace fs = std::experimental::filesystem;
11
12/** @class File
13 * @brief Responsible for handling file pointer
14 * Needed by putspent(3)
15 */
16class 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
Richard Marian Thomaiyar1f5a0022017-12-16 15:11:47 +053052 /** @brief Opens file using provided file descriptor
53 *
54 * @param[in] fd - File descriptor
55 * @param[in] name - File name
56 * @param[in] mode - File open mode
57 * @param[in] removeOnExit - File to be removed at exit or no
58 */
59 File(int fd,
60 const std::string& name,
61 const std::string& mode,
62 bool removeOnExit = false) :
63 name(name),
64 removeOnExit(removeOnExit)
65 {
66 fp = fdopen(fd, mode.c_str());
67 }
68
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053069 ~File()
70 {
71 if (fp)
72 {
73 fclose(fp);
74 }
75
76 // Needed for exception safety
77 if (removeOnExit && fs::exists(name))
78 {
79 fs::remove(name);
80 }
81 }
82
83 auto operator()()
84 {
85 return fp;
86 }
87};
88
89} // namespace user
90} // namespace phosphor