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