Merge "Consolidate the codes that handle reboot/shutdown."
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user