• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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_SERVICE_H
18 #define _INIT_SERVICE_H
19 
20 #include <sys/types.h>
21 
22 #include <cutils/iosched_policy.h>
23 
24 #include <memory>
25 #include <string>
26 #include <vector>
27 
28 #include "action.h"
29 #include "init_parser.h"
30 #include "keyword_map.h"
31 
32 #define SVC_DISABLED       0x001  // do not autostart with class
33 #define SVC_ONESHOT        0x002  // do not restart on exit
34 #define SVC_RUNNING        0x004  // currently active
35 #define SVC_RESTARTING     0x008  // waiting to restart
36 #define SVC_CONSOLE        0x010  // requires console
37 #define SVC_CRITICAL       0x020  // will reboot into recovery if keeps crashing
38 #define SVC_RESET          0x040  // Use when stopping a process,
39                                   // but not disabling so it can be restarted with its class.
40 #define SVC_RC_DISABLED    0x080  // Remember if the disabled flag was set in the rc script.
41 #define SVC_RESTART        0x100  // Use to safely restart (stop, wait, start) a service.
42 #define SVC_DISABLED_START 0x200  // A start was requested but it was disabled at the time.
43 #define SVC_EXEC           0x400  // This synthetic service corresponds to an 'exec'.
44 
45 #define NR_SVC_SUPP_GIDS 12    // twelve supplementary groups
46 
47 class Action;
48 class ServiceManager;
49 
50 struct SocketInfo {
51     SocketInfo();
52     SocketInfo(const std::string& name, const std::string& type, uid_t uid,
53                        gid_t gid, int perm, const std::string& socketcon);
54     std::string name;
55     std::string type;
56     uid_t uid;
57     gid_t gid;
58     int perm;
59     std::string socketcon;
60 };
61 
62 struct ServiceEnvironmentInfo {
63     ServiceEnvironmentInfo();
64     ServiceEnvironmentInfo(const std::string& name, const std::string& value);
65     std::string name;
66     std::string value;
67 };
68 
69 class Service {
70 public:
71     Service(const std::string& name, const std::string& classname,
72             const std::vector<std::string>& args);
73 
74     Service(const std::string& name, const std::string& classname,
75             unsigned flags, uid_t uid, gid_t gid, const std::vector<gid_t>& supp_gids,
76             const std::string& seclabel,  const std::vector<std::string>& args);
77 
78     bool HandleLine(const std::vector<std::string>& args, std::string* err);
79     bool Start();
80     bool StartIfNotDisabled();
81     bool Enable();
82     void Reset();
83     void Stop();
84     void Terminate();
85     void Restart();
86     void RestartIfNeeded(time_t& process_needs_restart);
87     bool Reap();
88     void DumpState() const;
89 
name()90     const std::string& name() const { return name_; }
classname()91     const std::string& classname() const { return classname_; }
flags()92     unsigned flags() const { return flags_; }
pid()93     pid_t pid() const { return pid_; }
uid()94     uid_t uid() const { return uid_; }
gid()95     gid_t gid() const { return gid_; }
supp_gids()96     const std::vector<gid_t>& supp_gids() const { return supp_gids_; }
seclabel()97     const std::string& seclabel() const { return seclabel_; }
keycodes()98     const std::vector<int>& keycodes() const { return keycodes_; }
keychord_id()99     int keychord_id() const { return keychord_id_; }
set_keychord_id(int keychord_id)100     void set_keychord_id(int keychord_id) { keychord_id_ = keychord_id; }
args()101     const std::vector<std::string>& args() const { return args_; }
102 
103 private:
104     using OptionHandler = bool (Service::*) (const std::vector<std::string>& args,
105                                              std::string* err);
106     class OptionHandlerMap;
107 
108     void NotifyStateChange(const std::string& new_state) const;
109     void StopOrReset(int how);
110     void ZapStdio() const;
111     void OpenConsole() const;
112     void PublishSocket(const std::string& name, int fd) const;
113 
114     bool HandleClass(const std::vector<std::string>& args, std::string* err);
115     bool HandleConsole(const std::vector<std::string>& args, std::string* err);
116     bool HandleCritical(const std::vector<std::string>& args, std::string* err);
117     bool HandleDisabled(const std::vector<std::string>& args, std::string* err);
118     bool HandleGroup(const std::vector<std::string>& args, std::string* err);
119     bool HandleIoprio(const std::vector<std::string>& args, std::string* err);
120     bool HandleKeycodes(const std::vector<std::string>& args, std::string* err);
121     bool HandleOneshot(const std::vector<std::string>& args, std::string* err);
122     bool HandleOnrestart(const std::vector<std::string>& args, std::string* err);
123     bool HandleSeclabel(const std::vector<std::string>& args, std::string* err);
124     bool HandleSetenv(const std::vector<std::string>& args, std::string* err);
125     bool HandleSocket(const std::vector<std::string>& args, std::string* err);
126     bool HandleUser(const std::vector<std::string>& args, std::string* err);
127     bool HandleWritepid(const std::vector<std::string>& args, std::string* err);
128 
129     std::string name_;
130     std::string classname_;
131 
132     unsigned flags_;
133     pid_t pid_;
134     time_t time_started_;    // time of last start
135     time_t time_crashed_;    // first crash within inspection window
136     int nr_crashed_;         // number of times crashed within window
137 
138     uid_t uid_;
139     gid_t gid_;
140     std::vector<gid_t> supp_gids_;
141 
142     std::string seclabel_;
143 
144     std::vector<SocketInfo> sockets_;
145     std::vector<ServiceEnvironmentInfo> envvars_;
146 
147     Action onrestart_;  // Commands to execute on restart.
148 
149     std::vector<std::string> writepid_files_;
150 
151     // keycodes for triggering this service via /dev/keychord
152     std::vector<int> keycodes_;
153     int keychord_id_;
154 
155     IoSchedClass ioprio_class_;
156     int ioprio_pri_;
157 
158     std::vector<std::string> args_;
159 };
160 
161 class ServiceManager {
162 public:
163     static ServiceManager& GetInstance();
164 
165     void AddService(std::unique_ptr<Service> service);
166     Service* MakeExecOneshotService(const std::vector<std::string>& args);
167     Service* FindServiceByName(const std::string& name) const;
168     Service* FindServiceByPid(pid_t pid) const;
169     Service* FindServiceByKeychord(int keychord_id) const;
170     void ForEachService(std::function<void(Service*)> callback) const;
171     void ForEachServiceInClass(const std::string& classname,
172                                void (*func)(Service* svc)) const;
173     void ForEachServiceWithFlags(unsigned matchflags,
174                              void (*func)(Service* svc)) const;
175     void ReapAnyOutstandingChildren();
176     void RemoveService(const Service& svc);
177     void DumpState() const;
178 
179 private:
180     ServiceManager();
181 
182     // Cleans up a child process that exited.
183     // Returns true iff a children was cleaned up.
184     bool ReapOneProcess();
185 
186     static int exec_count_; // Every service needs a unique name.
187     std::vector<std::unique_ptr<Service>> services_;
188 };
189 
190 class ServiceParser : public SectionParser {
191 public:
ServiceParser()192     ServiceParser() : service_(nullptr) {
193     }
194     bool ParseSection(const std::vector<std::string>& args,
195                       std::string* err) override;
196     bool ParseLineSection(const std::vector<std::string>& args,
197                           const std::string& filename, int line,
198                           std::string* err) const override;
199     void EndSection() override;
EndFile(const std::string &)200     void EndFile(const std::string&) override {
201     }
202 private:
203     bool IsValidName(const std::string& name) const;
204 
205     std::unique_ptr<Service> service_;
206 };
207 
208 #endif
209