summaryrefslogtreecommitdiffstats
path: root/reboot
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2013-04-18 12:20:02 -0700
committerNick Kralevich <nnk@google.com>2013-04-23 13:21:40 -0700
commitca8e66a8b0f843812014a28d49208f9f6f64ecbc (patch)
tree677652e5cbeb630b3fe66c1c41aa94160b6a13dd /reboot
parentba4ac0cc3aa69075d6cbcee4eddb314ef753aa8d (diff)
downloadsystem_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')
-rw-r--r--reboot/reboot.c37
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;
}