xref: /aosp_15_r20/system/core/toolbox/start.cpp (revision 00c7fec1bb09f3284aad6a6f96d2f63dfc3650ad)
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