diff --git a/init/builtins.cpp b/init/builtins.cpp index beeaa1768..90a9c5956 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -609,14 +609,13 @@ int do_powerctl(int nargs, char **args) { const char* command = args[1]; int len = 0; - int cmd = 0; - const char *reboot_target; + unsigned int cmd = 0; + const char *reboot_target = ""; void (*callback_on_ro_remount)(const struct mntent*) = NULL; if (strncmp(command, "shutdown", 8) == 0) { cmd = ANDROID_RB_POWEROFF; len = 8; - callback_on_ro_remount = unmount_and_fsck; } else if (strncmp(command, "reboot", 6) == 0) { cmd = ANDROID_RB_RESTART2; len = 6; @@ -626,10 +625,15 @@ int do_powerctl(int nargs, char **args) } if (command[len] == ',') { - reboot_target = &command[len + 1]; - } else if (command[len] == '\0') { - reboot_target = ""; - } else { + if (cmd == ANDROID_RB_POWEROFF && + !strcmp(&command[len + 1], "userrequested")) { + // The shutdown reason is PowerManager.SHUTDOWN_USER_REQUESTED. + // Run fsck once the file system is remounted in read-only mode. + callback_on_ro_remount = unmount_and_fsck; + } else if (cmd == ANDROID_RB_RESTART2) { + reboot_target = &command[len + 1]; + } + } else if (command[len] != '\0') { ERROR("powerctl: unrecognized reboot target '%s'\n", &command[len]); return -EINVAL; }