1 /*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <errno.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <cutils/properties.h>
21 #include <cutils/android_reboot.h>
22 #include <unistd.h>
23
main(int argc,char * argv[])24 int main(int argc, char *argv[])
25 {
26 int ret;
27 size_t prop_len;
28 char property_val[PROPERTY_VALUE_MAX];
29 const char *cmd = "reboot";
30 char *optarg = "";
31
32 opterr = 0;
33 do {
34 int c;
35
36 c = getopt(argc, argv, "p");
37
38 if (c == -1) {
39 break;
40 }
41
42 switch (c) {
43 case 'p':
44 cmd = "shutdown";
45 break;
46 case '?':
47 fprintf(stderr, "usage: %s [-p] [rebootcommand]\n", argv[0]);
48 exit(EXIT_FAILURE);
49 }
50 } while (1);
51
52 if(argc > optind + 1) {
53 fprintf(stderr, "%s: too many arguments\n", argv[0]);
54 exit(EXIT_FAILURE);
55 }
56
57 if (argc > optind)
58 optarg = argv[optind];
59
60 prop_len = snprintf(property_val, sizeof(property_val), "%s,%s", cmd, optarg);
61 if (prop_len >= sizeof(property_val)) {
62 fprintf(stderr, "reboot command too long: %s\n", optarg);
63 exit(EXIT_FAILURE);
64 }
65
66 ret = property_set(ANDROID_RB_PROPERTY, property_val);
67 if(ret < 0) {
68 perror("reboot");
69 exit(EXIT_FAILURE);
70 }
71
72 // Don't return early. Give the reboot command time to take effect
73 // to avoid messing up scripts which do "adb shell reboot && adb wait-for-device"
74 while(1) { pause(); }
75
76 fprintf(stderr, "Done\n");
77 return 0;
78 }
79