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