diff options
author | Nick Kralevich <nnk@google.com> | 2013-04-18 12:20:02 -0700 |
---|---|---|
committer | Nick Kralevich <nnk@google.com> | 2013-04-23 13:21:40 -0700 |
commit | ca8e66a8b0f843812014a28d49208f9f6f64ecbc (patch) | |
tree | 677652e5cbeb630b3fe66c1c41aa94160b6a13dd /reboot/reboot.c | |
parent | ba4ac0cc3aa69075d6cbcee4eddb314ef753aa8d (diff) | |
download | system_core-ca8e66a8b0f843812014a28d49208f9f6f64ecbc.zip system_core-ca8e66a8b0f843812014a28d49208f9f6f64ecbc.tar.gz system_core-ca8e66a8b0f843812014a28d49208f9f6f64ecbc.tar.bz2 |
Make init handle reboots
Move the responsibility for rebooting the system from the
reboot command to init. Init is in a better position to take
actions to bring the system down cleanly, including making sure
filesystems are mounted read-only.
The only UIDs which can perform an init triggered reboot are
root, system, and shell.
Modify the reboot command so that it calls into init to perform
the reboot. The reboot command no longer requires CAP_SYS_BOOT.
Remove the -n reboot option and code which supports it. Anyone needing
to do an unclean shutdown can just do a 'echo c > /proc/sysrq-trigger'.
Modify adb so that it calls into init to perform a shutdown.
Bug: 8646621
Change-Id: I84c0513acb549720cb0e8c9fcbda0050f5c396f5
Diffstat (limited to 'reboot/reboot.c')
-rw-r--r-- | reboot/reboot.c | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/reboot/reboot.c b/reboot/reboot.c index 45d8a8e..0e5170d 100644 --- a/reboot/reboot.c +++ b/reboot/reboot.c @@ -17,35 +17,34 @@ #include <errno.h> #include <stdio.h> #include <stdlib.h> +#include <cutils/properties.h> #include <cutils/android_reboot.h> #include <unistd.h> int main(int argc, char *argv[]) { int ret; - int nosync = 0; - int poweroff = 0; - int flags = 0; + size_t prop_len; + char property_val[PROPERTY_VALUE_MAX]; + const char *cmd = "reboot"; + char *optarg = ""; opterr = 0; do { int c; - c = getopt(argc, argv, "np"); + c = getopt(argc, argv, "p"); if (c == EOF) { break; } switch (c) { - case 'n': - nosync = 1; - break; case 'p': - poweroff = 1; + cmd = "shutdown"; break; case '?': - fprintf(stderr, "usage: %s [-n] [-p] [rebootcommand]\n", argv[0]); + fprintf(stderr, "usage: %s [-p] [rebootcommand]\n", argv[0]); exit(EXIT_FAILURE); } } while (1); @@ -55,20 +54,20 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - if(nosync) - /* also set NO_REMOUNT_RO as remount ro includes an implicit sync */ - flags = ANDROID_RB_FLAG_NO_SYNC | ANDROID_RB_FLAG_NO_REMOUNT_RO; + if (argc > optind) + optarg = argv[optind]; + + prop_len = snprintf(property_val, sizeof(property_val), "%s,%s", cmd, optarg); + if (prop_len >= sizeof(property_val)) { + fprintf(stderr, "reboot command too long: %s\n", optarg); + exit(EXIT_FAILURE); + } - if(poweroff) - ret = android_reboot(ANDROID_RB_POWEROFF, flags, 0); - else if(argc > optind) - ret = android_reboot(ANDROID_RB_RESTART2, flags, argv[optind]); - else - ret = android_reboot(ANDROID_RB_RESTART, flags, 0); + ret = property_set(ANDROID_RB_PROPERTY, property_val); if(ret < 0) { perror("reboot"); exit(EXIT_FAILURE); } - fprintf(stderr, "reboot returned\n"); + fprintf(stderr, "Done\n"); return 0; } |