1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _INIT_SUBCONTEXT_H 18 #define _INIT_SUBCONTEXT_H 19 20 #include <signal.h> 21 22 #include <string> 23 #include <vector> 24 25 #include <android-base/unique_fd.h> 26 27 #include "builtins.h" 28 #include "result.h" 29 #include "system/core/init/subcontext.pb.h" 30 31 namespace android { 32 namespace init { 33 34 extern const std::string kInitContext; 35 extern const std::string kVendorContext; 36 extern const char* const paths_and_secontexts[2][2]; 37 38 class Subcontext { 39 public: Subcontext(std::string path_prefix,std::string context)40 Subcontext(std::string path_prefix, std::string context) 41 : path_prefix_(std::move(path_prefix)), context_(std::move(context)), pid_(0) { 42 Fork(); 43 } 44 45 Result<Success> Execute(const std::vector<std::string>& args); 46 Result<std::vector<std::string>> ExpandArgs(const std::vector<std::string>& args); 47 void Restart(); 48 path_prefix()49 const std::string& path_prefix() const { return path_prefix_; } context()50 const std::string& context() const { return context_; } pid()51 pid_t pid() const { return pid_; } 52 53 private: 54 void Fork(); 55 Result<SubcontextReply> TransmitMessage(const SubcontextCommand& subcontext_command); 56 57 std::string path_prefix_; 58 std::string context_; 59 pid_t pid_; 60 android::base::unique_fd socket_; 61 }; 62 63 int SubcontextMain(int argc, char** argv, const KeywordFunctionMap* function_map); 64 std::vector<Subcontext>* InitializeSubcontexts(); 65 bool SubcontextChildReap(pid_t pid); 66 void SubcontextTerminate(); 67 68 } // namespace init 69 } // namespace android 70 71 #endif 72