]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.h
manager: add manager_set_unit_defaults() call that sets all unit defaults in one go
[thirdparty/systemd.git] / src / core / manager.h
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
c2f1db8f 2#pragma once
60918275
LP
3
4#include <stdbool.h>
a66d02c3 5#include <stdio.h>
ea430986 6
718db961 7#include "sd-bus.h"
d0955f00 8#include "sd-device.h"
718db961 9#include "sd-event.h"
71d35b6b 10
4ad49000 11#include "cgroup-util.h"
3a0f06c4 12#include "cgroup.h"
400f1a33 13#include "fdset.h"
2e5c94b9
LP
14#include "hashmap.h"
15#include "list.h"
da8e1782 16#include "prioq.h"
2e5c94b9 17#include "ratelimit.h"
19d22d43 18#include "varlink.h"
a16e1123 19
227b8a76 20struct libmnt_monitor;
57b7a260 21typedef struct Unit Unit;
227b8a76 22
4f0f902f 23/* Enforce upper limit how many names we allow */
59d1a833 24#define MANAGER_MAX_NAMES 131072 /* 128K */
4f0f902f 25
60918275 26typedef struct Manager Manager;
acbb0225 27
89998745
LP
28/* An externally visible state. We don't actually maintain this as state variable, but derive it from various fields
29 * when requested */
f755e3b7 30typedef enum ManagerState {
d81afec1 31 MANAGER_INITIALIZING,
f755e3b7 32 MANAGER_STARTING,
a16e1123 33 MANAGER_RUNNING,
f755e3b7
LP
34 MANAGER_DEGRADED,
35 MANAGER_MAINTENANCE,
36 MANAGER_STOPPING,
37 _MANAGER_STATE_MAX,
2d93c20e 38 _MANAGER_STATE_INVALID = -EINVAL,
f755e3b7
LP
39} ManagerState;
40
af41e508 41typedef enum ManagerObjective {
f755e3b7 42 MANAGER_OK,
a16e1123
LP
43 MANAGER_EXIT,
44 MANAGER_RELOAD,
45 MANAGER_REEXECUTE,
b9080b03 46 MANAGER_REBOOT,
13ffc607 47 MANAGER_SOFT_REBOOT,
b9080b03
FF
48 MANAGER_POWEROFF,
49 MANAGER_HALT,
50 MANAGER_KEXEC,
664f88a7 51 MANAGER_SWITCH_ROOT,
af41e508 52 _MANAGER_OBJECTIVE_MAX,
2d93c20e 53 _MANAGER_OBJECTIVE_INVALID = -EINVAL,
af41e508 54} ManagerObjective;
a16e1123 55
127d5fd1
ZJS
56typedef enum StatusType {
57 STATUS_TYPE_EPHEMERAL,
58 STATUS_TYPE_NORMAL,
5bcf34eb 59 STATUS_TYPE_NOTICE,
ebc5788e 60 STATUS_TYPE_EMERGENCY,
127d5fd1
ZJS
61} StatusType;
62
afcfaa69 63typedef enum OOMPolicy {
38c41427
NK
64 OOM_CONTINUE, /* The kernel or systemd-oomd kills the process it wants to kill, and that's it */
65 OOM_STOP, /* The kernel or systemd-oomd kills the process it wants to kill, and we stop the unit */
66 OOM_KILL, /* The kernel or systemd-oomd kills the process it wants to kill, and all others in the unit, and we stop the unit */
afcfaa69 67 _OOM_POLICY_MAX,
2d93c20e 68 _OOM_POLICY_INVALID = -EINVAL,
afcfaa69
LP
69} OOMPolicy;
70
7bc740f4
YW
71/* Notes:
72 * 1. TIMESTAMP_FIRMWARE, TIMESTAMP_LOADER, TIMESTAMP_KERNEL, TIMESTAMP_INITRD,
73 * TIMESTAMP_SECURITY_START, and TIMESTAMP_SECURITY_FINISH are set only when
74 * the manager is system and not running under container environment.
75 *
76 * 2. The monotonic timestamp of TIMESTAMP_KERNEL is always zero.
77 *
78 * 3. The realtime timestamp of TIMESTAMP_KERNEL will be unset if the system does not
79 * have RTC.
80 *
81 * 4. TIMESTAMP_FIRMWARE and TIMESTAMP_LOADER will be unset if the system does not
82 * have RTC, or systemd is built without EFI support.
83 *
84 * 5. The monotonic timestamps of TIMESTAMP_FIRMWARE and TIMESTAMP_LOADER are stored as
85 * negative of the actual value.
86 *
87 * 6. TIMESTAMP_USERSPACE is the timestamp of when the manager was started.
88 *
89 * 7. TIMESTAMP_INITRD_* are set only when the system is booted with an initrd.
90 */
91
9f9f0342
LP
92typedef enum ManagerTimestamp {
93 MANAGER_TIMESTAMP_FIRMWARE,
94 MANAGER_TIMESTAMP_LOADER,
95 MANAGER_TIMESTAMP_KERNEL,
96 MANAGER_TIMESTAMP_INITRD,
97 MANAGER_TIMESTAMP_USERSPACE,
98 MANAGER_TIMESTAMP_FINISH,
99
100 MANAGER_TIMESTAMP_SECURITY_START,
101 MANAGER_TIMESTAMP_SECURITY_FINISH,
102 MANAGER_TIMESTAMP_GENERATORS_START,
103 MANAGER_TIMESTAMP_GENERATORS_FINISH,
104 MANAGER_TIMESTAMP_UNITS_LOAD_START,
105 MANAGER_TIMESTAMP_UNITS_LOAD_FINISH,
49fbe940 106 MANAGER_TIMESTAMP_UNITS_LOAD,
d4ee7bd8
YW
107
108 MANAGER_TIMESTAMP_INITRD_SECURITY_START,
109 MANAGER_TIMESTAMP_INITRD_SECURITY_FINISH,
110 MANAGER_TIMESTAMP_INITRD_GENERATORS_START,
111 MANAGER_TIMESTAMP_INITRD_GENERATORS_FINISH,
112 MANAGER_TIMESTAMP_INITRD_UNITS_LOAD_START,
113 MANAGER_TIMESTAMP_INITRD_UNITS_LOAD_FINISH,
9f9f0342 114 _MANAGER_TIMESTAMP_MAX,
2d93c20e 115 _MANAGER_TIMESTAMP_INVALID = -EINVAL,
9f9f0342
LP
116} ManagerTimestamp;
117
986935cf
FB
118typedef enum WatchdogType {
119 WATCHDOG_RUNTIME,
120 WATCHDOG_REBOOT,
121 WATCHDOG_KEXEC,
5717062e 122 WATCHDOG_PRETIMEOUT,
986935cf
FB
123 _WATCHDOG_TYPE_MAX,
124} WatchdogType;
125
400f1a33 126#include "execute.h"
60918275 127#include "job.h"
84e3543e 128#include "path-lookup.h"
4d7213b2 129#include "show-status.h"
400f1a33 130#include "unit-name.h"
60918275 131
638cece4 132typedef enum ManagerTestRunFlags {
f14d6810
MG
133 MANAGER_TEST_NORMAL = 0, /* run normally */
134 MANAGER_TEST_RUN_MINIMAL = 1 << 0, /* create basic data structures */
135 MANAGER_TEST_RUN_BASIC = 1 << 1, /* interact with the environment */
136 MANAGER_TEST_RUN_ENV_GENERATORS = 1 << 2, /* also run env generators */
137 MANAGER_TEST_RUN_GENERATORS = 1 << 3, /* also run unit generators */
138 MANAGER_TEST_RUN_IGNORE_DEPENDENCIES = 1 << 4, /* run while ignoring dependencies */
e8112e67 139 MANAGER_TEST_FULL = MANAGER_TEST_RUN_BASIC | MANAGER_TEST_RUN_ENV_GENERATORS | MANAGER_TEST_RUN_GENERATORS,
638cece4
LP
140} ManagerTestRunFlags;
141
e0a3da1f
ZJS
142assert_cc((MANAGER_TEST_FULL & UINT8_MAX) == MANAGER_TEST_FULL);
143
c9e120e0
LP
144/* Various defaults for unit file settings. */
145typedef struct UnitDefaults {
146 ExecOutput std_output, std_error;
147
148 usec_t restart_usec, timeout_start_usec, timeout_stop_usec, timeout_abort_usec, device_timeout_usec;
149 bool timeout_abort_set;
150
151 usec_t start_limit_interval;
152 unsigned start_limit_burst;
153
154 bool cpu_accounting;
155 bool memory_accounting;
156 bool io_accounting;
157 bool blockio_accounting;
158 bool tasks_accounting;
159 bool ip_accounting;
160
161 TasksMax tasks_max;
162 usec_t timer_accuracy_usec;
163
164 OOMPolicy oom_policy;
165 int oom_score_adjust;
166 bool oom_score_adjust_set;
167
168 CGroupPressureWatch memory_pressure_watch;
169 usec_t memory_pressure_threshold_usec;
170
171 char *smack_process_label;
172
173 struct rlimit *rlimit[_RLIMIT_MAX];
174} UnitDefaults;
175
60918275 176struct Manager {
87f0e418 177 /* Note that the set of units we know of is allowed to be
35b8ca3a 178 * inconsistent. However the subset of it that is loaded may
87d1515d
LP
179 * not, and the list of jobs may neither. */
180
87f0e418
LP
181 /* Active jobs and units */
182 Hashmap *units; /* name string => Unit object n:1 */
4b58153d 183 Hashmap *units_by_invocation_id;
60918275
LP
184 Hashmap *jobs; /* job id => Job object 1:1 */
185
ef734fd6
LP
186 /* To make it easy to iterate through the units of a specific
187 * type we maintain a per type linked list */
ac155bb8 188 LIST_HEAD(Unit, units_by_type[_UNIT_TYPE_MAX]);
ef734fd6 189
87f0e418 190 /* Units that need to be loaded */
ac155bb8 191 LIST_HEAD(Unit, load_queue); /* this is actually more a stack than a queue, but uh. */
60918275 192
034c6ed7 193 /* Jobs that need to be run */
da8e1782 194 struct Prioq *run_queue;
034c6ed7 195
c1e1601e
LP
196 /* Units and jobs that have not yet been announced via
197 * D-Bus. When something about a job changes it is added here
198 * if it is not in there yet. This allows easy coalescing of
199 * D-Bus change signals. */
ac155bb8 200 LIST_HEAD(Unit, dbus_unit_queue);
c1e1601e
LP
201 LIST_HEAD(Job, dbus_job_queue);
202
701cc384 203 /* Units to remove */
ac155bb8 204 LIST_HEAD(Unit, cleanup_queue);
23a177ef 205
c5a97ed1
LP
206 /* Units and jobs to check when doing GC */
207 LIST_HEAD(Unit, gc_unit_queue);
208 LIST_HEAD(Job, gc_job_queue);
701cc384 209
4ad49000 210 /* Units that should be realized */
91a6073e 211 LIST_HEAD(Unit, cgroup_realize_queue);
4ad49000 212
09e24654
LP
213 /* Units whose cgroup ran empty */
214 LIST_HEAD(Unit, cgroup_empty_queue);
215
afcfaa69
LP
216 /* Units whose memory.event fired */
217 LIST_HEAD(Unit, cgroup_oom_queue);
218
19496554
MS
219 /* Target units whose default target dependencies haven't been set yet */
220 LIST_HEAD(Unit, target_deps_queue);
221
a3c1168a
LP
222 /* Units that might be subject to StopWhenUnneeded= clean-up */
223 LIST_HEAD(Unit, stop_when_unneeded_queue);
224
0bc488c9
LP
225 /* Units which are upheld by another other which we might need to act on */
226 LIST_HEAD(Unit, start_when_upheld_queue);
227
56c59592
LP
228 /* Units that have BindsTo= another unit, and might need to be shutdown because the bound unit is not active. */
229 LIST_HEAD(Unit, stop_when_bound_queue);
230
6ac62d61
LP
231 /* Units that have resources open, and where it might be good to check if they can be released now */
232 LIST_HEAD(Unit, release_resources_queue);
233
718db961
LP
234 sd_event *event;
235
be7148eb 236 /* This maps PIDs we care about to units that are interested in. We allow multiple units to be interested in
62a76913
LP
237 * the same PID and multiple PIDs to be relevant to the same unit. Since in most cases only a single unit will
238 * be interested in the same PID we use a somewhat special encoding here: the first unit interested in a PID is
239 * stored directly in the hashmap, keyed by the PID unmodified. If there are other units interested too they'll
240 * be stored in a NULL-terminated array, and keyed by the negative PID. This is safe as pid_t is signed and
241 * negative PIDs are not used for regular processes but process groups, which we don't care about in this
242 * context, but this allows us to use the negative range for our own purposes. */
243 Hashmap *watch_pids; /* pid => unit as well as -pid => array of units */
9152c765 244
95ae05c0
WC
245 /* A set contains all units which cgroup should be refreshed after startup */
246 Set *startup_units;
247
f755e3b7
LP
248 /* A set which contains all currently failed units */
249 Set *failed_units;
250
752b5905
LP
251 sd_event_source *run_queue_event_source;
252
c952c6ec 253 char *notify_socket;
718db961
LP
254 int notify_fd;
255 sd_event_source *notify_event_source;
256
d8fdc620
LP
257 int cgroups_agent_fd;
258 sd_event_source *cgroups_agent_event_source;
259
718db961
LP
260 int signal_fd;
261 sd_event_source *signal_event_source;
c952c6ec 262
575b300b
LP
263 sd_event_source *sigchld_event_source;
264
718db961 265 sd_event_source *time_change_event_source;
9d58f1db 266
bbf5fd8e
LP
267 sd_event_source *timezone_change_event_source;
268
718db961 269 sd_event_source *jobs_in_progress_event_source;
acbb0225 270
00d9ef85
LP
271 int user_lookup_fds[2];
272 sd_event_source *user_lookup_event_source;
273
4870133b
LP
274 RuntimeScope runtime_scope;
275
84e3543e 276 LookupPaths lookup_paths;
e8630e69
ZJS
277 Hashmap *unit_id_map;
278 Hashmap *unit_name_map;
fe51822e 279 Set *unit_path_cache;
c2911d48 280 uint64_t unit_cache_timestamp_hash;
036643a2 281
1ad6e8b3
LP
282 char **transient_environment; /* The environment, as determined from config files, kernel cmdline and environment generators */
283 char **client_environment; /* Environment variables created by clients through the bus API */
1137a57c 284
986935cf
FB
285 usec_t watchdog[_WATCHDOG_TYPE_MAX];
286 usec_t watchdog_overridden[_WATCHDOG_TYPE_MAX];
aff3a9e1
LB
287 char *watchdog_pretimeout_governor;
288 char *watchdog_pretimeout_governor_overridden;
e96d6be7 289
9f9f0342 290 dual_timestamp timestamps[_MANAGER_TIMESTAMP_MAX];
8d567588 291
9670d583 292 /* Data specific to the device subsystem */
d0955f00 293 sd_device_monitor *device_monitor;
8fe914ec 294 Hashmap *devices_by_sysfs;
ef734fd6
LP
295
296 /* Data specific to the mount subsystem */
d379d442 297 struct libmnt_monitor *mount_monitor;
718db961 298 sd_event_source *mount_event_source;
ea430986 299
07b0b134
ML
300 /* Data specific to the swap filesystem */
301 FILE *proc_swaps;
718db961 302 sd_event_source *swap_event_source;
9670d583 303 Hashmap *swaps_by_devnode;
07b0b134 304
ea430986 305 /* Data specific to the D-Bus subsystem */
718db961
LP
306 sd_bus *api_bus, *system_bus;
307 Set *private_buses;
308 int private_listen_fd;
309 sd_event_source *private_listen_event_source;
8f8f05a9
LP
310
311 /* Contains all the clients that are subscribed to signals via
312 the API bus. Note that private bus connections are always
313 considered subscribes, since they last for very short only,
314 and it is much simpler that way. */
315 sd_bus_track *subscribed;
316 char **deserialized_subscribed;
5e8d1c9a 317
8f88ecf6
LP
318 /* This is used during reloading: before the reload we queue
319 * the reply message here, and afterwards we send it */
209de525 320 sd_bus_message *pending_reload_message;
8e274523 321
05e343b7 322 Hashmap *watch_bus; /* D-Bus names => Unit object n:1 */
05e343b7 323
71445ae7
LP
324 bool send_reloading_done;
325
7fab9d01 326 uint32_t current_job_id;
bacbccb7 327 uint32_t default_unit_job_id;
7fab9d01 328
9d58f1db
LP
329 /* Data specific to the Automount subsystem */
330 int dev_autofs_fd;
331
8e274523 332 /* Data specific to the cgroup subsystem */
4ad49000 333 Hashmap *cgroup_unit;
efdb0237 334 CGroupMask cgroup_supported;
9444b1f2 335 char *cgroup_root;
e537352b 336
09e24654 337 /* Notifications from cgroups, when the unified hierarchy is used is done via inotify. */
efdb0237
LP
338 int cgroup_inotify_fd;
339 sd_event_source *cgroup_inotify_event_source;
afcfaa69
LP
340
341 /* Maps for finding the unit for each inotify watch descriptor for the cgroup.events and
342 * memory.events cgroupv2 attributes. */
0bb814c2 343 Hashmap *cgroup_control_inotify_wd_unit;
afcfaa69 344 Hashmap *cgroup_memory_inotify_wd_unit;
701cc384 345
09e24654
LP
346 /* A defer event for handling cgroup empty events and processing them after SIGCHLD in all cases. */
347 sd_event_source *cgroup_empty_event_source;
afcfaa69 348 sd_event_source *cgroup_oom_event_source;
09e24654 349
35b8ca3a 350 /* Make sure the user cannot accidentally unmount our cgroup
33be102a
LP
351 * file system */
352 int pin_cgroupfs_fd;
353
892a035c 354 unsigned gc_marker;
efdb0237 355
bbf5fd8e
LP
356 /* The stat() data the last time we saw /etc/localtime */
357 usec_t etc_localtime_mtime;
ec08f270 358 bool etc_localtime_accessible;
bbf5fd8e 359
ec08f270 360 ManagerObjective objective;
41447faf 361
af41e508 362 /* Flags */
ec08f270 363 bool dispatching_load_queue;
9d58f1db 364
d8eb10d6 365 /* Have we already sent out the READY=1 notification? */
ec08f270 366 bool ready_sent;
0c2826c6 367
6d932659
ZJS
368 /* Was the last status sent "STATUS=Ready."? */
369 bool status_ready;
370
d8eb10d6 371 /* Have we already printed the taint line if necessary? */
ec08f270 372 bool taint_logged;
d8eb10d6 373
00b5974f 374 /* Have we ever changed the "kernel.pid_max" sysctl? */
ec08f270 375 bool sysctl_pid_max_changed;
00b5974f 376
ec08f270 377 ManagerTestRunFlags test_run_flags;
0d8c31ff 378
287419c1
AC
379 /* If non-zero, exit with the following value when the systemd
380 * process terminate. Useful for containers: systemd-nspawn could get
381 * the return value. */
382 uint8_t return_value;
383
d450b6f2 384 ShowStatus show_status;
44a41954 385 ShowStatus show_status_overridden;
36cf4507 386 StatusUnitFormat status_unit_format;
7d5ceb64 387 char *confirm_spawn;
31a7eb86 388 bool no_console_output;
2a12e32e 389 bool service_watchdogs;
d3689161 390
c9e120e0 391 UnitDefaults defaults;
6bb00842 392
a6ecbf83 393 int original_log_level;
bda7d78b 394 LogTarget original_log_target;
ec08f270
ZJS
395 bool log_level_overridden;
396 bool log_target_overridden;
a6ecbf83 397
a7556052
LP
398 /* non-zero if we are reloading or reexecuting, */
399 int n_reloading;
e409f875
LP
400
401 unsigned n_installed_jobs;
76bf48b7 402 unsigned n_failed_jobs;
f2b68789 403
03b717a3 404 /* Jobs in progress watching */
637f8b8e 405 unsigned n_running_jobs;
7ed9f6cd 406 unsigned n_on_console;
03b717a3 407 unsigned jobs_in_progress_iteration;
637f8b8e 408
e46b13c8
ZJS
409 /* Do we have any outstanding password prompts? */
410 int have_ask_password;
411 int ask_password_inotify_fd;
412 sd_event_source *ask_password_event_source;
413
f2b68789 414 /* Type=idle pipes */
31a7eb86 415 int idle_pipe[4];
718db961 416 sd_event_source *idle_pipe_event_source;
664f88a7
LP
417
418 char *switch_root;
419 char *switch_root_init;
a57f7e2c 420
d35fe8c0
FB
421 /* This is true before and after switching root. */
422 bool switching_root;
423
a57f7e2c
LP
424 /* This maps all possible path prefixes to the units needing
425 * them. It's a hashmap with a path string as key and a Set as
426 * value where Unit objects are contained. */
427 Hashmap *units_requiring_mounts_for;
e3dd987c 428
283868e1
SW
429 /* Used for processing polkit authorization responses */
430 Hashmap *polkit_registry;
2e5c94b9 431
29206d46
LP
432 /* Dynamic users/groups, indexed by their name */
433 Hashmap *dynamic_users;
434
00d9ef85
LP
435 /* Keep track of all UIDs and GIDs any of our services currently use. This is useful for the RemoveIPC= logic. */
436 Hashmap *uid_refs;
437 Hashmap *gid_refs;
438
e76506b7
DDM
439 /* ExecSharedRuntime, indexed by their owner unit id */
440 Hashmap *exec_shared_runtime_by_id;
e8a565cb 441
24dd31c1 442 /* When the user hits C-A-D more than 7 times per 2s, do something immediately... */
2e5c94b9 443 RateLimit ctrl_alt_del_ratelimit;
ae8c7939 444 EmergencyAction cad_burst_action;
f2341e0a
LP
445
446 const char *unit_log_field;
447 const char *unit_log_format_string;
ae2a2c53 448
4b58153d
LP
449 const char *invocation_log_field;
450 const char *invocation_log_format_string;
451
463d0d15 452 int first_boot; /* tri-state */
3536f49e 453
62a76913 454 /* Prefixes of e.g. RuntimeDirectory= */
72fd1768 455 char *prefix[_EXEC_DIRECTORY_TYPE_MAX];
2ad591a3
LP
456 char *received_credentials_directory;
457 char *received_encrypted_credentials_directory;
62a76913
LP
458
459 /* Used in the SIGCHLD and sd_notify() message invocation logic to avoid that we dispatch the same event
460 * multiple times on the same unit. */
461 unsigned sigchldgen;
462 unsigned notifygen;
19d22d43
LP
463
464 VarlinkServer *varlink_server;
064a5c14
DDM
465 /* When we're a system manager, this object manages the subscription from systemd-oomd to PID1 that's
466 * used to report changes in ManagedOOM settings (systemd server - oomd client). When
467 * we're a user manager, this object manages the client connection from the user manager to
468 * systemd-oomd to report changes in ManagedOOM settings (systemd client - oomd server). */
469 Varlink *managed_oom_varlink;
184b4f78
ILG
470
471 /* Reference to RestrictFileSystems= BPF program */
472 struct restrict_fs_bpf *restrict_fs;
aa5ae971 473
856bfaeb
LB
474 /* Allow users to configure a rate limit for Reload() operations */
475 RateLimit reload_ratelimit;
d9365956
LB
476 /* Dump*() are slow, so always rate limit them to 10 per 10 minutes */
477 RateLimit dump_ratelimit;
29e6b0c1
LP
478
479 sd_event_source *memory_pressure_event_source;
60918275
LP
480};
481
dc653bf4 482static inline usec_t manager_default_timeout_abort_usec(Manager *m) {
9c79f0e0 483 assert(m);
c9e120e0 484 return m->defaults.timeout_abort_set ? m->defaults.timeout_abort_usec : m->defaults.timeout_stop_usec;
dc653bf4
JK
485}
486
4870133b
LP
487#define MANAGER_IS_SYSTEM(m) ((m)->runtime_scope == RUNTIME_SCOPE_SYSTEM)
488#define MANAGER_IS_USER(m) ((m)->runtime_scope == RUNTIME_SCOPE_USER)
463d0d15 489
2c289ea8
LP
490#define MANAGER_IS_RELOADING(m) ((m)->n_reloading > 0)
491
49d5666c
LP
492#define MANAGER_IS_FINISHED(m) (dual_timestamp_is_set((m)->timestamps + MANAGER_TIMESTAMP_FINISH))
493
af41e508
LP
494/* The objective is set to OK as soon as we enter the main loop, and set otherwise as soon as we are done with it */
495#define MANAGER_IS_RUNNING(m) ((m)->objective == MANAGER_OK)
4259d202 496
d35fe8c0
FB
497#define MANAGER_IS_SWITCHING_ROOT(m) ((m)->switching_root)
498
638cece4
LP
499#define MANAGER_IS_TEST_RUN(m) ((m)->test_run_flags != 0)
500
4870133b
LP
501static inline usec_t manager_default_timeout(RuntimeScope scope) {
502 return scope == RUNTIME_SCOPE_SYSTEM ? DEFAULT_TIMEOUT_USEC : DEFAULT_USER_TIMEOUT_USEC;
e4c7b5f5
ZJS
503}
504
4870133b 505int manager_new(RuntimeScope scope, ManagerTestRunFlags test_run_flags, Manager **m);
06d8d842 506Manager* manager_free(Manager *m);
c70cac54 507DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
60918275 508
2a7cf953 509int manager_startup(Manager *m, FILE *serialization, FDSet *fds, const char *root);
f50e0a01 510
60918275 511Job *manager_get_job(Manager *m, uint32_t id);
87f0e418 512Unit *manager_get_unit(Manager *m, const char *name);
60918275 513
86fbf370 514int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
ea430986 515
81be2388 516bool manager_unit_cache_should_retry_load(Unit *u);
4b6a2b3f
ZJS
517int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **ret);
518int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **ret);
4109ede7 519int manager_load_startable_unit_or_warn(Manager *m, const char *name, const char *path, Unit **ret);
718db961 520int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
28247076 521
50cbaba4
LP
522int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, Set *affected_jobs, sd_bus_error *e, Job **_ret);
523int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, Set *affected_jobs, sd_bus_error *e, Job **_ret);
524int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Set *affected_jobs, Job **ret);
15d167f8 525int manager_propagate_reload(Manager *m, Unit *unit, JobMode mode, sd_bus_error *e);
60918275 526
7fad411c
LP
527void manager_clear_jobs(Manager *m);
528
f75f613d
FB
529void manager_unwatch_pid(Manager *m, pid_t pid);
530
c1e1601e 531unsigned manager_dispatch_load_queue(Manager *m);
f50e0a01 532
29e6b0c1
LP
533int manager_setup_memory_pressure_event_source(Manager *m);
534
79a224c4 535int manager_default_environment(Manager *m);
1ad6e8b3
LP
536int manager_transient_environment_add(Manager *m, char **plus);
537int manager_client_environment_modify(Manager *m, char **minus, char **plus);
538int manager_get_effective_environment(Manager *m, char ***ret);
539
bfb27b06 540int manager_set_unit_defaults(Manager *m, const UnitDefaults *defaults);
b2bb3dbe 541
b0c4b282
LP
542void manager_trigger_run_queue(Manager *m);
543
9152c765 544int manager_loop(Manager *m);
83c60c9f 545
a16e1123 546int manager_reload(Manager *m);
a01ba4b2
ZJS
547Manager* manager_reloading_start(Manager *m);
548void manager_reloading_stopp(Manager **m);
a16e1123 549
fdf20a31 550void manager_reset_failed(Manager *m);
5632e374 551
4927fcae 552void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
e983b760 553void manager_send_unit_plymouth(Manager *m, Unit *u);
4927fcae 554
31afa0a4 555bool manager_unit_inactive_or_pending(Manager *m, const char *name);
8f6df3fa 556
b0c918b9 557void manager_check_finished(Manager *m);
dd0ab174 558void manager_send_reloading(Manager *m);
b0c918b9 559
6123dfaa 560void disable_printk_ratelimit(void);
8559b3b7 561void manager_recheck_dbus(Manager *m);
4cfa2c99 562void manager_recheck_journal(Manager *m);
f1dd0c3f 563
44a41954 564bool manager_get_show_status_on(Manager *m);
7365a296 565void manager_set_show_status(Manager *m, ShowStatus mode, const char *reason);
43bba15a 566void manager_override_show_status(Manager *m, ShowStatus mode, const char *reason);
44a41954 567
e2680723 568void manager_set_first_boot(Manager *m, bool b);
d35fe8c0 569void manager_set_switching_root(Manager *m, bool switching_root);
e2680723 570
127d5fd1 571void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) _printf_(4,5);
68b29a9f 572
a57f7e2c 573Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);
e66cf1a3 574
f755e3b7
LP
575ManagerState manager_state(Manager *m);
576
5269eb6b 577int manager_update_failed_units(Manager *m, Unit *u, bool failed);
03455c28 578
00d9ef85
LP
579void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now);
580int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc);
581
582void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now);
2571aafb 583int manager_ref_gid(Manager *m, gid_t gid, bool clean_ipc);
00d9ef85 584
83fe5d8a 585char* manager_taint_string(const Manager *m);
af6b0ecc 586
adefcf28
LP
587void manager_ref_console(Manager *m);
588void manager_unref_console(Manager *m);
589
a6ecbf83
FB
590void manager_override_log_level(Manager *m, int level);
591void manager_restore_original_log_level(Manager *m);
592
bda7d78b
FB
593void manager_override_log_target(Manager *m, LogTarget target);
594void manager_restore_original_log_target(Manager *m);
595
f755e3b7
LP
596const char *manager_state_to_string(ManagerState m) _const_;
597ManagerState manager_state_from_string(const char *s) _pure_;
7d5ceb64
FB
598
599const char *manager_get_confirm_spawn(Manager *m);
b0eb2944
FB
600bool manager_is_confirm_spawn_disabled(Manager *m);
601void manager_disable_confirm_spawn(void);
9f9f0342
LP
602
603const char *manager_timestamp_to_string(ManagerTimestamp m) _const_;
604ManagerTimestamp manager_timestamp_from_string(const char *s) _pure_;
d4ee7bd8 605ManagerTimestamp manager_timestamp_initrd_mangle(ManagerTimestamp s);
afcfaa69 606
986935cf
FB
607usec_t manager_get_watchdog(Manager *m, WatchdogType t);
608void manager_set_watchdog(Manager *m, WatchdogType t, usec_t timeout);
aac47032 609void manager_override_watchdog(Manager *m, WatchdogType t, usec_t timeout);
aff3a9e1
LB
610int manager_set_watchdog_pretimeout_governor(Manager *m, const char *governor);
611int manager_override_watchdog_pretimeout_governor(Manager *m, const char *governor);
986935cf 612
afcfaa69
LP
613const char* oom_policy_to_string(OOMPolicy i) _const_;
614OOMPolicy oom_policy_from_string(const char *s) _pure_;
c9e120e0
LP
615
616void unit_defaults_done(UnitDefaults *defaults);