subcontext.h revision c49719fc5d2cf3817f6997ce40fc2dac7d411efa
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 "system/core/init/subcontext.pb.h" 29 30namespace android { 31namespace init { 32 33extern const std::string kInitContext; 34extern const std::string kVendorContext; 35 36class Subcontext { 37 public: 38 Subcontext(std::string path_prefix, std::string context) 39 : path_prefix_(std::move(path_prefix)), context_(std::move(context)), pid_(0) { 40 Fork(); 41 } 42 43 Result<Success> Execute(const std::vector<std::string>& args); 44 Result<std::vector<std::string>> ExpandArgs(const std::vector<std::string>& args); 45 void Restart(); 46 47 const std::string& path_prefix() const { return path_prefix_; } 48 const std::string& context() const { return context_; } 49 pid_t pid() const { return pid_; } 50 51 private: 52 void Fork(); 53 Result<SubcontextReply> TransmitMessage(const SubcontextCommand& subcontext_command); 54 55 std::string path_prefix_; 56 std::string context_; 57 pid_t pid_; 58 android::base::unique_fd socket_; 59}; 60 61int SubcontextMain(int argc, char** argv, const KeywordFunctionMap* function_map); 62std::vector<Subcontext>* InitializeSubcontexts(); 63bool SubcontextChildReap(pid_t pid); 64 65} // namespace init 66} // namespace android 67 68#endif 69