reboot.c revision c6d7e200eddd620d8ac55259ab3aa5f8bfa2aadb
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>
20e3aeeb4de34dbb93e832e6554f494122ba633f3bKen Sumrall#include <cutils/android_reboot.h>
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
23c6d7e200eddd620d8ac55259ab3aa5f8bfa2aadbBenoit Gobyint main(int argc, char *argv[])
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int ret;
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int nosync = 0;
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int poweroff = 0;
28e3aeeb4de34dbb93e832e6554f494122ba633f3bKen Sumrall    int flags = 0;
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    opterr = 0;
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    do {
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int c;
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c = getopt(argc, argv, "np");
35c6d7e200eddd620d8ac55259ab3aa5f8bfa2aadbBenoit Goby
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (c == EOF) {
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
39c6d7e200eddd620d8ac55259ab3aa5f8bfa2aadbBenoit Goby
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        switch (c) {
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        case 'n':
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            nosync = 1;
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        case 'p':
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            poweroff = 1;
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        case '?':
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "usage: %s [-n] [-p] [rebootcommand]\n", argv[0]);
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            exit(EXIT_FAILURE);
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } while (1);
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(argc > optind + 1) {
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "%s: too many arguments\n", argv[0]);
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        exit(EXIT_FAILURE);
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
58e3aeeb4de34dbb93e832e6554f494122ba633f3bKen Sumrall    if(nosync)
59e3aeeb4de34dbb93e832e6554f494122ba633f3bKen Sumrall        /* also set NO_REMOUNT_RO as remount ro includes an implicit sync */
60e3aeeb4de34dbb93e832e6554f494122ba633f3bKen Sumrall        flags = ANDROID_RB_FLAG_NO_SYNC | ANDROID_RB_FLAG_NO_REMOUNT_RO;
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(poweroff)
63e3aeeb4de34dbb93e832e6554f494122ba633f3bKen Sumrall        ret = android_reboot(ANDROID_RB_POWEROFF, flags, 0);
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else if(argc > optind)
65e3aeeb4de34dbb93e832e6554f494122ba633f3bKen Sumrall        ret = android_reboot(ANDROID_RB_RESTART2, flags, argv[optind]);
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else
67e3aeeb4de34dbb93e832e6554f494122ba633f3bKen Sumrall        ret = android_reboot(ANDROID_RB_RESTART, flags, 0);
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(ret < 0) {
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        perror("reboot");
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        exit(EXIT_FAILURE);
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fprintf(stderr, "reboot returned\n");
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
75