summaryrefslogtreecommitdiffstats
path: root/reboot/reboot.c
diff options
context:
space:
mode:
authorBenoit Goby <benoit@android.com>2013-03-22 16:23:48 -0700
committerBenoit Goby <benoit@android.com>2013-03-26 12:24:10 -0700
commitc6d7e200eddd620d8ac55259ab3aa5f8bfa2aadb (patch)
tree3e2e332d9ed70377e13c91e2990c4a914d4f5f8b /reboot/reboot.c
parent82075a4044efe57ad9bad3d18982e311b4ef53ae (diff)
downloadsystem_core-c6d7e200eddd620d8ac55259ab3aa5f8bfa2aadb.zip
system_core-c6d7e200eddd620d8ac55259ab3aa5f8bfa2aadb.tar.gz
system_core-c6d7e200eddd620d8ac55259ab3aa5f8bfa2aadb.tar.bz2
toolbox: Make reboot a separate command from toolbox
Set the CAP_SYS_BOOT filesystem capability on the new reboot command and keep CAP_SYS_BOOT in adb bounding set so that the shell user can run it. Change-Id: I1dd6143445ee2a952254f0452ab6e544318431dd
Diffstat (limited to 'reboot/reboot.c')
-rw-r--r--reboot/reboot.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/reboot/reboot.c b/reboot/reboot.c
new file mode 100644
index 0000000..45d8a8e
--- /dev/null
+++ b/reboot/reboot.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.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;
+
+ opterr = 0;
+ do {
+ int c;
+
+ c = getopt(argc, argv, "np");
+
+ if (c == EOF) {
+ break;
+ }
+
+ switch (c) {
+ case 'n':
+ nosync = 1;
+ break;
+ case 'p':
+ poweroff = 1;
+ break;
+ case '?':
+ fprintf(stderr, "usage: %s [-n] [-p] [rebootcommand]\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ } while (1);
+
+ if(argc > optind + 1) {
+ fprintf(stderr, "%s: too many arguments\n", argv[0]);
+ 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(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);
+ if(ret < 0) {
+ perror("reboot");
+ exit(EXIT_FAILURE);
+ }
+ fprintf(stderr, "reboot returned\n");
+ return 0;
+}