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