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