]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.h
pid1: add "soft-reboot" reboot method
[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
ec08f270 333 bool taint_usr;
e0a3da1f 334
d8eb10d6 335 /* Have we already sent out the READY=1 notification? */
ec08f270 336 bool ready_sent;
0c2826c6 337
6d932659
ZJS
338 /* Was the last status sent "STATUS=Ready."? */
339 bool status_ready;
340
d8eb10d6 341 /* Have we already printed the taint line if necessary? */
ec08f270 342 bool taint_logged;
d8eb10d6 343
00b5974f 344 /* Have we ever changed the "kernel.pid_max" sysctl? */
ec08f270 345 bool sysctl_pid_max_changed;
00b5974f 346
ec08f270 347 ManagerTestRunFlags test_run_flags;
0d8c31ff 348
287419c1
AC
349 /* If non-zero, exit with the following value when the systemd
350 * process terminate. Useful for containers: systemd-nspawn could get
351 * the return value. */
352 uint8_t return_value;
353
d450b6f2 354 ShowStatus show_status;
44a41954 355 ShowStatus show_status_overridden;
36cf4507 356 StatusUnitFormat status_unit_format;
7d5ceb64 357 char *confirm_spawn;
31a7eb86 358 bool no_console_output;
2a12e32e 359 bool service_watchdogs;
d3689161 360
0a494f1f
LP
361 ExecOutput default_std_output, default_std_error;
362
085afe36 363 usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
a0fe19f9 364 usec_t default_device_timeout_usec;
dc653bf4
JK
365 usec_t default_timeout_abort_usec;
366 bool default_timeout_abort_set;
1f19a534 367
3f41e1e5
LN
368 usec_t default_start_limit_interval;
369 unsigned default_start_limit_burst;
370
085afe36
LP
371 bool default_cpu_accounting;
372 bool default_memory_accounting;
13c31542 373 bool default_io_accounting;
085afe36 374 bool default_blockio_accounting;
03a7b521 375 bool default_tasks_accounting;
377bfd2d 376 bool default_ip_accounting;
085afe36 377
3a0f06c4 378 TasksMax default_tasks_max;
bd8f585b
LP
379 usec_t default_timer_accuracy_usec;
380
afcfaa69 381 OOMPolicy default_oom_policy;
d4a402e4
LP
382 int default_oom_score_adjust;
383 bool default_oom_score_adjust_set;
afcfaa69 384
6bb00842
LP
385 CGroupPressureWatch default_memory_pressure_watch;
386 usec_t default_memory_pressure_threshold_usec;
387
a6ecbf83 388 int original_log_level;
bda7d78b 389 LogTarget original_log_target;
ec08f270
ZJS
390 bool log_level_overridden;
391 bool log_target_overridden;
a6ecbf83 392
517d56b1 393 struct rlimit *rlimit[_RLIMIT_MAX];
c93ff2e9 394
a7556052
LP
395 /* non-zero if we are reloading or reexecuting, */
396 int n_reloading;
e409f875
LP
397
398 unsigned n_installed_jobs;
76bf48b7 399 unsigned n_failed_jobs;
f2b68789 400
03b717a3 401 /* Jobs in progress watching */
637f8b8e 402 unsigned n_running_jobs;
7ed9f6cd 403 unsigned n_on_console;
03b717a3 404 unsigned jobs_in_progress_iteration;
637f8b8e 405
e46b13c8
ZJS
406 /* Do we have any outstanding password prompts? */
407 int have_ask_password;
408 int ask_password_inotify_fd;
409 sd_event_source *ask_password_event_source;
410
f2b68789 411 /* Type=idle pipes */
31a7eb86 412 int idle_pipe[4];
718db961 413 sd_event_source *idle_pipe_event_source;
664f88a7
LP
414
415 char *switch_root;
416 char *switch_root_init;
a57f7e2c 417
d35fe8c0
FB
418 /* This is true before and after switching root. */
419 bool switching_root;
420
a57f7e2c
LP
421 /* This maps all possible path prefixes to the units needing
422 * them. It's a hashmap with a path string as key and a Set as
423 * value where Unit objects are contained. */
424 Hashmap *units_requiring_mounts_for;
e3dd987c 425
283868e1
SW
426 /* Used for processing polkit authorization responses */
427 Hashmap *polkit_registry;
2e5c94b9 428
29206d46
LP
429 /* Dynamic users/groups, indexed by their name */
430 Hashmap *dynamic_users;
431
00d9ef85
LP
432 /* Keep track of all UIDs and GIDs any of our services currently use. This is useful for the RemoveIPC= logic. */
433 Hashmap *uid_refs;
434 Hashmap *gid_refs;
435
e76506b7
DDM
436 /* ExecSharedRuntime, indexed by their owner unit id */
437 Hashmap *exec_shared_runtime_by_id;
e8a565cb 438
24dd31c1 439 /* When the user hits C-A-D more than 7 times per 2s, do something immediately... */
2e5c94b9 440 RateLimit ctrl_alt_del_ratelimit;
ae8c7939 441 EmergencyAction cad_burst_action;
f2341e0a
LP
442
443 const char *unit_log_field;
444 const char *unit_log_format_string;
ae2a2c53 445
4b58153d
LP
446 const char *invocation_log_field;
447 const char *invocation_log_format_string;
448
463d0d15 449 int first_boot; /* tri-state */
3536f49e 450
62a76913 451 /* Prefixes of e.g. RuntimeDirectory= */
72fd1768 452 char *prefix[_EXEC_DIRECTORY_TYPE_MAX];
2ad591a3
LP
453 char *received_credentials_directory;
454 char *received_encrypted_credentials_directory;
62a76913
LP
455
456 /* Used in the SIGCHLD and sd_notify() message invocation logic to avoid that we dispatch the same event
457 * multiple times on the same unit. */
458 unsigned sigchldgen;
459 unsigned notifygen;
19d22d43
LP
460
461 VarlinkServer *varlink_server;
064a5c14
DDM
462 /* When we're a system manager, this object manages the subscription from systemd-oomd to PID1 that's
463 * used to report changes in ManagedOOM settings (systemd server - oomd client). When
464 * we're a user manager, this object manages the client connection from the user manager to
465 * systemd-oomd to report changes in ManagedOOM settings (systemd client - oomd server). */
466 Varlink *managed_oom_varlink;
184b4f78
ILG
467
468 /* Reference to RestrictFileSystems= BPF program */
469 struct restrict_fs_bpf *restrict_fs;
aa5ae971
ŁS
470
471 char *default_smack_process_label;
856bfaeb
LB
472
473 /* Allow users to configure a rate limit for Reload() operations */
474 RateLimit reload_ratelimit;
d9365956
LB
475 /* Dump*() are slow, so always rate limit them to 10 per 10 minutes */
476 RateLimit dump_ratelimit;
29e6b0c1
LP
477
478 sd_event_source *memory_pressure_event_source;
60918275
LP
479};
480
dc653bf4 481static inline usec_t manager_default_timeout_abort_usec(Manager *m) {
9c79f0e0 482 assert(m);
dc653bf4
JK
483 return m->default_timeout_abort_set ? m->default_timeout_abort_usec : m->default_timeout_stop_usec;
484}
485
4870133b
LP
486#define MANAGER_IS_SYSTEM(m) ((m)->runtime_scope == RUNTIME_SCOPE_SYSTEM)
487#define MANAGER_IS_USER(m) ((m)->runtime_scope == RUNTIME_SCOPE_USER)
463d0d15 488
2c289ea8
LP
489#define MANAGER_IS_RELOADING(m) ((m)->n_reloading > 0)
490
49d5666c
LP
491#define MANAGER_IS_FINISHED(m) (dual_timestamp_is_set((m)->timestamps + MANAGER_TIMESTAMP_FINISH))
492
af41e508
LP
493/* 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 */
494#define MANAGER_IS_RUNNING(m) ((m)->objective == MANAGER_OK)
4259d202 495
d35fe8c0
FB
496#define MANAGER_IS_SWITCHING_ROOT(m) ((m)->switching_root)
497
638cece4
LP
498#define MANAGER_IS_TEST_RUN(m) ((m)->test_run_flags != 0)
499
4870133b
LP
500static inline usec_t manager_default_timeout(RuntimeScope scope) {
501 return scope == RUNTIME_SCOPE_SYSTEM ? DEFAULT_TIMEOUT_USEC : DEFAULT_USER_TIMEOUT_USEC;
e4c7b5f5
ZJS
502}
503
4870133b 504int manager_new(RuntimeScope scope, ManagerTestRunFlags test_run_flags, Manager **m);
06d8d842 505Manager* manager_free(Manager *m);
c70cac54 506DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
60918275 507
2a7cf953 508int manager_startup(Manager *m, FILE *serialization, FDSet *fds, const char *root);
f50e0a01 509
60918275 510Job *manager_get_job(Manager *m, uint32_t id);
87f0e418 511Unit *manager_get_unit(Manager *m, const char *name);
60918275 512
86fbf370 513int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
ea430986 514
81be2388 515bool manager_unit_cache_should_retry_load(Unit *u);
4b6a2b3f
ZJS
516int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **ret);
517int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **ret);
4109ede7 518int manager_load_startable_unit_or_warn(Manager *m, const char *name, const char *path, Unit **ret);
718db961 519int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
28247076 520
50cbaba4
LP
521int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, Set *affected_jobs, sd_bus_error *e, Job **_ret);
522int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, Set *affected_jobs, sd_bus_error *e, Job **_ret);
523int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Set *affected_jobs, Job **ret);
15d167f8 524int manager_propagate_reload(Manager *m, Unit *unit, JobMode mode, sd_bus_error *e);
60918275 525
7fad411c
LP
526void manager_clear_jobs(Manager *m);
527
f75f613d
FB
528void manager_unwatch_pid(Manager *m, pid_t pid);
529
c1e1601e 530unsigned manager_dispatch_load_queue(Manager *m);
f50e0a01 531
29e6b0c1
LP
532int manager_setup_memory_pressure_event_source(Manager *m);
533
79a224c4 534int manager_default_environment(Manager *m);
1ad6e8b3
LP
535int manager_transient_environment_add(Manager *m, char **plus);
536int manager_client_environment_modify(Manager *m, char **minus, char **plus);
537int manager_get_effective_environment(Manager *m, char ***ret);
538
aa5ae971
ŁS
539int manager_set_default_smack_process_label(Manager *m, const char *label);
540
c93ff2e9 541int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
b2bb3dbe 542
b0c4b282
LP
543void manager_trigger_run_queue(Manager *m);
544
9152c765 545int manager_loop(Manager *m);
83c60c9f 546
a16e1123 547int manager_reload(Manager *m);
a01ba4b2
ZJS
548Manager* manager_reloading_start(Manager *m);
549void manager_reloading_stopp(Manager **m);
a16e1123 550
fdf20a31 551void manager_reset_failed(Manager *m);
5632e374 552
4927fcae 553void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
e983b760 554void manager_send_unit_plymouth(Manager *m, Unit *u);
4927fcae 555
31afa0a4 556bool manager_unit_inactive_or_pending(Manager *m, const char *name);
8f6df3fa 557
b0c918b9 558void manager_check_finished(Manager *m);
dd0ab174 559void manager_send_reloading(Manager *m);
b0c918b9 560
6123dfaa 561void disable_printk_ratelimit(void);
8559b3b7 562void manager_recheck_dbus(Manager *m);
4cfa2c99 563void manager_recheck_journal(Manager *m);
f1dd0c3f 564
44a41954 565bool manager_get_show_status_on(Manager *m);
7365a296 566void manager_set_show_status(Manager *m, ShowStatus mode, const char *reason);
43bba15a 567void manager_override_show_status(Manager *m, ShowStatus mode, const char *reason);
44a41954 568
e2680723 569void manager_set_first_boot(Manager *m, bool b);
d35fe8c0 570void manager_set_switching_root(Manager *m, bool switching_root);
e2680723 571
127d5fd1 572void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) _printf_(4,5);
68b29a9f 573
a57f7e2c 574Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);
e66cf1a3 575
f755e3b7
LP
576ManagerState manager_state(Manager *m);
577
5269eb6b 578int manager_update_failed_units(Manager *m, Unit *u, bool failed);
03455c28 579
00d9ef85
LP
580void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now);
581int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc);
582
583void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now);
2571aafb 584int manager_ref_gid(Manager *m, gid_t gid, bool clean_ipc);
00d9ef85 585
83fe5d8a 586char* manager_taint_string(const Manager *m);
af6b0ecc 587
adefcf28
LP
588void manager_ref_console(Manager *m);
589void manager_unref_console(Manager *m);
590
a6ecbf83
FB
591void manager_override_log_level(Manager *m, int level);
592void manager_restore_original_log_level(Manager *m);
593
bda7d78b
FB
594void manager_override_log_target(Manager *m, LogTarget target);
595void manager_restore_original_log_target(Manager *m);
596
f755e3b7
LP
597const char *manager_state_to_string(ManagerState m) _const_;
598ManagerState manager_state_from_string(const char *s) _pure_;
7d5ceb64
FB
599
600const char *manager_get_confirm_spawn(Manager *m);
b0eb2944
FB
601bool manager_is_confirm_spawn_disabled(Manager *m);
602void manager_disable_confirm_spawn(void);
9f9f0342
LP
603
604const char *manager_timestamp_to_string(ManagerTimestamp m) _const_;
605ManagerTimestamp manager_timestamp_from_string(const char *s) _pure_;
d4ee7bd8 606ManagerTimestamp manager_timestamp_initrd_mangle(ManagerTimestamp s);
afcfaa69 607
986935cf
FB
608usec_t manager_get_watchdog(Manager *m, WatchdogType t);
609void manager_set_watchdog(Manager *m, WatchdogType t, usec_t timeout);
aac47032 610void manager_override_watchdog(Manager *m, WatchdogType t, usec_t timeout);
aff3a9e1
LB
611int manager_set_watchdog_pretimeout_governor(Manager *m, const char *governor);
612int manager_override_watchdog_pretimeout_governor(Manager *m, const char *governor);
986935cf 613
afcfaa69
LP
614const char* oom_policy_to_string(OOMPolicy i) _const_;
615OOMPolicy oom_policy_from_string(const char *s) _pure_;