| Tom Cherry | 9027af0 | 2018-09-24 15:48:09 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2018 The Android Open Source Project | 
|  | 3 | * All rights reserved. | 
|  | 4 | * | 
|  | 5 | * Redistribution and use in source and binary forms, with or without | 
|  | 6 | * modification, are permitted provided that the following conditions | 
|  | 7 | * are met: | 
|  | 8 | *  * Redistributions of source code must retain the above copyright | 
|  | 9 | *    notice, this list of conditions and the following disclaimer. | 
|  | 10 | *  * Redistributions in binary form must reproduce the above copyright | 
|  | 11 | *    notice, this list of conditions and the following disclaimer in | 
|  | 12 | *    the documentation and/or other materials provided with the | 
|  | 13 | *    distribution. | 
|  | 14 | * | 
|  | 15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
|  | 16 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
|  | 17 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | 
|  | 18 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | 
|  | 19 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | 
|  | 20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | 
|  | 21 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS | 
|  | 22 | * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | 
|  | 23 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
|  | 24 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | 
|  | 25 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
|  | 26 | * SUCH DAMAGE. | 
|  | 27 | */ | 
| Daniel Zheng | 1a01a1c | 2023-01-30 23:29:50 +0000 | [diff] [blame] | 28 | #pragma once | 
| Tom Cherry | 9027af0 | 2018-09-24 15:48:09 -0700 | [diff] [blame] | 29 |  | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 30 | #include <string> | 
| Daniel Zheng | 7df2ab9 | 2023-02-21 18:22:08 +0000 | [diff] [blame] | 31 | #include "fastboot_driver.h" | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 32 | #include "super_flash_helper.h" | 
| Daniel Zheng | 7df2ab9 | 2023-02-21 18:22:08 +0000 | [diff] [blame] | 33 | #include "util.h" | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 34 |  | 
| Tom Cherry | 9027af0 | 2018-09-24 15:48:09 -0700 | [diff] [blame] | 35 | #include <bootimg.h> | 
|  | 36 |  | 
| Dmitrii Merkurev | cdbfa7a | 2023-03-01 23:50:05 +0000 | [diff] [blame] | 37 | #include "result.h" | 
|  | 38 | #include "socket.h" | 
|  | 39 | #include "util.h" | 
|  | 40 |  | 
| Tom Cherry | 9027af0 | 2018-09-24 15:48:09 -0700 | [diff] [blame] | 41 | class FastBootTool { | 
|  | 42 | public: | 
|  | 43 | int Main(int argc, char* argv[]); | 
|  | 44 |  | 
|  | 45 | void ParseOsPatchLevel(boot_img_hdr_v1*, const char*); | 
|  | 46 | void ParseOsVersion(boot_img_hdr_v1*, const char*); | 
| Jaegeuk Kim | 638d05e | 2020-11-09 08:54:13 -0800 | [diff] [blame] | 47 | unsigned ParseFsOption(const char*); | 
| Tom Cherry | 9027af0 | 2018-09-24 15:48:09 -0700 | [diff] [blame] | 48 | }; | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 49 |  | 
| Daniel Zheng | 7df2ab9 | 2023-02-21 18:22:08 +0000 | [diff] [blame] | 50 | enum class ImageType { | 
|  | 51 | // Must be flashed for device to boot into the kernel. | 
|  | 52 | BootCritical, | 
|  | 53 | // Normal partition to be flashed during "flashall". | 
|  | 54 | Normal, | 
|  | 55 | // Partition that is never flashed during "flashall". | 
|  | 56 | Extra | 
|  | 57 | }; | 
|  | 58 |  | 
|  | 59 | struct Image { | 
|  | 60 | std::string nickname; | 
|  | 61 | std::string img_name; | 
|  | 62 | std::string sig_name; | 
|  | 63 | std::string part_name; | 
|  | 64 | bool optional_if_no_image; | 
|  | 65 | ImageType type; | 
|  | 66 | bool IsSecondary() const { return nickname.empty(); } | 
|  | 67 | }; | 
|  | 68 |  | 
|  | 69 | using ImageEntry = std::pair<const Image*, std::string>; | 
|  | 70 |  | 
|  | 71 | struct FlashingPlan { | 
| Daniel Zheng | 15e7783 | 2023-03-13 17:09:43 +0000 | [diff] [blame] | 72 | unsigned fs_options = 0; | 
| Daniel Zheng | 7df2ab9 | 2023-02-21 18:22:08 +0000 | [diff] [blame] | 73 | // If the image uses the default slot, or the user specified "all", then | 
|  | 74 | // the paired string will be empty. If the image requests a specific slot | 
|  | 75 | // (for example, system_other) it is specified instead. | 
|  | 76 | ImageSource* source; | 
|  | 77 | bool wants_wipe = false; | 
|  | 78 | bool skip_reboot = false; | 
|  | 79 | bool wants_set_active = false; | 
|  | 80 | bool skip_secondary = false; | 
|  | 81 | bool force_flash = false; | 
|  | 82 |  | 
|  | 83 | std::string slot; | 
|  | 84 | std::string current_slot; | 
|  | 85 | std::string secondary_slot; | 
|  | 86 | fastboot::FastBootDriver* fb; | 
| Daniel Zheng | 7df2ab9 | 2023-02-21 18:22:08 +0000 | [diff] [blame] | 87 | }; | 
|  | 88 |  | 
| Daniel Zheng | 0d30718 | 2023-01-31 21:07:53 +0000 | [diff] [blame] | 89 | bool should_flash_in_userspace(const std::string& partition_name); | 
|  | 90 | bool is_userspace_fastboot(); | 
|  | 91 | void do_flash(const char* pname, const char* fname); | 
|  | 92 | void do_for_partitions(const std::string& part, const std::string& slot, | 
|  | 93 | const std::function<void(const std::string&)>& func, bool force_slot); | 
|  | 94 | std::string find_item(const std::string& item); | 
|  | 95 | void reboot_to_userspace_fastboot(); | 
|  | 96 | void syntax_error(const char* fmt, ...); | 
| Dmitrii Merkurev | cdbfa7a | 2023-03-01 23:50:05 +0000 | [diff] [blame] | 97 |  | 
|  | 98 | struct NetworkSerial { | 
|  | 99 | Socket::Protocol protocol; | 
|  | 100 | std::string address; | 
|  | 101 | int port; | 
|  | 102 | }; | 
|  | 103 |  | 
| Daniel Zheng | 47d70a5 | 2023-02-14 17:44:40 +0000 | [diff] [blame] | 104 | Result<NetworkSerial, FastbootError> ParseNetworkSerial(const std::string& serial); | 
|  | 105 | bool supports_AB(); | 
|  | 106 | std::string GetPartitionName(const ImageEntry& entry, std::string& current_slot_); | 
|  | 107 | void flash_partition_files(const std::string& partition, const std::vector<SparsePtr>& files); | 
|  | 108 | int64_t get_sparse_limit(int64_t size); | 
|  | 109 | std::vector<SparsePtr> resparse_file(sparse_file* s, int64_t max_size); | 
|  | 110 |  | 
|  | 111 | bool is_retrofit_device(); | 
|  | 112 | bool is_logical(const std::string& partition); | 
| Daniel Zheng | 15e7783 | 2023-03-13 17:09:43 +0000 | [diff] [blame] | 113 | void fb_perform_format(const std::string& partition, int skip_if_not_supported, | 
|  | 114 | const std::string& type_override, const std::string& size_override, | 
|  | 115 | const unsigned fs_options); |