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