blob: 968be37995a32db15cabc2d0d46b980e8b9162d2 [file] [log] [blame]
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +05301#pragma once
2
3#include <stdio.h>
Patrick Williams9638afb2021-02-22 17:16:24 -06004
Gunnar Mills703131f2020-10-28 14:26:33 -05005#include <filesystem>
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +05306namespace phosphor
7{
8namespace user
9{
10
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053011/** @class File
12 * @brief Responsible for handling file pointer
13 * Needed by putspent(3)
14 */
15class File
16{
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053017 private:
18 /** @brief handler for operating on file */
19 FILE* fp = NULL;
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053020
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053021 /** @brief File name. Needed in the case where the temp
22 * needs to be removed
23 */
24 const std::string& name;
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053025
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053026 /** @brief Should the file be removed at exit */
27 bool removeOnExit = false;
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053028
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053029 public:
30 File() = delete;
31 File(const File&) = delete;
32 File& operator=(const File&) = delete;
33 File(File&&) = delete;
34 File& operator=(File&&) = delete;
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053035
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053036 /** @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,
Patrick Williams16c2b682024-08-16 15:20:56 -040043 bool removeOnExit = false) : name(name), removeOnExit(removeOnExit)
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053044 {
45 fp = fopen(name.c_str(), mode.c_str());
46 }
47
48 /** @brief Opens file using provided file descriptor
49 *
50 * @param[in] fd - File descriptor
51 * @param[in] name - File name
52 * @param[in] mode - File open mode
53 * @param[in] removeOnExit - File to be removed at exit or no
54 */
55 File(int fd, const std::string& name, const std::string& mode,
Patrick Williams16c2b682024-08-16 15:20:56 -040056 bool removeOnExit = false) : name(name), removeOnExit(removeOnExit)
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053057 {
58 fp = fdopen(fd, mode.c_str());
59 }
60
61 ~File()
62 {
63 if (fp)
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053064 {
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053065 fclose(fp);
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053066 }
67
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053068 // Needed for exception safety
Gunnar Mills703131f2020-10-28 14:26:33 -050069 if (removeOnExit && std::filesystem::exists(name))
Richard Marian Thomaiyar1f5a0022017-12-16 15:11:47 +053070 {
Gunnar Mills703131f2020-10-28 14:26:33 -050071 std::filesystem::remove(name);
Richard Marian Thomaiyar1f5a0022017-12-16 15:11:47 +053072 }
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053073 }
Richard Marian Thomaiyar1f5a0022017-12-16 15:11:47 +053074
Richard Marian Thomaiyar9f630d92018-05-24 10:49:10 +053075 auto operator()()
76 {
77 return fp;
78 }
Vishwanatha Subbanna070a3e42017-09-06 11:40:45 +053079};
80
81} // namespace user
82} // namespace phosphor