diff options
Diffstat (limited to 'fastboot/fastboot.cpp')
-rw-r--r-- | fastboot/fastboot.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index 2fe3b1a9e..7ce7c7c0e 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -396,6 +396,9 @@ static int show_help() { " gsi wipe|disable Wipe or disable a GSI installation (fastbootd only).\n" " wipe-super [SUPER_EMPTY] Wipe the super partition. This will reset it to\n" " contain an empty set of default dynamic partitions.\n" + " snapshot-update cancel On devices that support snapshot-based updates, cancel\n" + " an in-progress update. This may make the device\n" + " unbootable until it is reflashed.\n" "\n" "boot image:\n" " boot KERNEL [RAMDISK [SECOND]]\n" @@ -1216,6 +1219,14 @@ static void reboot_to_userspace_fastboot() { target_sparse_limit = -1; } +static void CancelSnapshotIfNeeded() { + std::string merge_status = "none"; + if (fb->GetVar(FB_VAR_SNAPSHOT_UPDATE_STATUS, &merge_status) == fastboot::SUCCESS && + merge_status != "none") { + fb->SnapshotUpdateCommand("Cancel"); + } +} + class ImageSource { public: virtual bool ReadFile(const std::string& name, std::vector<char>* out) const = 0; @@ -1268,6 +1279,8 @@ void FlashAllTool::Flash() { DetermineSecondarySlot(); CollectImages(); + CancelSnapshotIfNeeded(); + // First flash boot partitions. We allow this to happen either in userspace // or in bootloader fastboot. FlashImages(boot_images_); @@ -2071,12 +2084,24 @@ int FastBootTool::Main(int argc, char* argv[]) { image = next_arg(&args); } do_wipe_super(image, slot_override); + } else if (command == "snapshot-update") { + std::string arg; + if (!args.empty()) { + arg = next_arg(&args); + } + if (!arg.empty() && arg != "cancel") { + syntax_error("expected: snapshot-update [cancel]"); + } + fb->SnapshotUpdateCommand(arg); } else { syntax_error("unknown command %s", command.c_str()); } } if (wants_wipe) { + if (force_flash) { + CancelSnapshotIfNeeded(); + } std::vector<std::string> partitions = { "userdata", "cache", "metadata" }; for (const auto& partition : partitions) { std::string partition_type; |