188edb362Sopenharmony_ci/* 288edb362Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 388edb362Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 488edb362Sopenharmony_ci * you may not use this file except in compliance with the License. 588edb362Sopenharmony_ci * You may obtain a copy of the License at 688edb362Sopenharmony_ci * 788edb362Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 888edb362Sopenharmony_ci * 988edb362Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1088edb362Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1188edb362Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1288edb362Sopenharmony_ci * See the License for the specific language governing permissions and 1388edb362Sopenharmony_ci * limitations under the License. 1488edb362Sopenharmony_ci */ 1588edb362Sopenharmony_ci 1688edb362Sopenharmony_ci#ifndef SYS_INSTALLER_MODULE_LOOP_H 1788edb362Sopenharmony_ci#define SYS_INSTALLER_MODULE_LOOP_H 1888edb362Sopenharmony_ci 1988edb362Sopenharmony_ci#include <memory> 2088edb362Sopenharmony_ci#include <string> 2188edb362Sopenharmony_ci 2288edb362Sopenharmony_ci#include "unique_fd.h" 2388edb362Sopenharmony_ci 2488edb362Sopenharmony_cinamespace OHOS { 2588edb362Sopenharmony_cinamespace SysInstaller { 2688edb362Sopenharmony_cinamespace Loop { 2788edb362Sopenharmony_ciclass LoopbackDeviceUniqueFd { 2888edb362Sopenharmony_cipublic: 2988edb362Sopenharmony_ci UniqueFd deviceFd; 3088edb362Sopenharmony_ci std::string name; 3188edb362Sopenharmony_ci 3288edb362Sopenharmony_ci LoopbackDeviceUniqueFd() {} 3388edb362Sopenharmony_ci LoopbackDeviceUniqueFd(UniqueFd &&fd, const std::string &name) 3488edb362Sopenharmony_ci : deviceFd(std::move(fd)), name(name) {} 3588edb362Sopenharmony_ci 3688edb362Sopenharmony_ci LoopbackDeviceUniqueFd(LoopbackDeviceUniqueFd &&fd) noexcept 3788edb362Sopenharmony_ci : deviceFd(std::move(fd.deviceFd)), name(std::move(fd.name)) {} 3888edb362Sopenharmony_ci LoopbackDeviceUniqueFd &operator=(LoopbackDeviceUniqueFd &&other) noexcept 3988edb362Sopenharmony_ci { 4088edb362Sopenharmony_ci MaybeCloseBad(); 4188edb362Sopenharmony_ci deviceFd = std::move(other.deviceFd); 4288edb362Sopenharmony_ci name = std::move(other.name); 4388edb362Sopenharmony_ci return *this; 4488edb362Sopenharmony_ci } 4588edb362Sopenharmony_ci 4688edb362Sopenharmony_ci ~LoopbackDeviceUniqueFd() 4788edb362Sopenharmony_ci { 4888edb362Sopenharmony_ci MaybeCloseBad(); 4988edb362Sopenharmony_ci } 5088edb362Sopenharmony_ci 5188edb362Sopenharmony_ci void MaybeCloseBad() const; 5288edb362Sopenharmony_ci 5388edb362Sopenharmony_ci void CloseGood() 5488edb362Sopenharmony_ci { 5588edb362Sopenharmony_ci deviceFd.Release(); 5688edb362Sopenharmony_ci } 5788edb362Sopenharmony_ci 5888edb362Sopenharmony_ci int Get() const 5988edb362Sopenharmony_ci { 6088edb362Sopenharmony_ci return deviceFd.Get(); 6188edb362Sopenharmony_ci } 6288edb362Sopenharmony_ci}; 6388edb362Sopenharmony_cibool ConfigureReadAhead(const std::string &devicePath); 6488edb362Sopenharmony_cibool PreAllocateLoopDevices(const size_t num); 6588edb362Sopenharmony_cistd::unique_ptr<LoopbackDeviceUniqueFd> CreateLoopDevice( 6688edb362Sopenharmony_ci const std::string &target, const uint32_t imageOffset, const uint32_t imageSize); 6788edb362Sopenharmony_cibool RemoveDmLoopDevice(const std::string &mountPoint, const std::string &imagePath); 6888edb362Sopenharmony_cibool RemoveDmLoopDevice(const std::string &loopDevPath); 6988edb362Sopenharmony_cibool IsLoopDevMatchedImg(const std::string &loopPath, const std::string &imgFilePath); 7088edb362Sopenharmony_cibool CloseLoopDev(const std::string &loopPath); 7188edb362Sopenharmony_cibool ClearDmLoopDevice(const std::string &loopDevPath, const bool clearDm); 7288edb362Sopenharmony_ci} // Loop 7388edb362Sopenharmony_ci} // SysInstaller 7488edb362Sopenharmony_ci} // namespace OHOS 7588edb362Sopenharmony_ci#endif // SYS_INSTALLER_MODULE_LOOP_H