diff options
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; } |