1 /*
2  * Copyright (C) 2019 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 #pragma once
18 
19 #include <vector>
20 
21 #include "interface_utils.h"
22 #include "parser.h"
23 #include "service.h"
24 #include "service_list.h"
25 #include "subcontext.h"
26 
27 namespace android {
28 namespace init {
29 
30 class ServiceParser : public SectionParser {
31   public:
32     ServiceParser(
33             ServiceList* service_list, Subcontext* subcontext,
34             const std::optional<InterfaceInheritanceHierarchyMap>& interface_inheritance_hierarchy,
35             bool from_apex = false)
service_list_(service_list)36         : service_list_(service_list),
37           subcontext_(subcontext),
38           interface_inheritance_hierarchy_(interface_inheritance_hierarchy),
39           service_(nullptr),
40           from_apex_(from_apex) {}
41     Result<void> ParseSection(std::vector<std::string>&& args, const std::string& filename,
42                               int line) override;
43     Result<void> ParseLineSection(std::vector<std::string>&& args, int line) override;
44     Result<void> EndSection() override;
EndFile()45     void EndFile() override { filename_ = ""; }
46 
47   private:
48     using OptionParser = Result<void> (ServiceParser::*)(std::vector<std::string>&& args);
49     const KeywordMap<ServiceParser::OptionParser>& GetParserMap() const;
50 
51     Result<void> ParseCapabilities(std::vector<std::string>&& args);
52     Result<void> ParseClass(std::vector<std::string>&& args);
53     Result<void> ParseConsole(std::vector<std::string>&& args);
54     Result<void> ParseCritical(std::vector<std::string>&& args);
55     Result<void> ParseDisabled(std::vector<std::string>&& args);
56     Result<void> ParseEnterNamespace(std::vector<std::string>&& args);
57     Result<void> ParseGroup(std::vector<std::string>&& args);
58     Result<void> ParsePriority(std::vector<std::string>&& args);
59     Result<void> ParseInterface(std::vector<std::string>&& args);
60     Result<void> ParseIoprio(std::vector<std::string>&& args);
61     Result<void> ParseKeycodes(std::vector<std::string>&& args);
62     Result<void> ParseOneshot(std::vector<std::string>&& args);
63     Result<void> ParseOnrestart(std::vector<std::string>&& args);
64     Result<void> ParseOomScoreAdjust(std::vector<std::string>&& args);
65     Result<void> ParseOverride(std::vector<std::string>&& args);
66     Result<void> ParseMemcgLimitInBytes(std::vector<std::string>&& args);
67     Result<void> ParseMemcgLimitPercent(std::vector<std::string>&& args);
68     Result<void> ParseMemcgLimitProperty(std::vector<std::string>&& args);
69     Result<void> ParseMemcgSoftLimitInBytes(std::vector<std::string>&& args);
70     Result<void> ParseMemcgSwappiness(std::vector<std::string>&& args);
71     Result<void> ParseNamespace(std::vector<std::string>&& args);
72     Result<void> ParseProcessRlimit(std::vector<std::string>&& args);
73     Result<void> ParseRebootOnFailure(std::vector<std::string>&& args);
74     Result<void> ParseRestartPeriod(std::vector<std::string>&& args);
75     Result<void> ParseSeclabel(std::vector<std::string>&& args);
76     Result<void> ParseSetenv(std::vector<std::string>&& args);
77     Result<void> ParseShutdown(std::vector<std::string>&& args);
78     Result<void> ParseSigstop(std::vector<std::string>&& args);
79     Result<void> ParseSocket(std::vector<std::string>&& args);
80     Result<void> ParseStdioToKmsg(std::vector<std::string>&& args);
81     Result<void> ParseTaskProfiles(std::vector<std::string>&& args);
82     Result<void> ParseTimeoutPeriod(std::vector<std::string>&& args);
83     Result<void> ParseFile(std::vector<std::string>&& args);
84     Result<void> ParseUser(std::vector<std::string>&& args);
85     Result<void> ParseWritepid(std::vector<std::string>&& args);
86     Result<void> ParseUpdatable(std::vector<std::string>&& args);
87 
88     bool IsValidName(const std::string& name) const;
89 
90     ServiceList* service_list_;
91     Subcontext* subcontext_;
92     std::optional<InterfaceInheritanceHierarchyMap> interface_inheritance_hierarchy_;
93     std::unique_ptr<Service> service_;
94     std::string filename_;
95     bool from_apex_ = false;
96 };
97 
98 }  // namespace init
99 }  // namespace android
100