| /* |
| * Copyright (C) 2019 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. |
| */ |
| #pragma once |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <string> |
| |
| #include <android/gsi/IGsiService.h> |
| #include <android/gsi/MappedImage.h> |
| #include <libfiemap/image_manager.h> |
| #include <liblp/builder.h> |
| |
| namespace android { |
| namespace gsi { |
| |
| class GsiService; |
| |
| class GsiInstaller final { |
| using ImageManager = android::fiemap::ImageManager; |
| using MappedDevice = android::fiemap::MappedDevice; |
| |
| public: |
| // Constructor for a new GSI installation. |
| GsiInstaller(GsiService* service, const GsiInstallParams& params); |
| // Constructor for re-enabling a previous GSI installation. |
| GsiInstaller(GsiService* service, const std::string& install_dir); |
| ~GsiInstaller(); |
| |
| // Methods for a clean GSI install. |
| int StartInstall(); |
| bool CommitGsiChunk(int stream_fd, int64_t bytes); |
| bool CommitGsiChunk(const void* data, size_t bytes); |
| int SetGsiBootable(bool one_shot); |
| |
| // Methods for interacting with an existing install. |
| int ReenableGsi(bool one_shot); |
| int WipeUserdata(); |
| |
| // Clean up install state if gsid crashed and restarted. |
| static void PostInstallCleanup(); |
| static void PostInstallCleanup(ImageManager* manager); |
| |
| const std::string& install_dir() const { return install_dir_; } |
| uint64_t userdata_size() const { return userdata_size_; } |
| |
| private: |
| int PerformSanityChecks(); |
| int PreallocateFiles(); |
| int PreallocateUserdata(); |
| int PreallocateSystem(); |
| bool FormatUserdata(); |
| bool CreateImage(const std::string& name, uint64_t size, bool readonly); |
| std::unique_ptr<MappedDevice> OpenPartition(const std::string& name); |
| int CheckInstallState(); |
| bool CreateInstallStatusFile(); |
| bool SetBootMode(bool one_shot); |
| |
| GsiService* service_; |
| |
| std::string install_dir_; |
| std::unique_ptr<ImageManager> images_; |
| uint64_t gsi_size_ = 0; |
| uint64_t userdata_size_ = 0; |
| bool wipe_userdata_ = false; |
| bool wipe_userdata_on_failure_ = false; |
| // Remaining data we're waiting to receive for the GSI image. |
| uint64_t gsi_bytes_written_ = 0; |
| bool succeeded_ = false; |
| |
| std::unique_ptr<MappedDevice> system_device_; |
| }; |
| |
| } // namespace gsi |
| } // namespace android |