diff --git a/init/reboot.cpp b/init/reboot.cpp index 0e6134809..b0b5b546d 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -669,6 +669,20 @@ bool HandlePowerctlMessage(const std::string& command) { "bootloader_message: " << err; } + } else if (reboot_target == "recovery") { + bootloader_message boot = {}; + if (std::string err; !read_bootloader_message(&boot, &err)) { + LOG(ERROR) << "Failed to read bootloader message: " << err; + } + // Update the boot command field if it's empty, and preserve + // the other arguments in the bootloader message. + if (boot.command[0] == '\0') { + strlcpy(boot.command, "boot-recovery", sizeof(boot.command)); + if (std::string err; !write_bootloader_message(boot, &err)) { + LOG(ERROR) << "Failed to set bootloader message: " << err; + return false; + } + } } else if (reboot_target == "sideload" || reboot_target == "sideload-auto-reboot" || reboot_target == "fastboot") { std::string arg = reboot_target == "sideload-auto-reboot" ? "sideload_auto_reboot"