]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.h
bootspec: fix debug message about default entry
[thirdparty/systemd.git] / src / core / manager.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
c2f1db8f 2#pragma once
60918275 3
a7334b09
LP
4/***
5 This file is part of systemd.
6
7 Copyright 2010 Lennart Poettering
8
9 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
12 (at your option) any later version.
13
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 17 Lesser General Public License for more details.
a7334b09 18
5430f7f2 19 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
71d35b6b 23#include <libmount.h>
60918275 24#include <stdbool.h>
a66d02c3 25#include <stdio.h>
ea430986 26
718db961
LP
27#include "sd-bus.h"
28#include "sd-event.h"
71d35b6b 29
4ad49000 30#include "cgroup-util.h"
400f1a33 31#include "fdset.h"
2e5c94b9 32#include "hashmap.h"
6a48d82f 33#include "ip-address-access.h"
2e5c94b9 34#include "list.h"
2e5c94b9 35#include "ratelimit.h"
a16e1123 36
4f0f902f 37/* Enforce upper limit how many names we allow */
59d1a833 38#define MANAGER_MAX_NAMES 131072 /* 128K */
4f0f902f 39
60918275 40typedef struct Manager Manager;
acbb0225 41
f755e3b7 42typedef enum ManagerState {
d81afec1 43 MANAGER_INITIALIZING,
f755e3b7 44 MANAGER_STARTING,
a16e1123 45 MANAGER_RUNNING,
f755e3b7
LP
46 MANAGER_DEGRADED,
47 MANAGER_MAINTENANCE,
48 MANAGER_STOPPING,
49 _MANAGER_STATE_MAX,
50 _MANAGER_STATE_INVALID = -1
51} ManagerState;
52
53typedef enum ManagerExitCode {
54 MANAGER_OK,
a16e1123
LP
55 MANAGER_EXIT,
56 MANAGER_RELOAD,
57 MANAGER_REEXECUTE,
b9080b03
FF
58 MANAGER_REBOOT,
59 MANAGER_POWEROFF,
60 MANAGER_HALT,
61 MANAGER_KEXEC,
664f88a7 62 MANAGER_SWITCH_ROOT,
a16e1123
LP
63 _MANAGER_EXIT_CODE_MAX,
64 _MANAGER_EXIT_CODE_INVALID = -1
65} ManagerExitCode;
66
127d5fd1
ZJS
67typedef enum StatusType {
68 STATUS_TYPE_EPHEMERAL,
69 STATUS_TYPE_NORMAL,
ebc5788e 70 STATUS_TYPE_EMERGENCY,
127d5fd1
ZJS
71} StatusType;
72
9f9f0342
LP
73typedef enum ManagerTimestamp {
74 MANAGER_TIMESTAMP_FIRMWARE,
75 MANAGER_TIMESTAMP_LOADER,
76 MANAGER_TIMESTAMP_KERNEL,
77 MANAGER_TIMESTAMP_INITRD,
78 MANAGER_TIMESTAMP_USERSPACE,
79 MANAGER_TIMESTAMP_FINISH,
80
81 MANAGER_TIMESTAMP_SECURITY_START,
82 MANAGER_TIMESTAMP_SECURITY_FINISH,
83 MANAGER_TIMESTAMP_GENERATORS_START,
84 MANAGER_TIMESTAMP_GENERATORS_FINISH,
85 MANAGER_TIMESTAMP_UNITS_LOAD_START,
86 MANAGER_TIMESTAMP_UNITS_LOAD_FINISH,
87 _MANAGER_TIMESTAMP_MAX,
88 _MANAGER_TIMESTAMP_INVALID = -1,
89} ManagerTimestamp;
90
400f1a33 91#include "execute.h"
60918275 92#include "job.h"
84e3543e 93#include "path-lookup.h"
4d7213b2 94#include "show-status.h"
400f1a33 95#include "unit-name.h"
60918275 96
e0a3da1f
ZJS
97enum {
98 /* 0 = run normally */
99 MANAGER_TEST_RUN_MINIMAL = 1, /* run test w/o generators */
100 MANAGER_TEST_RUN_ENV_GENERATORS = 2, /* also run env generators */
101 MANAGER_TEST_RUN_GENERATORS = 4, /* also run unit generators */
102 MANAGER_TEST_FULL = MANAGER_TEST_RUN_ENV_GENERATORS | MANAGER_TEST_RUN_GENERATORS,
103};
104assert_cc((MANAGER_TEST_FULL & UINT8_MAX) == MANAGER_TEST_FULL);
105
60918275 106struct Manager {
87f0e418 107 /* Note that the set of units we know of is allowed to be
35b8ca3a 108 * inconsistent. However the subset of it that is loaded may
87d1515d
LP
109 * not, and the list of jobs may neither. */
110
87f0e418
LP
111 /* Active jobs and units */
112 Hashmap *units; /* name string => Unit object n:1 */
4b58153d 113 Hashmap *units_by_invocation_id;
60918275
LP
114 Hashmap *jobs; /* job id => Job object 1:1 */
115
ef734fd6
LP
116 /* To make it easy to iterate through the units of a specific
117 * type we maintain a per type linked list */
ac155bb8 118 LIST_HEAD(Unit, units_by_type[_UNIT_TYPE_MAX]);
ef734fd6 119
87f0e418 120 /* Units that need to be loaded */
ac155bb8 121 LIST_HEAD(Unit, load_queue); /* this is actually more a stack than a queue, but uh. */
60918275 122
034c6ed7
LP
123 /* Jobs that need to be run */
124 LIST_HEAD(Job, run_queue); /* more a stack than a queue, too */
125
c1e1601e
LP
126 /* Units and jobs that have not yet been announced via
127 * D-Bus. When something about a job changes it is added here
128 * if it is not in there yet. This allows easy coalescing of
129 * D-Bus change signals. */
ac155bb8 130 LIST_HEAD(Unit, dbus_unit_queue);
c1e1601e
LP
131 LIST_HEAD(Job, dbus_job_queue);
132
701cc384 133 /* Units to remove */
ac155bb8 134 LIST_HEAD(Unit, cleanup_queue);
23a177ef 135
c5a97ed1
LP
136 /* Units and jobs to check when doing GC */
137 LIST_HEAD(Unit, gc_unit_queue);
138 LIST_HEAD(Job, gc_job_queue);
701cc384 139
4ad49000 140 /* Units that should be realized */
91a6073e 141 LIST_HEAD(Unit, cgroup_realize_queue);
4ad49000 142
09e24654
LP
143 /* Units whose cgroup ran empty */
144 LIST_HEAD(Unit, cgroup_empty_queue);
145
718db961
LP
146 sd_event *event;
147
5ba6985b
LP
148 /* We use two hash tables here, since the same PID might be
149 * watched by two different units: once the unit that forked
150 * it off, and possibly a different unit to which it was
151 * joined as cgroup member. Since we know that it is either
152 * one or two units for each PID we just use to hashmaps
153 * here. */
154 Hashmap *watch_pids1; /* pid => Unit object n:1 */
155 Hashmap *watch_pids2; /* pid => Unit object n:1 */
9152c765 156
95ae05c0
WC
157 /* A set contains all units which cgroup should be refreshed after startup */
158 Set *startup_units;
159
f755e3b7
LP
160 /* A set which contains all currently failed units */
161 Set *failed_units;
162
752b5905
LP
163 sd_event_source *run_queue_event_source;
164
c952c6ec 165 char *notify_socket;
718db961
LP
166 int notify_fd;
167 sd_event_source *notify_event_source;
168
d8fdc620
LP
169 int cgroups_agent_fd;
170 sd_event_source *cgroups_agent_event_source;
171
718db961
LP
172 int signal_fd;
173 sd_event_source *signal_event_source;
c952c6ec 174
718db961
LP
175 int time_change_fd;
176 sd_event_source *time_change_event_source;
9d58f1db 177
718db961 178 sd_event_source *jobs_in_progress_event_source;
acbb0225 179
00d9ef85
LP
180 int user_lookup_fds[2];
181 sd_event_source *user_lookup_event_source;
182
463d0d15 183 UnitFileScope unit_file_scope;
84e3543e 184 LookupPaths lookup_paths;
fe51822e 185 Set *unit_path_cache;
036643a2 186
1137a57c
LP
187 char **environment;
188
e96d6be7
LP
189 usec_t runtime_watchdog;
190 usec_t shutdown_watchdog;
191
9f9f0342 192 dual_timestamp timestamps[_MANAGER_TIMESTAMP_MAX];
8d567588 193
25ac040b 194 struct udev* udev;
9670d583
LP
195
196 /* Data specific to the device subsystem */
f94ea366 197 struct udev_monitor* udev_monitor;
718db961 198 sd_event_source *udev_event_source;
8fe914ec 199 Hashmap *devices_by_sysfs;
ef734fd6
LP
200
201 /* Data specific to the mount subsystem */
d379d442 202 struct libmnt_monitor *mount_monitor;
718db961 203 sd_event_source *mount_event_source;
ea430986 204
07b0b134
ML
205 /* Data specific to the swap filesystem */
206 FILE *proc_swaps;
718db961 207 sd_event_source *swap_event_source;
9670d583 208 Hashmap *swaps_by_devnode;
07b0b134 209
ea430986 210 /* Data specific to the D-Bus subsystem */
718db961
LP
211 sd_bus *api_bus, *system_bus;
212 Set *private_buses;
213 int private_listen_fd;
214 sd_event_source *private_listen_event_source;
8f8f05a9
LP
215
216 /* Contains all the clients that are subscribed to signals via
217 the API bus. Note that private bus connections are always
218 considered subscribes, since they last for very short only,
219 and it is much simpler that way. */
220 sd_bus_track *subscribed;
221 char **deserialized_subscribed;
5e8d1c9a 222
8f88ecf6
LP
223 /* This is used during reloading: before the reload we queue
224 * the reply message here, and afterwards we send it */
225 sd_bus_message *queued_message;
8e274523 226
05e343b7 227 Hashmap *watch_bus; /* D-Bus names => Unit object n:1 */
05e343b7 228
71445ae7
LP
229 bool send_reloading_done;
230
7fab9d01 231 uint32_t current_job_id;
bacbccb7 232 uint32_t default_unit_job_id;
7fab9d01 233
9d58f1db
LP
234 /* Data specific to the Automount subsystem */
235 int dev_autofs_fd;
236
8e274523 237 /* Data specific to the cgroup subsystem */
4ad49000 238 Hashmap *cgroup_unit;
efdb0237 239 CGroupMask cgroup_supported;
9444b1f2 240 char *cgroup_root;
e537352b 241
09e24654 242 /* Notifications from cgroups, when the unified hierarchy is used is done via inotify. */
efdb0237
LP
243 int cgroup_inotify_fd;
244 sd_event_source *cgroup_inotify_event_source;
245 Hashmap *cgroup_inotify_wd_unit;
701cc384 246
09e24654
LP
247 /* A defer event for handling cgroup empty events and processing them after SIGCHLD in all cases. */
248 sd_event_source *cgroup_empty_event_source;
249
35b8ca3a 250 /* Make sure the user cannot accidentally unmount our cgroup
33be102a
LP
251 * file system */
252 int pin_cgroupfs_fd;
253
892a035c 254 unsigned gc_marker;
efdb0237 255
9d58f1db 256 /* Flags */
b9080b03 257 ManagerExitCode exit_code:5;
41447faf 258
9d58f1db 259 bool dispatching_load_queue:1;
9d58f1db
LP
260 bool dispatching_dbus_queue:1;
261
72bc8d00 262 bool taint_usr:1;
e0a3da1f 263
0c2826c6
ZJS
264 bool ready_sent:1;
265
e0a3da1f 266 unsigned test_run_flags:8;
0d8c31ff 267
287419c1
AC
268 /* If non-zero, exit with the following value when the systemd
269 * process terminate. Useful for containers: systemd-nspawn could get
270 * the return value. */
271 uint8_t return_value;
272
d450b6f2 273 ShowStatus show_status;
7d5ceb64 274 char *confirm_spawn;
31a7eb86 275 bool no_console_output;
d3689161 276
0a494f1f
LP
277 ExecOutput default_std_output, default_std_error;
278
085afe36 279 usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
1f19a534 280
3f41e1e5
LN
281 usec_t default_start_limit_interval;
282 unsigned default_start_limit_burst;
283
085afe36
LP
284 bool default_cpu_accounting;
285 bool default_memory_accounting;
13c31542 286 bool default_io_accounting;
085afe36 287 bool default_blockio_accounting;
03a7b521 288 bool default_tasks_accounting;
377bfd2d 289 bool default_ip_accounting;
085afe36 290
0af20ea2 291 uint64_t default_tasks_max;
bd8f585b
LP
292 usec_t default_timer_accuracy_usec;
293
517d56b1 294 struct rlimit *rlimit[_RLIMIT_MAX];
c93ff2e9 295
a7556052
LP
296 /* non-zero if we are reloading or reexecuting, */
297 int n_reloading;
e409f875
LP
298
299 unsigned n_installed_jobs;
76bf48b7 300 unsigned n_failed_jobs;
f2b68789 301
03b717a3 302 /* Jobs in progress watching */
637f8b8e 303 unsigned n_running_jobs;
7ed9f6cd 304 unsigned n_on_console;
03b717a3 305 unsigned jobs_in_progress_iteration;
637f8b8e 306
e46b13c8
ZJS
307 /* Do we have any outstanding password prompts? */
308 int have_ask_password;
309 int ask_password_inotify_fd;
310 sd_event_source *ask_password_event_source;
311
f2b68789 312 /* Type=idle pipes */
31a7eb86 313 int idle_pipe[4];
718db961 314 sd_event_source *idle_pipe_event_source;
664f88a7
LP
315
316 char *switch_root;
317 char *switch_root_init;
a57f7e2c
LP
318
319 /* This maps all possible path prefixes to the units needing
320 * them. It's a hashmap with a path string as key and a Set as
321 * value where Unit objects are contained. */
322 Hashmap *units_requiring_mounts_for;
e3dd987c 323
283868e1
SW
324 /* Used for processing polkit authorization responses */
325 Hashmap *polkit_registry;
2e5c94b9 326
29206d46
LP
327 /* Dynamic users/groups, indexed by their name */
328 Hashmap *dynamic_users;
329
00d9ef85
LP
330 /* Keep track of all UIDs and GIDs any of our services currently use. This is useful for the RemoveIPC= logic. */
331 Hashmap *uid_refs;
332 Hashmap *gid_refs;
333
24dd31c1 334 /* When the user hits C-A-D more than 7 times per 2s, do something immediately... */
2e5c94b9 335 RateLimit ctrl_alt_del_ratelimit;
ae8c7939 336 EmergencyAction cad_burst_action;
f2341e0a
LP
337
338 const char *unit_log_field;
339 const char *unit_log_format_string;
ae2a2c53 340
4b58153d
LP
341 const char *invocation_log_field;
342 const char *invocation_log_format_string;
343
463d0d15 344 int first_boot; /* tri-state */
3536f49e
YW
345
346 /* prefixes of e.g. RuntimeDirectory= */
72fd1768 347 char *prefix[_EXEC_DIRECTORY_TYPE_MAX];
60918275
LP
348};
349
463d0d15
LP
350#define MANAGER_IS_SYSTEM(m) ((m)->unit_file_scope == UNIT_FILE_SYSTEM)
351#define MANAGER_IS_USER(m) ((m)->unit_file_scope != UNIT_FILE_SYSTEM)
352
2c289ea8
LP
353#define MANAGER_IS_RELOADING(m) ((m)->n_reloading > 0)
354
49d5666c
LP
355#define MANAGER_IS_FINISHED(m) (dual_timestamp_is_set((m)->timestamps + MANAGER_TIMESTAMP_FINISH))
356
e0a3da1f 357int manager_new(UnitFileScope scope, unsigned test_run_flags, Manager **m);
06d8d842 358Manager* manager_free(Manager *m);
60918275 359
ba64af90 360void manager_enumerate(Manager *m);
a16e1123 361int manager_startup(Manager *m, FILE *serialization, FDSet *fds);
f50e0a01 362
60918275 363Job *manager_get_job(Manager *m, uint32_t id);
87f0e418 364Unit *manager_get_unit(Manager *m, const char *name);
60918275 365
86fbf370 366int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
ea430986 367
718db961
LP
368int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
369int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
370int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
28247076 371
4bd29fe5
LP
372int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, sd_bus_error *e, Job **_ret);
373int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, sd_bus_error *e, Job **_ret);
53f18416 374int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Job **ret);
15d167f8 375int manager_propagate_reload(Manager *m, Unit *unit, JobMode mode, sd_bus_error *e);
60918275 376
87f0e418 377void manager_dump_units(Manager *s, FILE *f, const char *prefix);
cea8e32e 378void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
ad75b9e7 379void manager_dump(Manager *s, FILE *f, const char *prefix);
713f6f90 380int manager_get_dump_string(Manager *m, char **ret);
a66d02c3 381
7fad411c
LP
382void manager_clear_jobs(Manager *m);
383
c1e1601e 384unsigned manager_dispatch_load_queue(Manager *m);
f50e0a01 385
718db961 386int manager_environment_add(Manager *m, char **minus, char **plus);
c93ff2e9 387int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
b2bb3dbe 388
9152c765 389int manager_loop(Manager *m);
83c60c9f 390
d8d5ab98 391int manager_open_serialization(Manager *m, FILE **_f);
a16e1123 392
b3680f49 393int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root);
a16e1123
LP
394int manager_deserialize(Manager *m, FILE *f, FDSet *fds);
395
396int manager_reload(Manager *m);
397
fdf20a31 398void manager_reset_failed(Manager *m);
5632e374 399
4927fcae 400void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
e983b760 401void manager_send_unit_plymouth(Manager *m, Unit *u);
4927fcae 402
31afa0a4 403bool manager_unit_inactive_or_pending(Manager *m, const char *name);
8f6df3fa 404
b0c918b9
LP
405void manager_check_finished(Manager *m);
406
4cfa2c99 407void manager_recheck_journal(Manager *m);
f1dd0c3f 408
d450b6f2 409void manager_set_show_status(Manager *m, ShowStatus mode);
e2680723
LP
410void manager_set_first_boot(Manager *m, bool b);
411
127d5fd1 412void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) _printf_(4,5);
cb8ccb22 413void manager_flip_auto_status(Manager *m, bool enable);
68b29a9f 414
a57f7e2c 415Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);
e66cf1a3 416
19bbdd98 417void manager_set_exec_params(Manager *m, ExecParameters *p);
f755e3b7
LP
418
419ManagerState manager_state(Manager *m);
420
5269eb6b 421int manager_update_failed_units(Manager *m, Unit *u, bool failed);
03455c28 422
00d9ef85
LP
423void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now);
424int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc);
425
426void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now);
427int manager_ref_gid(Manager *m, gid_t gid, bool destroy_now);
428
429void manager_vacuum_uid_refs(Manager *m);
430void manager_vacuum_gid_refs(Manager *m);
431
432void manager_serialize_uid_refs(Manager *m, FILE *f);
433void manager_deserialize_uid_refs_one(Manager *m, const char *value);
434
435void manager_serialize_gid_refs(Manager *m, FILE *f);
436void manager_deserialize_gid_refs_one(Manager *m, const char *value);
437
f755e3b7
LP
438const char *manager_state_to_string(ManagerState m) _const_;
439ManagerState manager_state_from_string(const char *s) _pure_;
7d5ceb64
FB
440
441const char *manager_get_confirm_spawn(Manager *m);
b0eb2944
FB
442bool manager_is_confirm_spawn_disabled(Manager *m);
443void manager_disable_confirm_spawn(void);
9f9f0342
LP
444
445const char *manager_timestamp_to_string(ManagerTimestamp m) _const_;
446ManagerTimestamp manager_timestamp_from_string(const char *s) _pure_;