xref: /aosp_15_r20/system/core/init/subcontext.h (revision 00c7fec1bb09f3284aad6a6f96d2f63dfc3650ad)
1*00c7fec1SAndroid Build Coastguard Worker /*
2*00c7fec1SAndroid Build Coastguard Worker  * Copyright (C) 2017 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 #pragma once
18*00c7fec1SAndroid Build Coastguard Worker 
19*00c7fec1SAndroid Build Coastguard Worker #include <signal.h>
20*00c7fec1SAndroid Build Coastguard Worker 
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/unique_fd.h>
25*00c7fec1SAndroid Build Coastguard Worker 
26*00c7fec1SAndroid Build Coastguard Worker #include "builtins.h"
27*00c7fec1SAndroid Build Coastguard Worker #include "result.h"
28*00c7fec1SAndroid Build Coastguard Worker #include "system/core/init/subcontext.pb.h"
29*00c7fec1SAndroid Build Coastguard Worker 
30*00c7fec1SAndroid Build Coastguard Worker namespace android {
31*00c7fec1SAndroid Build Coastguard Worker namespace init {
32*00c7fec1SAndroid Build Coastguard Worker 
33*00c7fec1SAndroid Build Coastguard Worker static constexpr const char kInitContext[] = "u:r:init:s0";
34*00c7fec1SAndroid Build Coastguard Worker static constexpr const char kVendorContext[] = "u:r:vendor_init:s0";
35*00c7fec1SAndroid Build Coastguard Worker static constexpr const char kTestContext[] = "test-test-test";
36*00c7fec1SAndroid Build Coastguard Worker 
37*00c7fec1SAndroid Build Coastguard Worker class Subcontext {
38*00c7fec1SAndroid Build Coastguard Worker   public:
39*00c7fec1SAndroid Build Coastguard Worker     Subcontext(std::vector<std::string> path_prefixes, std::vector<std::string> partitions,
40*00c7fec1SAndroid Build Coastguard Worker                std::string_view context, bool host = false)
path_prefixes_(std::move (path_prefixes))41*00c7fec1SAndroid Build Coastguard Worker         : path_prefixes_(std::move(path_prefixes)),
42*00c7fec1SAndroid Build Coastguard Worker           partitions_(std::move(partitions)),
43*00c7fec1SAndroid Build Coastguard Worker           context_(context.begin(), context.end()),
44*00c7fec1SAndroid Build Coastguard Worker           pid_(0) {
45*00c7fec1SAndroid Build Coastguard Worker         if (!host) {
46*00c7fec1SAndroid Build Coastguard Worker             Fork();
47*00c7fec1SAndroid Build Coastguard Worker         }
48*00c7fec1SAndroid Build Coastguard Worker     }
49*00c7fec1SAndroid Build Coastguard Worker 
50*00c7fec1SAndroid Build Coastguard Worker     Result<void> Execute(const std::vector<std::string>& args);
51*00c7fec1SAndroid Build Coastguard Worker     Result<std::vector<std::string>> ExpandArgs(const std::vector<std::string>& args);
52*00c7fec1SAndroid Build Coastguard Worker     void Restart();
53*00c7fec1SAndroid Build Coastguard Worker     bool PathMatchesSubcontext(const std::string& path) const;
54*00c7fec1SAndroid Build Coastguard Worker     bool PartitionMatchesSubcontext(const std::string& partition) const;
55*00c7fec1SAndroid Build Coastguard Worker     void SetApexList(std::vector<std::string>&& apex_list);
56*00c7fec1SAndroid Build Coastguard Worker 
context()57*00c7fec1SAndroid Build Coastguard Worker     const std::string& context() const { return context_; }
pid()58*00c7fec1SAndroid Build Coastguard Worker     pid_t pid() const { return pid_; }
59*00c7fec1SAndroid Build Coastguard Worker 
60*00c7fec1SAndroid Build Coastguard Worker   private:
61*00c7fec1SAndroid Build Coastguard Worker     void Fork();
62*00c7fec1SAndroid Build Coastguard Worker     Result<SubcontextReply> TransmitMessage(const SubcontextCommand& subcontext_command);
63*00c7fec1SAndroid Build Coastguard Worker 
64*00c7fec1SAndroid Build Coastguard Worker     std::vector<std::string> path_prefixes_;
65*00c7fec1SAndroid Build Coastguard Worker     std::vector<std::string> partitions_;
66*00c7fec1SAndroid Build Coastguard Worker     std::vector<std::string> apex_list_;
67*00c7fec1SAndroid Build Coastguard Worker     std::string context_;
68*00c7fec1SAndroid Build Coastguard Worker     pid_t pid_;
69*00c7fec1SAndroid Build Coastguard Worker     android::base::unique_fd socket_;
70*00c7fec1SAndroid Build Coastguard Worker };
71*00c7fec1SAndroid Build Coastguard Worker 
72*00c7fec1SAndroid Build Coastguard Worker int SubcontextMain(int argc, char** argv, const BuiltinFunctionMap* function_map);
73*00c7fec1SAndroid Build Coastguard Worker void InitializeSubcontext();
74*00c7fec1SAndroid Build Coastguard Worker void InitializeHostSubcontext(std::vector<std::string> vendor_prefixes);
75*00c7fec1SAndroid Build Coastguard Worker Subcontext* GetSubcontext();
76*00c7fec1SAndroid Build Coastguard Worker bool SubcontextChildReap(pid_t pid);
77*00c7fec1SAndroid Build Coastguard Worker void SubcontextTerminate();
78*00c7fec1SAndroid Build Coastguard Worker 
79*00c7fec1SAndroid Build Coastguard Worker }  // namespace init
80*00c7fec1SAndroid Build Coastguard Worker }  // namespace android
81