1bac3299720623f4226bca103b26260052732ad30Tom Cherry/* 2bac3299720623f4226bca103b26260052732ad30Tom Cherry * Copyright (C) 2015 The Android Open Source Project 3bac3299720623f4226bca103b26260052732ad30Tom Cherry * 4bac3299720623f4226bca103b26260052732ad30Tom Cherry * Licensed under the Apache License, Version 2.0 (the "License"); 5bac3299720623f4226bca103b26260052732ad30Tom Cherry * you may not use this file except in compliance with the License. 6bac3299720623f4226bca103b26260052732ad30Tom Cherry * You may obtain a copy of the License at 7bac3299720623f4226bca103b26260052732ad30Tom Cherry * 8bac3299720623f4226bca103b26260052732ad30Tom Cherry * http://www.apache.org/licenses/LICENSE-2.0 9bac3299720623f4226bca103b26260052732ad30Tom Cherry * 10bac3299720623f4226bca103b26260052732ad30Tom Cherry * Unless required by applicable law or agreed to in writing, software 11bac3299720623f4226bca103b26260052732ad30Tom Cherry * distributed under the License is distributed on an "AS IS" BASIS, 12bac3299720623f4226bca103b26260052732ad30Tom Cherry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bac3299720623f4226bca103b26260052732ad30Tom Cherry * See the License for the specific language governing permissions and 14bac3299720623f4226bca103b26260052732ad30Tom Cherry * limitations under the License. 15bac3299720623f4226bca103b26260052732ad30Tom Cherry */ 16bac3299720623f4226bca103b26260052732ad30Tom Cherry 17bac3299720623f4226bca103b26260052732ad30Tom Cherry#ifndef _INIT_SERVICE_H 18bac3299720623f4226bca103b26260052732ad30Tom Cherry#define _INIT_SERVICE_H 19bac3299720623f4226bca103b26260052732ad30Tom Cherry 20dc97e3e091b404b23e7fe919b30e523565f3b1cePaul Crowley#include <signal.h> 217ac013de7edc7ec6570ff6a5b6bd3bdce68b769cTom Cherry#include <sys/resource.h> 22bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <sys/types.h> 23bac3299720623f4226bca103b26260052732ad30Tom Cherry 24bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <memory> 25641ff0a4d8d05349d9c22f726a035a2936a2a94dWei Wang#include <set> 26bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <string> 27bac3299720623f4226bca103b26260052732ad30Tom Cherry#include <vector> 28bac3299720623f4226bca103b26260052732ad30Tom Cherry 29e78ea77f6992013b16fd57c07548b53129cdd12fJames Hawkins#include <android-base/chrono_utils.h> 303f5eaae526413a29de899270714469c76dc91ec8Tom Cherry#include <cutils/iosched_policy.h> 31e78ea77f6992013b16fd57c07548b53129cdd12fJames Hawkins 32bac3299720623f4226bca103b26260052732ad30Tom Cherry#include "action.h" 3324b29132a017f7fbfd009c3e6aec499d1b815dbfJorge Lucangeli Obes#include "capabilities.h" 3462767fe29f8aaf62470781a3cf419ba11187d178Mark Salyzyn#include "descriptors.h" 35b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry#include "keyword_map.h" 3667dee626e0185096bbaf73042f1a891ce436f714Tom Cherry#include "parser.h" 37cb0f9bbc855097e0c8248643015b837255fd569aTom Cherry#include "subcontext.h" 38bac3299720623f4226bca103b26260052732ad30Tom Cherry 398d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_DISABLED 0x001 // do not autostart with class 408d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_ONESHOT 0x002 // do not restart on exit 418d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_RUNNING 0x004 // currently active 428d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_RESTARTING 0x008 // waiting to restart 438d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_CONSOLE 0x010 // requires console 448d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_CRITICAL 0x020 // will reboot into recovery if keeps crashing 458d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_RESET 0x040 // Use when stopping a process, 46bac3299720623f4226bca103b26260052732ad30Tom Cherry // but not disabling so it can be restarted with its class. 478d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_RC_DISABLED 0x080 // Remember if the disabled flag was set in the rc script. 488d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_RESTART 0x100 // Use to safely restart (stop, wait, start) a service. 49bac3299720623f4226bca103b26260052732ad30Tom Cherry#define SVC_DISABLED_START 0x200 // A start was requested but it was disabled at the time. 50b27004aa05039b5196f1e878169dca41b68aadd6Tom Cherry#define SVC_EXEC 0x400 // This service was started by either 'exec' or 'exec_start' and stops 51b27004aa05039b5196f1e878169dca41b68aadd6Tom Cherry // init from processing more commands until it completes 528d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park 538d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park#define SVC_SHUTDOWN_CRITICAL 0x800 // This service is critical for shutdown and 548d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park // should not be killed during shutdown 55b27004aa05039b5196f1e878169dca41b68aadd6Tom Cherry#define SVC_TEMPORARY 0x1000 // This service was started by 'exec' and should be removed from the 56b27004aa05039b5196f1e878169dca41b68aadd6Tom Cherry // service list once it is reaped. 57bac3299720623f4226bca103b26260052732ad30Tom Cherry 58bac3299720623f4226bca103b26260052732ad30Tom Cherry#define NR_SVC_SUPP_GIDS 12 // twelve supplementary groups 59bac3299720623f4226bca103b26260052732ad30Tom Cherry 6081f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherrynamespace android { 6181f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherrynamespace init { 62bac3299720623f4226bca103b26260052732ad30Tom Cherry 63bac3299720623f4226bca103b26260052732ad30Tom Cherryclass Service { 64641ff0a4d8d05349d9c22f726a035a2936a2a94dWei Wang public: 65cb0f9bbc855097e0c8248643015b837255fd569aTom Cherry Service(const std::string& name, Subcontext* subcontext_for_restart_commands, 66cb0f9bbc855097e0c8248643015b837255fd569aTom Cherry const std::vector<std::string>& args); 67bac3299720623f4226bca103b26260052732ad30Tom Cherry 68641ff0a4d8d05349d9c22f726a035a2936a2a94dWei Wang Service(const std::string& name, unsigned flags, uid_t uid, gid_t gid, 6924b29132a017f7fbfd009c3e6aec499d1b815dbfJorge Lucangeli Obes const std::vector<gid_t>& supp_gids, const CapSet& capabilities, 7024b29132a017f7fbfd009c3e6aec499d1b815dbfJorge Lucangeli Obes unsigned namespace_flags, const std::string& seclabel, 71cb0f9bbc855097e0c8248643015b837255fd569aTom Cherry Subcontext* subcontext_for_restart_commands, const std::vector<std::string>& args); 72bac3299720623f4226bca103b26260052732ad30Tom Cherry 733b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry static std::unique_ptr<Service> MakeTemporaryOneshotService(const std::vector<std::string>& args); 743b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry 758d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park bool IsRunning() { return (flags_ & SVC_RUNNING) != 0; } 7689bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseLine(const std::vector<std::string>& args); 7776af7e6a0c4ce7759e6cc5994b5496ddb09035eeTom Cherry Result<Success> ExecStart(); 7876af7e6a0c4ce7759e6cc5994b5496ddb09035eeTom Cherry Result<Success> Start(); 7976af7e6a0c4ce7759e6cc5994b5496ddb09035eeTom Cherry Result<Success> StartIfNotDisabled(); 8076af7e6a0c4ce7759e6cc5994b5496ddb09035eeTom Cherry Result<Success> Enable(); 81bac3299720623f4226bca103b26260052732ad30Tom Cherry void Reset(); 82bac3299720623f4226bca103b26260052732ad30Tom Cherry void Stop(); 83b7e03e82b89a30b09fea88eaf2a5638df1017cf6Bertrand SIMONNET void Terminate(); 84bac3299720623f4226bca103b26260052732ad30Tom Cherry void Restart(); 85dc97e3e091b404b23e7fe919b30e523565f3b1cePaul Crowley void Reap(const siginfo_t& siginfo); 86bac3299720623f4226bca103b26260052732ad30Tom Cherry void DumpState() const; 878d01f63f50fb001f41835a0dab636981f2ba76ddKeun-young Park void SetShutdownCritical() { flags_ |= SVC_SHUTDOWN_CRITICAL; } 88641ff0a4d8d05349d9c22f726a035a2936a2a94dWei Wang bool IsShutdownCritical() const { return (flags_ & SVC_SHUTDOWN_CRITICAL) != 0; } 893b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry void UnSetExec() { 903b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry is_exec_service_running_ = false; 913b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry flags_ &= ~SVC_EXEC; 923b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry } 93dc97e3e091b404b23e7fe919b30e523565f3b1cePaul Crowley void AddReapCallback(std::function<void(const siginfo_t& siginfo)> callback) { 94dc97e3e091b404b23e7fe919b30e523565f3b1cePaul Crowley reap_callbacks_.emplace_back(std::move(callback)); 95dc97e3e091b404b23e7fe919b30e523565f3b1cePaul Crowley } 963b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry 973b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry static bool is_exec_service_running() { return is_exec_service_running_; } 98bac3299720623f4226bca103b26260052732ad30Tom Cherry 99bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::string& name() const { return name_; } 100641ff0a4d8d05349d9c22f726a035a2936a2a94dWei Wang const std::set<std::string>& classnames() const { return classnames_; } 101bac3299720623f4226bca103b26260052732ad30Tom Cherry unsigned flags() const { return flags_; } 102bac3299720623f4226bca103b26260052732ad30Tom Cherry pid_t pid() const { return pid_; } 103d269e3a795fbb0ecb7b2c6dff720f9b356365a22Tom Cherry android::base::boot_clock::time_point time_started() const { return time_started_; } 1047da548578c25683fe0082283303e16961df312daTom Cherry int crash_count() const { return crash_count_; } 105bac3299720623f4226bca103b26260052732ad30Tom Cherry uid_t uid() const { return uid_; } 106bac3299720623f4226bca103b26260052732ad30Tom Cherry gid_t gid() const { return gid_; } 1077da548578c25683fe0082283303e16961df312daTom Cherry unsigned namespace_flags() const { return namespace_flags_; } 108bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::vector<gid_t>& supp_gids() const { return supp_gids_; } 109bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::string& seclabel() const { return seclabel_; } 110bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::vector<int>& keycodes() const { return keycodes_; } 111bac3299720623f4226bca103b26260052732ad30Tom Cherry int keychord_id() const { return keychord_id_; } 112bac3299720623f4226bca103b26260052732ad30Tom Cherry void set_keychord_id(int keychord_id) { keychord_id_ = keychord_id; } 1137da548578c25683fe0082283303e16961df312daTom Cherry IoSchedClass ioprio_class() const { return ioprio_class_; } 1147da548578c25683fe0082283303e16961df312daTom Cherry int ioprio_pri() const { return ioprio_pri_; } 115e055d73396ecfba1dafd41fd2ec0cb3353c81e6aSteven Moreland const std::set<std::string>& interfaces() const { return interfaces_; } 1167da548578c25683fe0082283303e16961df312daTom Cherry int priority() const { return priority_; } 1177da548578c25683fe0082283303e16961df312daTom Cherry int oom_score_adjust() const { return oom_score_adjust_; } 1186f5333a4a94becb7ef74a5b54d0c28a3738881fdSteven Moreland bool is_override() const { return override_; } 11933838b1156cd1a5f8eec94756bee9e030a3dd2ebTom Cherry bool process_cgroup_empty() const { return process_cgroup_empty_; } 1205938379e910c4cbd7ed2429901bb3c45e62405d4Tom Cherry unsigned long start_order() const { return start_order_; } 121bac3299720623f4226bca103b26260052732ad30Tom Cherry const std::vector<std::string>& args() const { return args_; } 122bac3299720623f4226bca103b26260052732ad30Tom Cherry 123641ff0a4d8d05349d9c22f726a035a2936a2a94dWei Wang private: 12489bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry using OptionParser = Result<Success> (Service::*)(const std::vector<std::string>& args); 125177b27d4f5bfa498cc46aad24d9375d65630bea0Jorge Lucangeli Obes class OptionParserMap; 126b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 1272fa7451e9b530f814f93ca2248fa425b1f5362cdTom Cherry Result<Success> SetUpMountNamespace() const; 1282fa7451e9b530f814f93ca2248fa425b1f5362cdTom Cherry Result<Success> SetUpPidNamespace() const; 1292fa7451e9b530f814f93ca2248fa425b1f5362cdTom Cherry Result<Success> EnterNamespaces() const; 130bac3299720623f4226bca103b26260052732ad30Tom Cherry void NotifyStateChange(const std::string& new_state) const; 131bac3299720623f4226bca103b26260052732ad30Tom Cherry void StopOrReset(int how); 132bac3299720623f4226bca103b26260052732ad30Tom Cherry void ZapStdio() const; 133bac3299720623f4226bca103b26260052732ad30Tom Cherry void OpenConsole() const; 134ad8e94e017173471e90c704eb7d8de5a14712aa7Elliott Hughes void KillProcessGroup(int signal); 135344d01f99f6049565e4342b4c4202bd9ab96340bJorge Lucangeli Obes void SetProcessAttributes(); 136bac3299720623f4226bca103b26260052732ad30Tom Cherry 13789bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseCapabilities(const std::vector<std::string>& args); 13889bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseClass(const std::vector<std::string>& args); 13989bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseConsole(const std::vector<std::string>& args); 14089bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseCritical(const std::vector<std::string>& args); 14189bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseDisabled(const std::vector<std::string>& args); 1422fa7451e9b530f814f93ca2248fa425b1f5362cdTom Cherry Result<Success> ParseEnterNamespace(const std::vector<std::string>& args); 14389bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseGroup(const std::vector<std::string>& args); 14489bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParsePriority(const std::vector<std::string>& args); 145e055d73396ecfba1dafd41fd2ec0cb3353c81e6aSteven Moreland Result<Success> ParseInterface(const std::vector<std::string>& args); 14689bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseIoprio(const std::vector<std::string>& args); 14789bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseKeycodes(const std::vector<std::string>& args); 14889bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseOneshot(const std::vector<std::string>& args); 14989bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseOnrestart(const std::vector<std::string>& args); 15089bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseOomScoreAdjust(const std::vector<std::string>& args); 1516f5333a4a94becb7ef74a5b54d0c28a3738881fdSteven Moreland Result<Success> ParseOverride(const std::vector<std::string>& args); 15289bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseMemcgLimitInBytes(const std::vector<std::string>& args); 15389bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseMemcgSoftLimitInBytes(const std::vector<std::string>& args); 15489bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseMemcgSwappiness(const std::vector<std::string>& args); 15589bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseNamespace(const std::vector<std::string>& args); 1567ac013de7edc7ec6570ff6a5b6bd3bdce68b769cTom Cherry Result<Success> ParseProcessRlimit(const std::vector<std::string>& args); 15789bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseSeclabel(const std::vector<std::string>& args); 15889bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseSetenv(const std::vector<std::string>& args); 15989bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseShutdown(const std::vector<std::string>& args); 16089bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseSocket(const std::vector<std::string>& args); 16189bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseFile(const std::vector<std::string>& args); 16289bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseUser(const std::vector<std::string>& args); 16389bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseWritepid(const std::vector<std::string>& args); 164b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 16562767fe29f8aaf62470781a3cf419ba11187d178Mark Salyzyn template <typename T> 16689bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> AddDescriptor(const std::vector<std::string>& args); 16762767fe29f8aaf62470781a3cf419ba11187d178Mark Salyzyn 1685938379e910c4cbd7ed2429901bb3c45e62405d4Tom Cherry static unsigned long next_start_order_; 1693b81f2d623c6cba45ad07fa91338d346d9b96482Tom Cherry static bool is_exec_service_running_; 1705938379e910c4cbd7ed2429901bb3c45e62405d4Tom Cherry 171bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string name_; 172641ff0a4d8d05349d9c22f726a035a2936a2a94dWei Wang std::set<std::string> classnames_; 17370daa67062c016eea1a30be2e1de0dcba1d23a13Viorel Suman std::string console_; 174bac3299720623f4226bca103b26260052732ad30Tom Cherry 175bac3299720623f4226bca103b26260052732ad30Tom Cherry unsigned flags_; 176bac3299720623f4226bca103b26260052732ad30Tom Cherry pid_t pid_; 177e78ea77f6992013b16fd57c07548b53129cdd12fJames Hawkins android::base::boot_clock::time_point time_started_; // time of last start 178e78ea77f6992013b16fd57c07548b53129cdd12fJames Hawkins android::base::boot_clock::time_point time_crashed_; // first crash within inspection window 1799605a945f7a497c0307b512b9cd762f2d23973caElliott Hughes int crash_count_; // number of times crashed within window 180bac3299720623f4226bca103b26260052732ad30Tom Cherry 181bac3299720623f4226bca103b26260052732ad30Tom Cherry uid_t uid_; 182bac3299720623f4226bca103b26260052732ad30Tom Cherry gid_t gid_; 183bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<gid_t> supp_gids_; 18424b29132a017f7fbfd009c3e6aec499d1b815dbfJorge Lucangeli Obes CapSet capabilities_; 1851b3fa3d6506d04570aab60147b0ec743e38c8796Jorge Lucangeli Obes unsigned namespace_flags_; 1862fa7451e9b530f814f93ca2248fa425b1f5362cdTom Cherry // Pair of namespace type, path to namespace. 1872fa7451e9b530f814f93ca2248fa425b1f5362cdTom Cherry std::vector<std::pair<int, std::string>> namespaces_to_enter_; 188bac3299720623f4226bca103b26260052732ad30Tom Cherry 189bac3299720623f4226bca103b26260052732ad30Tom Cherry std::string seclabel_; 190bac3299720623f4226bca103b26260052732ad30Tom Cherry 19162767fe29f8aaf62470781a3cf419ba11187d178Mark Salyzyn std::vector<std::unique_ptr<DescriptorInfo>> descriptors_; 1926de21f11125941ea1b94fdeec754bacea3916fd5Tom Cherry std::vector<std::pair<std::string, std::string>> environment_vars_; 193bac3299720623f4226bca103b26260052732ad30Tom Cherry 194bac3299720623f4226bca103b26260052732ad30Tom Cherry Action onrestart_; // Commands to execute on restart. 195bac3299720623f4226bca103b26260052732ad30Tom Cherry 196bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<std::string> writepid_files_; 197bac3299720623f4226bca103b26260052732ad30Tom Cherry 198e055d73396ecfba1dafd41fd2ec0cb3353c81e6aSteven Moreland std::set<std::string> interfaces_; // e.g. some.package.foo@1.0::IBaz/instance-name 199e055d73396ecfba1dafd41fd2ec0cb3353c81e6aSteven Moreland 200bac3299720623f4226bca103b26260052732ad30Tom Cherry // keycodes for triggering this service via /dev/keychord 201bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<int> keycodes_; 202bac3299720623f4226bca103b26260052732ad30Tom Cherry int keychord_id_; 203bac3299720623f4226bca103b26260052732ad30Tom Cherry 204bac3299720623f4226bca103b26260052732ad30Tom Cherry IoSchedClass ioprio_class_; 205bac3299720623f4226bca103b26260052732ad30Tom Cherry int ioprio_pri_; 206081705c258efbe938d71c2022528d809fa6d42c5Vitalii Tomkiv int priority_; 207bac3299720623f4226bca103b26260052732ad30Tom Cherry 208310f6704d0dfe9ca4cfb153ce8e4212cc7596190Marco Nelissen int oom_score_adjust_; 209310f6704d0dfe9ca4cfb153ce8e4212cc7596190Marco Nelissen 210d485226951013247dbb502fef7edbc6cf83acb0fRobert Benea int swappiness_; 211d485226951013247dbb502fef7edbc6cf83acb0fRobert Benea int soft_limit_in_bytes_; 212d485226951013247dbb502fef7edbc6cf83acb0fRobert Benea int limit_in_bytes_; 213d485226951013247dbb502fef7edbc6cf83acb0fRobert Benea 21433838b1156cd1a5f8eec94756bee9e030a3dd2ebTom Cherry bool process_cgroup_empty_ = false; 21533838b1156cd1a5f8eec94756bee9e030a3dd2ebTom Cherry 2166f5333a4a94becb7ef74a5b54d0c28a3738881fdSteven Moreland bool override_ = false; 2176f5333a4a94becb7ef74a5b54d0c28a3738881fdSteven Moreland 2185938379e910c4cbd7ed2429901bb3c45e62405d4Tom Cherry unsigned long start_order_; 2195938379e910c4cbd7ed2429901bb3c45e62405d4Tom Cherry 2207ac013de7edc7ec6570ff6a5b6bd3bdce68b769cTom Cherry std::vector<std::pair<int, rlimit>> rlimits_; 2217ac013de7edc7ec6570ff6a5b6bd3bdce68b769cTom Cherry 222bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<std::string> args_; 223dc97e3e091b404b23e7fe919b30e523565f3b1cePaul Crowley 224dc97e3e091b404b23e7fe919b30e523565f3b1cePaul Crowley std::vector<std::function<void(const siginfo_t& siginfo)>> reap_callbacks_; 225bac3299720623f4226bca103b26260052732ad30Tom Cherry}; 226bac3299720623f4226bca103b26260052732ad30Tom Cherry 227911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherryclass ServiceList { 228eeab491efd8f456324f88e444f228b1016712e45Wei Wang public: 229911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry static ServiceList& GetInstance(); 230bac3299720623f4226bca103b26260052732ad30Tom Cherry 2317da548578c25683fe0082283303e16961df312daTom Cherry // Exposed for testing 232911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry ServiceList(); 2337da548578c25683fe0082283303e16961df312daTom Cherry 234b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry void AddService(std::unique_ptr<Service> service); 235bac3299720623f4226bca103b26260052732ad30Tom Cherry void RemoveService(const Service& svc); 236911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry 237911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry template <typename T, typename F = decltype(&Service::name)> 238911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry Service* FindService(T value, F function = &Service::name) const { 239911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry auto svc = std::find_if(services_.begin(), services_.end(), 240911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry [&function, &value](const std::unique_ptr<Service>& s) { 241911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry return std::invoke(function, s) == value; 242911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry }); 243911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry if (svc != services_.end()) { 244911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry return svc->get(); 245911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry } 246911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry return nullptr; 247911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry } 248911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry 249bac3299720623f4226bca103b26260052732ad30Tom Cherry void DumpState() const; 250b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 251911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry auto begin() const { return services_.begin(); } 252911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry auto end() const { return services_.end(); } 253911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry const std::vector<std::unique_ptr<Service>>& services() const { return services_; } 254911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry const std::vector<Service*> services_in_shutdown_order() const; 255911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry 256eeab491efd8f456324f88e444f228b1016712e45Wei Wang private: 257bac3299720623f4226bca103b26260052732ad30Tom Cherry std::vector<std::unique_ptr<Service>> services_; 258bac3299720623f4226bca103b26260052732ad30Tom Cherry}; 259bac3299720623f4226bca103b26260052732ad30Tom Cherry 260b7349902a945903f9e36a569051f5131beb0bc24Tom Cherryclass ServiceParser : public SectionParser { 261012c573e267b8dd70de14237cb470bd7301ee8eaTom Cherry public: 262cb0f9bbc855097e0c8248643015b837255fd569aTom Cherry ServiceParser(ServiceList* service_list, std::vector<Subcontext>* subcontexts) 263cb0f9bbc855097e0c8248643015b837255fd569aTom Cherry : service_list_(service_list), subcontexts_(subcontexts), service_(nullptr) {} 26489bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseSection(std::vector<std::string>&& args, const std::string& filename, 26589bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry int line) override; 26689bcc85edfff4a2b2378f638ab90b2f7e19a8472Tom Cherry Result<Success> ParseLineSection(std::vector<std::string>&& args, int line) override; 2677d0a5c3656ee56eb81e442b58063d500b4f506e0Steven Moreland Result<Success> EndSection() override; 268012c573e267b8dd70de14237cb470bd7301ee8eaTom Cherry 269012c573e267b8dd70de14237cb470bd7301ee8eaTom Cherry private: 270b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry bool IsValidName(const std::string& name) const; 271b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 272911b9b1d6ead5f2e4c4158af0cd8787f4d458ddfTom Cherry ServiceList* service_list_; 273cb0f9bbc855097e0c8248643015b837255fd569aTom Cherry std::vector<Subcontext>* subcontexts_; 274b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry std::unique_ptr<Service> service_; 275b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry}; 276b7349902a945903f9e36a569051f5131beb0bc24Tom Cherry 27781f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherry} // namespace init 27881f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherry} // namespace android 27981f5d3ebef2c3789737bf718fc2a2cdd7b9e8b33Tom Cherry 280bac3299720623f4226bca103b26260052732ad30Tom Cherry#endif 281