|  | /* | 
|  | * 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; | 
|  | } |