]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.h
manager: split out send_ready and basic.target checking into functions of their own
[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
d8eb10d6 264 /* Have we already sent out the READY=1 notification? */
0c2826c6
ZJS
265 bool ready_sent:1;
266
d8eb10d6
ZJS
267 /* Have we already printed the taint line if necessary? */
268 bool taint_logged:1;
269
e0a3da1f 270 unsigned test_run_flags:8;
0d8c31ff 271
287419c1
AC
272 /* If non-zero, exit with the following value when the systemd
273 * process terminate. Useful for containers: systemd-nspawn could get
274 * the return value. */
275 uint8_t return_value;
276
d450b6f2 277 ShowStatus show_status;
7d5ceb64 278 char *confirm_spawn;
31a7eb86 279 bool no_console_output;
2a12e32e 280 bool service_watchdogs;
d3689161 281
0a494f1f
LP
282 ExecOutput default_std_output, default_std_error;
283
085afe36 284 usec_t default_restart_usec, default_timeout_start_usec, default_timeout_stop_usec;
1f19a534 285
3f41e1e5
LN
286 usec_t default_start_limit_interval;
287 unsigned default_start_limit_burst;
288
085afe36
LP
289 bool default_cpu_accounting;
290 bool default_memory_accounting;
13c31542 291 bool default_io_accounting;
085afe36 292 bool default_blockio_accounting;
03a7b521 293 bool default_tasks_accounting;
377bfd2d 294 bool default_ip_accounting;
085afe36 295
0af20ea2 296 uint64_t default_tasks_max;
bd8f585b
LP
297 usec_t default_timer_accuracy_usec;
298
517d56b1 299 struct rlimit *rlimit[_RLIMIT_MAX];
c93ff2e9 300
a7556052
LP
301 /* non-zero if we are reloading or reexecuting, */
302 int n_reloading;
e409f875
LP
303
304 unsigned n_installed_jobs;
76bf48b7 305 unsigned n_failed_jobs;
f2b68789 306
03b717a3 307 /* Jobs in progress watching */
637f8b8e 308 unsigned n_running_jobs;
7ed9f6cd 309 unsigned n_on_console;
03b717a3 310 unsigned jobs_in_progress_iteration;
637f8b8e 311
e46b13c8
ZJS
312 /* Do we have any outstanding password prompts? */
313 int have_ask_password;
314 int ask_password_inotify_fd;
315 sd_event_source *ask_password_event_source;
316
f2b68789 317 /* Type=idle pipes */
31a7eb86 318 int idle_pipe[4];
718db961 319 sd_event_source *idle_pipe_event_source;
664f88a7
LP
320
321 char *switch_root;
322 char *switch_root_init;
a57f7e2c
LP
323
324 /* This maps all possible path prefixes to the units needing
325 * them. It's a hashmap with a path string as key and a Set as
326 * value where Unit objects are contained. */
327 Hashmap *units_requiring_mounts_for;
e3dd987c 328
283868e1
SW
329 /* Used for processing polkit authorization responses */
330 Hashmap *polkit_registry;
2e5c94b9 331
29206d46
LP
332 /* Dynamic users/groups, indexed by their name */
333 Hashmap *dynamic_users;
334
00d9ef85
LP
335 /* Keep track of all UIDs and GIDs any of our services currently use. This is useful for the RemoveIPC= logic. */
336 Hashmap *uid_refs;
337 Hashmap *gid_refs;
338
24dd31c1 339 /* When the user hits C-A-D more than 7 times per 2s, do something immediately... */
2e5c94b9 340 RateLimit ctrl_alt_del_ratelimit;
ae8c7939 341 EmergencyAction cad_burst_action;
f2341e0a
LP
342
343 const char *unit_log_field;
344 const char *unit_log_format_string;
ae2a2c53 345
4b58153d
LP
346 const char *invocation_log_field;
347 const char *invocation_log_format_string;
348
463d0d15 349 int first_boot; /* tri-state */
3536f49e
YW
350
351 /* prefixes of e.g. RuntimeDirectory= */
72fd1768 352 char *prefix[_EXEC_DIRECTORY_TYPE_MAX];
60918275
LP
353};
354
463d0d15
LP
355#define MANAGER_IS_SYSTEM(m) ((m)->unit_file_scope == UNIT_FILE_SYSTEM)
356#define MANAGER_IS_USER(m) ((m)->unit_file_scope != UNIT_FILE_SYSTEM)
357
2c289ea8
LP
358#define MANAGER_IS_RELOADING(m) ((m)->n_reloading > 0)
359
49d5666c
LP
360#define MANAGER_IS_FINISHED(m) (dual_timestamp_is_set((m)->timestamps + MANAGER_TIMESTAMP_FINISH))
361
e0a3da1f 362int manager_new(UnitFileScope scope, unsigned test_run_flags, Manager **m);
06d8d842 363Manager* manager_free(Manager *m);
60918275 364
ba64af90 365void manager_enumerate(Manager *m);
a16e1123 366int manager_startup(Manager *m, FILE *serialization, FDSet *fds);
f50e0a01 367
60918275 368Job *manager_get_job(Manager *m, uint32_t id);
87f0e418 369Unit *manager_get_unit(Manager *m, const char *name);
60918275 370
86fbf370 371int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j);
ea430986 372
718db961
LP
373int manager_load_unit_prepare(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
374int manager_load_unit(Manager *m, const char *name, const char *path, sd_bus_error *e, Unit **_ret);
375int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u);
28247076 376
4bd29fe5
LP
377int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, sd_bus_error *e, Job **_ret);
378int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, sd_bus_error *e, Job **_ret);
53f18416 379int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Job **ret);
15d167f8 380int manager_propagate_reload(Manager *m, Unit *unit, JobMode mode, sd_bus_error *e);
60918275 381
87f0e418 382void manager_dump_units(Manager *s, FILE *f, const char *prefix);
cea8e32e 383void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
ad75b9e7 384void manager_dump(Manager *s, FILE *f, const char *prefix);
713f6f90 385int manager_get_dump_string(Manager *m, char **ret);
a66d02c3 386
7fad411c
LP
387void manager_clear_jobs(Manager *m);
388
c1e1601e 389unsigned manager_dispatch_load_queue(Manager *m);
f50e0a01 390
718db961 391int manager_environment_add(Manager *m, char **minus, char **plus);
c93ff2e9 392int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
b2bb3dbe 393
9152c765 394int manager_loop(Manager *m);
83c60c9f 395
d8d5ab98 396int manager_open_serialization(Manager *m, FILE **_f);
a16e1123 397
b3680f49 398int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root);
a16e1123
LP
399int manager_deserialize(Manager *m, FILE *f, FDSet *fds);
400
401int manager_reload(Manager *m);
402
fdf20a31 403void manager_reset_failed(Manager *m);
5632e374 404
4927fcae 405void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
e983b760 406void manager_send_unit_plymouth(Manager *m, Unit *u);
4927fcae 407
31afa0a4 408bool manager_unit_inactive_or_pending(Manager *m, const char *name);
8f6df3fa 409
b0c918b9
LP
410void manager_check_finished(Manager *m);
411
4cfa2c99 412void manager_recheck_journal(Manager *m);
f1dd0c3f 413
d450b6f2 414void manager_set_show_status(Manager *m, ShowStatus mode);
e2680723
LP
415void manager_set_first_boot(Manager *m, bool b);
416
127d5fd1 417void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) _printf_(4,5);
cb8ccb22 418void manager_flip_auto_status(Manager *m, bool enable);
68b29a9f 419
a57f7e2c 420Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path);
e66cf1a3 421
19bbdd98 422void manager_set_exec_params(Manager *m, ExecParameters *p);
f755e3b7
LP
423
424ManagerState manager_state(Manager *m);
425
5269eb6b 426int manager_update_failed_units(Manager *m, Unit *u, bool failed);
03455c28 427
00d9ef85
LP
428void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now);
429int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc);
430
431void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now);
432int manager_ref_gid(Manager *m, gid_t gid, bool destroy_now);
433
434void manager_vacuum_uid_refs(Manager *m);
435void manager_vacuum_gid_refs(Manager *m);
436
437void manager_serialize_uid_refs(Manager *m, FILE *f);
438void manager_deserialize_uid_refs_one(Manager *m, const char *value);
439
440void manager_serialize_gid_refs(Manager *m, FILE *f);
441void manager_deserialize_gid_refs_one(Manager *m, const char *value);
442
af6b0ecc
LP
443char *manager_taint_string(Manager *m);
444
f755e3b7
LP
445const char *manager_state_to_string(ManagerState m) _const_;
446ManagerState manager_state_from_string(const char *s) _pure_;
7d5ceb64
FB
447
448const char *manager_get_confirm_spawn(Manager *m);
b0eb2944
FB
449bool manager_is_confirm_spawn_disabled(Manager *m);
450void manager_disable_confirm_spawn(void);
9f9f0342
LP
451
452const char *manager_timestamp_to_string(ManagerTimestamp m) _const_;
453ManagerTimestamp manager_timestamp_from_string(const char *s) _pure_;