blob: 34b1422d94718d5a0a42e4228603c2b67966f907 [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{
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053018 private:
19 /** @brief handler for operating on file */
20 FILE* fp = NULL;
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053021
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053022 /** @brief File name. Needed in the case where the temp
23 * needs to be removed
24 */
25 const std::string& name;
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053026
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053027 /** @brief Should the file be removed at exit */
28 bool removeOnExit = false;
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053029
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053030 public:
31 File() = delete;
32 File(const File&) = delete;
33 File& operator=(const File&) = delete;
34 File(File&&) = delete;
35 File& operator=(File&&) = delete;
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053036
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053037 /** @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)
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053069 {
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053070 fclose(fp);
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053071 }
72
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053073 // Needed for exception safety
74 if (removeOnExit && fs::exists(name))
Richard Marian Thomaiyar1f5a0022017-12-16 15:11:47 +053075 {
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053076 fs::remove(name);
Richard Marian Thomaiyar1f5a0022017-12-16 15:11:47 +053077 }
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053078 }
Richard Marian Thomaiyar1f5a0022017-12-16 15:11:47 +053079
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053080 auto operator()()
81 {
82 return fp;
83 }
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053084};
85
86} // namespace user
87} // namespace phosphor