Merge "Consolidate the codes that handle reboot/shutdown."

This commit is contained in:
Tao Bao
2019-04-29 21:53:41 +00:00
committed by Gerrit Code Review
6 changed files with 30 additions and 24 deletions
+8 -7
View File
@@ -14,12 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef _OTAUTIL_SYSUTIL #pragma once
#define _OTAUTIL_SYSUTIL
#include <sys/types.h> #include <sys/types.h>
#include <string> #include <string>
#include <string_view>
#include <vector> #include <vector>
#include "rangeset.h" #include "rangeset.h"
@@ -101,13 +101,14 @@ class MemMapping {
std::vector<MappedRange> ranges_; std::vector<MappedRange> ranges_;
}; };
// Wrapper function to trigger a reboot, by additionally handling quiescent reboot mode. The // Reboots the device into the specified target, by additionally handling quiescent reboot mode.
// command should start with "reboot," (e.g. "reboot,bootloader" or "reboot,"). // 'target' can be an empty string, which indicates booting into Android.
bool reboot(const std::string& command); bool Reboot(std::string_view target);
// Triggers a shutdown.
bool Shutdown();
// Returns a null-terminated char* array, where the elements point to the C-strings in the given // Returns a null-terminated char* array, where the elements point to the C-strings in the given
// vector, plus an additional nullptr at the end. This is a helper function that facilitates // vector, plus an additional nullptr at the end. This is a helper function that facilitates
// calling C functions (such as getopt(3)) that expect an array of C-strings. // calling C functions (such as getopt(3)) that expect an array of C-strings.
std::vector<char*> StringVectorToNullTerminatedArray(const std::vector<std::string>& args); std::vector<char*> StringVectorToNullTerminatedArray(const std::vector<std::string>& args);
#endif // _OTAUTIL_SYSUTIL
+10 -3
View File
@@ -214,14 +214,21 @@ MemMapping::~MemMapping() {
ranges_.clear(); ranges_.clear();
} }
bool reboot(const std::string& command) { bool Reboot(std::string_view target) {
std::string cmd = command; std::string cmd = "reboot," + std::string(target);
if (android::base::GetBoolProperty("ro.boot.quiescent", false)) { // Honor the quiescent mode if applicable.
if (target != "bootloader" && target != "fastboot" &&
android::base::GetBoolProperty("ro.boot.quiescent", false)) {
cmd += ",quiescent"; cmd += ",quiescent";
} }
return android::base::SetProperty(ANDROID_RB_PROPERTY, cmd); return android::base::SetProperty(ANDROID_RB_PROPERTY, cmd);
} }
bool Shutdown() {
// "shutdown" doesn't need a "reason" arg nor a comma.
return android::base::SetProperty(ANDROID_RB_PROPERTY, "shutdown");
}
std::vector<char*> StringVectorToNullTerminatedArray(const std::vector<std::string>& args) { std::vector<char*> StringVectorToNullTerminatedArray(const std::vector<std::string>& args) {
std::vector<char*> result(args.size()); std::vector<char*> result(args.size());
std::transform(args.cbegin(), args.cend(), result.begin(), std::transform(args.cbegin(), args.cend(), result.begin(),
+2 -2
View File
@@ -734,8 +734,8 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri
// Print retry count on screen. // Print retry count on screen.
ui->Print("Retry attempt %d\n", retry_count); ui->Print("Retry attempt %d\n", retry_count);
// Reboot and retry the update // Reboot back into recovery to retry the update.
if (!reboot("reboot,recovery")) { if (!Reboot("recovery")) {
ui->Print("Reboot failed\n"); ui->Print("Reboot failed\n");
} else { } else {
while (true) { while (true) {
+8 -10
View File
@@ -41,7 +41,6 @@
#include <android-base/strings.h> #include <android-base/strings.h>
#include <android-base/unique_fd.h> #include <android-base/unique_fd.h>
#include <bootloader_message/bootloader_message.h> #include <bootloader_message/bootloader_message.h>
#include <cutils/android_reboot.h>
#include <cutils/sockets.h> #include <cutils/sockets.h>
#include <private/android_logger.h> /* private pmsg functions */ #include <private/android_logger.h> /* private pmsg functions */
#include <selinux/android.h> #include <selinux/android.h>
@@ -471,27 +470,26 @@ int main(int argc, char** argv) {
switch (ret) { switch (ret) {
case Device::SHUTDOWN: case Device::SHUTDOWN:
ui->Print("Shutting down...\n"); ui->Print("Shutting down...\n");
// TODO: Move all the reboots to reboot(), which should conditionally set quiescent flag. Shutdown();
android::base::SetProperty(ANDROID_RB_PROPERTY, "shutdown,");
break; break;
case Device::REBOOT_BOOTLOADER: case Device::REBOOT_BOOTLOADER:
ui->Print("Rebooting to bootloader...\n"); ui->Print("Rebooting to bootloader...\n");
android::base::SetProperty(ANDROID_RB_PROPERTY, "reboot,bootloader"); Reboot("bootloader");
break; break;
case Device::REBOOT_FASTBOOT: case Device::REBOOT_FASTBOOT:
ui->Print("Rebooting to recovery/fastboot...\n"); ui->Print("Rebooting to recovery/fastboot...\n");
android::base::SetProperty(ANDROID_RB_PROPERTY, "reboot,fastboot"); Reboot("fastboot");
break; break;
case Device::REBOOT_RECOVERY: case Device::REBOOT_RECOVERY:
ui->Print("Rebooting to recovery...\n"); ui->Print("Rebooting to recovery...\n");
reboot("reboot,recovery"); Reboot("recovery");
break; break;
case Device::REBOOT_RESCUE: { case Device::REBOOT_RESCUE: {
// Not using `reboot("reboot,rescue")`, as it requires matching support in kernel and/or // Not using `Reboot("rescue")`, as it requires matching support in kernel and/or
// bootloader. // bootloader.
bootloader_message boot = {}; bootloader_message boot = {};
strlcpy(boot.command, "boot-rescue", sizeof(boot.command)); strlcpy(boot.command, "boot-rescue", sizeof(boot.command));
@@ -502,14 +500,14 @@ int main(int argc, char** argv) {
continue; continue;
} }
ui->Print("Rebooting to recovery/rescue...\n"); ui->Print("Rebooting to recovery/rescue...\n");
reboot("reboot,recovery"); Reboot("recovery");
break; break;
} }
case Device::ENTER_FASTBOOT: case Device::ENTER_FASTBOOT:
if (logical_partitions_mapped()) { if (logical_partitions_mapped()) {
ui->Print("Partitions may be mounted - rebooting to enter fastboot."); ui->Print("Partitions may be mounted - rebooting to enter fastboot.");
android::base::SetProperty(ANDROID_RB_PROPERTY, "reboot,fastboot"); Reboot("fastboot");
} else { } else {
LOG(INFO) << "Entering fastboot"; LOG(INFO) << "Entering fastboot";
fastboot = true; fastboot = true;
@@ -523,7 +521,7 @@ int main(int argc, char** argv) {
default: default:
ui->Print("Rebooting...\n"); ui->Print("Rebooting...\n");
reboot("reboot,"); Reboot("");
break; break;
} }
} }
+1 -1
View File
@@ -375,7 +375,7 @@ void RecoveryUI::ProcessKey(int key_code, int updown) {
case RecoveryUI::REBOOT: case RecoveryUI::REBOOT:
if (reboot_enabled) { if (reboot_enabled) {
reboot("reboot,"); Reboot("");
while (true) { while (true) {
pause(); pause();
} }
+1 -1
View File
@@ -778,7 +778,7 @@ Value* RebootNowFn(const char* name, State* state, const std::vector<std::unique
return StringValue(""); return StringValue("");
} }
reboot("reboot," + property); Reboot(property);
sleep(5); sleep(5);
return ErrorAbort(state, kRebootFailure, "%s() failed to reboot", name); return ErrorAbort(state, kRebootFailure, "%s() failed to reboot", name);