]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/unit-name.h
Merge pull request #6472 from yuwata/journal-gateway-fix
[thirdparty/systemd.git] / src / basic / unit-name.h
1 #pragma once
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2010 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 #include <stdbool.h>
23
24 #include "macro.h"
25
26 #define UNIT_NAME_MAX 256
27
28 typedef enum UnitType {
29 UNIT_SERVICE = 0,
30 UNIT_SOCKET,
31 UNIT_TARGET,
32 UNIT_DEVICE,
33 UNIT_MOUNT,
34 UNIT_AUTOMOUNT,
35 UNIT_SWAP,
36 UNIT_TIMER,
37 UNIT_PATH,
38 UNIT_SLICE,
39 UNIT_SCOPE,
40 _UNIT_TYPE_MAX,
41 _UNIT_TYPE_INVALID = -1
42 } UnitType;
43
44 typedef enum UnitLoadState {
45 UNIT_STUB = 0,
46 UNIT_LOADED,
47 UNIT_NOT_FOUND,
48 UNIT_ERROR,
49 UNIT_MERGED,
50 UNIT_MASKED,
51 _UNIT_LOAD_STATE_MAX,
52 _UNIT_LOAD_STATE_INVALID = -1
53 } UnitLoadState;
54
55 typedef enum UnitActiveState {
56 UNIT_ACTIVE,
57 UNIT_RELOADING,
58 UNIT_INACTIVE,
59 UNIT_FAILED,
60 UNIT_ACTIVATING,
61 UNIT_DEACTIVATING,
62 _UNIT_ACTIVE_STATE_MAX,
63 _UNIT_ACTIVE_STATE_INVALID = -1
64 } UnitActiveState;
65
66 typedef enum AutomountState {
67 AUTOMOUNT_DEAD,
68 AUTOMOUNT_WAITING,
69 AUTOMOUNT_RUNNING,
70 AUTOMOUNT_FAILED,
71 _AUTOMOUNT_STATE_MAX,
72 _AUTOMOUNT_STATE_INVALID = -1
73 } AutomountState;
74
75 /* We simply watch devices, we cannot plug/unplug them. That
76 * simplifies the state engine greatly */
77 typedef enum DeviceState {
78 DEVICE_DEAD,
79 DEVICE_TENTATIVE, /* mounted or swapped, but not (yet) announced by udev */
80 DEVICE_PLUGGED, /* announced by udev */
81 _DEVICE_STATE_MAX,
82 _DEVICE_STATE_INVALID = -1
83 } DeviceState;
84
85 typedef enum MountState {
86 MOUNT_DEAD,
87 MOUNT_MOUNTING, /* /usr/bin/mount is running, but the mount is not done yet. */
88 MOUNT_MOUNTING_DONE, /* /usr/bin/mount is running, and the mount is done. */
89 MOUNT_MOUNTED,
90 MOUNT_REMOUNTING,
91 MOUNT_UNMOUNTING,
92 MOUNT_MOUNTING_SIGTERM,
93 MOUNT_MOUNTING_SIGKILL,
94 MOUNT_REMOUNTING_SIGTERM,
95 MOUNT_REMOUNTING_SIGKILL,
96 MOUNT_UNMOUNTING_SIGTERM,
97 MOUNT_UNMOUNTING_SIGKILL,
98 MOUNT_FAILED,
99 _MOUNT_STATE_MAX,
100 _MOUNT_STATE_INVALID = -1
101 } MountState;
102
103 typedef enum PathState {
104 PATH_DEAD,
105 PATH_WAITING,
106 PATH_RUNNING,
107 PATH_FAILED,
108 _PATH_STATE_MAX,
109 _PATH_STATE_INVALID = -1
110 } PathState;
111
112 typedef enum ScopeState {
113 SCOPE_DEAD,
114 SCOPE_RUNNING,
115 SCOPE_ABANDONED,
116 SCOPE_STOP_SIGTERM,
117 SCOPE_STOP_SIGKILL,
118 SCOPE_FAILED,
119 _SCOPE_STATE_MAX,
120 _SCOPE_STATE_INVALID = -1
121 } ScopeState;
122
123 typedef enum ServiceState {
124 SERVICE_DEAD,
125 SERVICE_START_PRE,
126 SERVICE_START,
127 SERVICE_START_POST,
128 SERVICE_RUNNING,
129 SERVICE_EXITED, /* Nothing is running anymore, but RemainAfterExit is true hence this is OK */
130 SERVICE_RELOAD,
131 SERVICE_STOP, /* No STOP_PRE state, instead just register multiple STOP executables */
132 SERVICE_STOP_SIGABRT, /* Watchdog timeout */
133 SERVICE_STOP_SIGTERM,
134 SERVICE_STOP_SIGKILL,
135 SERVICE_STOP_POST,
136 SERVICE_FINAL_SIGTERM, /* In case the STOP_POST executable hangs, we shoot that down, too */
137 SERVICE_FINAL_SIGKILL,
138 SERVICE_FAILED,
139 SERVICE_AUTO_RESTART,
140 _SERVICE_STATE_MAX,
141 _SERVICE_STATE_INVALID = -1
142 } ServiceState;
143
144 typedef enum SliceState {
145 SLICE_DEAD,
146 SLICE_ACTIVE,
147 _SLICE_STATE_MAX,
148 _SLICE_STATE_INVALID = -1
149 } SliceState;
150
151 typedef enum SocketState {
152 SOCKET_DEAD,
153 SOCKET_START_PRE,
154 SOCKET_START_CHOWN,
155 SOCKET_START_POST,
156 SOCKET_LISTENING,
157 SOCKET_RUNNING,
158 SOCKET_STOP_PRE,
159 SOCKET_STOP_PRE_SIGTERM,
160 SOCKET_STOP_PRE_SIGKILL,
161 SOCKET_STOP_POST,
162 SOCKET_FINAL_SIGTERM,
163 SOCKET_FINAL_SIGKILL,
164 SOCKET_FAILED,
165 _SOCKET_STATE_MAX,
166 _SOCKET_STATE_INVALID = -1
167 } SocketState;
168
169 typedef enum SwapState {
170 SWAP_DEAD,
171 SWAP_ACTIVATING, /* /sbin/swapon is running, but the swap not yet enabled. */
172 SWAP_ACTIVATING_DONE, /* /sbin/swapon is running, and the swap is done. */
173 SWAP_ACTIVE,
174 SWAP_DEACTIVATING,
175 SWAP_ACTIVATING_SIGTERM,
176 SWAP_ACTIVATING_SIGKILL,
177 SWAP_DEACTIVATING_SIGTERM,
178 SWAP_DEACTIVATING_SIGKILL,
179 SWAP_FAILED,
180 _SWAP_STATE_MAX,
181 _SWAP_STATE_INVALID = -1
182 } SwapState;
183
184 typedef enum TargetState {
185 TARGET_DEAD,
186 TARGET_ACTIVE,
187 _TARGET_STATE_MAX,
188 _TARGET_STATE_INVALID = -1
189 } TargetState;
190
191 typedef enum TimerState {
192 TIMER_DEAD,
193 TIMER_WAITING,
194 TIMER_RUNNING,
195 TIMER_ELAPSED,
196 TIMER_FAILED,
197 _TIMER_STATE_MAX,
198 _TIMER_STATE_INVALID = -1
199 } TimerState;
200
201 typedef enum UnitDependency {
202 /* Positive dependencies */
203 UNIT_REQUIRES,
204 UNIT_REQUISITE,
205 UNIT_WANTS,
206 UNIT_BINDS_TO,
207 UNIT_PART_OF,
208
209 /* Inverse of the above */
210 UNIT_REQUIRED_BY, /* inverse of 'requires' is 'required_by' */
211 UNIT_REQUISITE_OF, /* inverse of 'requisite' is 'requisite_of' */
212 UNIT_WANTED_BY, /* inverse of 'wants' */
213 UNIT_BOUND_BY, /* inverse of 'binds_to' */
214 UNIT_CONSISTS_OF, /* inverse of 'part_of' */
215
216 /* Negative dependencies */
217 UNIT_CONFLICTS, /* inverse of 'conflicts' is 'conflicted_by' */
218 UNIT_CONFLICTED_BY,
219
220 /* Order */
221 UNIT_BEFORE, /* inverse of 'before' is 'after' and vice versa */
222 UNIT_AFTER,
223
224 /* On Failure */
225 UNIT_ON_FAILURE,
226
227 /* Triggers (i.e. a socket triggers a service) */
228 UNIT_TRIGGERS,
229 UNIT_TRIGGERED_BY,
230
231 /* Propagate reloads */
232 UNIT_PROPAGATES_RELOAD_TO,
233 UNIT_RELOAD_PROPAGATED_FROM,
234
235 /* Joins namespace of */
236 UNIT_JOINS_NAMESPACE_OF,
237
238 /* Reference information for GC logic */
239 UNIT_REFERENCES, /* Inverse of 'references' is 'referenced_by' */
240 UNIT_REFERENCED_BY,
241
242 _UNIT_DEPENDENCY_MAX,
243 _UNIT_DEPENDENCY_INVALID = -1
244 } UnitDependency;
245
246 typedef enum NotifyAccess {
247 NOTIFY_NONE,
248 NOTIFY_ALL,
249 NOTIFY_MAIN,
250 NOTIFY_EXEC,
251 _NOTIFY_ACCESS_MAX,
252 _NOTIFY_ACCESS_INVALID = -1
253 } NotifyAccess;
254
255 typedef enum UnitNameFlags {
256 UNIT_NAME_PLAIN = 1, /* Allow foo.service */
257 UNIT_NAME_INSTANCE = 2, /* Allow foo@bar.service */
258 UNIT_NAME_TEMPLATE = 4, /* Allow foo@.service */
259 UNIT_NAME_ANY = UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE,
260 } UnitNameFlags;
261
262 bool unit_name_is_valid(const char *n, UnitNameFlags flags) _pure_;
263 bool unit_prefix_is_valid(const char *p) _pure_;
264 bool unit_instance_is_valid(const char *i) _pure_;
265 bool unit_suffix_is_valid(const char *s) _pure_;
266
267 static inline int unit_prefix_and_instance_is_valid(const char *p) {
268 /* For prefix+instance and instance the same rules apply */
269 return unit_instance_is_valid(p);
270 }
271
272 int unit_name_to_prefix(const char *n, char **prefix);
273 int unit_name_to_instance(const char *n, char **instance);
274 int unit_name_to_prefix_and_instance(const char *n, char **ret);
275
276 UnitType unit_name_to_type(const char *n) _pure_;
277
278 int unit_name_change_suffix(const char *n, const char *suffix, char **ret);
279
280 int unit_name_build(const char *prefix, const char *instance, const char *suffix, char **ret);
281
282 char *unit_name_escape(const char *f);
283 int unit_name_unescape(const char *f, char **ret);
284 int unit_name_path_escape(const char *f, char **ret);
285 int unit_name_path_unescape(const char *f, char **ret);
286
287 int unit_name_replace_instance(const char *f, const char *i, char **ret);
288
289 int unit_name_template(const char *f, char **ret);
290
291 int unit_name_from_path(const char *path, const char *suffix, char **ret);
292 int unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix, char **ret);
293 int unit_name_to_path(const char *name, char **ret);
294
295 char *unit_dbus_path_from_name(const char *name);
296 int unit_name_from_dbus_path(const char *path, char **name);
297
298 const char* unit_dbus_interface_from_type(UnitType t);
299 const char *unit_dbus_interface_from_name(const char *name);
300
301 typedef enum UnitNameMangle {
302 UNIT_NAME_NOGLOB,
303 UNIT_NAME_GLOB,
304 } UnitNameMangle;
305
306 int unit_name_mangle_with_suffix(const char *name, UnitNameMangle allow_globs, const char *suffix, char **ret);
307
308 static inline int unit_name_mangle(const char *name, UnitNameMangle allow_globs, char **ret) {
309 return unit_name_mangle_with_suffix(name, allow_globs, ".service", ret);
310 }
311
312 int slice_build_parent_slice(const char *slice, char **ret);
313 int slice_build_subslice(const char *slice, const char*name, char **subslice);
314 bool slice_name_is_valid(const char *name);
315
316 const char *unit_type_to_string(UnitType i) _const_;
317 UnitType unit_type_from_string(const char *s) _pure_;
318
319 const char *unit_load_state_to_string(UnitLoadState i) _const_;
320 UnitLoadState unit_load_state_from_string(const char *s) _pure_;
321
322 const char *unit_active_state_to_string(UnitActiveState i) _const_;
323 UnitActiveState unit_active_state_from_string(const char *s) _pure_;
324
325 const char* automount_state_to_string(AutomountState i) _const_;
326 AutomountState automount_state_from_string(const char *s) _pure_;
327
328 const char* device_state_to_string(DeviceState i) _const_;
329 DeviceState device_state_from_string(const char *s) _pure_;
330
331 const char* mount_state_to_string(MountState i) _const_;
332 MountState mount_state_from_string(const char *s) _pure_;
333
334 const char* path_state_to_string(PathState i) _const_;
335 PathState path_state_from_string(const char *s) _pure_;
336
337 const char* scope_state_to_string(ScopeState i) _const_;
338 ScopeState scope_state_from_string(const char *s) _pure_;
339
340 const char* service_state_to_string(ServiceState i) _const_;
341 ServiceState service_state_from_string(const char *s) _pure_;
342
343 const char* slice_state_to_string(SliceState i) _const_;
344 SliceState slice_state_from_string(const char *s) _pure_;
345
346 const char* socket_state_to_string(SocketState i) _const_;
347 SocketState socket_state_from_string(const char *s) _pure_;
348
349 const char* swap_state_to_string(SwapState i) _const_;
350 SwapState swap_state_from_string(const char *s) _pure_;
351
352 const char* target_state_to_string(TargetState i) _const_;
353 TargetState target_state_from_string(const char *s) _pure_;
354
355 const char *timer_state_to_string(TimerState i) _const_;
356 TimerState timer_state_from_string(const char *s) _pure_;
357
358 const char *unit_dependency_to_string(UnitDependency i) _const_;
359 UnitDependency unit_dependency_from_string(const char *s) _pure_;
360
361 const char* notify_access_to_string(NotifyAccess i) _const_;
362 NotifyAccess notify_access_from_string(const char *s) _pure_;