blob: fe763a882e39b534cbc0ab69fd9330d7921f97c0 [file] [log] [blame]
Benoit Gobyc6d7e202013-03-22 16:23:48 -07001/*
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
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080017#include <errno.h>
18#include <stdio.h>
19#include <stdlib.h>
Nick Kralevichca8e66a2013-04-18 12:20:02 -070020#include <cutils/properties.h>
Ken Sumralle3aeeb42011-03-07 23:29:42 -080021#include <cutils/android_reboot.h>
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080022#include <unistd.h>
23
Mark Salyzyn7b0f41c2017-09-26 10:19:41 -070024int main(int argc, char* argv[]) {
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080025 int ret;
Nick Kralevichca8e66a2013-04-18 12:20:02 -070026 size_t prop_len;
27 char property_val[PROPERTY_VALUE_MAX];
Mark Salyzyn7b0f41c2017-09-26 10:19:41 -070028 static const char reboot[] = "reboot";
29 const char* cmd = reboot;
30 char* optarg = "";
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080031
32 opterr = 0;
33 do {
34 int c;
35
Nick Kralevichca8e66a2013-04-18 12:20:02 -070036 c = getopt(argc, argv, "p");
Benoit Gobyc6d7e202013-03-22 16:23:48 -070037
David Gumberg1c3cb912014-03-02 09:59:19 -080038 if (c == -1) {
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080039 break;
40 }
Benoit Gobyc6d7e202013-03-22 16:23:48 -070041
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080042 switch (c) {
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080043 case 'p':
Nick Kralevichca8e66a2013-04-18 12:20:02 -070044 cmd = "shutdown";
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080045 break;
46 case '?':
Nick Kralevichca8e66a2013-04-18 12:20:02 -070047 fprintf(stderr, "usage: %s [-p] [rebootcommand]\n", argv[0]);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080048 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
Nick Kralevichca8e66a2013-04-18 12:20:02 -070057 if (argc > optind)
58 optarg = argv[optind];
Mark Salyzyn277eca12017-09-11 15:22:57 -070059 if (!optarg || !optarg[0]) optarg = "shell";
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080060
Nick Kralevichca8e66a2013-04-18 12:20:02 -070061 prop_len = snprintf(property_val, sizeof(property_val), "%s,%s", cmd, optarg);
62 if (prop_len >= sizeof(property_val)) {
Mark Salyzyn7b0f41c2017-09-26 10:19:41 -070063 fprintf(stderr, "%s command too long: %s\n", cmd, optarg);
Nick Kralevichca8e66a2013-04-18 12:20:02 -070064 exit(EXIT_FAILURE);
65 }
66
67 ret = property_set(ANDROID_RB_PROPERTY, property_val);
Mark Salyzyn7b0f41c2017-09-26 10:19:41 -070068 if (ret < 0) {
69 perror(cmd);
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080070 exit(EXIT_FAILURE);
71 }
Nick Kralevich91704522013-10-24 08:53:48 -070072
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"
Mark Salyzyn7b0f41c2017-09-26 10:19:41 -070075 if (cmd == reboot) {
76 while (1) {
77 pause();
78 }
79 }
Nick Kralevich91704522013-10-24 08:53:48 -070080
Nick Kralevichca8e66a2013-04-18 12:20:02 -070081 fprintf(stderr, "Done\n");
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080082 return 0;
83}