xref: /aosp_15_r20/frameworks/native/cmds/installd/unique_file.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #ifndef ANDROID_INSTALLD_UNIQUE_FILE_H
18*38e8c45fSAndroid Build Coastguard Worker #define ANDROID_INSTALLD_UNIQUE_FILE_H
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <functional>
21*38e8c45fSAndroid Build Coastguard Worker #include <string>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker namespace android {
24*38e8c45fSAndroid Build Coastguard Worker namespace installd {
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker // A file management helper that serves two purposes:
27*38e8c45fSAndroid Build Coastguard Worker //
28*38e8c45fSAndroid Build Coastguard Worker // 1. Closes the file description on destruction, similar unique_fd.
29*38e8c45fSAndroid Build Coastguard Worker // 2. Runs a cleanup function on after close, if not cancelled.
30*38e8c45fSAndroid Build Coastguard Worker //
31*38e8c45fSAndroid Build Coastguard Worker // The class does not assume the relationship between the given fd and file path.
32*38e8c45fSAndroid Build Coastguard Worker //
33*38e8c45fSAndroid Build Coastguard Worker // Example:
34*38e8c45fSAndroid Build Coastguard Worker //
35*38e8c45fSAndroid Build Coastguard Worker //   UniqueFile file(open(...),
36*38e8c45fSAndroid Build Coastguard Worker //                           filepath,
37*38e8c45fSAndroid Build Coastguard Worker //                           [](const std::string& path) {
38*38e8c45fSAndroid Build Coastguard Worker //                               unlink(path.c_str());
39*38e8c45fSAndroid Build Coastguard Worker //                           });
40*38e8c45fSAndroid Build Coastguard Worker //   if (file.fd() == -1) {
41*38e8c45fSAndroid Build Coastguard Worker //       // Error opening...
42*38e8c45fSAndroid Build Coastguard Worker //   }
43*38e8c45fSAndroid Build Coastguard Worker //
44*38e8c45fSAndroid Build Coastguard Worker //   ...
45*38e8c45fSAndroid Build Coastguard Worker //   if (error) {
46*38e8c45fSAndroid Build Coastguard Worker //       // At this point, when the UniqueFile is destructed, the cleanup function will run
47*38e8c45fSAndroid Build Coastguard Worker //       // (e.g. to delete the file) after the fd is closed.
48*38e8c45fSAndroid Build Coastguard Worker //       return -1;
49*38e8c45fSAndroid Build Coastguard Worker //   }
50*38e8c45fSAndroid Build Coastguard Worker //
51*38e8c45fSAndroid Build Coastguard Worker //   (Success case)
52*38e8c45fSAndroid Build Coastguard Worker //   file.DisableCleanup();
53*38e8c45fSAndroid Build Coastguard Worker //   // At this point, when the UniqueFile is destructed, the cleanup function will not run
54*38e8c45fSAndroid Build Coastguard Worker //   // (e.g. leaving the file around) after the fd is closed.
55*38e8c45fSAndroid Build Coastguard Worker //
56*38e8c45fSAndroid Build Coastguard Worker class UniqueFile {
57*38e8c45fSAndroid Build Coastguard Worker  private:
58*38e8c45fSAndroid Build Coastguard Worker     using CleanUpFunction = std::function<void (const std::string&)>;
59*38e8c45fSAndroid Build Coastguard Worker 
60*38e8c45fSAndroid Build Coastguard Worker  public:
61*38e8c45fSAndroid Build Coastguard Worker     UniqueFile();
62*38e8c45fSAndroid Build Coastguard Worker     UniqueFile(int value, std::string path);
63*38e8c45fSAndroid Build Coastguard Worker     UniqueFile(int value, std::string path, CleanUpFunction cleanup);
64*38e8c45fSAndroid Build Coastguard Worker     UniqueFile(UniqueFile&& other);
65*38e8c45fSAndroid Build Coastguard Worker     ~UniqueFile();
66*38e8c45fSAndroid Build Coastguard Worker 
67*38e8c45fSAndroid Build Coastguard Worker     UniqueFile& operator=(UniqueFile&& other);
68*38e8c45fSAndroid Build Coastguard Worker 
fd()69*38e8c45fSAndroid Build Coastguard Worker     int fd() const {
70*38e8c45fSAndroid Build Coastguard Worker         return value_;
71*38e8c45fSAndroid Build Coastguard Worker     }
72*38e8c45fSAndroid Build Coastguard Worker 
path()73*38e8c45fSAndroid Build Coastguard Worker     const std::string& path() const {
74*38e8c45fSAndroid Build Coastguard Worker       return path_;
75*38e8c45fSAndroid Build Coastguard Worker     }
76*38e8c45fSAndroid Build Coastguard Worker 
DisableAutoClose()77*38e8c45fSAndroid Build Coastguard Worker     void DisableAutoClose() {
78*38e8c45fSAndroid Build Coastguard Worker         auto_close_ = false;
79*38e8c45fSAndroid Build Coastguard Worker     }
80*38e8c45fSAndroid Build Coastguard Worker 
DisableCleanup()81*38e8c45fSAndroid Build Coastguard Worker     void DisableCleanup() {
82*38e8c45fSAndroid Build Coastguard Worker         do_cleanup_ = false;
83*38e8c45fSAndroid Build Coastguard Worker     }
84*38e8c45fSAndroid Build Coastguard Worker 
85*38e8c45fSAndroid Build Coastguard Worker     void reset();
86*38e8c45fSAndroid Build Coastguard Worker     void reset(int new_value, std::string path, CleanUpFunction new_cleanup = nullptr);
87*38e8c45fSAndroid Build Coastguard Worker 
88*38e8c45fSAndroid Build Coastguard Worker  private:
89*38e8c45fSAndroid Build Coastguard Worker     void release();
90*38e8c45fSAndroid Build Coastguard Worker 
91*38e8c45fSAndroid Build Coastguard Worker     int value_;
92*38e8c45fSAndroid Build Coastguard Worker     std::string path_;
93*38e8c45fSAndroid Build Coastguard Worker     CleanUpFunction cleanup_;
94*38e8c45fSAndroid Build Coastguard Worker     bool do_cleanup_;
95*38e8c45fSAndroid Build Coastguard Worker     bool auto_close_;
96*38e8c45fSAndroid Build Coastguard Worker };
97*38e8c45fSAndroid Build Coastguard Worker 
98*38e8c45fSAndroid Build Coastguard Worker }  // namespace installd
99*38e8c45fSAndroid Build Coastguard Worker }  // namespace android
100*38e8c45fSAndroid Build Coastguard Worker 
101*38e8c45fSAndroid Build Coastguard Worker #endif  // ANDROID_INSTALLD_UNIQUE_FILE_H
102