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