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 int ret;
26 size_t prop_len;
27 char property_val[PROPERTY_VALUE_MAX];
28 static const char reboot[] = "reboot";
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 if (!optarg || !optarg[0]) optarg = "shell";
60
61 prop_len = snprintf(property_val, sizeof(property_val), "%s,%s", cmd, optarg);
62 if (prop_len >= sizeof(property_val)) {
63 fprintf(stderr, "%s command too long: %s\n", cmd, optarg);
64 exit(EXIT_FAILURE);
65 }
66
67 ret = property_set(ANDROID_RB_PROPERTY, property_val);
68 if (ret < 0) {
69 perror(cmd);
70 exit(EXIT_FAILURE);
71 }
72
73 // Don't return early. Give the reboot command time to take effect
74 // to avoid messing up scripts which do "adb shell reboot && adb wait-for-device"
75 if (cmd == reboot) {
76 while (1) {
77 pause();
78 }
79 }
80
81 fprintf(stderr, "Done\n");
82 return 0;
83 }
84