/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_APEXD_APEXD_LOOP_H_ #define ANDROID_APEXD_APEXD_LOOP_H_ #include #include #include #include namespace android { namespace apex { namespace loop { using android::base::unique_fd; struct LoopbackDeviceUniqueFd { unique_fd device_fd; std::string name; LoopbackDeviceUniqueFd() {} LoopbackDeviceUniqueFd(unique_fd&& fd, const std::string& name) : device_fd(std::move(fd)), name(name) {} LoopbackDeviceUniqueFd(LoopbackDeviceUniqueFd&& fd) noexcept : device_fd(std::move(fd.device_fd)), name(std::move(fd.name)) {} LoopbackDeviceUniqueFd& operator=(LoopbackDeviceUniqueFd&& other) noexcept { MaybeCloseBad(); device_fd = std::move(other.device_fd); name = std::move(other.name); return *this; } ~LoopbackDeviceUniqueFd() { MaybeCloseBad(); } void MaybeCloseBad(); void CloseGood() { device_fd.reset(-1); } int Get() { return device_fd.get(); } }; android::base::Result ConfigureReadAhead(const std::string& device_path); android::base::Result PreAllocateLoopDevices(size_t num); android::base::Result CreateLoopDevice( const std::string& target, const int32_t image_offset, const size_t image_size); using DestroyLoopFn = std::function; void DestroyLoopDevice(const std::string& path, const DestroyLoopFn& extra); } // namespace loop } // namespace apex } // namespace android #endif // ANDROID_APEXD_APEXD_LOOP_H_