]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.h
core/cgroup: Add OOM check
[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
LP
62typedef enum OOMPolicy {
63 OOM_CONTINUE, /* The kernel kills the process it wants to kill, and that's it */
64 OOM_STOP, /* The kernel kills the process it wants to kill, and we stop the unit */
65 OOM_KILL, /* The kernel kills the process it wants to kill, and all others in the unit, and we stop the unit */
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
463d0d15 238 UnitFileScope unit_file_scope;
84e3543e 239 LookupPaths lookup_paths;
e8630e69
ZJS
240 Hashmap *unit_id_map;
241 Hashmap *unit_name_map;
fe51822e 242 Set *unit_path_cache;
c2911d48 243 uint64_t unit_cache_timestamp_hash;
036643a2 244
1ad6e8b3
LP
245 char **transient_environment; /* The environment, as determined from config files, kernel cmdline and environment generators */
246 char **client_environment; /* Environment variables created by clients through the bus API */
1137a57c 247
986935cf
FB
248 usec_t watchdog[_WATCHDOG_TYPE_MAX];
249 usec_t watchdog_overridden[_WATCHDOG_TYPE_MAX];
aff3a9e1
LB
250 char *watchdog_pretimeout_governor;
251 char *watchdog_pretimeout_governor_overridden;
e96d6be7 252
9f9f0342 253 dual_timestamp timestamps[_MANAGER_TIMESTAMP_MAX];
8d567588 254
9670d583 255 /* Data specific to the device subsystem */
d0955f00 256 sd_device_monitor *device_monitor;
8fe914ec 257 Hashmap *devices_by_sysfs;
ef734fd6
LP
258
259 /* Data specific to the mount subsystem */
d379d442 260 struct libmnt_monitor *mount_monitor;
718db961 261 sd_event_source *mount_event_source;
ea430986 262
07b0b134
ML
263 /* Data specific to the swap filesystem */
264 FILE *proc_swaps;
718db961 265 sd_event_source *swap_event_source;
9670d583 266 Hashmap *swaps_by_devnode;
07b0b134 267
ea430986 268 /* Data specific to the D-Bus subsystem */
718db961
LP
269 sd_bus *api_bus, *system_bus;
270 Set *private_buses;
271 int private_listen_fd;
272 sd_event_source *private_listen_event_source;
8f8f05a9
LP
273
274 /* Contains all the clients that are subscribed to signals via
275 the API bus. Note that private bus connections are always
276 considered subscribes, since they last for very short only,
277 and it is much simpler that way. */
278 sd_bus_track *subscribed;
279 char **deserialized_subscribed;
5e8d1c9a 280
8f88ecf6
LP
281 /* This is used during reloading: before the reload we queue
282 * the reply message here, and afterwards we send it */
209de525 283 sd_bus_message *pending_reload_message;
8e274523 284
05e343b7 285 Hashmap *watch_bus; /* D-Bus names => Unit object n:1 */
05e343b7 286
71445ae7
LP
287 bool send_reloading_done;
288
7fab9d01 289 uint32_t current_job_id;
bacbccb7 290 uint32_t default_unit_job_id;
7fab9d01 291
9d58f1db
LP
292 /* Data specific to the Automount subsystem */
293 int dev_autofs_fd;
294
8e274523 295 /* Data specific to the cgroup subsystem */
4ad49000 296 Hashmap *cgroup_unit;
efdb0237 297 CGroupMask cgroup_supported;
9444b1f2 298 char *cgroup_root;
e537352b 299
09e24654 300 /* Notifications from cgroups, when the unified hierarchy is used is done via inotify. */
efdb0237
LP
301 int cgroup_inotify_fd;
302 sd_event_source *cgroup_inotify_event_source;
afcfaa69
LP
303
304 /* Maps for finding the unit for each inotify watch descriptor for the cgroup.events and
305 * memory.events cgroupv2 attributes. */
0bb814c2 306 Hashmap *cgroup_control_inotify_wd_unit;
afcfaa69 307 Hashmap *cgroup_memory_inotify_wd_unit;
701cc384 308
09e24654
LP
309 /* A defer event for handling cgroup empty events and processing them after SIGCHLD in all cases. */
310 sd_event_source *cgroup_empty_event_source;
afcfaa69 311 sd_event_source *cgroup_oom_event_source;
09e24654 312
35b8ca3a 313 /* Make sure the user cannot accidentally unmount our cgroup
33be102a
LP
314 * file system */
315 int pin_cgroupfs_fd;
316
892a035c 317 unsigned gc_marker;
efdb0237 318
bbf5fd8e
LP
319 /* The stat() data the last time we saw /etc/localtime */
320 usec_t etc_localtime_mtime;
ec08f270 321 bool etc_localtime_accessible;
bbf5fd8e 322
ec08f270 323 ManagerObjective objective;
41447faf 324
af41e508 325 /* Flags */
ec08f270 326 bool dispatching_load_queue;
9d58f1db 327
ec08f270 328 bool taint_usr;
e0a3da1f 329
d8eb10d6 330 /* Have we already sent out the READY=1 notification? */
ec08f270 331 bool ready_sent;
0c2826c6 332
6d932659
ZJS
333 /* Was the last status sent "STATUS=Ready."? */
334 bool status_ready;
335
d8eb10d6 336 /* Have we already printed the taint line if necessary? */
ec08f270 337 bool taint_logged;
d8eb10d6 338
00b5974f 339 /* Have we ever changed the "kernel.pid_max" sysctl? */
ec08f270 340 bool sysctl_pid_max_changed;
00b5974f 341
ec08f270 342 ManagerTestRunFlags test_run_flags;
0d8c31ff 343
287419c1
AC
344 /* If non-zero, exit with the following value when the systemd
345 * process terminate. Useful for containers: systemd-nspawn could get
346 * the return value. */
347 uint8_t return_value;
348
d450b6f2 349 ShowStatus show_status;
44a41954 350 ShowStatus show_status_overridden;
36cf4507 351 StatusUnitFormat status_unit_format;
7d5ceb64 352 char *confirm_spawn;
31a7eb86 353 bool no_console_output;
2a12e32e 354 bool service_watchdogs;
d3689161 355
0a494f1f
LP
356 ExecOutput default_std_output, default_std_error;
357
085afe36 358 usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
dc653bf4
JK
359 usec_t default_timeout_abort_usec;
360 bool default_timeout_abort_set;
1f19a534 361
3f41e1e5
LN
362 usec_t default_start_limit_interval;
363 unsigned default_start_limit_burst;
364
085afe36
LP
365 bool default_cpu_accounting;
366 bool default_memory_accounting;
13c31542 367 bool default_io_accounting;
085afe36 368 bool default_blockio_accounting;
03a7b521 369 bool default_tasks_accounting;
377bfd2d 370 bool default_ip_accounting;
085afe36 371
3a0f06c4 372 TasksMax default_tasks_max;
bd8f585b
LP
373 usec_t default_timer_accuracy_usec;
374
afcfaa69 375 OOMPolicy default_oom_policy;
d4a402e4
LP
376 int default_oom_score_adjust;
377 bool default_oom_score_adjust_set;
afcfaa69 378
a6ecbf83 379 int original_log_level;
bda7d78b 380 LogTarget original_log_target;
ec08f270
ZJS
381 bool log_level_overridden;
382 bool log_target_overridden;
a6ecbf83 383
517d56b1 384 struct rlimit *rlimit[_RLIMIT_MAX];
c93ff2e9 385
a7556052
LP
386 /* non-zero if we are reloading or reexecuting, */
387 int n_reloading;
e409f875
LP
388
389 unsigned n_installed_jobs;
76bf48b7 390 unsigned n_failed_jobs;
f2b68789 391
03b717a3 392 /* Jobs in progress watching */
637f8b8e 393 unsigned n_running_jobs;
7ed9f6cd 394 unsigned n_on_console;
03b717a3 395 unsigned jobs_in_progress_iteration;
637f8b8e 396
e46b13c8
ZJS
397 /* Do we have any outstanding password prompts? */
398 int have_ask_password;
399 int ask_password_inotify_fd;
400 sd_event_source *ask_password_event_source;
401
f2b68789 402 /* Type=idle pipes */
31a7eb86 403 int idle_pipe[4];
718db961 404 sd_event_source *idle_pipe_event_source;
664f88a7
LP
405
406 char *switch_root;
407 char *switch_root_init;
a57f7e2c
LP
408
409 /* This maps all possible path prefixes to the units needing
410 * them. It's a hashmap with a path string as key and a Set as
411 * value where Unit objects are contained. */
412 Hashmap *units_requiring_mounts_for;
e3dd987c 413
283868e1
SW
414 /* Used for processing polkit authorization responses */
415 Hashmap *polkit_registry;
2e5c94b9 416
29206d46
LP
417 /* Dynamic users/groups, indexed by their name */
418 Hashmap *dynamic_users;
419
00d9ef85
LP
420 /* Keep track of all UIDs and GIDs any of our services currently use. This is useful for the RemoveIPC= logic. */
421 Hashmap *uid_refs;
422 Hashmap *gid_refs;
423
e8a565cb
YW
424 /* ExecRuntime, indexed by their owner unit id */
425 Hashmap *exec_runtime_by_id;
426
24dd31c1 427 /* When the user hits C-A-D more than 7 times per 2s, do something immediately... */
2e5c94b9 428 RateLimit ctrl_alt_del_ratelimit;
ae8c7939 429 EmergencyAction cad_burst_action;
f2341e0a
LP
430
431 const char *unit_log_field;
432 const char *unit_log_format_string;
ae2a2c53 433
4b58153d
LP
434 const char *invocation_log_field;
435 const char *invocation_log_format_string;
436
463d0d15 437 int first_boot; /* tri-state */
3536f49e 438
62a76913 439 /* Prefixes of e.g. RuntimeDirectory= */
72fd1768 440 char *prefix[_EXEC_DIRECTORY_TYPE_MAX];
bb0c0d6f 441 char *received_credentials;
62a76913
LP
442
443 /* Used in the SIGCHLD and sd_notify() message invocation logic to avoid that we dispatch the same event
444 * multiple times on the same unit. */
445 unsigned sigchldgen;
446 unsigned notifygen;
c6e892bc
YW
447
448 bool honor_device_enumeration;
19d22d43
LP
449
450 VarlinkServer *varlink_server;
064a5c14
DDM
451 /* When we're a system manager, this object manages the subscription from systemd-oomd to PID1 that's
452 * used to report changes in ManagedOOM settings (systemd server - oomd client). When
453 * we're a user manager, this object manages the client connection from the user manager to
454 * systemd-oomd to report changes in ManagedOOM settings (systemd client - oomd server). */
455 Varlink *managed_oom_varlink;
184b4f78
ILG
456
457 /* Reference to RestrictFileSystems= BPF program */
458 struct restrict_fs_bpf *restrict_fs;
60918275
LP
459};
460
dc653bf4 461static inline usec_t manager_default_timeout_abort_usec(Manager *m) {
9c79f0e0 462 assert(m);
dc653bf4
JK
463 return m->default_timeout_abort_set ? m->default_timeout_abort_usec : m->default_timeout_stop_usec;
464}
465
463d0d15
LP
466#define MANAGER_IS_SYSTEM(m) ((m)->unit_file_scope == UNIT_FILE_SYSTEM)
467#define MANAGER_IS_USER(m) ((m)->unit_file_scope != UNIT_FILE_SYSTEM)
468
2c289ea8
LP
469#define MANAGER_IS_RELOADING(m) ((m)->n_reloading > 0)
470
49d5666c
LP
471#define MANAGER_IS_FINISHED(m) (dual_timestamp_is_set((m)->timestamps + MANAGER_TIMESTAMP_FINISH))
472
af41e508
LP
473/* 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 */
474#define MANAGER_IS_RUNNING(m) ((m)->objective == MANAGER_OK)
4259d202 475
638cece4
LP
476#define MANAGER_IS_TEST_RUN(m) ((m)->test_run_flags != 0)
477
478int manager_new(UnitFileScope scope, ManagerTestRunFlags test_run_flags, Manager **m);
06d8d842 479Manager* manager_free(Manager *m);
c70cac54 480DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
60918275 481
2a7cf953 482int manager_startup(Manager *m, FILE *serialization, FDSet *fds, const char *root);
f50e0a01 483
60918275 484Job *manager_get_job(Manager *m, uint32_t id);
87f0e418 485Unit *manager_get_unit(Manager *m, const char *name);
60918275 486
86fbf370 487int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
ea430986 488
81be2388 489bool manager_unit_cache_should_retry_load(Unit *u);
718db961
LP
490int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
491int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
4109ede7 492int manager_load_startable_unit_or_warn(Manager *m, const char *name, const char *path, Unit **ret);
718db961 493int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
28247076 494
50cbaba4
LP
495int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, Set *affected_jobs, sd_bus_error *e, Job **_ret);
496int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, Set *affected_jobs, sd_bus_error *e, Job **_ret);
497int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Set *affected_jobs, Job **ret);
15d167f8 498int manager_propagate_reload(Manager *m, Unit *unit, JobMode mode, sd_bus_error *e);
60918275 499
7fad411c
LP
500void manager_clear_jobs(Manager *m);
501
f75f613d
FB
502void manager_unwatch_pid(Manager *m, pid_t pid);
503
c1e1601e 504unsigned manager_dispatch_load_queue(Manager *m);
f50e0a01 505
79a224c4 506int manager_default_environment(Manager *m);
1ad6e8b3
LP
507int manager_transient_environment_add(Manager *m, char **plus);
508int manager_client_environment_modify(Manager *m, char **minus, char **plus);
509int manager_get_effective_environment(Manager *m, char ***ret);
510
c93ff2e9 511int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
b2bb3dbe 512
b0c4b282
LP
513void manager_trigger_run_queue(Manager *m);
514
9152c765 515int manager_loop(Manager *m);
83c60c9f 516
a16e1123 517int manager_reload(Manager *m);
a01ba4b2
ZJS
518Manager* manager_reloading_start(Manager *m);
519void manager_reloading_stopp(Manager **m);
a16e1123 520
fdf20a31 521void manager_reset_failed(Manager *m);
5632e374 522
4927fcae 523void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
e983b760 524void manager_send_unit_plymouth(Manager *m, Unit *u);
4927fcae 525
31afa0a4 526bool manager_unit_inactive_or_pending(Manager *m, const char *name);
8f6df3fa 527
b0c918b9
LP
528void manager_check_finished(Manager *m);
529
6123dfaa 530void disable_printk_ratelimit(void);
8559b3b7 531void manager_recheck_dbus(Manager *m);
4cfa2c99 532void manager_recheck_journal(Manager *m);
f1dd0c3f 533
44a41954 534bool manager_get_show_status_on(Manager *m);
7365a296 535void manager_set_show_status(Manager *m, ShowStatus mode, const char *reason);
43bba15a 536void manager_override_show_status(Manager *m, ShowStatus mode, const char *reason);
44a41954 537
e2680723
LP
538void manager_set_first_boot(Manager *m, bool b);
539
127d5fd1 540void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) _printf_(4,5);
68b29a9f 541
a57f7e2c 542Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);
e66cf1a3 543
f755e3b7
LP
544ManagerState manager_state(Manager *m);
545
5269eb6b 546int manager_update_failed_units(Manager *m, Unit *u, bool failed);
03455c28 547
00d9ef85
LP
548void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now);
549int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc);
550
551void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now);
2571aafb 552int manager_ref_gid(Manager *m, gid_t gid, bool clean_ipc);
00d9ef85 553
af6b0ecc
LP
554char *manager_taint_string(Manager *m);
555
adefcf28
LP
556void manager_ref_console(Manager *m);
557void manager_unref_console(Manager *m);
558
a6ecbf83
FB
559void manager_override_log_level(Manager *m, int level);
560void manager_restore_original_log_level(Manager *m);
561
bda7d78b
FB
562void manager_override_log_target(Manager *m, LogTarget target);
563void manager_restore_original_log_target(Manager *m);
564
f755e3b7
LP
565const char *manager_state_to_string(ManagerState m) _const_;
566ManagerState manager_state_from_string(const char *s) _pure_;
7d5ceb64
FB
567
568const char *manager_get_confirm_spawn(Manager *m);
b0eb2944
FB
569bool manager_is_confirm_spawn_disabled(Manager *m);
570void manager_disable_confirm_spawn(void);
9f9f0342
LP
571
572const char *manager_timestamp_to_string(ManagerTimestamp m) _const_;
573ManagerTimestamp manager_timestamp_from_string(const char *s) _pure_;
d4ee7bd8 574ManagerTimestamp manager_timestamp_initrd_mangle(ManagerTimestamp s);
afcfaa69 575
986935cf
FB
576usec_t manager_get_watchdog(Manager *m, WatchdogType t);
577void manager_set_watchdog(Manager *m, WatchdogType t, usec_t timeout);
aac47032 578void manager_override_watchdog(Manager *m, WatchdogType t, usec_t timeout);
aff3a9e1
LB
579int manager_set_watchdog_pretimeout_governor(Manager *m, const char *governor);
580int manager_override_watchdog_pretimeout_governor(Manager *m, const char *governor);
986935cf 581
afcfaa69
LP
582const char* oom_policy_to_string(OOMPolicy i) _const_;
583OOMPolicy oom_policy_from_string(const char *s) _pure_;