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