blob: 374907d28fe1b21997313dc88d012916602a85d8 [file] [log] [blame]
Jiangyi4983f4b2013-11-03 05:37:40 -05001/*
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
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020017#include <errno.h>
18#include <stdio.h>
19#include <stdlib.h>
Jiangyi4983f4b2013-11-03 05:37:40 -050020#include <cutils/properties.h>
Tanguy Pruvot8a6c2c22012-04-28 00:24:09 +020021#include <cutils/android_reboot.h>
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020022#include <unistd.h>
23
24int reboot_main(int argc, char *argv[])
25{
26 int ret;
Jiangyi4983f4b2013-11-03 05:37:40 -050027 size_t prop_len;
28 char property_val[PROPERTY_VALUE_MAX];
29 const char *cmd = "reboot";
30 char *optarg = "";
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020031
32 opterr = 0;
33 do {
34 int c;
35
Jiangyi4983f4b2013-11-03 05:37:40 -050036 c = getopt(argc, argv, "p");
37
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020038 if (c == EOF) {
39 break;
40 }
Jiangyi4983f4b2013-11-03 05:37:40 -050041
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020042 switch (c) {
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020043 case 'p':
Jiangyi4983f4b2013-11-03 05:37:40 -050044 cmd = "shutdown";
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020045 break;
46 case '?':
Jiangyi4983f4b2013-11-03 05:37:40 -050047 fprintf(stderr, "usage: %s [-p] [rebootcommand]\n", argv[0]);
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020048 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
Jiangyi4983f4b2013-11-03 05:37:40 -050057 if (argc > optind)
58 optarg = argv[optind];
59
60 prop_len = snprintf(property_val, sizeof(property_val), "%s,%s", cmd, optarg);
61 if (prop_len >= sizeof(property_val)) {
62 fprintf(stderr, "reboot command too long: %s\n", optarg);
63 exit(EXIT_FAILURE);
64 }
65
66 ret = property_set(ANDROID_RB_PROPERTY, property_val);
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020067 if(ret < 0) {
68 perror("reboot");
69 exit(EXIT_FAILURE);
70 }
Jiangyi4983f4b2013-11-03 05:37:40 -050071 fprintf(stderr, "Done\n");
Tanguy Pruvot8aeb3712011-06-30 08:59:26 +020072 return 0;
73}