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