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