7b0f41c393
If -p flag specified, return immediately so that scripting code can progress. Shutdown is unique in that if it does happen, the device will never come back, but if it fails one can continue diagnosis (without the need for a script to send a SIGINT to break out of the indefinite pause on the reboot -p command). Yes, this will break adb shell reboot -p ; adb wait-for-device as noted in the comment, but no one should ever expect the device to come back if a shutdown is requested. We do not break adb reboot ; adb wait-for-device sequence though as we retain the pause forever. Test: manual Bug: 63736262 Bug: 38446744 Bug: 66912053 Change-Id: I028cd873a7193a78c6b3c342eca1e08b6b296fd2
83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
/*
|
|
* 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/properties.h>
|
|
#include <cutils/android_reboot.h>
|
|
#include <unistd.h>
|
|
|
|
int main(int argc, char* argv[]) {
|
|
int ret;
|
|
size_t prop_len;
|
|
char property_val[PROPERTY_VALUE_MAX];
|
|
static const char reboot[] = "reboot";
|
|
const char* cmd = reboot;
|
|
char* optarg = "";
|
|
|
|
opterr = 0;
|
|
do {
|
|
int c;
|
|
|
|
c = getopt(argc, argv, "p");
|
|
|
|
if (c == -1) {
|
|
break;
|
|
}
|
|
|
|
switch (c) {
|
|
case 'p':
|
|
cmd = "shutdown";
|
|
break;
|
|
case '?':
|
|
fprintf(stderr, "usage: %s [-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 (argc > optind)
|
|
optarg = argv[optind];
|
|
if (!optarg || !optarg[0]) optarg = "shell";
|
|
|
|
prop_len = snprintf(property_val, sizeof(property_val), "%s,%s", cmd, optarg);
|
|
if (prop_len >= sizeof(property_val)) {
|
|
fprintf(stderr, "%s command too long: %s\n", cmd, optarg);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
ret = property_set(ANDROID_RB_PROPERTY, property_val);
|
|
if (ret < 0) {
|
|
perror(cmd);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
// Don't return early. Give the reboot command time to take effect
|
|
// to avoid messing up scripts which do "adb shell reboot && adb wait-for-device"
|
|
if (cmd == reboot) {
|
|
while (1) {
|
|
pause();
|
|
}
|
|
}
|
|
|
|
fprintf(stderr, "Done\n");
|
|
return 0;
|
|
}
|