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