1*00c7fec1SAndroid Build Coastguard Worker /*
2*00c7fec1SAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*00c7fec1SAndroid Build Coastguard Worker *
4*00c7fec1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*00c7fec1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*00c7fec1SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*00c7fec1SAndroid Build Coastguard Worker *
8*00c7fec1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*00c7fec1SAndroid Build Coastguard Worker *
10*00c7fec1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*00c7fec1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*00c7fec1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*00c7fec1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*00c7fec1SAndroid Build Coastguard Worker * limitations under the License.
15*00c7fec1SAndroid Build Coastguard Worker */
16*00c7fec1SAndroid Build Coastguard Worker
17*00c7fec1SAndroid Build Coastguard Worker #include <stdlib.h>
18*00c7fec1SAndroid Build Coastguard Worker #include <unistd.h>
19*00c7fec1SAndroid Build Coastguard Worker
20*00c7fec1SAndroid Build Coastguard Worker #include <iostream>
21*00c7fec1SAndroid Build Coastguard Worker #include <string>
22*00c7fec1SAndroid Build Coastguard Worker #include <vector>
23*00c7fec1SAndroid Build Coastguard Worker
24*00c7fec1SAndroid Build Coastguard Worker #include <android-base/properties.h>
25*00c7fec1SAndroid Build Coastguard Worker
26*00c7fec1SAndroid Build Coastguard Worker using android::base::GetProperty;
27*00c7fec1SAndroid Build Coastguard Worker using android::base::SetProperty;
28*00c7fec1SAndroid Build Coastguard Worker using namespace std::literals;
29*00c7fec1SAndroid Build Coastguard Worker
ControlService(bool start,const std::string & service)30*00c7fec1SAndroid Build Coastguard Worker static void ControlService(bool start, const std::string& service) {
31*00c7fec1SAndroid Build Coastguard Worker if (!android::base::SetProperty(start ? "ctl.start" : "ctl.stop", service)) {
32*00c7fec1SAndroid Build Coastguard Worker std::cerr << "Unable to " << (start ? "start" : "stop") << " service '" << service
33*00c7fec1SAndroid Build Coastguard Worker << "'\nSee dmesg for error reason." << std::endl;
34*00c7fec1SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
35*00c7fec1SAndroid Build Coastguard Worker }
36*00c7fec1SAndroid Build Coastguard Worker }
37*00c7fec1SAndroid Build Coastguard Worker
ControlDefaultServices(bool start)38*00c7fec1SAndroid Build Coastguard Worker static void ControlDefaultServices(bool start) {
39*00c7fec1SAndroid Build Coastguard Worker std::vector<std::string> services = {
40*00c7fec1SAndroid Build Coastguard Worker "netd",
41*00c7fec1SAndroid Build Coastguard Worker "surfaceflinger",
42*00c7fec1SAndroid Build Coastguard Worker "audioserver",
43*00c7fec1SAndroid Build Coastguard Worker "zygote",
44*00c7fec1SAndroid Build Coastguard Worker };
45*00c7fec1SAndroid Build Coastguard Worker
46*00c7fec1SAndroid Build Coastguard Worker // Only start zygote_secondary if not single arch.
47*00c7fec1SAndroid Build Coastguard Worker std::string zygote_configuration = GetProperty("ro.zygote", "");
48*00c7fec1SAndroid Build Coastguard Worker if (zygote_configuration != "zygote32" && zygote_configuration != "zygote64") {
49*00c7fec1SAndroid Build Coastguard Worker services.emplace_back("zygote_secondary");
50*00c7fec1SAndroid Build Coastguard Worker }
51*00c7fec1SAndroid Build Coastguard Worker
52*00c7fec1SAndroid Build Coastguard Worker if (start) {
53*00c7fec1SAndroid Build Coastguard Worker for (const auto& service : services) {
54*00c7fec1SAndroid Build Coastguard Worker ControlService(true, service);
55*00c7fec1SAndroid Build Coastguard Worker }
56*00c7fec1SAndroid Build Coastguard Worker } else {
57*00c7fec1SAndroid Build Coastguard Worker for (auto it = services.crbegin(); it != services.crend(); ++it) {
58*00c7fec1SAndroid Build Coastguard Worker ControlService(false, *it);
59*00c7fec1SAndroid Build Coastguard Worker }
60*00c7fec1SAndroid Build Coastguard Worker }
61*00c7fec1SAndroid Build Coastguard Worker }
62*00c7fec1SAndroid Build Coastguard Worker
StartStop(int argc,char ** argv,bool start)63*00c7fec1SAndroid Build Coastguard Worker static int StartStop(int argc, char** argv, bool start) {
64*00c7fec1SAndroid Build Coastguard Worker if (getuid()) {
65*00c7fec1SAndroid Build Coastguard Worker std::cerr << "Must be root" << std::endl;
66*00c7fec1SAndroid Build Coastguard Worker return EXIT_FAILURE;
67*00c7fec1SAndroid Build Coastguard Worker }
68*00c7fec1SAndroid Build Coastguard Worker
69*00c7fec1SAndroid Build Coastguard Worker if (argc == 1) {
70*00c7fec1SAndroid Build Coastguard Worker ControlDefaultServices(start);
71*00c7fec1SAndroid Build Coastguard Worker }
72*00c7fec1SAndroid Build Coastguard Worker
73*00c7fec1SAndroid Build Coastguard Worker if (argc == 2 && argv[1] == "--help"s) {
74*00c7fec1SAndroid Build Coastguard Worker std::cout << "usage: " << (start ? "start" : "stop")
75*00c7fec1SAndroid Build Coastguard Worker << " [SERVICE...]\n"
76*00c7fec1SAndroid Build Coastguard Worker "\n"
77*00c7fec1SAndroid Build Coastguard Worker << (start ? "Starts" : "Stops")
78*00c7fec1SAndroid Build Coastguard Worker << " the given system service, or netd/surfaceflinger/zygotes." << std::endl;
79*00c7fec1SAndroid Build Coastguard Worker return EXIT_SUCCESS;
80*00c7fec1SAndroid Build Coastguard Worker }
81*00c7fec1SAndroid Build Coastguard Worker
82*00c7fec1SAndroid Build Coastguard Worker for (int i = 1; i < argc; ++i) {
83*00c7fec1SAndroid Build Coastguard Worker ControlService(start, argv[i]);
84*00c7fec1SAndroid Build Coastguard Worker }
85*00c7fec1SAndroid Build Coastguard Worker return EXIT_SUCCESS;
86*00c7fec1SAndroid Build Coastguard Worker }
87*00c7fec1SAndroid Build Coastguard Worker
start_main(int argc,char ** argv)88*00c7fec1SAndroid Build Coastguard Worker extern "C" int start_main(int argc, char** argv) {
89*00c7fec1SAndroid Build Coastguard Worker return StartStop(argc, argv, true);
90*00c7fec1SAndroid Build Coastguard Worker }
91*00c7fec1SAndroid Build Coastguard Worker
stop_main(int argc,char ** argv)92*00c7fec1SAndroid Build Coastguard Worker extern "C" int stop_main(int argc, char** argv) {
93*00c7fec1SAndroid Build Coastguard Worker return StartStop(argc, argv, false);
94*00c7fec1SAndroid Build Coastguard Worker }
95