]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/install.h
shared/install: in install_context_mark_for_removal ignore not found units
[thirdparty/systemd.git] / src / shared / install.h
1 #pragma once
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2011 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 typedef enum UnitFileScope UnitFileScope;
23 typedef enum UnitFileState UnitFileState;
24 typedef enum UnitFilePresetMode UnitFilePresetMode;
25 typedef enum UnitFileChangeType UnitFileChangeType;
26 typedef enum UnitFileType UnitFileType;
27 typedef struct UnitFileChange UnitFileChange;
28 typedef struct UnitFileList UnitFileList;
29 typedef struct UnitFileInstallInfo UnitFileInstallInfo;
30
31 #include <stdbool.h>
32
33 #include "hashmap.h"
34 #include "macro.h"
35 #include "path-lookup.h"
36 #include "strv.h"
37 #include "unit-name.h"
38
39 enum UnitFileScope {
40 UNIT_FILE_SYSTEM,
41 UNIT_FILE_GLOBAL,
42 UNIT_FILE_USER,
43 _UNIT_FILE_SCOPE_MAX,
44 _UNIT_FILE_SCOPE_INVALID = -1
45 };
46
47 enum UnitFileState {
48 UNIT_FILE_ENABLED,
49 UNIT_FILE_ENABLED_RUNTIME,
50 UNIT_FILE_LINKED,
51 UNIT_FILE_LINKED_RUNTIME,
52 UNIT_FILE_MASKED,
53 UNIT_FILE_MASKED_RUNTIME,
54 UNIT_FILE_STATIC,
55 UNIT_FILE_DISABLED,
56 UNIT_FILE_INDIRECT,
57 UNIT_FILE_GENERATED,
58 UNIT_FILE_TRANSIENT,
59 UNIT_FILE_BAD,
60 _UNIT_FILE_STATE_MAX,
61 _UNIT_FILE_STATE_INVALID = -1
62 };
63
64 enum UnitFilePresetMode {
65 UNIT_FILE_PRESET_FULL,
66 UNIT_FILE_PRESET_ENABLE_ONLY,
67 UNIT_FILE_PRESET_DISABLE_ONLY,
68 _UNIT_FILE_PRESET_MAX,
69 _UNIT_FILE_PRESET_INVALID = -1
70 };
71
72 enum UnitFileChangeType {
73 UNIT_FILE_SYMLINK,
74 UNIT_FILE_UNLINK,
75 UNIT_FILE_IS_MASKED,
76 UNIT_FILE_IS_DANGLING,
77 _UNIT_FILE_CHANGE_TYPE_MAX,
78 _UNIT_FILE_CHANGE_INVALID = INT_MIN
79 };
80
81 /* type can either one of the UnitFileChangeTypes listed above, or a negative error.
82 * If source is specified, it should be the contents of the path symlink.
83 * In case of an error, source should be the existing symlink contents or NULL
84 */
85 struct UnitFileChange {
86 int type; /* UnitFileChangeType or bust */
87 char *path;
88 char *source;
89 };
90
91 static inline bool unit_file_changes_have_modification(const UnitFileChange* changes, unsigned n_changes) {
92 unsigned i;
93 for (i = 0; i < n_changes; i++)
94 if (IN_SET(changes[i].type, UNIT_FILE_SYMLINK, UNIT_FILE_UNLINK))
95 return true;
96 return false;
97 }
98
99 struct UnitFileList {
100 char *path;
101 UnitFileState state;
102 };
103
104 enum UnitFileType {
105 UNIT_FILE_TYPE_REGULAR,
106 UNIT_FILE_TYPE_SYMLINK,
107 UNIT_FILE_TYPE_MASKED,
108 _UNIT_FILE_TYPE_MAX,
109 _UNIT_FILE_TYPE_INVALID = -1,
110 };
111
112 struct UnitFileInstallInfo {
113 char *name;
114 char *path;
115
116 char **aliases;
117 char **wanted_by;
118 char **required_by;
119 char **also;
120
121 char *default_instance;
122 char *symlink_target;
123
124 UnitFileType type;
125 bool auxiliary;
126 };
127
128 static inline bool UNIT_FILE_INSTALL_INFO_HAS_RULES(UnitFileInstallInfo *i) {
129 assert(i);
130
131 return !strv_isempty(i->aliases) ||
132 !strv_isempty(i->wanted_by) ||
133 !strv_isempty(i->required_by);
134 }
135
136 static inline bool UNIT_FILE_INSTALL_INFO_HAS_ALSO(UnitFileInstallInfo *i) {
137 assert(i);
138
139 return !strv_isempty(i->also);
140 }
141
142 bool unit_type_may_alias(UnitType type) _const_;
143 bool unit_type_may_template(UnitType type) _const_;
144
145 int unit_file_enable(
146 UnitFileScope scope,
147 bool runtime,
148 const char *root_dir,
149 char **files,
150 bool force,
151 UnitFileChange **changes,
152 unsigned *n_changes);
153 int unit_file_disable(
154 UnitFileScope scope,
155 bool runtime,
156 const char *root_dir,
157 char **files,
158 UnitFileChange **changes,
159 unsigned *n_changes);
160 int unit_file_reenable(
161 UnitFileScope scope,
162 bool runtime,
163 const char *root_dir,
164 char **files,
165 bool force,
166 UnitFileChange **changes,
167 unsigned *n_changes);
168 int unit_file_preset(
169 UnitFileScope scope,
170 bool runtime,
171 const char *root_dir,
172 char **files,
173 UnitFilePresetMode mode,
174 bool force,
175 UnitFileChange **changes,
176 unsigned *n_changes);
177 int unit_file_preset_all(
178 UnitFileScope scope,
179 bool runtime,
180 const char *root_dir,
181 UnitFilePresetMode mode,
182 bool force,
183 UnitFileChange **changes,
184 unsigned *n_changes);
185 int unit_file_mask(
186 UnitFileScope scope,
187 bool runtime,
188 const char *root_dir,
189 char **files,
190 bool force,
191 UnitFileChange **changes,
192 unsigned *n_changes);
193 int unit_file_unmask(
194 UnitFileScope scope,
195 bool runtime,
196 const char *root_dir,
197 char **files,
198 UnitFileChange **changes,
199 unsigned *n_changes);
200 int unit_file_link(
201 UnitFileScope scope,
202 bool runtime,
203 const char *root_dir,
204 char **files,
205 bool force,
206 UnitFileChange **changes,
207 unsigned *n_changes);
208 int unit_file_revert(
209 UnitFileScope scope,
210 const char *root_dir,
211 char **files,
212 UnitFileChange **changes,
213 unsigned *n_changes);
214 int unit_file_set_default(
215 UnitFileScope scope,
216 const char *root_dir,
217 const char *file,
218 bool force,
219 UnitFileChange **changes,
220 unsigned *n_changes);
221 int unit_file_get_default(
222 UnitFileScope scope,
223 const char *root_dir,
224 char **name);
225 int unit_file_add_dependency(
226 UnitFileScope scope,
227 bool runtime,
228 const char *root_dir,
229 char **files,
230 const char *target,
231 UnitDependency dep,
232 bool force,
233 UnitFileChange **changes,
234 unsigned *n_changes);
235
236 int unit_file_get_state(UnitFileScope scope, const char *root_dir, const char *filename, UnitFileState *ret);
237 int unit_file_exists(UnitFileScope scope, const LookupPaths *paths, const char *name);
238
239 int unit_file_get_list(UnitFileScope scope, const char *root_dir, Hashmap *h, char **states, char **patterns);
240 Hashmap* unit_file_list_free(Hashmap *h);
241
242 int unit_file_changes_add(UnitFileChange **changes, unsigned *n_changes, UnitFileChangeType type, const char *path, const char *source);
243 void unit_file_changes_free(UnitFileChange *changes, unsigned n_changes);
244 void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *changes, unsigned n_changes, bool quiet);
245
246 int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char *name);
247
248 const char *unit_file_state_to_string(UnitFileState s) _const_;
249 UnitFileState unit_file_state_from_string(const char *s) _pure_;
250 /* from_string conversion is unreliable because of the overlap between -EPERM and -1 for error. */
251
252 const char *unit_file_change_type_to_string(UnitFileChangeType s) _const_;
253 UnitFileChangeType unit_file_change_type_from_string(const char *s) _pure_;
254
255 const char *unit_file_preset_mode_to_string(UnitFilePresetMode m) _const_;
256 UnitFilePresetMode unit_file_preset_mode_from_string(const char *s) _pure_;