chiark / gitweb /
Rearrange Unit to make pahole happy
[elogind.git] / src / core / unit.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 #include <stdlib.h>
26 #include <unistd.h>
27
28 typedef struct Unit Unit;
29 typedef struct UnitVTable UnitVTable;
30 typedef enum UnitActiveState UnitActiveState;
31 typedef struct UnitRef UnitRef;
32 typedef struct UnitStatusMessageFormats UnitStatusMessageFormats;
33
34 #include "sd-event.h"
35 #include "set.h"
36 #include "util.h"
37 #include "list.h"
38 #include "socket-util.h"
39 #include "execute.h"
40 #include "cgroup.h"
41 #include "condition.h"
42 #include "install.h"
43 #include "unit-name.h"
44
45 enum UnitActiveState {
46         UNIT_ACTIVE,
47         UNIT_RELOADING,
48         UNIT_INACTIVE,
49         UNIT_FAILED,
50         UNIT_ACTIVATING,
51         UNIT_DEACTIVATING,
52         _UNIT_ACTIVE_STATE_MAX,
53         _UNIT_ACTIVE_STATE_INVALID = -1
54 };
55
56 static inline bool UNIT_IS_ACTIVE_OR_RELOADING(UnitActiveState t) {
57         return t == UNIT_ACTIVE || t == UNIT_RELOADING;
58 }
59
60 static inline bool UNIT_IS_ACTIVE_OR_ACTIVATING(UnitActiveState t) {
61         return t == UNIT_ACTIVE || t == UNIT_ACTIVATING || t == UNIT_RELOADING;
62 }
63
64 static inline bool UNIT_IS_INACTIVE_OR_DEACTIVATING(UnitActiveState t) {
65         return t == UNIT_INACTIVE || t == UNIT_FAILED || t == UNIT_DEACTIVATING;
66 }
67
68 static inline bool UNIT_IS_INACTIVE_OR_FAILED(UnitActiveState t) {
69         return t == UNIT_INACTIVE || t == UNIT_FAILED;
70 }
71
72 #include "manager.h"
73 #include "job.h"
74
75 struct UnitRef {
76         /* Keeps tracks of references to a unit. This is useful so
77          * that we can merge two units if necessary and correct all
78          * references to them */
79
80         Unit* unit;
81         LIST_FIELDS(UnitRef, refs);
82 };
83
84 struct Unit {
85         Manager *manager;
86
87         UnitType type;
88         UnitLoadState load_state;
89         Unit *merged_into;
90
91         char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
92         char *instance;
93
94         Set *names;
95         Set *dependencies[_UNIT_DEPENDENCY_MAX];
96
97         char **requires_mounts_for;
98
99         char *description;
100         char **documentation;
101
102         char *fragment_path; /* if loaded from a config file this is the primary path to it */
103         char *source_path; /* if converted, the source file */
104         char **dropin_paths;
105         usec_t fragment_mtime;
106         usec_t source_mtime;
107         usec_t dropin_mtime;
108
109         /* If there is something to do with this unit, then this is the installed job for it */
110         Job *job;
111
112         /* JOB_NOP jobs are special and can be installed without disturbing the real job. */
113         Job *nop_job;
114
115         usec_t job_timeout;
116
117         /* References to this */
118         LIST_HEAD(UnitRef, refs);
119
120         /* Conditions to check */
121         LIST_HEAD(Condition, conditions);
122
123         dual_timestamp condition_timestamp;
124
125         dual_timestamp inactive_exit_timestamp;
126         dual_timestamp active_enter_timestamp;
127         dual_timestamp active_exit_timestamp;
128         dual_timestamp inactive_enter_timestamp;
129
130         UnitRef slice;
131
132         /* Per type list */
133         LIST_FIELDS(Unit, units_by_type);
134
135         /* All units which have requires_mounts_for set */
136         LIST_FIELDS(Unit, has_requires_mounts_for);
137
138         /* Load queue */
139         LIST_FIELDS(Unit, load_queue);
140
141         /* D-Bus queue */
142         LIST_FIELDS(Unit, dbus_queue);
143
144         /* Cleanup queue */
145         LIST_FIELDS(Unit, cleanup_queue);
146
147         /* GC queue */
148         LIST_FIELDS(Unit, gc_queue);
149
150         /* CGroup realize members queue */
151         LIST_FIELDS(Unit, cgroup_queue);
152
153         /* PIDs we keep an eye on. Note that a unit might have many
154          * more, but these are the ones we care enough about to
155          * process SIGCHLD for */
156         Set *pids;
157
158         /* Used during GC sweeps */
159         unsigned gc_marker;
160
161         /* When deserializing, temporarily store the job type for this
162          * unit here, if there was a job scheduled.
163          * Only for deserializing from a legacy version. New style uses full
164          * serialized jobs. */
165         int deserialized_job; /* This is actually of type JobType */
166
167         /* Error code when we didn't manage to load the unit (negative) */
168         int load_error;
169
170         /* Cached unit file state */
171         UnitFileState unit_file_state;
172
173         /* Counterparts in the cgroup filesystem */
174         char *cgroup_path;
175         CGroupControllerMask cgroup_realized_mask;
176         CGroupControllerMask cgroup_subtree_mask;
177         CGroupControllerMask cgroup_members_mask;
178
179         /* How to start OnFailure units */
180         JobMode on_failure_job_mode;
181
182         /* Garbage collect us we nobody wants or requires us anymore */
183         bool stop_when_unneeded;
184
185         /* Create default dependencies */
186         bool default_dependencies;
187
188         /* Refuse manual starting, allow starting only indirectly via dependency. */
189         bool refuse_manual_start;
190
191         /* Don't allow the user to stop this unit manually, allow stopping only indirectly via dependency. */
192         bool refuse_manual_stop;
193
194         /* Allow isolation requests */
195         bool allow_isolate;
196
197         /* Ignore this unit when isolating */
198         bool ignore_on_isolate;
199
200         /* Ignore this unit when snapshotting */
201         bool ignore_on_snapshot;
202
203         /* Did the last condition check succeed? */
204         bool condition_result;
205
206         /* Is this a transient unit? */
207         bool transient;
208
209         bool in_load_queue:1;
210         bool in_dbus_queue:1;
211         bool in_cleanup_queue:1;
212         bool in_gc_queue:1;
213         bool in_cgroup_queue:1;
214
215         bool sent_dbus_new_signal:1;
216
217         bool no_gc:1;
218
219         bool in_audit:1;
220
221         bool cgroup_realized:1;
222         bool cgroup_members_mask_valid:1;
223         bool cgroup_subtree_mask_valid:1;
224 };
225
226 struct UnitStatusMessageFormats {
227         const char *starting_stopping[2];
228         const char *finished_start_job[_JOB_RESULT_MAX];
229         const char *finished_stop_job[_JOB_RESULT_MAX];
230 };
231
232 typedef enum UnitSetPropertiesMode {
233         UNIT_CHECK = 0,
234         UNIT_RUNTIME = 1,
235         UNIT_PERSISTENT = 2,
236 } UnitSetPropertiesMode;
237
238 #include "service.h"
239 #include "socket.h"
240 #include "busname.h"
241 #include "target.h"
242 #include "snapshot.h"
243 #include "device.h"
244 #include "mount.h"
245 #include "automount.h"
246 #include "swap.h"
247 #include "timer.h"
248 #include "path.h"
249 #include "slice.h"
250 #include "scope.h"
251
252 struct UnitVTable {
253         /* How much memory does an object of this unit type need */
254         size_t object_size;
255
256         /* If greater than 0, the offset into the object where
257          * ExecContext is found, if the unit type has that */
258         size_t exec_context_offset;
259
260         /* If greater than 0, the offset into the object where
261          * CGroupContext is found, if the unit type has that */
262         size_t cgroup_context_offset;
263
264         /* If greater than 0, the offset into the object where
265          * KillContext is found, if the unit type has that */
266         size_t kill_context_offset;
267
268         /* If greater than 0, the offset into the object where the
269          * pointer to ExecRuntime is found, if the unit type has
270          * that */
271         size_t exec_runtime_offset;
272
273         /* The name of the configuration file section with the private settings of this unit*/
274         const char *private_section;
275
276         /* Config file sections this unit type understands, separated
277          * by NUL chars */
278         const char *sections;
279
280         /* This should reset all type-specific variables. This should
281          * not allocate memory, and is called with zero-initialized
282          * data. It should hence only initialize variables that need
283          * to be set != 0. */
284         void (*init)(Unit *u);
285
286         /* This should free all type-specific variables. It should be
287          * idempotent. */
288         void (*done)(Unit *u);
289
290         /* Actually load data from disk. This may fail, and should set
291          * load_state to UNIT_LOADED, UNIT_MERGED or leave it at
292          * UNIT_STUB if no configuration could be found. */
293         int (*load)(Unit *u);
294
295         /* If a lot of units got created via enumerate(), this is
296          * where to actually set the state and call unit_notify(). */
297         int (*coldplug)(Unit *u);
298
299         void (*dump)(Unit *u, FILE *f, const char *prefix);
300
301         int (*start)(Unit *u);
302         int (*stop)(Unit *u);
303         int (*reload)(Unit *u);
304
305         int (*kill)(Unit *u, KillWho w, int signo, sd_bus_error *error);
306
307         bool (*can_reload)(Unit *u);
308
309         /* Write all data that cannot be restored from other sources
310          * away using unit_serialize_item() */
311         int (*serialize)(Unit *u, FILE *f, FDSet *fds);
312
313         /* Restore one item from the serialization */
314         int (*deserialize_item)(Unit *u, const char *key, const char *data, FDSet *fds);
315
316         /* Try to match up fds with what we need for this unit */
317         int (*distribute_fds)(Unit *u, FDSet *fds);
318
319         /* Boils down the more complex internal state of this unit to
320          * a simpler one that the engine can understand */
321         UnitActiveState (*active_state)(Unit *u);
322
323         /* Returns the substate specific to this unit type as
324          * string. This is purely information so that we can give the
325          * user a more fine grained explanation in which actual state a
326          * unit is in. */
327         const char* (*sub_state_to_string)(Unit *u);
328
329         /* Return true when there is reason to keep this entry around
330          * even nothing references it and it isn't active in any
331          * way */
332         bool (*check_gc)(Unit *u);
333
334         /* Return true when this unit is suitable for snapshotting */
335         bool (*check_snapshot)(Unit *u);
336
337         /* Invoked on every child that died */
338         void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
339
340         /* Reset failed state if we are in failed state */
341         void (*reset_failed)(Unit *u);
342
343         /* Called whenever any of the cgroups this unit watches for
344          * ran empty */
345         void (*notify_cgroup_empty)(Unit *u);
346
347         /* Called whenever a process of this unit sends us a message */
348         void (*notify_message)(Unit *u, pid_t pid, char **tags);
349
350         /* Called whenever a name this Unit registered for comes or
351          * goes away. */
352         void (*bus_name_owner_change)(Unit *u, const char *name, const char *old_owner, const char *new_owner);
353
354         /* Called for each property that is being set */
355         int (*bus_set_property)(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
356
357         /* Called after at least one property got changed to apply the necessary change */
358         int (*bus_commit_properties)(Unit *u);
359
360         /* Return the unit this unit is following */
361         Unit *(*following)(Unit *u);
362
363         /* Return the set of units that are following each other */
364         int (*following_set)(Unit *u, Set **s);
365
366         /* Invoked each time a unit this unit is triggering changes
367          * state or gains/loses a job */
368         void (*trigger_notify)(Unit *u, Unit *trigger);
369
370         /* Called whenever CLOCK_REALTIME made a jump */
371         void (*time_change)(Unit *u);
372
373         int (*get_timeout)(Unit *u, uint64_t *timeout);
374
375         /* This is called for each unit type and should be used to
376          * enumerate existing devices and load them. However,
377          * everything that is loaded here should still stay in
378          * inactive state. It is the job of the coldplug() call above
379          * to put the units into the initial state.  */
380         int (*enumerate)(Manager *m);
381
382         /* Type specific cleanups. */
383         void (*shutdown)(Manager *m);
384
385         /* The interface name */
386         const char *bus_interface;
387
388         /* The bus vtable */
389         const sd_bus_vtable *bus_vtable;
390
391         /* The strings to print in status messages */
392         UnitStatusMessageFormats status_message_formats;
393
394         /* Can units of this type have multiple names? */
395         bool no_alias:1;
396
397         /* Instances make no sense for this type */
398         bool no_instances:1;
399
400         /* Exclude from automatic gc */
401         bool no_gc:1;
402
403         /* True if transient units of this type are OK */
404         bool can_transient:1;
405 };
406
407 extern const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX];
408
409 #define UNIT_VTABLE(u) unit_vtable[(u)->type]
410
411 /* For casting a unit into the various unit types */
412 #define DEFINE_CAST(UPPERCASE, MixedCase)                               \
413         static inline MixedCase* UPPERCASE(Unit *u) {                   \
414                 if (_unlikely_(!u || u->type != UNIT_##UPPERCASE))      \
415                         return NULL;                                    \
416                                                                         \
417                 return (MixedCase*) u;                                  \
418         }
419
420 /* For casting the various unit types into a unit */
421 #define UNIT(u) (&(u)->meta)
422
423 #define UNIT_TRIGGER(u) ((Unit*) set_first((u)->dependencies[UNIT_TRIGGERS]))
424
425 DEFINE_CAST(SERVICE, Service);
426 DEFINE_CAST(SOCKET, Socket);
427 DEFINE_CAST(BUSNAME, BusName);
428 DEFINE_CAST(TARGET, Target);
429 DEFINE_CAST(SNAPSHOT, Snapshot);
430 DEFINE_CAST(DEVICE, Device);
431 DEFINE_CAST(MOUNT, Mount);
432 DEFINE_CAST(AUTOMOUNT, Automount);
433 DEFINE_CAST(SWAP, Swap);
434 DEFINE_CAST(TIMER, Timer);
435 DEFINE_CAST(PATH, Path);
436 DEFINE_CAST(SLICE, Slice);
437 DEFINE_CAST(SCOPE, Scope);
438
439 Unit *unit_new(Manager *m, size_t size);
440 void unit_free(Unit *u);
441
442 int unit_add_name(Unit *u, const char *name);
443
444 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference);
445 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference);
446
447 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
448 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
449
450 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *filename, bool add_reference);
451 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference);
452
453 int unit_add_exec_dependencies(Unit *u, ExecContext *c);
454
455 int unit_choose_id(Unit *u, const char *name);
456 int unit_set_description(Unit *u, const char *description);
457
458 bool unit_check_gc(Unit *u);
459
460 void unit_add_to_load_queue(Unit *u);
461 void unit_add_to_dbus_queue(Unit *u);
462 void unit_add_to_cleanup_queue(Unit *u);
463 void unit_add_to_gc_queue(Unit *u);
464
465 int unit_merge(Unit *u, Unit *other);
466 int unit_merge_by_name(Unit *u, const char *other);
467
468 Unit *unit_follow_merge(Unit *u) _pure_;
469
470 int unit_load_fragment_and_dropin(Unit *u);
471 int unit_load_fragment_and_dropin_optional(Unit *u);
472 int unit_load(Unit *unit);
473
474 int unit_add_default_slice(Unit *u, CGroupContext *c);
475
476 const char *unit_description(Unit *u) _pure_;
477
478 bool unit_has_name(Unit *u, const char *name);
479
480 UnitActiveState unit_active_state(Unit *u);
481
482 const char* unit_sub_state_to_string(Unit *u);
483
484 void unit_dump(Unit *u, FILE *f, const char *prefix);
485
486 bool unit_can_reload(Unit *u) _pure_;
487 bool unit_can_start(Unit *u) _pure_;
488 bool unit_can_isolate(Unit *u) _pure_;
489
490 int unit_start(Unit *u);
491 int unit_stop(Unit *u);
492 int unit_reload(Unit *u);
493
494 int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error);
495 int unit_kill_common(Unit *u, KillWho who, int signo, pid_t main_pid, pid_t control_pid, sd_bus_error *error);
496
497 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success);
498
499 int unit_watch_pid(Unit *u, pid_t pid);
500 void unit_unwatch_pid(Unit *u, pid_t pid);
501 int unit_watch_all_pids(Unit *u);
502 void unit_unwatch_all_pids(Unit *u);
503
504 void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2);
505
506 int unit_watch_bus_name(Unit *u, const char *name);
507 void unit_unwatch_bus_name(Unit *u, const char *name);
508
509 bool unit_job_is_applicable(Unit *u, JobType j);
510
511 int set_unit_path(const char *p);
512
513 char *unit_dbus_path(Unit *u);
514
515 int unit_load_related_unit(Unit *u, const char *type, Unit **_found);
516
517 bool unit_can_serialize(Unit *u) _pure_;
518 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs);
519 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *value, ...) _printf_(4,5);
520 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
521 int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
522
523 int unit_add_node_link(Unit *u, const char *what, bool wants);
524
525 int unit_coldplug(Unit *u);
526
527 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_(3, 0);
528
529 bool unit_need_daemon_reload(Unit *u);
530
531 void unit_reset_failed(Unit *u);
532
533 Unit *unit_following(Unit *u);
534 int unit_following_set(Unit *u, Set **s);
535
536 const char *unit_slice_name(Unit *u);
537
538 bool unit_stop_pending(Unit *u) _pure_;
539 bool unit_inactive_or_pending(Unit *u) _pure_;
540 bool unit_active_or_pending(Unit *u);
541
542 int unit_add_default_target_dependency(Unit *u, Unit *target);
543
544 char *unit_default_cgroup_path(Unit *u);
545
546 void unit_start_on_failure(Unit *u);
547 void unit_trigger_notify(Unit *u);
548
549 UnitFileState unit_get_unit_file_state(Unit *u);
550
551 Unit* unit_ref_set(UnitRef *ref, Unit *u);
552 void unit_ref_unset(UnitRef *ref);
553
554 #define UNIT_DEREF(ref) ((ref).unit)
555 #define UNIT_ISSET(ref) (!!(ref).unit)
556
557 int unit_patch_contexts(Unit *u);
558
559 ExecContext *unit_get_exec_context(Unit *u) _pure_;
560 KillContext *unit_get_kill_context(Unit *u) _pure_;
561 CGroupContext *unit_get_cgroup_context(Unit *u) _pure_;
562
563 ExecRuntime *unit_get_exec_runtime(Unit *u) _pure_;
564
565 int unit_setup_exec_runtime(Unit *u);
566
567 int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
568 int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
569
570 int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data);
571 int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) _printf_(4,5);
572
573 int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name);
574
575 int unit_kill_context(Unit *u, KillContext *c, bool sigkill, pid_t main_pid, pid_t control_pid, bool main_pid_alien);
576
577 int unit_make_transient(Unit *u);
578
579 int unit_require_mounts_for(Unit *u, const char *path);
580
581 const char *unit_active_state_to_string(UnitActiveState i) _const_;
582 UnitActiveState unit_active_state_from_string(const char *s) _pure_;
583
584 /* Macros which append UNIT= or USER_UNIT= to the message */
585
586 #define log_full_unit(level, unit, ...) log_meta_object(level, __FILE__, __LINE__, __func__, getpid() == 1 ? "UNIT=" : "USER_UNIT=", unit, __VA_ARGS__)
587 #define log_debug_unit(unit, ...)       log_full_unit(LOG_DEBUG, unit, __VA_ARGS__)
588 #define log_info_unit(unit, ...)        log_full_unit(LOG_INFO, unit, __VA_ARGS__)
589 #define log_notice_unit(unit, ...)      log_full_unit(LOG_NOTICE, unit, __VA_ARGS__)
590 #define log_warning_unit(unit, ...)     log_full_unit(LOG_WARNING, unit, __VA_ARGS__)
591 #define log_error_unit(unit, ...)       log_full_unit(LOG_ERR, unit, __VA_ARGS__)
592
593 #define log_struct_unit(level, unit, ...) log_struct(level, getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, __VA_ARGS__)