diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index 699d40642..15d187437 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -1830,9 +1830,9 @@ static unsigned fb_get_flash_block_size(std::string name) { return size; } -static void fb_perform_format(const std::string& partition, int skip_if_not_supported, - const std::string& type_override, const std::string& size_override, - const unsigned fs_options) { +void fb_perform_format(const std::string& partition, int skip_if_not_supported, + const std::string& type_override, const std::string& size_override, + const unsigned fs_options) { std::string partition_type, partition_size; struct fastboot_buffer buf; @@ -2026,7 +2026,6 @@ int FastBootTool::Main(int argc, char* argv[]) { android::base::InitLogging(argv, FastbootLogger, FastbootAborter); std::unique_ptr fp = std::make_unique(); - unsigned fs_options = 0; int longindex; std::string slot_override; std::string next_active; @@ -2080,7 +2079,7 @@ int FastBootTool::Main(int argc, char* argv[]) { } else if (name == "force") { fp->force_flash = true; } else if (name == "fs-options") { - fs_options = ParseFsOption(optarg); + fp->fs_options = ParseFsOption(optarg); } else if (name == "header-version") { g_boot_img_hdr.header_version = strtoul(optarg, nullptr, 0); } else if (name == "dtb") { @@ -2250,7 +2249,7 @@ int FastBootTool::Main(int argc, char* argv[]) { std::string partition = next_arg(&args); auto format = [&](const std::string& partition) { - fb_perform_format(partition, 0, type_override, size_override, fs_options); + fb_perform_format(partition, 0, type_override, size_override, fp->fs_options); }; do_for_partitions(partition, slot_override, format, true); } else if (command == "signature") { @@ -2407,19 +2406,15 @@ int FastBootTool::Main(int argc, char* argv[]) { syntax_error("unknown command %s", command.c_str()); } } + if (fp->wants_wipe) { if (fp->force_flash) { CancelSnapshotIfNeeded(); } std::vector partitions = {"userdata", "cache", "metadata"}; for (const auto& partition : partitions) { - std::string partition_type; - if (fb->GetVar("partition-type:" + partition, &partition_type) != fastboot::SUCCESS) { - continue; - } - if (partition_type.empty()) continue; - fb->Erase(partition); - fb_perform_format(partition, 1, partition_type, "", fs_options); + std::unique_ptr wipe_task = std::make_unique(fp.get(), partition); + wipe_task->Run(); } } if (fp->wants_set_active) { diff --git a/fastboot/fastboot.h b/fastboot/fastboot.h index 2264ca343..ed33481d5 100644 --- a/fastboot/fastboot.h +++ b/fastboot/fastboot.h @@ -69,6 +69,7 @@ struct Image { using ImageEntry = std::pair; struct FlashingPlan { + unsigned fs_options = 0; // If the image uses the default slot, or the user specified "all", then // the paired string will be empty. If the image requests a specific slot // (for example, system_other) it is specified instead. @@ -109,3 +110,6 @@ std::vector resparse_file(sparse_file* s, int64_t max_size); bool is_retrofit_device(); bool is_logical(const std::string& partition); +void fb_perform_format(const std::string& partition, int skip_if_not_supported, + const std::string& type_override, const std::string& size_override, + const unsigned fs_options); diff --git a/fastboot/task.cpp b/fastboot/task.cpp index 6233c900f..c70139b9a 100644 --- a/fastboot/task.cpp +++ b/fastboot/task.cpp @@ -143,8 +143,7 @@ std::unique_ptr FlashSuperLayoutTask::Initialize( return std::make_unique(super_name, std::move(helper), std::move(s)); } -UpdateSuperTask::UpdateSuperTask(FlashingPlan* fp) - : fp_(fp) {} +UpdateSuperTask::UpdateSuperTask(FlashingPlan* fp) : fp_(fp) {} void UpdateSuperTask::Run() { unique_fd fd = fp_->source->OpenFile("super_empty.img"); @@ -185,4 +184,16 @@ DeleteTask::DeleteTask(FlashingPlan* fp, const std::string& pname) : fp_(fp), pn void DeleteTask::Run() { fp_->fb->DeletePartition(pname_); -} \ No newline at end of file +} + +WipeTask::WipeTask(FlashingPlan* fp, const std::string& pname) : fp_(fp), pname_(pname){}; + +void WipeTask::Run() { + std::string partition_type; + if (fp_->fb->GetVar("partition-type:" + pname_, &partition_type) != fastboot::SUCCESS) { + return; + } + if (partition_type.empty()) return; + fp_->fb->Erase(pname_); + fb_perform_format(pname_, 1, partition_type, "", fp_->fs_options); +} diff --git a/fastboot/task.h b/fastboot/task.h index 0af771e97..149c34cc5 100644 --- a/fastboot/task.h +++ b/fastboot/task.h @@ -100,3 +100,13 @@ class DeleteTask : public Task { const FlashingPlan* fp_; const std::string pname_; }; + +class WipeTask : public Task { + public: + WipeTask(FlashingPlan* fp, const std::string& pname); + void Run() override; + + private: + const FlashingPlan* fp_; + const std::string pname_; +};