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