1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #pragma once 17 18 #include <stdint.h> 19 #include <sys/mman.h> 20 21 #include <memory> 22 #include <string> 23 24 #include <android-base/unique_fd.h> 25 #include <android/gsi/IGsiService.h> 26 #include <android/gsi/MappedImage.h> 27 #include <libfiemap/image_manager.h> 28 #include <liblp/builder.h> 29 30 namespace android { 31 namespace gsi { 32 33 class GsiService; 34 35 class PartitionInstaller final { 36 using ImageManager = android::fiemap::ImageManager; 37 using MappedDevice = android::fiemap::MappedDevice; 38 39 public: 40 // Constructor for a new GSI installation. 41 PartitionInstaller(GsiService* service, const std::string& installDir, const std::string& name, 42 const std::string& active_dsu, int64_t size, bool read_only); 43 ~PartitionInstaller(); 44 45 // Methods for a clean GSI install. 46 int StartInstall(); 47 bool CommitGsiChunk(int stream_fd, int64_t bytes); 48 bool CommitGsiChunk(const void* data, size_t bytes); 49 bool MapAshmem(int fd, size_t size); 50 bool CommitGsiChunk(size_t bytes); 51 int GetPartitionFd(); 52 53 static int WipeWritable(const std::string& active_dsu, const std::string& install_dir, 54 const std::string& name); 55 56 // Clean up install state if gsid crashed and restarted. 57 void PostInstallCleanup(); 58 void PostInstallCleanup(ImageManager* manager); 59 install_dir()60 const std::string& install_dir() const { return install_dir_; } 61 62 private: 63 int Finish(); 64 int PerformSanityChecks(); 65 int Preallocate(); 66 bool Format(); 67 bool CreateImage(const std::string& name, uint64_t size); 68 std::unique_ptr<MappedDevice> OpenPartition(const std::string& name); 69 int CheckInstallState(); 70 static const std::string GetBackingFile(std::string name); 71 bool IsFinishedWriting(); 72 bool IsAshmemMapped(); 73 void UnmapAshmem(); 74 75 GsiService* service_; 76 77 std::string install_dir_; 78 std::string name_; 79 std::string active_dsu_; 80 std::unique_ptr<ImageManager> images_; 81 uint64_t size_ = 0; 82 bool readOnly_; 83 // Remaining data we're waiting to receive for the GSI image. 84 uint64_t gsi_bytes_written_ = 0; 85 bool succeeded_ = false; 86 uint64_t ashmem_size_ = -1; 87 void* ashmem_data_ = MAP_FAILED; 88 89 std::unique_ptr<MappedDevice> system_device_; 90 }; 91 92 } // namespace gsi 93 } // namespace android 94