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