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