chiark / gitweb /
units: introduce new Documentation= field and make use of it everywhere
[elogind.git] / src / core / unit.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #ifndef foounithfoo
4 #define foounithfoo
5
6 /***
7   This file is part of systemd.
8
9   Copyright 2010 Lennart Poettering
10
11   systemd is free software; you can redistribute it and/or modify it
12   under the terms of the GNU Lesser General Public License as published by
13   the Free Software Foundation; either version 2.1 of the License, or
14   (at your option) any later version.
15
16   systemd is distributed in the hope that it will be useful, but
17   WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19   Lesser General Public License for more details.
20
21   You should have received a copy of the GNU Lesser General Public License
22   along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 ***/
24
25 #include <stdbool.h>
26 #include <stdlib.h>
27
28 typedef struct Unit Unit;
29 typedef struct UnitVTable UnitVTable;
30 typedef enum UnitType UnitType;
31 typedef enum UnitLoadState UnitLoadState;
32 typedef enum UnitActiveState UnitActiveState;
33 typedef enum UnitDependency UnitDependency;
34 typedef struct UnitRef UnitRef;
35 typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
36
37 #include "set.h"
38 #include "util.h"
39 #include "list.h"
40 #include "socket-util.h"
41 #include "execute.h"
42 #include "condition.h"
43 #include "install.h"
44
45 enum UnitType {
46         UNIT_SERVICE = 0,
47         UNIT_SOCKET,
48         UNIT_TARGET,
49         UNIT_DEVICE,
50         UNIT_MOUNT,
51         UNIT_AUTOMOUNT,
52         UNIT_SNAPSHOT,
53         UNIT_TIMER,
54         UNIT_SWAP,
55         UNIT_PATH,
56         _UNIT_TYPE_MAX,
57         _UNIT_TYPE_INVALID = -1
58 };
59
60 enum UnitLoadState {
61         UNIT_STUB,
62         UNIT_LOADED,
63         UNIT_ERROR,
64         UNIT_MERGED,
65         UNIT_MASKED,
66         _UNIT_LOAD_STATE_MAX,
67         _UNIT_LOAD_STATE_INVALID = -1
68 };
69
70 enum UnitActiveState {
71         UNIT_ACTIVE,
72         UNIT_RELOADING,
73         UNIT_INACTIVE,
74         UNIT_FAILED,
75         UNIT_ACTIVATING,
76         UNIT_DEACTIVATING,
77         _UNIT_ACTIVE_STATE_MAX,
78         _UNIT_ACTIVE_STATE_INVALID = -1
79 };
80
81 static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {
82         return t == UNIT_ACTIVE || t == UNIT_RELOADING;
83 }
84
85 static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) {
86         return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_RELOADING;
87 }
88
89 static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) {
90         return t == UNIT_INACTIVE || t == UNIT_FAILED || t == UNIT_DEACTIVATING;
91 }
92
93 static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) {
94         return t == UNIT_INACTIVE || t == UNIT_FAILED;
95 }
96
97 enum UnitDependency {
98         /* Positive dependencies */
99         UNIT_REQUIRES,
100         UNIT_REQUIRES_OVERRIDABLE,
101         UNIT_REQUISITE,
102         UNIT_REQUISITE_OVERRIDABLE,
103         UNIT_WANTS,
104         UNIT_BIND_TO,
105
106         /* Inverse of the above */
107         UNIT_REQUIRED_BY,             /* inverse of 'requires' and 'requisite' is 'required_by' */
108         UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' and 'requisite_overridable' is 'soft_required_by' */
109         UNIT_WANTED_BY,               /* inverse of 'wants' */
110         UNIT_BOUND_BY,                /* inverse of 'bind_to' */
111
112         /* Negative dependencies */
113         UNIT_CONFLICTS,               /* inverse of 'conflicts' is 'conflicted_by' */
114         UNIT_CONFLICTED_BY,
115
116         /* Order */
117         UNIT_BEFORE,                  /* inverse of 'before' is 'after' and vice versa */
118         UNIT_AFTER,
119
120         /* On Failure */
121         UNIT_ON_FAILURE,
122
123         /* Triggers (i.e. a socket triggers a service) */
124         UNIT_TRIGGERS,
125         UNIT_TRIGGERED_BY,
126
127         /* Propagate reloads */
128         UNIT_PROPAGATE_RELOAD_TO,
129         UNIT_PROPAGATE_RELOAD_FROM,
130
131         /* Reference information for GC logic */
132         UNIT_REFERENCES,              /* Inverse of 'references' is 'referenced_by' */
133         UNIT_REFERENCED_BY,
134
135         _UNIT_DEPENDENCY_MAX,
136         _UNIT_DEPENDENCY_INVALID = -1
137 };
138
139 #include "manager.h"
140 #include "job.h"
141 #include "cgroup.h"
142 #include "cgroup-attr.h"
143
144 struct Unit {
145         Manager *manager;
146
147         UnitType type;
148         UnitLoadState load_state;
149         Unit *merged_into;
150
151         char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
152         char *instance;
153
154         Set *names;
155         Set *dependencies[_UNIT_DEPENDENCY_MAX];
156
157         char **requires_mounts_for;
158
159         char *description;
160         char **documentation;
161
162         char *fragment_path; /* if loaded from a config file this is the primary path to it */
163         usec_t fragment_mtime;
164
165         /* If there is something to do with this unit, then this is the installed job for it */
166         Job *job;
167
168         /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
169         Job *nop_job;
170
171         usec_t job_timeout;
172
173         /* References to this */
174         LIST_HEAD(UnitRef, refs);
175
176         /* Conditions to check */
177         LIST_HEAD(Condition, conditions);
178
179         dual_timestamp condition_timestamp;
180
181         dual_timestamp inactive_exit_timestamp;
182         dual_timestamp active_enter_timestamp;
183         dual_timestamp active_exit_timestamp;
184         dual_timestamp inactive_enter_timestamp;
185
186         /* Counterparts in the cgroup filesystem */
187         CGroupBonding *cgroup_bondings;
188         CGroupAttribute *cgroup_attributes;
189
190         /* Per type list */
191         LIST_FIELDS(Unit, units_by_type);
192
193         /* All units which have requires_mounts_for set */
194         LIST_FIELDS(Unit, has_requires_mounts_for);
195
196         /* Load queue */
197         LIST_FIELDS(Unit, load_queue);
198
199         /* D-Bus queue */
200         LIST_FIELDS(Unit, dbus_queue);
201
202         /* Cleanup queue */
203         LIST_FIELDS(Unit, cleanup_queue);
204
205         /* GC queue */
206         LIST_FIELDS(Unit, gc_queue);
207
208         /* Used during GC sweeps */
209         unsigned gc_marker;
210
211         /* When deserializing, temporarily store the job type for this
212          * unit here, if there was a job scheduled.
213          * Only for deserializing from a legacy version. New style uses full
214          * serialized jobs. */
215         int deserialized_job; /* This is actually of type JobType */
216
217         /* Error code when we didn't manage to load the unit (negative) */
218         int load_error;
219
220         /* Cached unit file state */
221         UnitFileState unit_file_state;
222
223         /* Garbage collect us we nobody wants or requires us anymore */
224         bool stop_when_unneeded;
225
226         /* Create default dependencies */
227         bool default_dependencies;
228
229         /* Refuse manual starting, allow starting only indirectly via dependency. */
230         bool refuse_manual_start;
231
232         /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
233         bool refuse_manual_stop;
234
235         /* Allow isolation requests */
236         bool allow_isolate;
237
238         /* Isolate OnFailure unit */
239         bool on_failure_isolate;
240
241         /* Ignore this unit when isolating */
242         bool ignore_on_isolate;
243
244         /* Ignore this unit when snapshotting */
245         bool ignore_on_snapshot;
246
247         /* Did the last condition check suceed? */
248         bool condition_result;
249
250         bool in_load_queue:1;
251         bool in_dbus_queue:1;
252         bool in_cleanup_queue:1;
253         bool in_gc_queue:1;
254
255         bool sent_dbus_new_signal:1;
256
257         bool no_gc:1;
258
259         bool in_audit:1;
260 };
261
262 struct UnitRef {
263         /* Keeps tracks of references to a unit. This is useful so
264          * that we can merge two units if necessary and correct all
265          * references to them */
266
267         Unit* unit;
268         LIST_FIELDS(UnitRef, refs);
269 };
270
271 struct UnitStatusMessageFormats {
272         const char *starting_stopping[2];
273         const char *finished_start_job[_JOB_RESULT_MAX];
274         const char *finished_stop_job[_JOB_RESULT_MAX];
275 };
276
277 #include "service.h"
278 #include "timer.h"
279 #include "socket.h"
280 #include "target.h"
281 #include "device.h"
282 #include "mount.h"
283 #include "automount.h"
284 #include "snapshot.h"
285 #include "swap.h"
286 #include "path.h"
287
288 struct UnitVTable {
289         const char *suffix;
290
291         /* How much memory does an object of this unit type need */
292         size_t object_size;
293
294         /* Config file sections this unit type understands, separated
295          * by NUL chars */
296         const char *sections;
297
298         /* This should reset all type-specific variables. This should
299          * not allocate memory, and is called with zero-initialized
300          * data. It should hence only initialize variables that need
301          * to be set != 0. */
302         void (*init)(Unit *u);
303
304         /* This should free all type-specific variables. It should be
305          * idempotent. */
306         void (*done)(Unit *u);
307
308         /* Actually load data from disk. This may fail, and should set
309          * load_state to UNIT_LOADED, UNIT_MERGED or leave it at
310          * UNIT_STUB if no configuration could be found. */
311         int (*load)(Unit *u);
312
313         /* If a a lot of units got created via enumerate(), this is
314          * where to actually set the state and call unit_notify(). */
315         int (*coldplug)(Unit *u);
316
317         void (*dump)(Unit *u, FILE *f, const char *prefix);
318
319         int (*start)(Unit *u);
320         int (*stop)(Unit *u);
321         int (*reload)(Unit *u);
322
323         int (*kill)(Unit *u, KillWho w, KillMode m, int signo, DBusError *error);
324
325         bool (*can_reload)(Unit *u);
326
327         /* Write all data that cannot be restored from other sources
328          * away using unit_serialize_item() */
329         int (*serialize)(Unit *u, FILE *f, FDSet *fds);
330
331         /* Restore one item from the serialization */
332         int (*deserialize_item)(Unit *u, const char *key, const char *data, FDSet *fds);
333
334         /* Boils down the more complex internal state of this unit to
335          * a simpler one that the engine can understand */
336         UnitActiveState (*active_state)(Unit *u);
337
338         /* Returns the substate specific to this unit type as
339          * string. This is purely information so that we can give the
340          * user a more fine grained explanation in which actual state a
341          * unit is in. */
342         const char* (*sub_state_to_string)(Unit *u);
343
344         /* Return true when there is reason to keep this entry around
345          * even nothing references it and it isn't active in any
346          * way */
347         bool (*check_gc)(Unit *u);
348
349         /* Return true when this unit is suitable for snapshotting */
350         bool (*check_snapshot)(Unit *u);
351
352         void (*fd_event)(Unit *u, int fd, uint32_t events, Watch *w);
353         void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
354         void (*timer_event)(Unit *u, uint64_t n_elapsed, Watch *w);
355
356         /* Check whether unit needs a daemon reload */
357         bool (*need_daemon_reload)(Unit *u);
358
359         /* Reset failed state if we are in failed state */
360         void (*reset_failed)(Unit *u);
361
362         /* Called whenever any of the cgroups this unit watches for
363          * ran empty */
364         void (*cgroup_notify_empty)(Unit *u);
365
366         /* Called whenever a process of this unit sends us a message */
367         void (*notify_message)(Unit *u, pid_t pid, char **tags);
368
369         /* Called whenever a name thus Unit registered for comes or
370          * goes away. */
371         void (*bus_name_owner_change)(Unit *u, const char *name, const char *old_owner, const char *new_owner);
372
373         /* Called whenever a bus PID lookup finishes */
374         void (*bus_query_pid_done)(Unit *u, const char *name, pid_t pid);
375
376         /* Called for each message received on the bus */
377         DBusHandlerResult (*bus_message_handler)(Unit *u, DBusConnection *c, DBusMessage *message);
378
379         /* Return the unit this unit is following */
380         Unit *(*following)(Unit *u);
381
382         /* Return the set of units that are following each other */
383         int (*following_set)(Unit *u, Set **s);
384
385         /* This is called for each unit type and should be used to
386          * enumerate existing devices and load them. However,
387          * everything that is loaded here should still stay in
388          * inactive state. It is the job of the coldplug() call above
389          * to put the units into the initial state.  */
390         int (*enumerate)(Manager *m);
391
392         /* Type specific cleanups. */
393         void (*shutdown)(Manager *m);
394
395         /* When sending out PropertiesChanged signal, which properties
396          * shall be invalidated? This is a NUL separated list of
397          * strings, to minimize relocations a little. */
398         const char *bus_invalidating_properties;
399
400         /* The interface name */
401         const char *bus_interface;
402
403         UnitStatusMessageFormats status_message_formats;
404
405         /* Can units of this type have multiple names? */
406         bool no_alias:1;
407
408         /* Instances make no sense for this type */
409         bool no_instances:1;
410
411         /* Exclude from automatic gc */
412         bool no_gc:1;
413 };
414
415 extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
416
417 #define UNIT_VTABLE(u) unit_vtable[(u)->type]
418
419 /* For casting a unit into the various unit types */
420 #define DEFINE_CAST(UPPERCASE, MixedCase)                               \
421         static inline MixedCase* UPPERCASE(Unit *u) {                   \
422                 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE))      \
423                         return NULL;                                    \
424                                                                         \
425                 return (MixedCase*) u;                                  \
426         }
427
428 /* For casting the various unit types into a unit */
429 #define UNIT(u) (&(u)->meta)
430
431 DEFINE_CAST(SOCKET, Socket);
432 DEFINE_CAST(TIMER, Timer);
433 DEFINE_CAST(SERVICE, Service);
434 DEFINE_CAST(TARGET, Target);
435 DEFINE_CAST(DEVICE, Device);
436 DEFINE_CAST(MOUNT, Mount);
437 DEFINE_CAST(AUTOMOUNT, Automount);
438 DEFINE_CAST(SNAPSHOT, Snapshot);
439 DEFINE_CAST(SWAP, Swap);
440 DEFINE_CAST(PATH, Path);
441
442 Unit *unit_new(Manager *m, size_t size);
443 void unit_free(Unit *u);
444
445 int unit_add_name(Unit *u, const char *name);
446
447 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
448 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
449
450 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
451 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
452
453 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
454 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
455
456 int unit_add_exec_dependencies(Unit *u, ExecContext *c);
457
458 int unit_add_cgroup(Unit *u, CGroupBonding *b);
459 int unit_add_cgroup_from_text(Unit *u, const char *name);
460 int unit_add_default_cgroups(Unit *u);
461 CGroupBonding* unit_get_default_cgroup(Unit *u);
462 int unit_add_cgroup_attribute(Unit *u, const char *controller, const char *name, const char *value, CGroupAttributeMapCallback map_callback);
463
464 int unit_choose_id(Unit *u, const char *name);
465 int unit_set_description(Unit *u, const char *description);
466
467 bool unit_check_gc(Unit *u);
468
469 void unit_add_to_load_queue(Unit *u);
470 void unit_add_to_dbus_queue(Unit *u);
471 void unit_add_to_cleanup_queue(Unit *u);
472 void unit_add_to_gc_queue(Unit *u);
473
474 int unit_merge(Unit *u, Unit *other);
475 int unit_merge_by_name(Unit *u, const char *other);
476
477 Unit *unit_follow_merge(Unit *u);
478
479 int unit_load_fragment_and_dropin(Unit *u);
480 int unit_load_fragment_and_dropin_optional(Unit *u);
481 int unit_load(Unit *unit);
482
483 const char *unit_description(Unit *u);
484
485 bool unit_has_name(Unit *u, const char *name);
486
487 UnitActiveState unit_active_state(Unit *u);
488
489 const char* unit_sub_state_to_string(Unit *u);
490
491 void unit_dump(Unit *u, FILE *f, const char *prefix);
492
493 bool unit_can_reload(Unit *u);
494 bool unit_can_start(Unit *u);
495 bool unit_can_isolate(Unit *u);
496
497 int unit_start(Unit *u);
498 int unit_stop(Unit *u);
499 int unit_reload(Unit *u);
500
501 int unit_kill(Unit *u, KillWho w, KillMode m, int signo, DBusError *error);
502
503 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success);
504
505 int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w);
506 void unit_unwatch_fd(Unit *u, Watch *w);
507
508 int unit_watch_pid(Unit *u, pid_t pid);
509 void unit_unwatch_pid(Unit *u, pid_t pid);
510
511 int unit_watch_timer(Unit *u, usec_t delay, Watch *w);
512 void unit_unwatch_timer(Unit *u, Watch *w);
513
514 int unit_watch_bus_name(Unit *u, const char *name);
515 void unit_unwatch_bus_name(Unit *u, const char *name);
516
517 bool unit_job_is_applicable(Unit *u, JobType j);
518
519 int set_unit_path(const char *p);
520
521 char *unit_dbus_path(Unit *u);
522
523 int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
524 int unit_get_related_unit(Unit *u, const char *type, Unit **_found);
525
526 char *unit_name_printf(Unit *u, const char* text);
527 char *unit_full_printf(Unit *u, const char *text);
528 char **unit_full_printf_strv(Unit *u, char **l);
529
530 bool unit_can_serialize(Unit *u);
531 int unit_serialize(Unit *u, FILE *f, FDSet *fds);
532 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_attr_(4,5);
533 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
534 int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
535
536 int unit_add_node_link(Unit *u, const char *what, bool wants);
537
538 int unit_coldplug(Unit *u);
539
540 void unit_status_printf(Unit *u, const char *status, const char *format, ...);
541
542 bool unit_need_daemon_reload(Unit *u);
543
544 void unit_reset_failed(Unit *u);
545
546 Unit *unit_following(Unit *u);
547
548 bool unit_pending_inactive(Unit *u);
549 bool unit_pending_active(Unit *u);
550
551 int unit_add_default_target_dependency(Unit *u, Unit *target);
552
553 int unit_following_set(Unit *u, Set **s);
554
555 UnitType unit_name_to_type(const char *n);
556 bool unit_name_is_valid(const char *n, bool template_ok);
557
558 void unit_trigger_on_failure(Unit *u);
559
560 bool unit_condition_test(Unit *u);
561
562 UnitFileState unit_get_unit_file_state(Unit *u);
563
564 Unit* unit_ref_set(UnitRef *ref, Unit *u);
565 void unit_ref_unset(UnitRef *ref);
566
567 #define UNIT_DEREF(ref) ((ref).unit)
568
569 int unit_add_one_mount_link(Unit *u, Mount *m);
570 int unit_add_mount_links(Unit *u);
571
572 const char *unit_load_state_to_string(UnitLoadState i);
573 UnitLoadState unit_load_state_from_string(const char *s);
574
575 const char *unit_active_state_to_string(UnitActiveState i);
576 UnitActiveState unit_active_state_from_string(const char *s);
577
578 const char *unit_dependency_to_string(UnitDependency i);
579 UnitDependency unit_dependency_from_string(const char *s);
580
581 #endif