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