]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.c
manager: split out code that sets up run_queue event source into function of its own
[thirdparty/systemd.git] / src / core / manager.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
a7334b09
LP
2/***
3 This file is part of systemd.
4
5 Copyright 2010 Lennart Poettering
6
7 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
10 (at your option) any later version.
11
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 15 Lesser General Public License for more details.
a7334b09 16
5430f7f2 17 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
19***/
20
60918275 21#include <errno.h>
400f1a33
LP
22#include <fcntl.h>
23#include <linux/kd.h>
9152c765 24#include <signal.h>
713f6f90 25#include <stdio_ext.h>
400f1a33 26#include <string.h>
e46b13c8 27#include <sys/epoll.h>
400f1a33 28#include <sys/inotify.h>
e1414003 29#include <sys/ioctl.h>
400f1a33 30#include <sys/reboot.h>
8742514c 31#include <sys/timerfd.h>
400f1a33
LP
32#include <sys/wait.h>
33#include <unistd.h>
830f6caa 34
349cc4a5 35#if HAVE_AUDIT
4927fcae 36#include <libaudit.h>
830f6caa 37#endif
60918275 38
718db961 39#include "sd-daemon.h"
718db961 40#include "sd-messages.h"
3536f49e 41#include "sd-path.h"
81527be1 42
b5efdb8a 43#include "alloc-util.h"
400f1a33
LP
44#include "audit-fd.h"
45#include "boot-timestamps.h"
46#include "bus-common-errors.h"
47#include "bus-error.h"
48#include "bus-kernel.h"
49#include "bus-util.h"
00d9ef85 50#include "clean-ipc.h"
400f1a33
LP
51#include "dbus-job.h"
52#include "dbus-manager.h"
53#include "dbus-unit.h"
54#include "dbus.h"
d063a527 55#include "dirent-util.h"
400f1a33 56#include "env-util.h"
4f5dd394 57#include "escape.h"
89711996 58#include "exec-util.h"
d3070fbd 59#include "execute.h"
400f1a33 60#include "exit-status.h"
3ffd4af2 61#include "fd-util.h"
0d39fa9c 62#include "fileio.h"
f4f15635 63#include "fs-util.h"
60918275 64#include "hashmap.h"
c004493c 65#include "io-util.h"
d3070fbd 66#include "label.h"
400f1a33 67#include "locale-setup.h"
16354eff 68#include "log.h"
400f1a33 69#include "macro.h"
3ffd4af2 70#include "manager.h"
400f1a33 71#include "missing.h"
49e942b2 72#include "mkdir.h"
6bedfcbb 73#include "parse-util.h"
400f1a33
LP
74#include "path-lookup.h"
75#include "path-util.h"
76#include "process-util.h"
ea430986 77#include "ratelimit.h"
c6878637 78#include "rm-rf.h"
400f1a33 79#include "signal-util.h"
514f4ef5 80#include "special.h"
8fcde012 81#include "stat-util.h"
8b43440b 82#include "string-table.h"
07630cea 83#include "string-util.h"
400f1a33
LP
84#include "strv.h"
85#include "terminal-util.h"
86#include "time-util.h"
87#include "transaction.h"
affb60b1 88#include "umask-util.h"
400f1a33 89#include "unit-name.h"
00d9ef85 90#include "user-util.h"
400f1a33 91#include "util.h"
5dc4c17f 92#include "virt.h"
e96d6be7 93#include "watchdog.h"
60918275 94
a47806fa 95#define NOTIFY_RCVBUF_SIZE (8*1024*1024)
d8fdc620 96#define CGROUPS_AGENT_RCVBUF_SIZE (8*1024*1024)
a47806fa 97
03b717a3 98/* Initial delay and the interval for printing status messages about running jobs */
fd08a840
ZJS
99#define JOBS_IN_PROGRESS_WAIT_USEC (5*USEC_PER_SEC)
100#define JOBS_IN_PROGRESS_PERIOD_USEC (USEC_PER_SEC / 3)
03b717a3
MS
101#define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
102
718db961 103static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
d8fdc620 104static int manager_dispatch_cgroups_agent_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
718db961
LP
105static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
106static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
107static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
00d9ef85 108static int manager_dispatch_user_lookup_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
718db961 109static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata);
752b5905 110static int manager_dispatch_run_queue(sd_event_source *source, void *userdata);
64691d20 111static int manager_run_environment_generators(Manager *m);
e801700e 112static int manager_run_generators(Manager *m);
718db961 113
2ae56591 114static void manager_watch_jobs_in_progress(Manager *m) {
e5723c89 115 usec_t next;
cfa9677b 116 int r;
e5723c89 117
718db961 118 assert(m);
03b717a3 119
42bf1ae1
FB
120 /* We do not want to show the cylon animation if the user
121 * needs to confirm service executions otherwise confirmation
122 * messages will be screwed by the cylon animation. */
b0eb2944 123 if (!manager_is_confirm_spawn_disabled(m))
42bf1ae1
FB
124 return;
125
718db961 126 if (m->jobs_in_progress_event_source)
2ae56591 127 return;
03b717a3 128
e5723c89 129 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC;
cfa9677b 130 r = sd_event_add_time(
6a0f1f6d
LP
131 m->event,
132 &m->jobs_in_progress_event_source,
133 CLOCK_MONOTONIC,
134 next, 0,
135 manager_dispatch_jobs_in_progress, m);
cfa9677b
MM
136 if (r < 0)
137 return;
7dfbe2e3
TG
138
139 (void) sd_event_source_set_description(m->jobs_in_progress_event_source, "manager-jobs-in-progress");
03b717a3
MS
140}
141
1fc464f6 142#define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED)-1) + sizeof(ANSI_HIGHLIGHT_RED)-1 + 2*(sizeof(ANSI_NORMAL)-1))
03b717a3 143
03b717a3
MS
144static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
145 char *p = buffer;
146
147 assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
148 assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
149
150 if (pos > 1) {
6282c859
MS
151 if (pos > 2)
152 p = mempset(p, ' ', pos-2);
64c3610b
FB
153 if (log_get_show_color())
154 p = stpcpy(p, ANSI_RED);
03b717a3
MS
155 *p++ = '*';
156 }
157
158 if (pos > 0 && pos <= width) {
64c3610b
FB
159 if (log_get_show_color())
160 p = stpcpy(p, ANSI_HIGHLIGHT_RED);
03b717a3
MS
161 *p++ = '*';
162 }
163
64c3610b
FB
164 if (log_get_show_color())
165 p = stpcpy(p, ANSI_NORMAL);
03b717a3
MS
166
167 if (pos < width) {
64c3610b
FB
168 if (log_get_show_color())
169 p = stpcpy(p, ANSI_RED);
03b717a3 170 *p++ = '*';
6282c859
MS
171 if (pos < width-1)
172 p = mempset(p, ' ', width-1-pos);
64c3610b
FB
173 if (log_get_show_color())
174 strcpy(p, ANSI_NORMAL);
03b717a3 175 }
03b717a3
MS
176}
177
cb8ccb22 178void manager_flip_auto_status(Manager *m, bool enable) {
f755e3b7
LP
179 assert(m);
180
cb8ccb22
ZJS
181 if (enable) {
182 if (m->show_status == SHOW_STATUS_AUTO)
183 manager_set_show_status(m, SHOW_STATUS_TEMPORARY);
184 } else {
185 if (m->show_status == SHOW_STATUS_TEMPORARY)
186 manager_set_show_status(m, SHOW_STATUS_AUTO);
187 }
188}
189
03b717a3 190static void manager_print_jobs_in_progress(Manager *m) {
718db961 191 _cleanup_free_ char *job_of_n = NULL;
03b717a3
MS
192 Iterator i;
193 Job *j;
03b717a3
MS
194 unsigned counter = 0, print_nr;
195 char cylon[6 + CYLON_BUFFER_EXTRA + 1];
196 unsigned cylon_pos;
8bb310c3
ZJS
197 char time[FORMAT_TIMESPAN_MAX], limit[FORMAT_TIMESPAN_MAX] = "no limit";
198 uint64_t x;
03b717a3 199
718db961 200 assert(m);
9c3349e2 201 assert(m->n_running_jobs > 0);
718db961 202
cb8ccb22 203 manager_flip_auto_status(m, true);
d450b6f2 204
03b717a3
MS
205 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
206
207 HASHMAP_FOREACH(j, m->jobs, i)
208 if (j->state == JOB_RUNNING && counter++ == print_nr)
209 break;
210
e970a72e
MS
211 /* m->n_running_jobs must be consistent with the contents of m->jobs,
212 * so the above loop must have succeeded in finding j. */
213 assert(counter == print_nr + 1);
51d122af 214 assert(j);
5a82a91a 215
03b717a3
MS
216 cylon_pos = m->jobs_in_progress_iteration % 14;
217 if (cylon_pos >= 8)
218 cylon_pos = 14 - cylon_pos;
219 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
220
8bb310c3
ZJS
221 m->jobs_in_progress_iteration++;
222
d6483ba7
ZJS
223 if (m->n_running_jobs > 1) {
224 if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
225 job_of_n = NULL;
226 }
03b717a3 227
8bb310c3
ZJS
228 format_timespan(time, sizeof(time), now(CLOCK_MONOTONIC) - j->begin_usec, 1*USEC_PER_SEC);
229 if (job_get_timeout(j, &x) > 0)
230 format_timespan(limit, sizeof(limit), x - j->begin_usec, 1*USEC_PER_SEC);
231
127d5fd1 232 manager_status_printf(m, STATUS_TYPE_EPHEMERAL, cylon,
8bb310c3
ZJS
233 "%sA %s job is running for %s (%s / %s)",
234 strempty(job_of_n),
235 job_type_to_string(j->type),
236 unit_description(j->unit),
237 time, limit);
03b717a3
MS
238}
239
e46b13c8
ZJS
240static int have_ask_password(void) {
241 _cleanup_closedir_ DIR *dir;
8fb3f009 242 struct dirent *de;
e46b13c8
ZJS
243
244 dir = opendir("/run/systemd/ask-password");
245 if (!dir) {
246 if (errno == ENOENT)
247 return false;
248 else
249 return -errno;
250 }
251
8fb3f009 252 FOREACH_DIRENT_ALL(de, dir, return -errno) {
e46b13c8
ZJS
253 if (startswith(de->d_name, "ask."))
254 return true;
255 }
8fb3f009 256 return false;
e46b13c8
ZJS
257}
258
259static int manager_dispatch_ask_password_fd(sd_event_source *source,
260 int fd, uint32_t revents, void *userdata) {
261 Manager *m = userdata;
262
263 assert(m);
264
265 flush_fd(fd);
266
267 m->have_ask_password = have_ask_password();
268 if (m->have_ask_password < 0)
269 /* Log error but continue. Negative have_ask_password
270 * is treated as unknown status. */
c33b3297 271 log_error_errno(m->have_ask_password, "Failed to list /run/systemd/ask-password: %m");
e46b13c8
ZJS
272
273 return 0;
274}
275
276static void manager_close_ask_password(Manager *m) {
277 assert(m);
278
e46b13c8 279 m->ask_password_event_source = sd_event_source_unref(m->ask_password_event_source);
90990e28 280 m->ask_password_inotify_fd = safe_close(m->ask_password_inotify_fd);
e46b13c8
ZJS
281 m->have_ask_password = -EINVAL;
282}
283
284static int manager_check_ask_password(Manager *m) {
285 int r;
286
287 assert(m);
288
289 if (!m->ask_password_event_source) {
290 assert(m->ask_password_inotify_fd < 0);
291
292 mkdir_p_label("/run/systemd/ask-password", 0755);
293
294 m->ask_password_inotify_fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC);
4a62c710
MS
295 if (m->ask_password_inotify_fd < 0)
296 return log_error_errno(errno, "inotify_init1() failed: %m");
e46b13c8
ZJS
297
298 if (inotify_add_watch(m->ask_password_inotify_fd, "/run/systemd/ask-password", IN_CREATE|IN_DELETE|IN_MOVE) < 0) {
56f64d95 299 log_error_errno(errno, "Failed to add watch on /run/systemd/ask-password: %m");
e46b13c8
ZJS
300 manager_close_ask_password(m);
301 return -errno;
302 }
303
304 r = sd_event_add_io(m->event, &m->ask_password_event_source,
305 m->ask_password_inotify_fd, EPOLLIN,
306 manager_dispatch_ask_password_fd, m);
307 if (r < 0) {
56f64d95 308 log_error_errno(errno, "Failed to add event source for /run/systemd/ask-password: %m");
e46b13c8
ZJS
309 manager_close_ask_password(m);
310 return -errno;
311 }
312
7dfbe2e3
TG
313 (void) sd_event_source_set_description(m->ask_password_event_source, "manager-ask-password");
314
e46b13c8
ZJS
315 /* Queries might have been added meanwhile... */
316 manager_dispatch_ask_password_fd(m->ask_password_event_source,
317 m->ask_password_inotify_fd, EPOLLIN, m);
318 }
319
320 return m->have_ask_password;
321}
322
31a7eb86 323static int manager_watch_idle_pipe(Manager *m) {
31a7eb86
ZJS
324 int r;
325
718db961
LP
326 assert(m);
327
328 if (m->idle_pipe_event_source)
31a7eb86
ZJS
329 return 0;
330
331 if (m->idle_pipe[2] < 0)
332 return 0;
333
151b9b96 334 r = sd_event_add_io(m->event, &m->idle_pipe_event_source, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m);
23bbb0de
MS
335 if (r < 0)
336 return log_error_errno(r, "Failed to watch idle pipe: %m");
31a7eb86 337
7dfbe2e3
TG
338 (void) sd_event_source_set_description(m->idle_pipe_event_source, "manager-idle-pipe");
339
31a7eb86 340 return 0;
31a7eb86
ZJS
341}
342
718db961
LP
343static void manager_close_idle_pipe(Manager *m) {
344 assert(m);
31a7eb86 345
cd72bd8a
LP
346 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
347
3d94f76c
LP
348 safe_close_pair(m->idle_pipe);
349 safe_close_pair(m->idle_pipe + 2);
31a7eb86
ZJS
350}
351
8742514c 352static int manager_setup_time_change(Manager *m) {
718db961 353 int r;
b92bea5d
ZJS
354
355 /* We only care for the cancellation event, hence we set the
356 * timeout to the latest possible value. */
357 struct itimerspec its = {
358 .it_value.tv_sec = TIME_T_MAX,
359 };
8742514c 360
718db961
LP
361 assert(m);
362 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
8742514c 363
e0a3da1f 364 if (m->test_run_flags)
0d8c31ff
ZJS
365 return 0;
366
8742514c
LP
367 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
368 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
369
718db961 370 m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
4a62c710
MS
371 if (m->time_change_fd < 0)
372 return log_error_errno(errno, "Failed to create timerfd: %m");
8742514c 373
718db961 374 if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
56f64d95 375 log_debug_errno(errno, "Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
03e334a1 376 m->time_change_fd = safe_close(m->time_change_fd);
8742514c
LP
377 return 0;
378 }
379
151b9b96 380 r = sd_event_add_io(m->event, &m->time_change_event_source, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m);
23bbb0de
MS
381 if (r < 0)
382 return log_error_errno(r, "Failed to create time change event source: %m");
8742514c 383
7dfbe2e3
TG
384 (void) sd_event_source_set_description(m->time_change_event_source, "manager-time-change");
385
8742514c
LP
386 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
387
388 return 0;
389}
390
80876c20 391static int enable_special_signals(Manager *m) {
718db961 392 _cleanup_close_ int fd = -1;
80876c20
LP
393
394 assert(m);
395
e0a3da1f 396 if (m->test_run_flags)
37453b3a
EV
397 return 0;
398
a41b539e 399 /* Enable that we get SIGINT on control-alt-del. In containers
c9999773
LP
400 * this will fail with EPERM (older) or EINVAL (newer), so
401 * ignore that. */
4c701096 402 if (reboot(RB_DISABLE_CAD) < 0 && !IN_SET(errno, EPERM, EINVAL))
56f64d95 403 log_warning_errno(errno, "Failed to enable ctrl-alt-del handling: %m");
80876c20 404
a41b539e
LP
405 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
406 if (fd < 0) {
407 /* Support systems without virtual console */
408 if (fd != -ENOENT)
56f64d95 409 log_warning_errno(errno, "Failed to open /dev/tty0: %m");
a41b539e 410 } else {
80876c20
LP
411 /* Enable that we get SIGWINCH on kbrequest */
412 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
56f64d95 413 log_warning_errno(errno, "Failed to enable kbrequest handling: %m");
80876c20
LP
414 }
415
416 return 0;
417}
418
ce578209 419static int manager_setup_signals(Manager *m) {
b92bea5d
ZJS
420 struct sigaction sa = {
421 .sa_handler = SIG_DFL,
422 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
423 };
718db961
LP
424 sigset_t mask;
425 int r;
60918275 426
ce578209
LP
427 assert(m);
428
57c0c30e
LP
429 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
430
4dffec14
LP
431 /* We make liberal use of realtime signals here. On
432 * Linux/glibc we have 30 of them (with the exception of Linux
433 * on hppa, see below), between SIGRTMIN+0 ... SIGRTMIN+30
434 * (aka SIGRTMAX). */
7d793605 435
4dffec14 436 assert_se(sigemptyset(&mask) == 0);
7d793605
LP
437 sigset_add_many(&mask,
438 SIGCHLD, /* Child died */
439 SIGTERM, /* Reexecute daemon */
440 SIGHUP, /* Reload configuration */
441 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
442 SIGUSR2, /* systemd: dump status */
443 SIGINT, /* Kernel sends us this on control-alt-del */
444 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
445 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
4dffec14 446
7d793605 447 SIGRTMIN+0, /* systemd: start default.target */
0003d1ab 448 SIGRTMIN+1, /* systemd: isolate rescue.target */
7d793605
LP
449 SIGRTMIN+2, /* systemd: isolate emergency.target */
450 SIGRTMIN+3, /* systemd: start halt.target */
451 SIGRTMIN+4, /* systemd: start poweroff.target */
452 SIGRTMIN+5, /* systemd: start reboot.target */
0003d1ab 453 SIGRTMIN+6, /* systemd: start kexec.target */
4dffec14
LP
454
455 /* ... space for more special targets ... */
456
0003d1ab
LP
457 SIGRTMIN+13, /* systemd: Immediate halt */
458 SIGRTMIN+14, /* systemd: Immediate poweroff */
459 SIGRTMIN+15, /* systemd: Immediate reboot */
460 SIGRTMIN+16, /* systemd: Immediate kexec */
4dffec14
LP
461
462 /* ... space for more immediate system state changes ... */
463
0658666b
LP
464 SIGRTMIN+20, /* systemd: enable status messages */
465 SIGRTMIN+21, /* systemd: disable status messages */
253ee27a
LP
466 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
467 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
600b704e 468 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
4dffec14
LP
469
470 /* .. one free signal here ... */
471
472#if !defined(__hppa64__) && !defined(__hppa__)
473 /* Apparently Linux on hppa has fewer RT
474 * signals (SIGRTMAX is SIGRTMIN+25 there),
475 * hence let's not try to make use of them
476 * here. Since these commands are accessible
477 * by different means and only really a safety
478 * net, the missing functionality on hppa
479 * shouldn't matter. */
480
4cfa2c99 481 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
253ee27a
LP
482 SIGRTMIN+27, /* systemd: set log target to console */
483 SIGRTMIN+28, /* systemd: set log target to kmsg */
ee33e53a 484 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg (obsolete) */
4dffec14
LP
485
486 /* ... one free signal here SIGRTMIN+30 ... */
487#endif
7d793605 488 -1);
ce578209
LP
489 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
490
718db961
LP
491 m->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
492 if (m->signal_fd < 0)
ce578209
LP
493 return -errno;
494
151b9b96 495 r = sd_event_add_io(m->event, &m->signal_event_source, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m);
718db961
LP
496 if (r < 0)
497 return r;
ce578209 498
7dfbe2e3
TG
499 (void) sd_event_source_set_description(m->signal_event_source, "manager-signal");
500
d8fdc620
LP
501 /* Process signals a bit earlier than the rest of things, but later than notify_fd processing, so that the
502 * notify processing can still figure out to which process/service a message belongs, before we reap the
503 * process. Also, process this before handling cgroup notifications, so that we always collect child exit
504 * status information before detecting that there's no process in a cgroup. */
505 r = sd_event_source_set_priority(m->signal_event_source, SD_EVENT_PRIORITY_NORMAL-6);
29083707
LP
506 if (r < 0)
507 return r;
508
463d0d15 509 if (MANAGER_IS_SYSTEM(m))
80876c20 510 return enable_special_signals(m);
e1414003 511
ce578209
LP
512 return 0;
513}
514
f069efb4
LP
515static void manager_clean_environment(Manager *m) {
516 assert(m);
517
518 /* Let's remove some environment variables that we
519 * need ourselves to communicate with our clients */
520 strv_env_unset_many(
521 m->environment,
522 "NOTIFY_SOCKET",
523 "MAINPID",
524 "MANAGERPID",
525 "LISTEN_PID",
526 "LISTEN_FDS",
8dd4c05b 527 "LISTEN_FDNAMES",
f069efb4
LP
528 "WATCHDOG_PID",
529 "WATCHDOG_USEC",
4b58153d 530 "INVOCATION_ID",
f069efb4
LP
531 NULL);
532}
533
e21fea24 534static int manager_default_environment(Manager *m) {
71ecc858
LP
535 assert(m);
536
463d0d15 537 if (MANAGER_IS_SYSTEM(m)) {
e21fea24
KS
538 /* The system manager always starts with a clean
539 * environment for its children. It does not import
71cb7d30 540 * the kernel's or the parents' exported variables.
e21fea24 541 *
71cb7d30 542 * The initial passed environment is untouched to keep
e21fea24
KS
543 * /proc/self/environ valid; it is used for tagging
544 * the init process inside containers. */
43638332
ZJS
545 m->environment = strv_new("PATH=" DEFAULT_PATH,
546 NULL);
e21fea24
KS
547
548 /* Import locale variables LC_*= from configuration */
549 locale_setup(&m->environment);
71cb7d30 550 } else
e21fea24
KS
551 /* The user manager passes its own environment
552 * along to its children. */
553 m->environment = strv_copy(environ);
43d03a83 554
e21fea24
KS
555 if (!m->environment)
556 return -ENOMEM;
8b55b8c4 557
f069efb4 558 manager_clean_environment(m);
9d5a3757
LP
559 strv_sort(m->environment);
560
e21fea24 561 return 0;
71ecc858
LP
562}
563
3536f49e
YW
564static int manager_setup_prefix(Manager *m) {
565 struct table_entry {
566 uint64_t type;
567 const char *suffix;
568 };
569
72fd1768 570 static const struct table_entry paths_system[_EXEC_DIRECTORY_TYPE_MAX] = {
3536f49e
YW
571 [EXEC_DIRECTORY_RUNTIME] = { SD_PATH_SYSTEM_RUNTIME, NULL },
572 [EXEC_DIRECTORY_STATE] = { SD_PATH_SYSTEM_STATE_PRIVATE, NULL },
573 [EXEC_DIRECTORY_CACHE] = { SD_PATH_SYSTEM_STATE_CACHE, NULL },
574 [EXEC_DIRECTORY_LOGS] = { SD_PATH_SYSTEM_STATE_LOGS, NULL },
575 [EXEC_DIRECTORY_CONFIGURATION] = { SD_PATH_SYSTEM_CONFIGURATION, NULL },
576 };
577
72fd1768 578 static const struct table_entry paths_user[_EXEC_DIRECTORY_TYPE_MAX] = {
3536f49e
YW
579 [EXEC_DIRECTORY_RUNTIME] = { SD_PATH_USER_RUNTIME, NULL },
580 [EXEC_DIRECTORY_STATE] = { SD_PATH_USER_CONFIGURATION, NULL },
c6218495
LP
581 [EXEC_DIRECTORY_CACHE] = { SD_PATH_USER_STATE_CACHE, NULL },
582 [EXEC_DIRECTORY_LOGS] = { SD_PATH_USER_CONFIGURATION, "log" },
583 [EXEC_DIRECTORY_CONFIGURATION] = { SD_PATH_USER_CONFIGURATION, NULL },
3536f49e
YW
584 };
585
586 const struct table_entry *p;
587 ExecDirectoryType i;
588 int r;
589
590 assert(m);
591
592 if (MANAGER_IS_SYSTEM(m))
593 p = paths_system;
594 else
595 p = paths_user;
596
72fd1768 597 for (i = 0; i < _EXEC_DIRECTORY_TYPE_MAX; i++) {
3536f49e
YW
598 r = sd_path_home(p[i].type, p[i].suffix, &m->prefix[i]);
599 if (r < 0)
600 return r;
601 }
602
603 return 0;
604}
605
279d81dd
LP
606static int manager_setup_run_queue(Manager *m) {
607 int r;
608
609 assert(m);
610 assert(!m->run_queue_event_source);
611
612 r = sd_event_add_defer(m->event, &m->run_queue_event_source, manager_dispatch_run_queue, m);
613 if (r < 0)
614 return r;
615
616 r = sd_event_source_set_priority(m->run_queue_event_source, SD_EVENT_PRIORITY_IDLE);
617 if (r < 0)
618 return r;
619
620 r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_OFF);
621 if (r < 0)
622 return r;
623
624 (void) sd_event_source_set_description(m->run_queue_event_source, "manager-run-queue");
625
626 return 0;
627}
628
e0a3da1f 629int manager_new(UnitFileScope scope, unsigned test_run_flags, Manager **_m) {
ce578209 630 Manager *m;
e3dd987c 631 int r;
8e274523
LP
632
633 assert(_m);
463d0d15 634 assert(IN_SET(scope, UNIT_FILE_SYSTEM, UNIT_FILE_USER));
ce578209 635
915b3753
LP
636 m = new0(Manager, 1);
637 if (!m)
8e274523 638 return -ENOMEM;
60918275 639
463d0d15 640 m->unit_file_scope = scope;
a16e1123 641 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
bd8f585b 642 m->default_timer_accuracy_usec = USEC_PER_MINUTE;
9ded9cd1 643 m->default_tasks_accounting = true;
79baeeb9 644 m->default_tasks_max = UINT64_MAX;
bd389aa7
LP
645 m->default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
646 m->default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
647 m->default_restart_usec = DEFAULT_RESTART_USEC;
80876c20 648
349cc4a5 649#if ENABLE_EFI
463d0d15 650 if (MANAGER_IS_SYSTEM(m) && detect_container() <= 0)
9f9f0342
LP
651 boot_timestamps(m->timestamps + MANAGER_TIMESTAMP_USERSPACE,
652 m->timestamps + MANAGER_TIMESTAMP_FIRMWARE,
653 m->timestamps + MANAGER_TIMESTAMP_LOADER);
463d0d15
LP
654#endif
655
f2341e0a 656 /* Prepare log fields we can use for structured logging */
463d0d15
LP
657 if (MANAGER_IS_SYSTEM(m)) {
658 m->unit_log_field = "UNIT=";
659 m->unit_log_format_string = "UNIT=%s";
4b58153d
LP
660
661 m->invocation_log_field = "INVOCATION_ID=";
f1c50bec 662 m->invocation_log_format_string = "INVOCATION_ID=%s";
463d0d15
LP
663 } else {
664 m->unit_log_field = "USER_UNIT=";
665 m->unit_log_format_string = "USER_UNIT=%s";
4b58153d
LP
666
667 m->invocation_log_field = "USER_INVOCATION_ID=";
f1c50bec 668 m->invocation_log_format_string = "USER_INVOCATION_ID=%s";
463d0d15 669 }
f2341e0a 670
718db961 671 m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
8742514c 672
d8fdc620 673 m->pin_cgroupfs_fd = m->notify_fd = m->cgroups_agent_fd = m->signal_fd = m->time_change_fd =
232f6754 674 m->dev_autofs_fd = m->private_listen_fd = m->cgroup_inotify_fd =
d8fdc620 675 m->ask_password_inotify_fd = -1;
d379d442 676
00d9ef85
LP
677 m->user_lookup_fds[0] = m->user_lookup_fds[1] = -1;
678
ea430986 679 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
9152c765 680
e46b13c8 681 m->have_ask_password = -EINVAL; /* we don't know */
ae2a2c53 682 m->first_boot = -1;
e46b13c8 683
e0a3da1f 684 m->test_run_flags = test_run_flags;
0d8c31ff 685
2e5c94b9
LP
686 /* Reboot immediately if the user hits C-A-D more often than 7x per 2s */
687 RATELIMIT_INIT(m->ctrl_alt_del_ratelimit, 2 * USEC_PER_SEC, 7);
688
e21fea24
KS
689 r = manager_default_environment(m);
690 if (r < 0)
1137a57c
LP
691 goto fail;
692
d5099efc 693 r = hashmap_ensure_allocated(&m->units, &string_hash_ops);
718db961 694 if (r < 0)
60918275
LP
695 goto fail;
696
d5099efc 697 r = hashmap_ensure_allocated(&m->jobs, NULL);
718db961 698 if (r < 0)
60918275
LP
699 goto fail;
700
d5099efc 701 r = hashmap_ensure_allocated(&m->cgroup_unit, &string_hash_ops);
718db961 702 if (r < 0)
9152c765
LP
703 goto fail;
704
d5099efc 705 r = hashmap_ensure_allocated(&m->watch_bus, &string_hash_ops);
718db961 706 if (r < 0)
05e343b7
LP
707 goto fail;
708
718db961
LP
709 r = sd_event_default(&m->event);
710 if (r < 0)
8742514c
LP
711 goto fail;
712
279d81dd 713 r = manager_setup_run_queue(m);
752b5905
LP
714 if (r < 0)
715 goto fail;
716
8742514c
LP
717 r = manager_setup_signals(m);
718 if (r < 0)
9152c765
LP
719 goto fail;
720
8742514c
LP
721 r = manager_setup_cgroup(m);
722 if (r < 0)
8e274523
LP
723 goto fail;
724
8742514c
LP
725 r = manager_setup_time_change(m);
726 if (r < 0)
8c47c732
LP
727 goto fail;
728
9670d583
LP
729 m->udev = udev_new();
730 if (!m->udev) {
731 r = -ENOMEM;
732 goto fail;
733 }
734
d3070fbd
LP
735 if (MANAGER_IS_SYSTEM(m)) {
736 r = mkdir_label("/run/systemd/units", 0755);
737 if (r < 0 && r != -EEXIST)
738 goto fail;
739 }
740
232f6754
ZJS
741 /* Note that we do not set up the notify fd here. We do that after deserialization,
742 * since they might have gotten serialized across the reexec. */
d86f9d52 743
72bc8d00
LP
744 m->taint_usr = dir_is_empty("/usr") > 0;
745
3536f49e
YW
746 r = manager_setup_prefix(m);
747 if (r < 0)
748 goto fail;
749
8e274523
LP
750 *_m = m;
751 return 0;
60918275
LP
752
753fail:
754 manager_free(m);
8e274523 755 return r;
60918275
LP
756}
757
d86f9d52 758static int manager_setup_notify(Manager *m) {
7181dbdb 759 int r;
d86f9d52 760
e0a3da1f 761 if (m->test_run_flags)
0d8c31ff
ZJS
762 return 0;
763
d86f9d52
LP
764 if (m->notify_fd < 0) {
765 _cleanup_close_ int fd = -1;
920b52e4 766 union sockaddr_union sa = {
7181dbdb
LP
767 .sa.sa_family = AF_UNIX,
768 };
55836941 769 static const int one = 1;
d86f9d52
LP
770
771 /* First free all secondary fields */
a1e58e8e 772 m->notify_socket = mfree(m->notify_socket);
d86f9d52
LP
773 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
774
775 fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
4a62c710
MS
776 if (fd < 0)
777 return log_error_errno(errno, "Failed to allocate notification socket: %m");
d86f9d52 778
a47806fa
LP
779 fd_inc_rcvbuf(fd, NOTIFY_RCVBUF_SIZE);
780
3536f49e 781 m->notify_socket = strappend(m->prefix[EXEC_DIRECTORY_RUNTIME], "/systemd/notify");
498e87d6
LP
782 if (!m->notify_socket)
783 return log_oom();
784
785 (void) mkdir_parents_label(m->notify_socket, 0755);
f0e62e89 786 (void) unlink(m->notify_socket);
7181dbdb
LP
787
788 strncpy(sa.un.sun_path, m->notify_socket, sizeof(sa.un.sun_path)-1);
fc2fffe7 789 r = bind(fd, &sa.sa, SOCKADDR_UN_LEN(sa.un));
4a62c710
MS
790 if (r < 0)
791 return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path);
d86f9d52
LP
792
793 r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
4a62c710
MS
794 if (r < 0)
795 return log_error_errno(errno, "SO_PASSCRED failed: %m");
d86f9d52 796
d86f9d52
LP
797 m->notify_fd = fd;
798 fd = -1;
799
800 log_debug("Using notification socket %s", m->notify_socket);
801 }
802
803 if (!m->notify_event_source) {
151b9b96 804 r = sd_event_add_io(m->event, &m->notify_event_source, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m);
895b3a7b
MS
805 if (r < 0)
806 return log_error_errno(r, "Failed to allocate notify event source: %m");
d86f9d52 807
d8fdc620
LP
808 /* Process notification messages a bit earlier than SIGCHLD, so that we can still identify to which
809 * service an exit message belongs. */
df006034 810 r = sd_event_source_set_priority(m->notify_event_source, SD_EVENT_PRIORITY_NORMAL-7);
23bbb0de
MS
811 if (r < 0)
812 return log_error_errno(r, "Failed to set priority of notify event source: %m");
7dfbe2e3
TG
813
814 (void) sd_event_source_set_description(m->notify_event_source, "manager-notify");
d86f9d52
LP
815 }
816
817 return 0;
818}
819
d8fdc620
LP
820static int manager_setup_cgroups_agent(Manager *m) {
821
822 static const union sockaddr_union sa = {
823 .un.sun_family = AF_UNIX,
824 .un.sun_path = "/run/systemd/cgroups-agent",
825 };
826 int r;
827
828 /* This creates a listening socket we receive cgroups agent messages on. We do not use D-Bus for delivering
829 * these messages from the cgroups agent binary to PID 1, as the cgroups agent binary is very short-living, and
830 * each instance of it needs a new D-Bus connection. Since D-Bus connections are SOCK_STREAM/AF_UNIX, on
831 * overloaded systems the backlog of the D-Bus socket becomes relevant, as not more than the configured number
832 * of D-Bus connections may be queued until the kernel will start dropping further incoming connections,
833 * possibly resulting in lost cgroups agent messages. To avoid this, we'll use a private SOCK_DGRAM/AF_UNIX
834 * socket, where no backlog is relevant as communication may take place without an actual connect() cycle, and
835 * we thus won't lose messages.
836 *
837 * Note that PID 1 will forward the agent message to system bus, so that the user systemd instance may listen
838 * to it. The system instance hence listens on this special socket, but the user instances listen on the system
839 * bus for these messages. */
840
e0a3da1f 841 if (m->test_run_flags)
d8fdc620
LP
842 return 0;
843
844 if (!MANAGER_IS_SYSTEM(m))
845 return 0;
846
c22800e4 847 r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER);
b4cccbc1
LP
848 if (r < 0)
849 return log_error_errno(r, "Failed to determine whether unified cgroups hierarchy is used: %m");
850 if (r > 0) /* We don't need this anymore on the unified hierarchy */
d8fdc620
LP
851 return 0;
852
853 if (m->cgroups_agent_fd < 0) {
854 _cleanup_close_ int fd = -1;
855
856 /* First free all secondary fields */
857 m->cgroups_agent_event_source = sd_event_source_unref(m->cgroups_agent_event_source);
858
859 fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
860 if (fd < 0)
861 return log_error_errno(errno, "Failed to allocate cgroups agent socket: %m");
862
863 fd_inc_rcvbuf(fd, CGROUPS_AGENT_RCVBUF_SIZE);
864
865 (void) unlink(sa.un.sun_path);
866
867 /* Only allow root to connect to this socket */
868 RUN_WITH_UMASK(0077)
fc2fffe7 869 r = bind(fd, &sa.sa, SOCKADDR_UN_LEN(sa.un));
d8fdc620
LP
870 if (r < 0)
871 return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path);
872
873 m->cgroups_agent_fd = fd;
874 fd = -1;
875 }
876
877 if (!m->cgroups_agent_event_source) {
878 r = sd_event_add_io(m->event, &m->cgroups_agent_event_source, m->cgroups_agent_fd, EPOLLIN, manager_dispatch_cgroups_agent_fd, m);
879 if (r < 0)
880 return log_error_errno(r, "Failed to allocate cgroups agent event source: %m");
881
882 /* Process cgroups notifications early, but after having processed service notification messages or
883 * SIGCHLD signals, so that a cgroup running empty is always just the last safety net of notification,
884 * and we collected the metadata the notification and SIGCHLD stuff offers first. Also see handling of
885 * cgroup inotify for the unified cgroup stuff. */
09e24654 886 r = sd_event_source_set_priority(m->cgroups_agent_event_source, SD_EVENT_PRIORITY_NORMAL-4);
d8fdc620
LP
887 if (r < 0)
888 return log_error_errno(r, "Failed to set priority of cgroups agent event source: %m");
889
890 (void) sd_event_source_set_description(m->cgroups_agent_event_source, "manager-cgroups-agent");
891 }
892
893 return 0;
894}
895
00d9ef85
LP
896static int manager_setup_user_lookup_fd(Manager *m) {
897 int r;
898
899 assert(m);
900
901 /* Set up the socket pair used for passing UID/GID resolution results from forked off processes to PID
902 * 1. Background: we can't do name lookups (NSS) from PID 1, since it might involve IPC and thus activation,
903 * and we might hence deadlock on ourselves. Hence we do all user/group lookups asynchronously from the forked
904 * off processes right before executing the binaries to start. In order to be able to clean up any IPC objects
905 * created by a unit (see RemoveIPC=) we need to know in PID 1 the used UID/GID of the executed processes,
906 * hence we establish this communication channel so that forked off processes can pass their UID/GID
907 * information back to PID 1. The forked off processes send their resolved UID/GID to PID 1 in a simple
908 * datagram, along with their unit name, so that we can share one communication socket pair among all units for
909 * this purpose.
910 *
911 * You might wonder why we need a communication channel for this that is independent of the usual notification
912 * socket scheme (i.e. $NOTIFY_SOCKET). The primary difference is about trust: data sent via the $NOTIFY_SOCKET
913 * channel is only accepted if it originates from the right unit and if reception was enabled for it. The user
914 * lookup socket OTOH is only accessible by PID 1 and its children until they exec(), and always available.
915 *
916 * Note that this function is called under two circumstances: when we first initialize (in which case we
917 * allocate both the socket pair and the event source to listen on it), and when we deserialize after a reload
918 * (in which case the socket pair already exists but we still need to allocate the event source for it). */
919
920 if (m->user_lookup_fds[0] < 0) {
921
922 /* Free all secondary fields */
923 safe_close_pair(m->user_lookup_fds);
924 m->user_lookup_event_source = sd_event_source_unref(m->user_lookup_event_source);
925
926 if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, m->user_lookup_fds) < 0)
927 return log_error_errno(errno, "Failed to allocate user lookup socket: %m");
928
929 (void) fd_inc_rcvbuf(m->user_lookup_fds[0], NOTIFY_RCVBUF_SIZE);
930 }
931
932 if (!m->user_lookup_event_source) {
933 r = sd_event_add_io(m->event, &m->user_lookup_event_source, m->user_lookup_fds[0], EPOLLIN, manager_dispatch_user_lookup_fd, m);
934 if (r < 0)
935 return log_error_errno(errno, "Failed to allocate user lookup event source: %m");
936
937 /* Process even earlier than the notify event source, so that we always know first about valid UID/GID
938 * resolutions */
939 r = sd_event_source_set_priority(m->user_lookup_event_source, SD_EVENT_PRIORITY_NORMAL-8);
940 if (r < 0)
941 return log_error_errno(errno, "Failed to set priority ot user lookup event source: %m");
942
943 (void) sd_event_source_set_description(m->user_lookup_event_source, "user-lookup");
944 }
945
946 return 0;
947}
948
d86f9d52
LP
949static int manager_connect_bus(Manager *m, bool reexecuting) {
950 bool try_bus_connect;
5463fa0a 951 Unit *u = NULL;
d86f9d52
LP
952
953 assert(m);
954
e0a3da1f 955 if (m->test_run_flags)
0d8c31ff
ZJS
956 return 0;
957
5463fa0a
MS
958 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
959
d86f9d52 960 try_bus_connect =
41dfa61d 961 (u && SERVICE(u)->deserialized_state == SERVICE_RUNNING) &&
5463fa0a
MS
962 (reexecuting ||
963 (MANAGER_IS_USER(m) && getenv("DBUS_SESSION_BUS_ADDRESS")));
d86f9d52 964
ff9b60f3 965 /* Try to connect to the buses, if possible. */
d86f9d52
LP
966 return bus_init(m, try_bus_connect);
967}
968
23a177ef 969static unsigned manager_dispatch_cleanup_queue(Manager *m) {
595ed347 970 Unit *u;
23a177ef
LP
971 unsigned n = 0;
972
973 assert(m);
974
595ed347
MS
975 while ((u = m->cleanup_queue)) {
976 assert(u->in_cleanup_queue);
23a177ef 977
595ed347 978 unit_free(u);
23a177ef
LP
979 n++;
980 }
981
982 return n;
983}
984
eced69b3 985enum {
35b8ca3a 986 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
eced69b3
LP
987 GC_OFFSET_UNSURE, /* No clue */
988 GC_OFFSET_GOOD, /* We still need this unit */
989 GC_OFFSET_BAD, /* We don't need this unit anymore */
990 _GC_OFFSET_MAX
991};
992
00d9ef85 993static void unit_gc_mark_good(Unit *u, unsigned gc_marker) {
4892084f 994 Unit *other;
eef85c4a
LP
995 Iterator i;
996 void *v;
4892084f
LN
997
998 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
999
1000 /* Recursively mark referenced units as GOOD as well */
eef85c4a 1001 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REFERENCES], i)
4892084f
LN
1002 if (other->gc_marker == gc_marker + GC_OFFSET_UNSURE)
1003 unit_gc_mark_good(other, gc_marker);
1004}
1005
eced69b3 1006static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
701cc384 1007 Unit *other;
eced69b3 1008 bool is_bad;
eef85c4a
LP
1009 Iterator i;
1010 void *v;
701cc384
LP
1011
1012 assert(u);
1013
4c701096
YW
1014 if (IN_SET(u->gc_marker - gc_marker,
1015 GC_OFFSET_GOOD, GC_OFFSET_BAD, GC_OFFSET_UNSURE, GC_OFFSET_IN_PATH))
701cc384
LP
1016 return;
1017
ac155bb8 1018 if (u->in_cleanup_queue)
701cc384
LP
1019 goto bad;
1020
1021 if (unit_check_gc(u))
1022 goto good;
1023
ac155bb8 1024 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
eced69b3
LP
1025
1026 is_bad = true;
1027
eef85c4a 1028 HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_REFERENCED_BY], i) {
701cc384
LP
1029 unit_gc_sweep(other, gc_marker);
1030
ac155bb8 1031 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
701cc384 1032 goto good;
eced69b3 1033
ac155bb8 1034 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
eced69b3 1035 is_bad = false;
701cc384
LP
1036 }
1037
eced69b3
LP
1038 if (is_bad)
1039 goto bad;
1040
1041 /* We were unable to find anything out about this entry, so
1042 * let's investigate it later */
ac155bb8 1043 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
eced69b3
LP
1044 unit_add_to_gc_queue(u);
1045 return;
1046
701cc384 1047bad:
eced69b3
LP
1048 /* We definitely know that this one is not useful anymore, so
1049 * let's mark it for deletion */
ac155bb8 1050 u->gc_marker = gc_marker + GC_OFFSET_BAD;
eced69b3 1051 unit_add_to_cleanup_queue(u);
701cc384
LP
1052 return;
1053
1054good:
4892084f 1055 unit_gc_mark_good(u, gc_marker);
701cc384
LP
1056}
1057
c5a97ed1
LP
1058static unsigned manager_dispatch_gc_unit_queue(Manager *m) {
1059 unsigned n = 0, gc_marker;
595ed347 1060 Unit *u;
701cc384
LP
1061
1062 assert(m);
1063
cf1265e1 1064 /* log_debug("Running GC..."); */
701cc384 1065
eced69b3
LP
1066 m->gc_marker += _GC_OFFSET_MAX;
1067 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
c9c0cadb 1068 m->gc_marker = 1;
701cc384 1069
eced69b3
LP
1070 gc_marker = m->gc_marker;
1071
c5a97ed1 1072 while ((u = m->gc_unit_queue)) {
595ed347 1073 assert(u->in_gc_queue);
701cc384 1074
595ed347 1075 unit_gc_sweep(u, gc_marker);
eced69b3 1076
c5a97ed1 1077 LIST_REMOVE(gc_queue, m->gc_unit_queue, u);
595ed347 1078 u->in_gc_queue = false;
701cc384
LP
1079
1080 n++;
1081
4c701096
YW
1082 if (IN_SET(u->gc_marker - gc_marker,
1083 GC_OFFSET_BAD, GC_OFFSET_UNSURE)) {
cc3bc3e6 1084 if (u->id)
f2341e0a 1085 log_unit_debug(u, "Collecting.");
595ed347
MS
1086 u->gc_marker = gc_marker + GC_OFFSET_BAD;
1087 unit_add_to_cleanup_queue(u);
701cc384
LP
1088 }
1089 }
1090
701cc384
LP
1091 return n;
1092}
1093
c5a97ed1
LP
1094static unsigned manager_dispatch_gc_job_queue(Manager *m) {
1095 unsigned n = 0;
1096 Job *j;
1097
1098 assert(m);
1099
1100 while ((j = m->gc_job_queue)) {
1101 assert(j->in_gc_queue);
1102
1103 LIST_REMOVE(gc_queue, m->gc_job_queue, j);
1104 j->in_gc_queue = false;
1105
1106 n++;
1107
1108 if (job_check_gc(j))
1109 continue;
1110
1111 log_unit_debug(j->unit, "Collecting job.");
1112 (void) job_finish_and_invalidate(j, JOB_COLLECTED, false, false);
1113 }
1114
1115 return n;
1116}
1117
a16e1123 1118static void manager_clear_jobs_and_units(Manager *m) {
a16e1123 1119 Unit *u;
60918275
LP
1120
1121 assert(m);
1122
87f0e418
LP
1123 while ((u = hashmap_first(m->units)))
1124 unit_free(u);
964e0949
LP
1125
1126 manager_dispatch_cleanup_queue(m);
1127
1128 assert(!m->load_queue);
1129 assert(!m->run_queue);
1130 assert(!m->dbus_unit_queue);
1131 assert(!m->dbus_job_queue);
1132 assert(!m->cleanup_queue);
c5a97ed1
LP
1133 assert(!m->gc_unit_queue);
1134 assert(!m->gc_job_queue);
964e0949 1135
964e0949
LP
1136 assert(hashmap_isempty(m->jobs));
1137 assert(hashmap_isempty(m->units));
9e9e2b72
MS
1138
1139 m->n_on_console = 0;
1140 m->n_running_jobs = 0;
a16e1123
LP
1141}
1142
06d8d842 1143Manager* manager_free(Manager *m) {
a16e1123 1144 UnitType c;
c93ff2e9 1145 int i;
35aba85a 1146 ExecDirectoryType dt;
87f0e418 1147
06d8d842
ZJS
1148 if (!m)
1149 return NULL;
a16e1123
LP
1150
1151 manager_clear_jobs_and_units(m);
23a177ef 1152
7824bbeb
LP
1153 for (c = 0; c < _UNIT_TYPE_MAX; c++)
1154 if (unit_vtable[c]->shutdown)
1155 unit_vtable[c]->shutdown(m);
1156
a1f31f47 1157 /* If we reexecute ourselves, we keep the root cgroup around */
c6c18be3 1158 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
8e274523 1159
07a78643 1160 lookup_paths_flush_generator(&m->lookup_paths);
5a1e9937 1161
5e8d1c9a 1162 bus_done(m);
ea430986 1163
29206d46
LP
1164 dynamic_user_vacuum(m, false);
1165 hashmap_free(m->dynamic_users);
1166
87f0e418 1167 hashmap_free(m->units);
4b58153d 1168 hashmap_free(m->units_by_invocation_id);
60918275 1169 hashmap_free(m->jobs);
5ba6985b
LP
1170 hashmap_free(m->watch_pids1);
1171 hashmap_free(m->watch_pids2);
05e343b7 1172 hashmap_free(m->watch_bus);
9152c765 1173
95ae05c0 1174 set_free(m->startup_units);
f755e3b7
LP
1175 set_free(m->failed_units);
1176
718db961
LP
1177 sd_event_source_unref(m->signal_event_source);
1178 sd_event_source_unref(m->notify_event_source);
d8fdc620 1179 sd_event_source_unref(m->cgroups_agent_event_source);
718db961
LP
1180 sd_event_source_unref(m->time_change_event_source);
1181 sd_event_source_unref(m->jobs_in_progress_event_source);
752b5905 1182 sd_event_source_unref(m->run_queue_event_source);
00d9ef85 1183 sd_event_source_unref(m->user_lookup_event_source);
718db961 1184
03e334a1
LP
1185 safe_close(m->signal_fd);
1186 safe_close(m->notify_fd);
d8fdc620 1187 safe_close(m->cgroups_agent_fd);
03e334a1 1188 safe_close(m->time_change_fd);
00d9ef85 1189 safe_close_pair(m->user_lookup_fds);
718db961 1190
e46b13c8
ZJS
1191 manager_close_ask_password(m);
1192
718db961
LP
1193 manager_close_idle_pipe(m);
1194
9670d583 1195 udev_unref(m->udev);
718db961 1196 sd_event_unref(m->event);
60918275 1197
c952c6ec
LP
1198 free(m->notify_socket);
1199
84e3543e 1200 lookup_paths_free(&m->lookup_paths);
1137a57c 1201 strv_free(m->environment);
036643a2 1202
4ad49000 1203 hashmap_free(m->cgroup_unit);
c6c18be3 1204 set_free_free(m->unit_path_cache);
33be102a 1205
664f88a7
LP
1206 free(m->switch_root);
1207 free(m->switch_root_init);
1208
517d56b1 1209 for (i = 0; i < _RLIMIT_MAX; i++)
d9814c76 1210 m->rlimit[i] = mfree(m->rlimit[i]);
c93ff2e9 1211
a57f7e2c
LP
1212 assert(hashmap_isempty(m->units_requiring_mounts_for));
1213 hashmap_free(m->units_requiring_mounts_for);
1214
00d9ef85
LP
1215 hashmap_free(m->uid_refs);
1216 hashmap_free(m->gid_refs);
1217
72fd1768 1218 for (dt = 0; dt < _EXEC_DIRECTORY_TYPE_MAX; dt++)
35aba85a
YW
1219 m->prefix[dt] = mfree(m->prefix[dt]);
1220
6b430fdb 1221 return mfree(m);
60918275
LP
1222}
1223
ba64af90 1224void manager_enumerate(Manager *m) {
f50e0a01 1225 UnitType c;
f50e0a01
LP
1226
1227 assert(m);
1228
a16e1123
LP
1229 /* Let's ask every type to load all units from disk/kernel
1230 * that it might know */
0faacd47 1231 for (c = 0; c < _UNIT_TYPE_MAX; c++) {
1c2e9646 1232 if (!unit_type_supported(c)) {
03afec3c 1233 log_debug("Unit type .%s is not supported on this system.", unit_type_to_string(c));
0faacd47 1234 continue;
a57f7e2c 1235 }
f50e0a01 1236
0faacd47
LP
1237 if (!unit_vtable[c]->enumerate)
1238 continue;
1239
ba64af90 1240 unit_vtable[c]->enumerate(m);
0faacd47
LP
1241 }
1242
f50e0a01 1243 manager_dispatch_load_queue(m);
a16e1123
LP
1244}
1245
007c6337 1246static void manager_coldplug(Manager *m) {
a16e1123
LP
1247 Iterator i;
1248 Unit *u;
1249 char *k;
007c6337 1250 int r;
a16e1123
LP
1251
1252 assert(m);
f50e0a01
LP
1253
1254 /* Then, let's set up their initial state. */
1255 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
1256
1257 /* ignore aliases */
ac155bb8 1258 if (u->id != k)
f50e0a01
LP
1259 continue;
1260
007c6337
LP
1261 r = unit_coldplug(u);
1262 if (r < 0)
1263 log_warning_errno(r, "We couldn't coldplug %s, proceeding anyway: %m", u->id);
f50e0a01 1264 }
a16e1123
LP
1265}
1266
fe51822e
LP
1267static void manager_build_unit_path_cache(Manager *m) {
1268 char **i;
fe51822e
LP
1269 int r;
1270
1271 assert(m);
1272
1273 set_free_free(m->unit_path_cache);
1274
d5099efc 1275 m->unit_path_cache = set_new(&string_hash_ops);
874310b7 1276 if (!m->unit_path_cache) {
d063a527
LP
1277 r = -ENOMEM;
1278 goto fail;
fe51822e
LP
1279 }
1280
1281 /* This simply builds a list of files we know exist, so that
1282 * we don't always have to go to disk */
1283
a3c4eb07 1284 STRV_FOREACH(i, m->lookup_paths.search_path) {
d063a527 1285 _cleanup_closedir_ DIR *d = NULL;
fe51822e
LP
1286 struct dirent *de;
1287
bd0af849
ZJS
1288 d = opendir(*i);
1289 if (!d) {
874310b7 1290 if (errno != ENOENT)
d063a527 1291 log_warning_errno(errno, "Failed to open directory %s, ignoring: %m", *i);
fe51822e
LP
1292 continue;
1293 }
1294
d063a527 1295 FOREACH_DIRENT(de, d, r = -errno; goto fail) {
fe51822e
LP
1296 char *p;
1297
605405c6 1298 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name);
44d91056 1299 if (!p) {
fe51822e
LP
1300 r = -ENOMEM;
1301 goto fail;
1302 }
1303
ef42202a
ZJS
1304 r = set_consume(m->unit_path_cache, p);
1305 if (r < 0)
fe51822e 1306 goto fail;
fe51822e 1307 }
fe51822e
LP
1308 }
1309
1310 return;
1311
1312fail:
d063a527
LP
1313 log_warning_errno(r, "Failed to build unit path cache, proceeding without: %m");
1314 m->unit_path_cache = set_free_free(m->unit_path_cache);
fe51822e
LP
1315}
1316
9ff1a6f1 1317static void manager_distribute_fds(Manager *m, FDSet *fds) {
9588bc32 1318 Iterator i;
9ff1a6f1 1319 Unit *u;
9588bc32
LP
1320
1321 assert(m);
1322
1323 HASHMAP_FOREACH(u, m->units, i) {
1324
1325 if (fdset_size(fds) <= 0)
1326 break;
1327
9ff1a6f1
LP
1328 if (!UNIT_VTABLE(u)->distribute_fds)
1329 continue;
9588bc32 1330
9ff1a6f1
LP
1331 UNIT_VTABLE(u)->distribute_fds(u, fds);
1332 }
9588bc32
LP
1333}
1334
a16e1123 1335int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
17f01ace 1336 int r;
a16e1123
LP
1337
1338 assert(m);
1339
a1f31f47
ZJS
1340 /* If we are running in test mode, we still want to run the generators,
1341 * but we should not touch the real generator directories. */
1342 r = lookup_paths_init(&m->lookup_paths, m->unit_file_scope,
e0a3da1f 1343 m->test_run_flags ? LOOKUP_PATHS_TEMPORARY_GENERATED : 0,
a1f31f47 1344 NULL);
e801700e
ZJS
1345 if (r < 0)
1346 return r;
5a1e9937 1347
64691d20
ZJS
1348 r = manager_run_environment_generators(m);
1349 if (r < 0)
1350 return r;
1351
9f9f0342 1352 dual_timestamp_get(m->timestamps + MANAGER_TIMESTAMP_GENERATORS_START);
a3c4eb07 1353 r = manager_run_generators(m);
9f9f0342 1354 dual_timestamp_get(m->timestamps + MANAGER_TIMESTAMP_GENERATORS_FINISH);
07719a21
LP
1355 if (r < 0)
1356 return r;
1357
fd130612 1358 /* If this is the first boot, and we are in the host system, then preset everything */
81fe6cde 1359 if (m->first_boot > 0 &&
fd130612 1360 MANAGER_IS_SYSTEM(m) &&
e0a3da1f 1361 !m->test_run_flags) {
81fe6cde 1362
17f01ace
ZJS
1363 r = unit_file_preset_all(UNIT_FILE_SYSTEM, 0, NULL, UNIT_FILE_PRESET_ENABLE_ONLY, NULL, 0);
1364 if (r < 0)
1365 log_full_errno(r == -EEXIST ? LOG_NOTICE : LOG_WARNING, r,
1366 "Failed to populate /etc with preset unit settings, ignoring: %m");
28dd66ec
LB
1367 else
1368 log_info("Populated /etc with preset unit settings.");
1369 }
1370
a1453343 1371 lookup_paths_reduce(&m->lookup_paths);
fe51822e
LP
1372 manager_build_unit_path_cache(m);
1373
9f611ad8
LP
1374 /* If we will deserialize make sure that during enumeration
1375 * this is already known, so we increase the counter here
1376 * already */
1377 if (serialization)
313cefa1 1378 m->n_reloading++;
9f611ad8 1379
a16e1123 1380 /* First, enumerate what we can from all config files */
9f9f0342 1381 dual_timestamp_get(m->timestamps + MANAGER_TIMESTAMP_UNITS_LOAD_START);
ba64af90 1382 manager_enumerate(m);
9f9f0342 1383 dual_timestamp_get(m->timestamps + MANAGER_TIMESTAMP_UNITS_LOAD_FINISH);
a16e1123
LP
1384
1385 /* Second, deserialize if there is something to deserialize */
07429866 1386 if (serialization) {
1cd974ed 1387 r = manager_deserialize(m, serialization, fds);
07429866 1388 if (r < 0)
17f01ace 1389 return log_error_errno(r, "Deserialization failed: %m");
07429866 1390 }
a16e1123 1391
01e10de3
LP
1392 /* Any fds left? Find some unit which wants them. This is
1393 * useful to allow container managers to pass some file
1394 * descriptors to us pre-initialized. This enables
1395 * socket-based activation of entire containers. */
9ff1a6f1 1396 manager_distribute_fds(m, fds);
01e10de3 1397
d86f9d52
LP
1398 /* We might have deserialized the notify fd, but if we didn't
1399 * then let's create the bus now */
17f01ace
ZJS
1400 r = manager_setup_notify(m);
1401 if (r < 0)
1402 /* No sense to continue without notifications, our children would fail anyway. */
1403 return r;
d86f9d52 1404
17f01ace
ZJS
1405 r = manager_setup_cgroups_agent(m);
1406 if (r < 0)
1407 /* Likewise, no sense to continue without empty cgroup notifications. */
1408 return r;
d8fdc620 1409
17f01ace
ZJS
1410 r = manager_setup_user_lookup_fd(m);
1411 if (r < 0)
1412 /* This shouldn't fail, except if things are really broken. */
1413 return r;
00d9ef85 1414
232f6754 1415 /* Let's connect to the bus now. */
05a98afd
LP
1416 (void) manager_connect_bus(m, !!serialization);
1417
1418 (void) bus_track_coldplug(m, &m->subscribed, false, m->deserialized_subscribed);
1419 m->deserialized_subscribed = strv_free(m->deserialized_subscribed);
e3dd987c 1420
a16e1123 1421 /* Third, fire things up! */
007c6337 1422 manager_coldplug(m);
a16e1123 1423
29206d46
LP
1424 /* Release any dynamic users no longer referenced */
1425 dynamic_user_vacuum(m, true);
1426
00d9ef85
LP
1427 /* Release any references to UIDs/GIDs no longer referenced, and destroy any IPC owned by them */
1428 manager_vacuum_uid_refs(m);
1429 manager_vacuum_gid_refs(m);
1430
9f611ad8 1431 if (serialization) {
a7556052 1432 assert(m->n_reloading > 0);
313cefa1 1433 m->n_reloading--;
71445ae7
LP
1434
1435 /* Let's wait for the UnitNew/JobNew messages being
1436 * sent, before we notify that the reload is
1437 * finished */
1438 m->send_reloading_done = true;
9f611ad8
LP
1439 }
1440
17f01ace 1441 return 0;
f50e0a01
LP
1442}
1443
4bd29fe5 1444int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, sd_bus_error *e, Job **_ret) {
e5b5ae50 1445 int r;
7527cb52 1446 Transaction *tr;
e5b5ae50
LP
1447
1448 assert(m);
1449 assert(type < _JOB_TYPE_MAX);
87f0e418 1450 assert(unit);
e5b5ae50 1451 assert(mode < _JOB_MODE_MAX);
60918275 1452
7358dc02
ZJS
1453 if (mode == JOB_ISOLATE && type != JOB_START)
1454 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Isolate is only valid for start.");
c497c7a9 1455
7358dc02
ZJS
1456 if (mode == JOB_ISOLATE && !unit->allow_isolate)
1457 return sd_bus_error_setf(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
2528a7a6 1458
f2341e0a 1459 log_unit_debug(unit, "Trying to enqueue job %s/%s/%s", unit->id, job_type_to_string(type), job_mode_to_string(mode));
9f04bd52 1460
c6497ccb 1461 type = job_type_collapse(type, unit);
e0209d83 1462
23ade460 1463 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
7527cb52
MS
1464 if (!tr)
1465 return -ENOMEM;
11dd41ce 1466
4bd29fe5 1467 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, false,
3742095b 1468 IN_SET(mode, JOB_IGNORE_DEPENDENCIES, JOB_IGNORE_REQUIREMENTS),
b94fbd30 1469 mode == JOB_IGNORE_DEPENDENCIES, e);
7527cb52
MS
1470 if (r < 0)
1471 goto tr_abort;
c497c7a9 1472
7527cb52
MS
1473 if (mode == JOB_ISOLATE) {
1474 r = transaction_add_isolate_jobs(tr, m);
1475 if (r < 0)
1476 goto tr_abort;
1477 }
1478
1479 r = transaction_activate(tr, m, mode, e);
1480 if (r < 0)
1481 goto tr_abort;
e5b5ae50 1482
f2341e0a 1483 log_unit_debug(unit,
66870f90
ZJS
1484 "Enqueued job %s/%s as %u", unit->id,
1485 job_type_to_string(type), (unsigned) tr->anchor_job->id);
f50e0a01 1486
e5b5ae50 1487 if (_ret)
b94fbd30 1488 *_ret = tr->anchor_job;
60918275 1489
7527cb52 1490 transaction_free(tr);
e5b5ae50 1491 return 0;
7527cb52
MS
1492
1493tr_abort:
1494 transaction_abort(tr);
1495 transaction_free(tr);
1496 return r;
e5b5ae50 1497}
60918275 1498
53f18416 1499int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, sd_bus_error *e, Job **ret) {
4440b27d 1500 Unit *unit = NULL; /* just to appease gcc, initialization is not really necessary */
28247076
LP
1501 int r;
1502
1503 assert(m);
1504 assert(type < _JOB_TYPE_MAX);
1505 assert(name);
1506 assert(mode < _JOB_MODE_MAX);
1507
c3090674
LP
1508 r = manager_load_unit(m, name, NULL, NULL, &unit);
1509 if (r < 0)
28247076 1510 return r;
4440b27d 1511 assert(unit);
28247076 1512
53f18416
LP
1513 return manager_add_job(m, type, unit, mode, e, ret);
1514}
1515
1516int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Job **ret) {
4afd3348 1517 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
53f18416
LP
1518 int r;
1519
1520 assert(m);
1521 assert(type < _JOB_TYPE_MAX);
1522 assert(name);
1523 assert(mode < _JOB_MODE_MAX);
1524
1525 r = manager_add_job_by_name(m, type, name, mode, &error, ret);
1526 if (r < 0)
1527 return log_warning_errno(r, "Failed to enqueue %s job for %s: %s", job_mode_to_string(mode), name, bus_error_message(&error, r));
1528
1529 return r;
28247076
LP
1530}
1531
15d167f8
JW
1532int manager_propagate_reload(Manager *m, Unit *unit, JobMode mode, sd_bus_error *e) {
1533 int r;
1534 Transaction *tr;
1535
1536 assert(m);
1537 assert(unit);
1538 assert(mode < _JOB_MODE_MAX);
1539 assert(mode != JOB_ISOLATE); /* Isolate is only valid for start */
1540
1541 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
1542 if (!tr)
1543 return -ENOMEM;
1544
1545 /* We need an anchor job */
1546 r = transaction_add_job_and_dependencies(tr, JOB_NOP, unit, NULL, false, false, true, true, e);
1547 if (r < 0)
1548 goto tr_abort;
1549
1550 /* Failure in adding individual dependencies is ignored, so this always succeeds. */
1551 transaction_add_propagate_reload_jobs(tr, unit, tr->anchor_job, mode == JOB_IGNORE_DEPENDENCIES, e);
1552
1553 r = transaction_activate(tr, m, mode, e);
1554 if (r < 0)
1555 goto tr_abort;
1556
1557 transaction_free(tr);
1558 return 0;
1559
1560tr_abort:
1561 transaction_abort(tr);
1562 transaction_free(tr);
1563 return r;
1564}
1565
60918275
LP
1566Job *manager_get_job(Manager *m, uint32_t id) {
1567 assert(m);
1568
1569 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1570}
1571
87f0e418 1572Unit *manager_get_unit(Manager *m, const char *name) {
60918275
LP
1573 assert(m);
1574 assert(name);
1575
87f0e418 1576 return hashmap_get(m->units, name);
60918275
LP
1577}
1578
c1e1601e 1579unsigned manager_dispatch_load_queue(Manager *m) {
595ed347 1580 Unit *u;
c1e1601e 1581 unsigned n = 0;
60918275
LP
1582
1583 assert(m);
1584
223dabab
LP
1585 /* Make sure we are not run recursively */
1586 if (m->dispatching_load_queue)
c1e1601e 1587 return 0;
223dabab
LP
1588
1589 m->dispatching_load_queue = true;
1590
87f0e418 1591 /* Dispatches the load queue. Takes a unit from the queue and
60918275
LP
1592 * tries to load its data until the queue is empty */
1593
595ed347
MS
1594 while ((u = m->load_queue)) {
1595 assert(u->in_load_queue);
034c6ed7 1596
595ed347 1597 unit_load(u);
c1e1601e 1598 n++;
60918275
LP
1599 }
1600
223dabab 1601 m->dispatching_load_queue = false;
c1e1601e 1602 return n;
60918275
LP
1603}
1604
c2756a68
LP
1605int manager_load_unit_prepare(
1606 Manager *m,
1607 const char *name,
1608 const char *path,
718db961 1609 sd_bus_error *e,
c2756a68
LP
1610 Unit **_ret) {
1611
87f0e418 1612 Unit *ret;
7d17cfbc 1613 UnitType t;
60918275
LP
1614 int r;
1615
1616 assert(m);
9e2f7c11 1617 assert(name || path);
7a6a095a 1618 assert(_ret);
60918275 1619
db06e3b6
LP
1620 /* This will prepare the unit for loading, but not actually
1621 * load anything from disk. */
0301abf4 1622
718db961
LP
1623 if (path && !is_path(path))
1624 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
9e2f7c11
LP
1625
1626 if (!name)
2b6bf07d 1627 name = basename(path);
9e2f7c11 1628
7d17cfbc
MS
1629 t = unit_name_to_type(name);
1630
5d512d54
LN
1631 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE)) {
1632 if (unit_name_is_valid(name, UNIT_NAME_TEMPLATE))
1633 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is missing the instance name.", name);
1634
718db961 1635 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is not valid.", name);
5d512d54 1636 }
60918275 1637
7d17cfbc
MS
1638 ret = manager_get_unit(m, name);
1639 if (ret) {
034c6ed7 1640 *_ret = ret;
413d6313 1641 return 1;
034c6ed7 1642 }
60918275 1643
7d17cfbc
MS
1644 ret = unit_new(m, unit_vtable[t]->object_size);
1645 if (!ret)
60918275
LP
1646 return -ENOMEM;
1647
7d17cfbc 1648 if (path) {
ac155bb8
MS
1649 ret->fragment_path = strdup(path);
1650 if (!ret->fragment_path) {
0301abf4
LP
1651 unit_free(ret);
1652 return -ENOMEM;
1653 }
7d17cfbc 1654 }
0301abf4 1655
1058cbf2
ZJS
1656 r = unit_add_name(ret, name);
1657 if (r < 0) {
87f0e418 1658 unit_free(ret);
1ffba6fe 1659 return r;
60918275
LP
1660 }
1661
87f0e418 1662 unit_add_to_load_queue(ret);
c1e1601e 1663 unit_add_to_dbus_queue(ret);
949061f0 1664 unit_add_to_gc_queue(ret);
c1e1601e 1665
7a6a095a 1666 *_ret = ret;
db06e3b6
LP
1667
1668 return 0;
1669}
1670
c2756a68
LP
1671int manager_load_unit(
1672 Manager *m,
1673 const char *name,
1674 const char *path,
718db961 1675 sd_bus_error *e,
c2756a68
LP
1676 Unit **_ret) {
1677
db06e3b6
LP
1678 int r;
1679
1680 assert(m);
7a6a095a 1681 assert(_ret);
db06e3b6
LP
1682
1683 /* This will load the service information files, but not actually
1684 * start any services or anything. */
1685
c3090674
LP
1686 r = manager_load_unit_prepare(m, name, path, e, _ret);
1687 if (r != 0)
db06e3b6
LP
1688 return r;
1689
f50e0a01 1690 manager_dispatch_load_queue(m);
60918275 1691
7a6a095a 1692 *_ret = unit_follow_merge(*_ret);
9e2f7c11 1693
60918275
LP
1694 return 0;
1695}
a66d02c3 1696
cea8e32e 1697void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
034c6ed7 1698 Iterator i;
a66d02c3
LP
1699 Job *j;
1700
1701 assert(s);
1702 assert(f);
1703
034c6ed7 1704 HASHMAP_FOREACH(j, s->jobs, i)
cea8e32e 1705 job_dump(j, f, prefix);
a66d02c3
LP
1706}
1707
87f0e418 1708void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
034c6ed7 1709 Iterator i;
87f0e418 1710 Unit *u;
11dd41ce 1711 const char *t;
a66d02c3
LP
1712
1713 assert(s);
1714 assert(f);
1715
87f0e418 1716 HASHMAP_FOREACH_KEY(u, t, s->units, i)
ac155bb8 1717 if (u->id == t)
87f0e418 1718 unit_dump(u, f, prefix);
a66d02c3 1719}
7fad411c 1720
ad75b9e7
LP
1721void manager_dump(Manager *m, FILE *f, const char *prefix) {
1722 ManagerTimestamp q;
1723
1724 assert(m);
1725 assert(f);
1726
1727 for (q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
1728 char buf[FORMAT_TIMESTAMP_MAX];
1729
1730 if (dual_timestamp_is_set(m->timestamps + q))
1731 fprintf(f, "%sTimestamp %s: %s\n",
1732 strempty(prefix),
1733 manager_timestamp_to_string(q),
1734 format_timestamp(buf, sizeof(buf), m->timestamps[q].realtime));
1735 }
1736
1737 manager_dump_units(m, f, prefix);
1738 manager_dump_jobs(m, f, prefix);
1739}
1740
713f6f90
LP
1741int manager_get_dump_string(Manager *m, char **ret) {
1742 _cleanup_free_ char *dump = NULL;
1743 _cleanup_fclose_ FILE *f = NULL;
1744 size_t size;
1745 int r;
1746
1747 assert(m);
1748 assert(ret);
1749
1750 f = open_memstream(&dump, &size);
1751 if (!f)
1752 return -errno;
1753
1754 __fsetlocking(f, FSETLOCKING_BYCALLER);
1755
1756 manager_dump(m, f, NULL);
1757
1758 r = fflush_and_check(f);
1759 if (r < 0)
1760 return r;
1761
1762 f = safe_fclose(f);
1763
1764 *ret = dump;
1765 dump = NULL;
1766
1767 return 0;
1768}
1769
7fad411c
LP
1770void manager_clear_jobs(Manager *m) {
1771 Job *j;
1772
1773 assert(m);
1774
7fad411c 1775 while ((j = hashmap_first(m->jobs)))
5273510e 1776 /* No need to recurse. We're cancelling all jobs. */
833f92ad 1777 job_finish_and_invalidate(j, JOB_CANCELED, false, false);
7fad411c 1778}
83c60c9f 1779
752b5905
LP
1780static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
1781 Manager *m = userdata;
83c60c9f 1782 Job *j;
034c6ed7 1783
752b5905
LP
1784 assert(source);
1785 assert(m);
9152c765 1786
034c6ed7 1787 while ((j = m->run_queue)) {
ac1135be 1788 assert(j->installed);
034c6ed7
LP
1789 assert(j->in_run_queue);
1790
1791 job_run_and_invalidate(j);
9152c765 1792 }
034c6ed7 1793
a0b64226 1794 if (m->n_running_jobs > 0)
03b717a3
MS
1795 manager_watch_jobs_in_progress(m);
1796
31a7eb86
ZJS
1797 if (m->n_on_console > 0)
1798 manager_watch_idle_pipe(m);
1799
752b5905 1800 return 1;
c1e1601e
LP
1801}
1802
9588bc32 1803static unsigned manager_dispatch_dbus_queue(Manager *m) {
c1e1601e 1804 Job *j;
595ed347 1805 Unit *u;
c1e1601e
LP
1806 unsigned n = 0;
1807
1808 assert(m);
1809
1810 if (m->dispatching_dbus_queue)
1811 return 0;
1812
1813 m->dispatching_dbus_queue = true;
1814
595ed347
MS
1815 while ((u = m->dbus_unit_queue)) {
1816 assert(u->in_dbus_queue);
c1e1601e 1817
595ed347 1818 bus_unit_send_change_signal(u);
c1e1601e
LP
1819 n++;
1820 }
1821
1822 while ((j = m->dbus_job_queue)) {
1823 assert(j->in_dbus_queue);
1824
1825 bus_job_send_change_signal(j);
1826 n++;
1827 }
1828
1829 m->dispatching_dbus_queue = false;
71445ae7
LP
1830
1831 if (m->send_reloading_done) {
1832 m->send_reloading_done = false;
1833
718db961 1834 bus_manager_send_reloading(m, false);
71445ae7
LP
1835 }
1836
718db961
LP
1837 if (m->queued_message)
1838 bus_send_queued_message(m);
1839
c1e1601e 1840 return n;
9152c765
LP
1841}
1842
d8fdc620
LP
1843static int manager_dispatch_cgroups_agent_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1844 Manager *m = userdata;
1845 char buf[PATH_MAX+1];
1846 ssize_t n;
1847
1848 n = recv(fd, buf, sizeof(buf), 0);
1849 if (n < 0)
1850 return log_error_errno(errno, "Failed to read cgroups agent message: %m");
1851 if (n == 0) {
1852 log_error("Got zero-length cgroups agent message, ignoring.");
1853 return 0;
1854 }
1855 if ((size_t) n >= sizeof(buf)) {
1856 log_error("Got overly long cgroups agent message, ignoring.");
1857 return 0;
1858 }
1859
1860 if (memchr(buf, 0, n)) {
1861 log_error("Got cgroups agent message with embedded NUL byte, ignoring.");
1862 return 0;
1863 }
1864 buf[n] = 0;
1865
1866 manager_notify_cgroup_empty(m, buf);
d5f15326 1867 (void) bus_forward_agent_released(m, buf);
d8fdc620
LP
1868
1869 return 0;
1870}
1871
8523bf7d 1872static void manager_invoke_notify_message(Manager *m, Unit *u, pid_t pid, const char *buf, FDSet *fds) {
5ba6985b
LP
1873 _cleanup_strv_free_ char **tags = NULL;
1874
1875 assert(m);
1876 assert(u);
1877 assert(buf);
5ba6985b
LP
1878
1879 tags = strv_split(buf, "\n\r");
1880 if (!tags) {
1881 log_oom();
1882 return;
1883 }
1884
5ba6985b 1885 if (UNIT_VTABLE(u)->notify_message)
a354329f 1886 UNIT_VTABLE(u)->notify_message(u, pid, tags, fds);
a86b7675
ZJS
1887 else if (_unlikely_(log_get_max_level() >= LOG_DEBUG)) {
1888 _cleanup_free_ char *x = NULL, *y = NULL;
1889
1890 x = cescape(buf);
1891 if (x)
1892 y = ellipsize(x, 20, 90);
1893 log_unit_debug(u, "Got notification message \"%s\", ignoring.", strnull(y));
1894 }
5ba6985b
LP
1895}
1896
718db961 1897static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
3d0b8a55 1898
b215b0ed 1899 _cleanup_fdset_free_ FDSet *fds = NULL;
718db961 1900 Manager *m = userdata;
b215b0ed
DH
1901 char buf[NOTIFY_BUFFER_MAX+1];
1902 struct iovec iovec = {
1903 .iov_base = buf,
1904 .iov_len = sizeof(buf)-1,
1905 };
1906 union {
1907 struct cmsghdr cmsghdr;
1908 uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
1909 CMSG_SPACE(sizeof(int) * NOTIFY_FD_MAX)];
1910 } control = {};
1911 struct msghdr msghdr = {
1912 .msg_iov = &iovec,
1913 .msg_iovlen = 1,
1914 .msg_control = &control,
1915 .msg_controllen = sizeof(control),
1916 };
1917
1918 struct cmsghdr *cmsg;
1919 struct ucred *ucred = NULL;
b215b0ed
DH
1920 Unit *u1, *u2, *u3;
1921 int r, *fd_array = NULL;
1922 unsigned n_fds = 0;
8c47c732
LP
1923 ssize_t n;
1924
1925 assert(m);
718db961
LP
1926 assert(m->notify_fd == fd);
1927
1928 if (revents != EPOLLIN) {
1929 log_warning("Got unexpected poll event for notify fd.");
1930 return 0;
1931 }
8c47c732 1932
045a3d59 1933 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC|MSG_TRUNC);
b215b0ed 1934 if (n < 0) {
c55ae51e
LP
1935 if (IN_SET(errno, EAGAIN, EINTR))
1936 return 0; /* Spurious wakeup, try again */
8c47c732 1937
c55ae51e
LP
1938 /* If this is any other, real error, then let's stop processing this socket. This of course means we
1939 * won't take notification messages anymore, but that's still better than busy looping around this:
1940 * being woken up over and over again but being unable to actually read the message off the socket. */
1941 return log_error_errno(errno, "Failed to receive notification message: %m");
b215b0ed 1942 }
a354329f 1943
b215b0ed
DH
1944 CMSG_FOREACH(cmsg, &msghdr) {
1945 if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
a354329f 1946
b215b0ed
DH
1947 fd_array = (int*) CMSG_DATA(cmsg);
1948 n_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
a354329f 1949
b215b0ed
DH
1950 } else if (cmsg->cmsg_level == SOL_SOCKET &&
1951 cmsg->cmsg_type == SCM_CREDENTIALS &&
1952 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
a354329f 1953
b215b0ed 1954 ucred = (struct ucred*) CMSG_DATA(cmsg);
a354329f 1955 }
b215b0ed 1956 }
a354329f 1957
b215b0ed
DH
1958 if (n_fds > 0) {
1959 assert(fd_array);
a354329f 1960
b215b0ed
DH
1961 r = fdset_new_array(&fds, fd_array, n_fds);
1962 if (r < 0) {
1963 close_many(fd_array, n_fds);
9987750e
FB
1964 log_oom();
1965 return 0;
a354329f 1966 }
b215b0ed 1967 }
8c47c732 1968
b215b0ed
DH
1969 if (!ucred || ucred->pid <= 0) {
1970 log_warning("Received notify message without valid credentials. Ignoring.");
1971 return 0;
1972 }
8c47c732 1973
045a3d59 1974 if ((size_t) n >= sizeof(buf) || (msghdr.msg_flags & MSG_TRUNC)) {
b215b0ed
DH
1975 log_warning("Received notify message exceeded maximum size. Ignoring.");
1976 return 0;
1977 }
8c47c732 1978
875ca88d
LP
1979 /* As extra safety check, let's make sure the string we get doesn't contain embedded NUL bytes. We permit one
1980 * trailing NUL byte in the message, but don't expect it. */
1981 if (n > 1 && memchr(buf, 0, n-1)) {
1982 log_warning("Received notify message with embedded NUL bytes. Ignoring.");
1983 return 0;
1984 }
1985
1986 /* Make sure it's NUL-terminated. */
b215b0ed 1987 buf[n] = 0;
8c47c732 1988
b215b0ed
DH
1989 /* Notify every unit that might be interested, but try
1990 * to avoid notifying the same one multiple times. */
1991 u1 = manager_get_unit_by_pid_cgroup(m, ucred->pid);
c4bee3c4 1992 if (u1)
8523bf7d 1993 manager_invoke_notify_message(m, u1, ucred->pid, buf, fds);
5ba6985b 1994
b215b0ed 1995 u2 = hashmap_get(m->watch_pids1, PID_TO_PTR(ucred->pid));
c4bee3c4 1996 if (u2 && u2 != u1)
8523bf7d 1997 manager_invoke_notify_message(m, u2, ucred->pid, buf, fds);
5ba6985b 1998
b215b0ed 1999 u3 = hashmap_get(m->watch_pids2, PID_TO_PTR(ucred->pid));
c4bee3c4 2000 if (u3 && u3 != u2 && u3 != u1)
8523bf7d 2001 manager_invoke_notify_message(m, u3, ucred->pid, buf, fds);
8c47c732 2002
c4bee3c4 2003 if (!u1 && !u2 && !u3)
b215b0ed 2004 log_warning("Cannot find unit for notify message of PID "PID_FMT".", ucred->pid);
a354329f 2005
b215b0ed 2006 if (fdset_size(fds) > 0)
5fd2c135 2007 log_warning("Got extra auxiliary fds with notification message, closing them.");
8c47c732
LP
2008
2009 return 0;
2010}
2011
96d66d89 2012static void invoke_sigchld_event(Manager *m, Unit *u, const siginfo_t *si) {
36f20ae3
KW
2013 uint64_t iteration;
2014
5ba6985b
LP
2015 assert(m);
2016 assert(u);
2017 assert(si);
2018
36f20ae3
KW
2019 sd_event_get_iteration(m->event, &iteration);
2020
f2341e0a 2021 log_unit_debug(u, "Child "PID_FMT" belongs to %s", si->si_pid, u->id);
5ba6985b
LP
2022
2023 unit_unwatch_pid(u, si->si_pid);
e57051f5 2024
36f20ae3 2025 if (UNIT_VTABLE(u)->sigchld_event) {
ccc2c98e
LN
2026 if (set_size(u->pids) <= 1 ||
2027 iteration != u->sigchldgen ||
2028 unit_main_pid(u) == si->si_pid ||
2029 unit_control_pid(u) == si->si_pid) {
36f20ae3
KW
2030 UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
2031 u->sigchldgen = iteration;
2032 } else
1e706c8d 2033 log_debug("%s already issued a sigchld this iteration %" PRIu64 ", skipping. Pids still being watched %d", u->id, iteration, set_size(u->pids));
36f20ae3 2034 }
5ba6985b
LP
2035}
2036
034c6ed7 2037static int manager_dispatch_sigchld(Manager *m) {
9152c765
LP
2038 assert(m);
2039
2040 for (;;) {
b92bea5d 2041 siginfo_t si = {};
9152c765 2042
4112df16
LP
2043 /* First we call waitd() for a PID and do not reap the
2044 * zombie. That way we can still access /proc/$PID for
2045 * it while it is a zombie. */
2046 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
acbb0225
LP
2047
2048 if (errno == ECHILD)
2049 break;
2050
4112df16
LP
2051 if (errno == EINTR)
2052 continue;
2053
9152c765 2054 return -errno;
acbb0225 2055 }
9152c765 2056
4112df16 2057 if (si.si_pid <= 0)
9152c765
LP
2058 break;
2059
3742095b 2060 if (IN_SET(si.si_code, CLD_EXITED, CLD_KILLED, CLD_DUMPED)) {
7fd1b19b 2061 _cleanup_free_ char *name = NULL;
70af4d17 2062 Unit *u1, *u2, *u3;
4112df16 2063
87d2c1ff 2064 get_process_comm(si.si_pid, &name);
4112df16 2065
5ba6985b
LP
2066 log_debug("Child "PID_FMT" (%s) died (code=%s, status=%i/%s)",
2067 si.si_pid, strna(name),
2068 sigchld_code_to_string(si.si_code),
2069 si.si_status,
2070 strna(si.si_code == CLD_EXITED
2071 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
2072 : signal_to_string(si.si_status)));
2073
2074 /* And now figure out the unit this belongs
2075 * to, it might be multiple... */
b3ac818b 2076 u1 = manager_get_unit_by_pid_cgroup(m, si.si_pid);
70af4d17
LP
2077 if (u1)
2078 invoke_sigchld_event(m, u1, &si);
fea72cc0 2079 u2 = hashmap_get(m->watch_pids1, PID_TO_PTR(si.si_pid));
70af4d17
LP
2080 if (u2 && u2 != u1)
2081 invoke_sigchld_event(m, u2, &si);
fea72cc0 2082 u3 = hashmap_get(m->watch_pids2, PID_TO_PTR(si.si_pid));
70af4d17
LP
2083 if (u3 && u3 != u2 && u3 != u1)
2084 invoke_sigchld_event(m, u3, &si);
5ba6985b 2085 }
8c47c732 2086
4112df16
LP
2087 /* And now, we actually reap the zombie. */
2088 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
2089 if (errno == EINTR)
2090 continue;
2091
2092 return -errno;
2093 }
9152c765
LP
2094 }
2095
2096 return 0;
2097}
2098
c75fbada 2099static void manager_start_target(Manager *m, const char *name, JobMode mode) {
4afd3348 2100 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
28247076 2101 int r;
398ef8ba 2102
f2341e0a 2103 log_debug("Activating special unit %s", name);
1e001f52 2104
4bd29fe5 2105 r = manager_add_job_by_name(m, JOB_START, name, mode, &error, NULL);
bd0af849 2106 if (r < 0)
f2341e0a 2107 log_error("Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
28247076
LP
2108}
2109
24dd31c1
LN
2110static void manager_handle_ctrl_alt_del(Manager *m) {
2111 /* If the user presses C-A-D more than
2112 * 7 times within 2s, we reboot/shutdown immediately,
2113 * unless it was disabled in system.conf */
2114
ae8c7939 2115 if (ratelimit_test(&m->ctrl_alt_del_ratelimit) || m->cad_burst_action == EMERGENCY_ACTION_NONE)
24dd31c1 2116 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
ae8c7939
LN
2117 else
2118 emergency_action(m, m->cad_burst_action, NULL,
2119 "Ctrl-Alt-Del was pressed more than 7 times within 2s");
24dd31c1
LN
2120}
2121
718db961
LP
2122static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
2123 Manager *m = userdata;
9152c765
LP
2124 ssize_t n;
2125 struct signalfd_siginfo sfsi;
2126 bool sigchld = false;
dacd6cee 2127 int r;
9152c765
LP
2128
2129 assert(m);
718db961
LP
2130 assert(m->signal_fd == fd);
2131
2132 if (revents != EPOLLIN) {
2133 log_warning("Got unexpected events from signal file descriptor.");
2134 return 0;
2135 }
9152c765
LP
2136
2137 for (;;) {
718db961 2138 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
57cb4adf 2139 if (n != sizeof(sfsi)) {
8f4d6401
ZJS
2140 if (n >= 0) {
2141 log_warning("Truncated read from signal fd (%zu bytes)!", n);
2142 return 0;
2143 }
9152c765 2144
8f4d6401 2145 if (IN_SET(errno, EINTR, EAGAIN))
acbb0225 2146 break;
9152c765 2147
8f4d6401
ZJS
2148 /* We return an error here, which will kill this handler,
2149 * to avoid a busy loop on read error. */
2150 return log_error_errno(errno, "Reading from signal fd failed: %m");
9152c765
LP
2151 }
2152
4daf54a8 2153 log_received_signal(sfsi.ssi_signo == SIGCHLD ||
463d0d15 2154 (sfsi.ssi_signo == SIGTERM && MANAGER_IS_USER(m))
4daf54a8
ZJS
2155 ? LOG_DEBUG : LOG_INFO,
2156 &sfsi);
1e001f52 2157
b9cd2ec1
LP
2158 switch (sfsi.ssi_signo) {
2159
4112df16 2160 case SIGCHLD:
9152c765 2161 sigchld = true;
b9cd2ec1
LP
2162 break;
2163
6632c602 2164 case SIGTERM:
463d0d15 2165 if (MANAGER_IS_SYSTEM(m)) {
db06e3b6
LP
2166 /* This is for compatibility with the
2167 * original sysvinit */
ae57dad3
LP
2168 r = verify_run_space_and_log("Refusing to reexecute");
2169 if (r >= 0)
2170 m->exit_code = MANAGER_REEXECUTE;
a1b256b0
LP
2171 break;
2172 }
84e9af1e 2173
4831981d 2174 _fallthrough_;
e11dc4a2 2175 case SIGINT:
c75fbada 2176 if (MANAGER_IS_SYSTEM(m))
24dd31c1 2177 manager_handle_ctrl_alt_del(m);
c75fbada 2178 else
d60cb656
AJ
2179 manager_start_target(m, SPECIAL_EXIT_TARGET,
2180 JOB_REPLACE_IRREVERSIBLY);
a1b256b0 2181 break;
84e9af1e 2182
28247076 2183 case SIGWINCH:
463d0d15 2184 if (MANAGER_IS_SYSTEM(m))
7d793605 2185 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
84e9af1e 2186
28247076
LP
2187 /* This is a nop on non-init */
2188 break;
84e9af1e 2189
28247076 2190 case SIGPWR:
463d0d15 2191 if (MANAGER_IS_SYSTEM(m))
7d793605 2192 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
84e9af1e 2193
28247076 2194 /* This is a nop on non-init */
84e9af1e 2195 break;
6632c602 2196
1005d14f 2197 case SIGUSR1: {
57ee42ce
LP
2198 Unit *u;
2199
2200 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
2201
2202 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
2203 log_info("Trying to reconnect to bus...");
3996fbe2 2204 bus_init(m, true);
57ee42ce
LP
2205 }
2206
2207 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
2208 log_info("Loading D-Bus service...");
7d793605 2209 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
57ee42ce
LP
2210 }
2211
2212 break;
2213 }
2214
2149e37c 2215 case SIGUSR2: {
718db961 2216 _cleanup_free_ char *dump = NULL;
2149e37c 2217
713f6f90 2218 r = manager_get_dump_string(m, &dump);
dacd6cee 2219 if (r < 0) {
713f6f90 2220 log_warning_errno(errno, "Failed to acquire manager dump: %m");
b2cdc666
DM
2221 break;
2222 }
2223
2149e37c 2224 log_dump(LOG_INFO, dump);
1005d14f 2225 break;
2149e37c 2226 }
1005d14f 2227
a16e1123 2228 case SIGHUP:
ae57dad3
LP
2229 r = verify_run_space_and_log("Refusing to reload");
2230 if (r >= 0)
2231 m->exit_code = MANAGER_RELOAD;
a16e1123
LP
2232 break;
2233
7d793605 2234 default: {
253ee27a 2235
0003d1ab 2236 /* Starting SIGRTMIN+0 */
d60cb656
AJ
2237 static const struct {
2238 const char *target;
2239 JobMode mode;
2240 } target_table[] = {
2241 [0] = { SPECIAL_DEFAULT_TARGET, JOB_ISOLATE },
2242 [1] = { SPECIAL_RESCUE_TARGET, JOB_ISOLATE },
2243 [2] = { SPECIAL_EMERGENCY_TARGET, JOB_ISOLATE },
2244 [3] = { SPECIAL_HALT_TARGET, JOB_REPLACE_IRREVERSIBLY },
2245 [4] = { SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY },
2246 [5] = { SPECIAL_REBOOT_TARGET, JOB_REPLACE_IRREVERSIBLY },
2247 [6] = { SPECIAL_KEXEC_TARGET, JOB_REPLACE_IRREVERSIBLY }
0003d1ab
LP
2248 };
2249
2250 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
2251 static const ManagerExitCode code_table[] = {
2252 [0] = MANAGER_HALT,
2253 [1] = MANAGER_POWEROFF,
2254 [2] = MANAGER_REBOOT,
2255 [3] = MANAGER_KEXEC
7d793605
LP
2256 };
2257
2258 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
0003d1ab 2259 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
764e9b5f 2260 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
d60cb656
AJ
2261 manager_start_target(m, target_table[idx].target,
2262 target_table[idx].mode);
7d793605
LP
2263 break;
2264 }
2265
0003d1ab
LP
2266 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
2267 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
2268 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
2269 break;
2270 }
2271
0658666b
LP
2272 switch (sfsi.ssi_signo - SIGRTMIN) {
2273
2274 case 20:
d450b6f2 2275 manager_set_show_status(m, SHOW_STATUS_YES);
0658666b
LP
2276 break;
2277
2278 case 21:
d450b6f2 2279 manager_set_show_status(m, SHOW_STATUS_NO);
0658666b
LP
2280 break;
2281
253ee27a
LP
2282 case 22:
2283 log_set_max_level(LOG_DEBUG);
4cee3a78 2284 log_info("Setting log level to debug.");
253ee27a
LP
2285 break;
2286
2287 case 23:
2288 log_set_max_level(LOG_INFO);
4cee3a78 2289 log_info("Setting log level to info.");
253ee27a
LP
2290 break;
2291
600b704e 2292 case 24:
463d0d15 2293 if (MANAGER_IS_USER(m)) {
600b704e
LP
2294 m->exit_code = MANAGER_EXIT;
2295 return 0;
2296 }
2297
2298 /* This is a nop on init */
2299 break;
2300
4cfa2c99 2301 case 26:
c1dc6153 2302 case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */
4cfa2c99
LP
2303 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
2304 log_notice("Setting log target to journal-or-kmsg.");
2305 break;
2306
253ee27a
LP
2307 case 27:
2308 log_set_target(LOG_TARGET_CONSOLE);
2309 log_notice("Setting log target to console.");
2310 break;
2311
2312 case 28:
2313 log_set_target(LOG_TARGET_KMSG);
2314 log_notice("Setting log target to kmsg.");
2315 break;
2316
0658666b 2317 default:
4e240ab0 2318 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
0658666b 2319 }
b9cd2ec1 2320 }
7d793605 2321 }
9152c765
LP
2322 }
2323
2324 if (sigchld)
7b77ed8c 2325 manager_dispatch_sigchld(m);
034c6ed7
LP
2326
2327 return 0;
2328}
2329
718db961
LP
2330static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
2331 Manager *m = userdata;
2332 Iterator i;
2333 Unit *u;
034c6ed7
LP
2334
2335 assert(m);
718db961 2336 assert(m->time_change_fd == fd);
034c6ed7 2337
a80c1575 2338 log_struct(LOG_DEBUG,
2b044526 2339 "MESSAGE_ID=" SD_MESSAGE_TIME_CHANGE_STR,
e2cc6eca 2340 LOG_MESSAGE("Time has been changed"),
718db961 2341 NULL);
034c6ed7 2342
718db961
LP
2343 /* Restart the watch */
2344 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
03e334a1 2345 m->time_change_fd = safe_close(m->time_change_fd);
ef734fd6 2346
718db961 2347 manager_setup_time_change(m);
4e434314 2348
718db961
LP
2349 HASHMAP_FOREACH(u, m->units, i)
2350 if (UNIT_VTABLE(u)->time_change)
2351 UNIT_VTABLE(u)->time_change(u);
ea430986 2352
718db961
LP
2353 return 0;
2354}
ea430986 2355
718db961
LP
2356static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
2357 Manager *m = userdata;
8742514c 2358
718db961
LP
2359 assert(m);
2360 assert(m->idle_pipe[2] == fd);
8742514c 2361
718db961 2362 m->no_console_output = m->n_on_console > 0;
03b717a3 2363
718db961 2364 manager_close_idle_pipe(m);
03b717a3 2365
718db961
LP
2366 return 0;
2367}
31a7eb86 2368
718db961
LP
2369static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
2370 Manager *m = userdata;
fd08a840
ZJS
2371 int r;
2372 uint64_t next;
31a7eb86 2373
718db961 2374 assert(m);
fd08a840 2375 assert(source);
9152c765 2376
718db961 2377 manager_print_jobs_in_progress(m);
fd08a840
ZJS
2378
2379 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_PERIOD_USEC;
2380 r = sd_event_source_set_time(source, next);
2381 if (r < 0)
2382 return r;
2383
2384 return sd_event_source_set_enabled(source, SD_EVENT_ONESHOT);
9152c765
LP
2385}
2386
2387int manager_loop(Manager *m) {
2388 int r;
9152c765 2389
fac9f8df 2390 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
ea430986 2391
9152c765 2392 assert(m);
f755e3b7 2393 m->exit_code = MANAGER_OK;
9152c765 2394
fe51822e 2395 /* Release the path cache */
97044145 2396 m->unit_path_cache = set_free_free(m->unit_path_cache);
fe51822e 2397
b0c918b9
LP
2398 manager_check_finished(m);
2399
a4312405 2400 /* There might still be some zombies hanging around from
f3669545 2401 * before we were exec()'ed. Let's reap them. */
e96d6be7
LP
2402 r = manager_dispatch_sigchld(m);
2403 if (r < 0)
a4312405
LP
2404 return r;
2405
f755e3b7 2406 while (m->exit_code == MANAGER_OK) {
718db961 2407 usec_t wait_usec;
9152c765 2408
463d0d15 2409 if (m->runtime_watchdog > 0 && m->runtime_watchdog != USEC_INFINITY && MANAGER_IS_SYSTEM(m))
e96d6be7
LP
2410 watchdog_ping();
2411
ea430986
LP
2412 if (!ratelimit_test(&rl)) {
2413 /* Yay, something is going seriously wrong, pause a little */
2414 log_warning("Looping too fast. Throttling execution a little.");
2415 sleep(1);
2416 }
2417
37a8e683 2418 if (manager_dispatch_load_queue(m) > 0)
23a177ef
LP
2419 continue;
2420
c5a97ed1
LP
2421 if (manager_dispatch_gc_job_queue(m) > 0)
2422 continue;
2423
2424 if (manager_dispatch_gc_unit_queue(m) > 0)
701cc384
LP
2425 continue;
2426
cf1265e1 2427 if (manager_dispatch_cleanup_queue(m) > 0)
c1e1601e 2428 continue;
034c6ed7 2429
91a6073e 2430 if (manager_dispatch_cgroup_realize_queue(m) > 0)
c1e1601e
LP
2431 continue;
2432
c1e1601e 2433 if (manager_dispatch_dbus_queue(m) > 0)
ea430986 2434 continue;
ea430986 2435
c757a65b 2436 /* Sleep for half the watchdog time */
463d0d15 2437 if (m->runtime_watchdog > 0 && m->runtime_watchdog != USEC_INFINITY && MANAGER_IS_SYSTEM(m)) {
718db961
LP
2438 wait_usec = m->runtime_watchdog / 2;
2439 if (wait_usec <= 0)
2440 wait_usec = 1;
c757a65b 2441 } else
3a43da28 2442 wait_usec = USEC_INFINITY;
9152c765 2443
718db961 2444 r = sd_event_run(m->event, wait_usec);
23bbb0de
MS
2445 if (r < 0)
2446 return log_error_errno(r, "Failed to run event loop: %m");
a16e1123 2447 }
957ca890 2448
a16e1123 2449 return m->exit_code;
83c60c9f 2450}
ea430986 2451
718db961 2452int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
ede3a796 2453 _cleanup_free_ char *n = NULL;
4b58153d 2454 sd_id128_t invocation_id;
ea430986 2455 Unit *u;
80fbf05e 2456 int r;
ea430986
LP
2457
2458 assert(m);
2459 assert(s);
2460 assert(_u);
2461
ede3a796
LP
2462 r = unit_name_from_dbus_path(s, &n);
2463 if (r < 0)
2464 return r;
ea430986 2465
4b58153d
LP
2466 /* Permit addressing units by invocation ID: if the passed bus path is suffixed by a 128bit ID then we use it
2467 * as invocation ID. */
2468 r = sd_id128_from_string(n, &invocation_id);
2469 if (r >= 0) {
2470 u = hashmap_get(m->units_by_invocation_id, &invocation_id);
2471 if (u) {
2472 *_u = u;
2473 return 0;
2474 }
2475
2476 return sd_bus_error_setf(e, BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID, "No unit with the specified invocation ID " SD_ID128_FORMAT_STR " known.", SD_ID128_FORMAT_VAL(invocation_id));
2477 }
2478
00c83b43
LP
2479 /* If this didn't work, we check if this is a unit name */
2480 if (!unit_name_is_valid(n, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE))
2481 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is neither a valid invocation ID nor unit name.", n);
2482
80fbf05e 2483 r = manager_load_unit(m, n, NULL, e, &u);
80fbf05e
MS
2484 if (r < 0)
2485 return r;
ea430986
LP
2486
2487 *_u = u;
ea430986
LP
2488 return 0;
2489}
86fbf370
LP
2490
2491int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
718db961 2492 const char *p;
86fbf370 2493 unsigned id;
718db961 2494 Job *j;
86fbf370
LP
2495 int r;
2496
2497 assert(m);
2498 assert(s);
2499 assert(_j);
2500
718db961
LP
2501 p = startswith(s, "/org/freedesktop/systemd1/job/");
2502 if (!p)
86fbf370
LP
2503 return -EINVAL;
2504
718db961 2505 r = safe_atou(p, &id);
8742514c 2506 if (r < 0)
86fbf370
LP
2507 return r;
2508
8742514c
LP
2509 j = manager_get_job(m, id);
2510 if (!j)
86fbf370
LP
2511 return -ENOENT;
2512
2513 *_j = j;
2514
2515 return 0;
2516}
dfcd764e 2517
4927fcae 2518void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
e537352b 2519
349cc4a5 2520#if HAVE_AUDIT
2ba11090 2521 _cleanup_free_ char *p = NULL;
0aa281df 2522 const char *msg;
7410616c 2523 int audit_fd, r;
e537352b 2524
463d0d15 2525 if (!MANAGER_IS_SYSTEM(m))
a1a078ee
LP
2526 return;
2527
c1165f82
LP
2528 audit_fd = get_audit_fd();
2529 if (audit_fd < 0)
e537352b
LP
2530 return;
2531
bbd3a7ba
LP
2532 /* Don't generate audit events if the service was already
2533 * started and we're just deserializing */
2c289ea8 2534 if (MANAGER_IS_RELOADING(m))
bbd3a7ba
LP
2535 return;
2536
ac155bb8 2537 if (u->type != UNIT_SERVICE)
f1dd0c3f
LP
2538 return;
2539
7410616c
LP
2540 r = unit_name_to_prefix_and_instance(u->id, &p);
2541 if (r < 0) {
2542 log_error_errno(r, "Failed to extract prefix and instance of unit name: %m");
e537352b
LP
2543 return;
2544 }
2545
63c372cb 2546 msg = strjoina("unit=", p);
0aa281df
LP
2547 if (audit_log_user_comm_message(audit_fd, type, msg, "systemd", NULL, NULL, NULL, success) < 0) {
2548 if (errno == EPERM)
391ade86 2549 /* We aren't allowed to send audit messages?
44785992 2550 * Then let's not retry again. */
c1165f82 2551 close_audit_fd();
0aa281df 2552 else
56f64d95 2553 log_warning_errno(errno, "Failed to send audit message: %m");
391ade86 2554 }
4927fcae 2555#endif
e537352b 2556
e537352b
LP
2557}
2558
e983b760 2559void manager_send_unit_plymouth(Manager *m, Unit *u) {
fc2fffe7 2560 static const union sockaddr_union sa = PLYMOUTH_SOCKET;
2ba11090
ZJS
2561 _cleanup_free_ char *message = NULL;
2562 _cleanup_close_ int fd = -1;
fc2fffe7 2563 int n = 0;
e983b760
LP
2564
2565 /* Don't generate plymouth events if the service was already
2566 * started and we're just deserializing */
2c289ea8 2567 if (MANAGER_IS_RELOADING(m))
e983b760
LP
2568 return;
2569
463d0d15 2570 if (!MANAGER_IS_SYSTEM(m))
e983b760
LP
2571 return;
2572
75f86906 2573 if (detect_container() > 0)
3772995a
LP
2574 return;
2575
ec2ce0c5 2576 if (!IN_SET(u->type, UNIT_SERVICE, UNIT_MOUNT, UNIT_SWAP))
e983b760
LP
2577 return;
2578
2579 /* We set SOCK_NONBLOCK here so that we rather drop the
2580 * message then wait for plymouth */
e62d8c39
ZJS
2581 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
2582 if (fd < 0) {
56f64d95 2583 log_error_errno(errno, "socket() failed: %m");
e983b760
LP
2584 return;
2585 }
2586
fc2fffe7 2587 if (connect(fd, &sa.sa, SOCKADDR_UN_LEN(sa.un)) < 0) {
e983b760 2588
2ba11090 2589 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
56f64d95 2590 log_error_errno(errno, "connect() failed: %m");
2ba11090 2591 return;
e983b760
LP
2592 }
2593
ac155bb8 2594 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
0d0f0c50 2595 log_oom();
2ba11090 2596 return;
e983b760
LP
2597 }
2598
2599 errno = 0;
2ba11090
ZJS
2600 if (write(fd, message, n + 1) != n + 1)
2601 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
56f64d95 2602 log_error_errno(errno, "Failed to write Plymouth message: %m");
e983b760
LP
2603}
2604
d8d5ab98 2605int manager_open_serialization(Manager *m, FILE **_f) {
504afd7c 2606 int fd;
a16e1123
LP
2607 FILE *f;
2608
2609 assert(_f);
2610
504afd7c
ZJS
2611 fd = open_serialization_fd("systemd-state");
2612 if (fd < 0)
2613 return fd;
a16e1123 2614
01e10de3 2615 f = fdopen(fd, "w+");
d86f9d52 2616 if (!f) {
03e334a1 2617 safe_close(fd);
a16e1123 2618 return -errno;
d86f9d52 2619 }
a16e1123
LP
2620
2621 *_f = f;
a16e1123
LP
2622 return 0;
2623}
2624
b3680f49 2625int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
9f9f0342
LP
2626 ManagerTimestamp q;
2627 const char *t;
a16e1123
LP
2628 Iterator i;
2629 Unit *u;
a16e1123
LP
2630 int r;
2631
2632 assert(m);
2633 assert(f);
2634 assert(fds);
2635
313cefa1 2636 m->n_reloading++;
38c52d46 2637
1fa2f38f 2638 fprintf(f, "current-job-id=%"PRIu32"\n", m->current_job_id);
33c5fae9
LP
2639 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
2640 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
0c2826c6
ZJS
2641 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
2642 fprintf(f, "ready-sent=%s\n", yes_no(m->ready_sent));
01d67b43 2643
9f9f0342
LP
2644 for (q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
2645 /* The userspace and finish timestamps only apply to the host system, hence only serialize them there */
2646 if (in_initrd() && IN_SET(q, MANAGER_TIMESTAMP_USERSPACE, MANAGER_TIMESTAMP_FINISH))
2647 continue;
f38ed060 2648
9f9f0342
LP
2649 t = manager_timestamp_to_string(q);
2650 {
2651 char field[strlen(t) + strlen("-timestamp") + 1];
2652 strcpy(stpcpy(field, t), "-timestamp");
2653 dual_timestamp_serialize(f, field, m->timestamps + q);
2654 }
f38ed060 2655 }
47a483a1 2656
fe902fa4
ZJS
2657 if (!switching_root)
2658 (void) serialize_environment(f, m->environment);
4a9fd066 2659
d86f9d52
LP
2660 if (m->notify_fd >= 0) {
2661 int copy;
2662
2663 copy = fdset_put_dup(fds, m->notify_fd);
2664 if (copy < 0)
2665 return copy;
2666
2667 fprintf(f, "notify-fd=%i\n", copy);
2668 fprintf(f, "notify-socket=%s\n", m->notify_socket);
2669 }
2670
d8fdc620
LP
2671 if (m->cgroups_agent_fd >= 0) {
2672 int copy;
2673
2674 copy = fdset_put_dup(fds, m->cgroups_agent_fd);
2675 if (copy < 0)
2676 return copy;
2677
2678 fprintf(f, "cgroups-agent-fd=%i\n", copy);
2679 }
2680
00d9ef85
LP
2681 if (m->user_lookup_fds[0] >= 0) {
2682 int copy0, copy1;
2683
2684 copy0 = fdset_put_dup(fds, m->user_lookup_fds[0]);
2685 if (copy0 < 0)
2686 return copy0;
2687
2688 copy1 = fdset_put_dup(fds, m->user_lookup_fds[1]);
2689 if (copy1 < 0)
2690 return copy1;
2691
2692 fprintf(f, "user-lookup=%i %i\n", copy0, copy1);
2693 }
2694
05a98afd 2695 bus_track_serialize(m->subscribed, f, "subscribed");
6fa48533 2696
29206d46
LP
2697 r = dynamic_user_serialize(m, f, fds);
2698 if (r < 0)
2699 return r;
2700
00d9ef85
LP
2701 manager_serialize_uid_refs(m, f);
2702 manager_serialize_gid_refs(m, f);
2703
4b61c875 2704 fputc_unlocked('\n', f);
f2382a94 2705
a16e1123 2706 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
ac155bb8 2707 if (u->id != t)
a16e1123
LP
2708 continue;
2709
a16e1123 2710 /* Start marker */
4b61c875
LP
2711 fputs_unlocked(u->id, f);
2712 fputc_unlocked('\n', f);
a16e1123 2713
6fa48533
LP
2714 r = unit_serialize(u, f, fds, !switching_root);
2715 if (r < 0) {
313cefa1 2716 m->n_reloading--;
a16e1123 2717 return r;
38c52d46 2718 }
a16e1123
LP
2719 }
2720
a7556052 2721 assert(m->n_reloading > 0);
313cefa1 2722 m->n_reloading--;
38c52d46 2723
a16e1123
LP
2724 if (ferror(f))
2725 return -EIO;
2726
b23de6af
LP
2727 r = bus_fdset_add_all(m, fds);
2728 if (r < 0)
2729 return r;
2730
a16e1123
LP
2731 return 0;
2732}
2733
2734int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2735 int r = 0;
2736
2737 assert(m);
2738 assert(f);
2739
2740 log_debug("Deserializing state...");
2741
313cefa1 2742 m->n_reloading++;
82c64bf5 2743
10f8e83c 2744 for (;;) {
d233c99a
ZJS
2745 char line[LINE_MAX];
2746 const char *val, *l;
10f8e83c
LP
2747
2748 if (!fgets(line, sizeof(line), f)) {
2749 if (feof(f))
2750 r = 0;
2751 else
2752 r = -errno;
2753
2754 goto finish;
2755 }
2756
2757 char_array_0(line);
2758 l = strstrip(line);
2759
2760 if (l[0] == 0)
2761 break;
2762
fb4650aa 2763 if ((val = startswith(l, "current-job-id="))) {
01d67b43
LP
2764 uint32_t id;
2765
fb4650aa 2766 if (safe_atou32(val, &id) < 0)
62c460c6 2767 log_notice("Failed to parse current job id value %s", val);
01d67b43
LP
2768 else
2769 m->current_job_id = MAX(m->current_job_id, id);
718db961 2770
fb4650aa 2771 } else if ((val = startswith(l, "n-installed-jobs="))) {
33c5fae9
LP
2772 uint32_t n;
2773
fb4650aa 2774 if (safe_atou32(val, &n) < 0)
62c460c6 2775 log_notice("Failed to parse installed jobs counter %s", val);
33c5fae9
LP
2776 else
2777 m->n_installed_jobs += n;
718db961 2778
fb4650aa 2779 } else if ((val = startswith(l, "n-failed-jobs="))) {
33c5fae9
LP
2780 uint32_t n;
2781
fb4650aa 2782 if (safe_atou32(val, &n) < 0)
62c460c6 2783 log_notice("Failed to parse failed jobs counter %s", val);
33c5fae9
LP
2784 else
2785 m->n_failed_jobs += n;
718db961 2786
fb4650aa 2787 } else if ((val = startswith(l, "taint-usr="))) {
01d67b43
LP
2788 int b;
2789
fb4650aa 2790 b = parse_boolean(val);
e3dd987c 2791 if (b < 0)
62c460c6 2792 log_notice("Failed to parse taint /usr flag %s", val);
01d67b43
LP
2793 else
2794 m->taint_usr = m->taint_usr || b;
718db961 2795
0c2826c6
ZJS
2796 } else if ((val = startswith(l, "ready-sent="))) {
2797 int b;
2798
2799 b = parse_boolean(val);
2800 if (b < 0)
2801 log_notice("Failed to parse ready-sent flag %s", val);
2802 else
2803 m->ready_sent = m->ready_sent || b;
2804
9f9f0342 2805 } else if (startswith(l, "env=")) {
fe902fa4 2806 r = deserialize_environment(&m->environment, l);
d233c99a
ZJS
2807 if (r == -ENOMEM)
2808 goto finish;
527b7a42 2809 if (r < 0)
d233c99a 2810 log_notice_errno(r, "Failed to parse environment entry: \"%s\": %m", l);
e3dd987c 2811
fb4650aa 2812 } else if ((val = startswith(l, "notify-fd="))) {
d86f9d52
LP
2813 int fd;
2814
fb4650aa 2815 if (safe_atoi(val, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
62c460c6 2816 log_notice("Failed to parse notify fd: \"%s\"", val);
d86f9d52 2817 else {
03e334a1
LP
2818 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
2819 safe_close(m->notify_fd);
d86f9d52
LP
2820 m->notify_fd = fdset_remove(fds, fd);
2821 }
2822
fb4650aa 2823 } else if ((val = startswith(l, "notify-socket="))) {
d86f9d52
LP
2824 char *n;
2825
fb4650aa 2826 n = strdup(val);
d86f9d52
LP
2827 if (!n) {
2828 r = -ENOMEM;
2829 goto finish;
2830 }
2831
2832 free(m->notify_socket);
2833 m->notify_socket = n;
2834
fb4650aa 2835 } else if ((val = startswith(l, "cgroups-agent-fd="))) {
d8fdc620
LP
2836 int fd;
2837
fb4650aa 2838 if (safe_atoi(val, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
62c460c6 2839 log_notice("Failed to parse cgroups agent fd: %s", val);
d8fdc620
LP
2840 else {
2841 m->cgroups_agent_event_source = sd_event_source_unref(m->cgroups_agent_event_source);
2842 safe_close(m->cgroups_agent_fd);
2843 m->cgroups_agent_fd = fdset_remove(fds, fd);
2844 }
2845
fb4650aa 2846 } else if ((val = startswith(l, "user-lookup="))) {
00d9ef85
LP
2847 int fd0, fd1;
2848
fb4650aa 2849 if (sscanf(val, "%i %i", &fd0, &fd1) != 2 || fd0 < 0 || fd1 < 0 || fd0 == fd1 || !fdset_contains(fds, fd0) || !fdset_contains(fds, fd1))
62c460c6 2850 log_notice("Failed to parse user lookup fd: %s", val);
00d9ef85
LP
2851 else {
2852 m->user_lookup_event_source = sd_event_source_unref(m->user_lookup_event_source);
2853 safe_close_pair(m->user_lookup_fds);
2854 m->user_lookup_fds[0] = fdset_remove(fds, fd0);
2855 m->user_lookup_fds[1] = fdset_remove(fds, fd1);
2856 }
2857
fb4650aa
ZJS
2858 } else if ((val = startswith(l, "dynamic-user=")))
2859 dynamic_user_deserialize_one(m, val, fds);
2860 else if ((val = startswith(l, "destroy-ipc-uid=")))
2861 manager_deserialize_uid_refs_one(m, val);
2862 else if ((val = startswith(l, "destroy-ipc-gid=")))
2863 manager_deserialize_gid_refs_one(m, val);
2864 else if ((val = startswith(l, "subscribed="))) {
05a98afd 2865
fb4650aa 2866 if (strv_extend(&m->deserialized_subscribed, val) < 0)
05a98afd 2867 log_oom();
9f9f0342
LP
2868 } else {
2869 ManagerTimestamp q;
2870
2871 for (q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
2872 val = startswith(l, manager_timestamp_to_string(q));
2873 if (!val)
2874 continue;
05a98afd 2875
9f9f0342
LP
2876 val = startswith(val, "-timestamp=");
2877 if (val)
2878 break;
2879 }
05a98afd 2880
9f9f0342
LP
2881 if (q < _MANAGER_TIMESTAMP_MAX) /* found it */
2882 dual_timestamp_deserialize(val, m->timestamps + q);
2883 else if (!startswith(l, "kdbus-fd=")) /* ignore kdbus */
2884 log_notice("Unknown serialization item '%s'", l);
2885 }
10f8e83c
LP
2886 }
2887
a16e1123
LP
2888 for (;;) {
2889 Unit *u;
2890 char name[UNIT_NAME_MAX+2];
07429866 2891 const char* unit_name;
a16e1123
LP
2892
2893 /* Start marker */
2894 if (!fgets(name, sizeof(name), f)) {
2895 if (feof(f))
10f8e83c
LP
2896 r = 0;
2897 else
2898 r = -errno;
a16e1123 2899
82c64bf5 2900 goto finish;
a16e1123
LP
2901 }
2902
2903 char_array_0(name);
07429866 2904 unit_name = strstrip(name);
a16e1123 2905
07429866
ZJS
2906 r = manager_load_unit(m, unit_name, NULL, NULL, &u);
2907 if (r < 0) {
2908 log_notice_errno(r, "Failed to load unit \"%s\", skipping deserialization: %m", unit_name);
2909 if (r == -ENOMEM)
2910 goto finish;
2911 unit_deserialize_skip(f);
2912 continue;
2913 }
a16e1123 2914
01e10de3 2915 r = unit_deserialize(u, f, fds);
07429866
ZJS
2916 if (r < 0) {
2917 log_notice_errno(r, "Failed to deserialize unit \"%s\": %m", unit_name);
2918 if (r == -ENOMEM)
2919 goto finish;
2920 }
a16e1123
LP
2921 }
2922
10f8e83c 2923finish:
145b1f79 2924 if (ferror(f))
82c64bf5 2925 r = -EIO;
a16e1123 2926
a7556052 2927 assert(m->n_reloading > 0);
313cefa1 2928 m->n_reloading--;
82c64bf5
LP
2929
2930 return r;
a16e1123
LP
2931}
2932
2933int manager_reload(Manager *m) {
2934 int r, q;
51d122af
ZJS
2935 _cleanup_fclose_ FILE *f = NULL;
2936 _cleanup_fdset_free_ FDSet *fds = NULL;
a16e1123
LP
2937
2938 assert(m);
2939
07719a21
LP
2940 r = manager_open_serialization(m, &f);
2941 if (r < 0)
a16e1123
LP
2942 return r;
2943
313cefa1 2944 m->n_reloading++;
718db961 2945 bus_manager_send_reloading(m, true);
38c52d46 2946
07719a21
LP
2947 fds = fdset_new();
2948 if (!fds) {
313cefa1 2949 m->n_reloading--;
51d122af 2950 return -ENOMEM;
a16e1123
LP
2951 }
2952
b3680f49 2953 r = manager_serialize(m, f, fds, false);
07719a21 2954 if (r < 0) {
313cefa1 2955 m->n_reloading--;
51d122af 2956 return r;
38c52d46 2957 }
a16e1123
LP
2958
2959 if (fseeko(f, 0, SEEK_SET) < 0) {
313cefa1 2960 m->n_reloading--;
51d122af 2961 return -errno;
a16e1123
LP
2962 }
2963
2964 /* From here on there is no way back. */
2965 manager_clear_jobs_and_units(m);
07a78643 2966 lookup_paths_flush_generator(&m->lookup_paths);
84e3543e 2967 lookup_paths_free(&m->lookup_paths);
29206d46 2968 dynamic_user_vacuum(m, false);
00d9ef85
LP
2969 m->uid_refs = hashmap_free(m->uid_refs);
2970 m->gid_refs = hashmap_free(m->gid_refs);
2ded0c04 2971
4943d143 2972 q = lookup_paths_init(&m->lookup_paths, m->unit_file_scope, 0, NULL);
e801700e
ZJS
2973 if (q < 0 && r >= 0)
2974 r = q;
5a1e9937 2975
64691d20
ZJS
2976 q = manager_run_environment_generators(m);
2977 if (q < 0 && r >= 0)
2978 r = q;
2979
a3c4eb07
LP
2980 /* Find new unit paths */
2981 q = manager_run_generators(m);
e801700e 2982 if (q < 0 && r >= 0)
07719a21
LP
2983 r = q;
2984
a1453343 2985 lookup_paths_reduce(&m->lookup_paths);
5a1e9937
LP
2986 manager_build_unit_path_cache(m);
2987
a16e1123 2988 /* First, enumerate what we can from all config files */
ba64af90 2989 manager_enumerate(m);
a16e1123
LP
2990
2991 /* Second, deserialize our stored data */
07719a21 2992 q = manager_deserialize(m, f, fds);
07429866
ZJS
2993 if (q < 0) {
2994 log_error_errno(q, "Deserialization failed: %m");
2995
2996 if (r >= 0)
2997 r = q;
2998 }
a16e1123
LP
2999
3000 fclose(f);
3001 f = NULL;
3002
a2cc4a6c
ZJS
3003 /* Re-register notify_fd as event source */
3004 q = manager_setup_notify(m);
e801700e 3005 if (q < 0 && r >= 0)
a2cc4a6c
ZJS
3006 r = q;
3007
d8fdc620
LP
3008 q = manager_setup_cgroups_agent(m);
3009 if (q < 0 && r >= 0)
3010 r = q;
3011
00d9ef85
LP
3012 q = manager_setup_user_lookup_fd(m);
3013 if (q < 0 && r >= 0)
3014 r = q;
3015
a16e1123 3016 /* Third, fire things up! */
007c6337 3017 manager_coldplug(m);
a16e1123 3018
29206d46
LP
3019 /* Release any dynamic users no longer referenced */
3020 dynamic_user_vacuum(m, true);
3021
00d9ef85
LP
3022 /* Release any references to UIDs/GIDs no longer referenced, and destroy any IPC owned by them */
3023 manager_vacuum_uid_refs(m);
3024 manager_vacuum_gid_refs(m);
3025
8936a5e3
DM
3026 /* Sync current state of bus names with our set of listening units */
3027 if (m->api_bus)
3028 manager_sync_bus_names(m, m->api_bus);
3029
a7556052
LP
3030 assert(m->n_reloading > 0);
3031 m->n_reloading--;
9f611ad8 3032
71445ae7
LP
3033 m->send_reloading_done = true;
3034
a16e1123
LP
3035 return r;
3036}
3037
fdf20a31 3038void manager_reset_failed(Manager *m) {
5632e374
LP
3039 Unit *u;
3040 Iterator i;
3041
3042 assert(m);
3043
3044 HASHMAP_FOREACH(u, m->units, i)
fdf20a31 3045 unit_reset_failed(u);
5632e374
LP
3046}
3047
31afa0a4 3048bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
8f6df3fa
LP
3049 Unit *u;
3050
3051 assert(m);
3052 assert(name);
3053
3054 /* Returns true if the unit is inactive or going down */
bd0af849
ZJS
3055 u = manager_get_unit(m, name);
3056 if (!u)
8f6df3fa
LP
3057 return true;
3058
31afa0a4 3059 return unit_inactive_or_pending(u);
8f6df3fa
LP
3060}
3061
56dacdbc 3062static void manager_notify_finished(Manager *m) {
7ceba241 3063 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
915b3753 3064 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
b0c918b9 3065
e0a3da1f 3066 if (m->test_run_flags)
b0c918b9
LP
3067 return;
3068
463d0d15 3069 if (MANAGER_IS_SYSTEM(m) && detect_container() <= 0) {
e03ae661 3070
9f9f0342
LP
3071 /* Note that MANAGER_TIMESTAMP_KERNEL's monotonic value is always at 0, and
3072 * MANAGER_TIMESTAMP_FIRMWARE's and MANAGER_TIMESTAMP_LOADER's monotonic value should be considered
915b3753
LP
3073 * negative values. */
3074
9f9f0342
LP
3075 firmware_usec = m->timestamps[MANAGER_TIMESTAMP_FIRMWARE].monotonic - m->timestamps[MANAGER_TIMESTAMP_LOADER].monotonic;
3076 loader_usec = m->timestamps[MANAGER_TIMESTAMP_LOADER].monotonic - m->timestamps[MANAGER_TIMESTAMP_KERNEL].monotonic;
3077 userspace_usec = m->timestamps[MANAGER_TIMESTAMP_FINISH].monotonic - m->timestamps[MANAGER_TIMESTAMP_USERSPACE].monotonic;
3078 total_usec = m->timestamps[MANAGER_TIMESTAMP_FIRMWARE].monotonic + m->timestamps[MANAGER_TIMESTAMP_FINISH].monotonic;
18fa6b27 3079
9f9f0342 3080 if (dual_timestamp_is_set(&m->timestamps[MANAGER_TIMESTAMP_INITRD])) {
18fa6b27 3081
9f9f0342
LP
3082 /* The initrd case on bare-metal*/
3083 kernel_usec = m->timestamps[MANAGER_TIMESTAMP_INITRD].monotonic - m->timestamps[MANAGER_TIMESTAMP_KERNEL].monotonic;
3084 initrd_usec = m->timestamps[MANAGER_TIMESTAMP_USERSPACE].monotonic - m->timestamps[MANAGER_TIMESTAMP_INITRD].monotonic;
18fa6b27 3085
e12919e8 3086 log_struct(LOG_INFO,
2b044526 3087 "MESSAGE_ID=" SD_MESSAGE_STARTUP_FINISHED_STR,
e12919e8
LP
3088 "KERNEL_USEC="USEC_FMT, kernel_usec,
3089 "INITRD_USEC="USEC_FMT, initrd_usec,
3090 "USERSPACE_USEC="USEC_FMT, userspace_usec,
e2cc6eca
LP
3091 LOG_MESSAGE("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
3092 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
3093 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
3094 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
3095 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC)),
e12919e8 3096 NULL);
18fa6b27 3097 } else {
9f9f0342
LP
3098 /* The initrd-less case on bare-metal*/
3099
3100 kernel_usec = m->timestamps[MANAGER_TIMESTAMP_USERSPACE].monotonic - m->timestamps[MANAGER_TIMESTAMP_KERNEL].monotonic;
18fa6b27
LP
3101 initrd_usec = 0;
3102
81270860 3103 log_struct(LOG_INFO,
2b044526 3104 "MESSAGE_ID=" SD_MESSAGE_STARTUP_FINISHED_STR,
e12919e8 3105 "KERNEL_USEC="USEC_FMT, kernel_usec,
ccd06097 3106 "USERSPACE_USEC="USEC_FMT, userspace_usec,
e2cc6eca
LP
3107 LOG_MESSAGE("Startup finished in %s (kernel) + %s (userspace) = %s.",
3108 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
3109 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
3110 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC)),
81270860 3111 NULL);
e12919e8
LP
3112 }
3113 } else {
9f9f0342 3114 /* The container case */
e12919e8 3115 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
9f9f0342 3116 total_usec = userspace_usec = m->timestamps[MANAGER_TIMESTAMP_FINISH].monotonic - m->timestamps[MANAGER_TIMESTAMP_USERSPACE].monotonic;
e12919e8
LP
3117
3118 log_struct(LOG_INFO,
2b044526 3119 "MESSAGE_ID=" SD_MESSAGE_USER_STARTUP_FINISHED_STR,
e12919e8 3120 "USERSPACE_USEC="USEC_FMT, userspace_usec,
e2cc6eca
LP
3121 LOG_MESSAGE("Startup finished in %s.",
3122 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC)),
e12919e8 3123 NULL);
18fa6b27 3124 }
b0c918b9 3125
718db961 3126 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
530345e7
LP
3127
3128 sd_notifyf(false,
0c2826c6
ZJS
3129 m->ready_sent ? "STATUS=Startup finished in %s."
3130 : "READY=1\n"
3131 "STATUS=Startup finished in %s.",
2fa4092c 3132 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
0c2826c6 3133 m->ready_sent = true;
b0c918b9
LP
3134}
3135
56dacdbc 3136void manager_check_finished(Manager *m) {
56dacdbc
ZJS
3137 assert(m);
3138
2c289ea8 3139 if (MANAGER_IS_RELOADING(m))
aad1976f
LP
3140 return;
3141
9771b62d
LP
3142 /* Verify that we are actually running currently. Initially
3143 * the exit code is set to invalid, and during operation it is
3144 * then set to MANAGER_OK */
3145 if (m->exit_code != MANAGER_OK)
3146 return;
3147
0c2826c6
ZJS
3148 /* For user managers, send out READY=1 as soon as we reach basic.target */
3149 if (MANAGER_IS_USER(m) && !m->ready_sent) {
3150 Unit *u;
3151
3152 u = manager_get_unit(m, SPECIAL_BASIC_TARGET);
3153 if (u && !u->job) {
3154 sd_notifyf(false,
3155 "READY=1\n"
3156 "STATUS=Reached " SPECIAL_BASIC_TARGET ".");
3157 m->ready_sent = true;
3158 }
3159 }
3160
56dacdbc 3161 if (hashmap_size(m->jobs) > 0) {
56dacdbc 3162 if (m->jobs_in_progress_event_source)
2ae56591 3163 /* Ignore any failure, this is only for feedback */
e7ab4d1a 3164 (void) sd_event_source_set_time(m->jobs_in_progress_event_source, now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
56dacdbc
ZJS
3165
3166 return;
3167 }
3168
3169 manager_flip_auto_status(m, false);
3170
3171 /* Notify Type=idle units that we are done now */
56dacdbc
ZJS
3172 manager_close_idle_pipe(m);
3173
3174 /* Turn off confirm spawn now */
7d5ceb64 3175 m->confirm_spawn = NULL;
56dacdbc
ZJS
3176
3177 /* No need to update ask password status when we're going non-interactive */
3178 manager_close_ask_password(m);
3179
3180 /* This is no longer the first boot */
3181 manager_set_first_boot(m, false);
3182
49d5666c 3183 if (MANAGER_IS_FINISHED(m))
56dacdbc
ZJS
3184 return;
3185
9f9f0342 3186 dual_timestamp_get(m->timestamps + MANAGER_TIMESTAMP_FINISH);
56dacdbc
ZJS
3187
3188 manager_notify_finished(m);
3189
e7ab4d1a 3190 manager_invalidate_startup_units(m);
56dacdbc
ZJS
3191}
3192
64691d20
ZJS
3193static bool generator_path_any(const char* const* paths) {
3194 char **path;
3195 bool found = false;
3196
3197 /* Optimize by skipping the whole process by not creating output directories
3198 * if no generators are found. */
3199 STRV_FOREACH(path, (char**) paths)
3200 if (access(*path, F_OK) == 0)
3201 found = true;
3202 else if (errno != ENOENT)
3203 log_warning_errno(errno, "Failed to open generator directory %s: %m", *path);
3204
3205 return found;
3206}
3207
3208static const char* system_env_generator_binary_paths[] = {
3209 "/run/systemd/system-environment-generators",
3210 "/etc/systemd/system-environment-generators",
3211 "/usr/local/lib/systemd/system-environment-generators",
3212 SYSTEM_ENV_GENERATOR_PATH,
3213 NULL
3214};
3215
3216static const char* user_env_generator_binary_paths[] = {
3217 "/run/systemd/user-environment-generators",
3218 "/etc/systemd/user-environment-generators",
3219 "/usr/local/lib/systemd/user-environment-generators",
3220 USER_ENV_GENERATOR_PATH,
3221 NULL
3222};
3223
3224static int manager_run_environment_generators(Manager *m) {
3225 char **tmp = NULL; /* this is only used in the forked process, no cleanup here */
3226 const char **paths;
3227 void* args[] = {&tmp, &tmp, &m->environment};
3228
e0a3da1f
ZJS
3229 if (m->test_run_flags && !(m->test_run_flags & MANAGER_TEST_RUN_ENV_GENERATORS))
3230 return 0;
3231
64691d20
ZJS
3232 paths = MANAGER_IS_SYSTEM(m) ? system_env_generator_binary_paths : user_env_generator_binary_paths;
3233
3234 if (!generator_path_any(paths))
3235 return 0;
3236
3237 return execute_directories(paths, DEFAULT_TIMEOUT_USEC, gather_environment, args, NULL);
3238}
3239
e801700e 3240static int manager_run_generators(Manager *m) {
f42348ac 3241 _cleanup_strv_free_ char **paths = NULL;
07719a21 3242 const char *argv[5];
07719a21 3243 int r;
5a1e9937
LP
3244
3245 assert(m);
3246
e0a3da1f
ZJS
3247 if (m->test_run_flags && !(m->test_run_flags & MANAGER_TEST_RUN_GENERATORS))
3248 return 0;
3249
9183df70 3250 paths = generator_binary_paths(m->unit_file_scope);
e801700e
ZJS
3251 if (!paths)
3252 return log_oom();
5a1e9937 3253
64691d20
ZJS
3254 if (!generator_path_any((const char* const*) paths))
3255 return 0;
5a1e9937 3256
cd64fd56 3257 r = lookup_paths_mkdir_generator(&m->lookup_paths);
07719a21
LP
3258 if (r < 0)
3259 goto finish;
5a1e9937 3260
83cc030f 3261 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
a3c4eb07
LP
3262 argv[1] = m->lookup_paths.generator;
3263 argv[2] = m->lookup_paths.generator_early;
3264 argv[3] = m->lookup_paths.generator_late;
07719a21 3265 argv[4] = NULL;
5a1e9937 3266
718db961 3267 RUN_WITH_UMASK(0022)
c6e47247
ZJS
3268 execute_directories((const char* const*) paths, DEFAULT_TIMEOUT_USEC,
3269 NULL, NULL, (char**) argv);
5a1e9937 3270
718db961 3271finish:
cd64fd56 3272 lookup_paths_trim_generator(&m->lookup_paths);
e801700e 3273 return r;
5a1e9937
LP
3274}
3275
718db961
LP
3276int manager_environment_add(Manager *m, char **minus, char **plus) {
3277 char **a = NULL, **b = NULL, **l;
97d0e5f8 3278 assert(m);
bcd8e6d1 3279
718db961 3280 l = m->environment;
bcd8e6d1 3281
718db961
LP
3282 if (!strv_isempty(minus)) {
3283 a = strv_env_delete(l, 1, minus);
3284 if (!a)
3285 return -ENOMEM;
3286
3287 l = a;
3288 }
3289
3290 if (!strv_isempty(plus)) {
3291 b = strv_env_merge(2, l, plus);
aa9f8a30
AH
3292 if (!b) {
3293 strv_free(a);
718db961 3294 return -ENOMEM;
aa9f8a30 3295 }
bcd8e6d1 3296
718db961
LP
3297 l = b;
3298 }
3299
3300 if (m->environment != l)
3301 strv_free(m->environment);
3302 if (a != l)
3303 strv_free(a);
3304 if (b != l)
3305 strv_free(b);
3306
f069efb4
LP
3307 m->environment = l;
3308 manager_clean_environment(m);
3309 strv_sort(m->environment);
3310
97d0e5f8
UTL
3311 return 0;
3312}
3313
c93ff2e9
FC
3314int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
3315 int i;
3316
3317 assert(m);
3318
517d56b1 3319 for (i = 0; i < _RLIMIT_MAX; i++) {
d9814c76
EV
3320 m->rlimit[i] = mfree(m->rlimit[i]);
3321
07719a21
LP
3322 if (!default_rlimit[i])
3323 continue;
c93ff2e9 3324
07719a21
LP
3325 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
3326 if (!m->rlimit[i])
3ce40911 3327 return log_oom();
c93ff2e9
FC
3328 }
3329
3330 return 0;
3331}
3332
4cfa2c99 3333void manager_recheck_journal(Manager *m) {
f1dd0c3f
LP
3334 Unit *u;
3335
3336 assert(m);
3337
463d0d15 3338 if (!MANAGER_IS_SYSTEM(m))
f1dd0c3f
LP
3339 return;
3340
731a676c
LP
3341 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
3342 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
4cfa2c99 3343 log_close_journal();
731a676c 3344 return;
f1dd0c3f
LP
3345 }
3346
731a676c
LP
3347 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
3348 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
4cfa2c99 3349 log_close_journal();
731a676c
LP
3350 return;
3351 }
f1dd0c3f 3352
731a676c
LP
3353 /* Hmm, OK, so the socket is fully up and the service is up
3354 * too, then let's make use of the thing. */
f1dd0c3f
LP
3355 log_open();
3356}
3357
d450b6f2 3358void manager_set_show_status(Manager *m, ShowStatus mode) {
27d340c7 3359 assert(m);
d450b6f2 3360 assert(IN_SET(mode, SHOW_STATUS_AUTO, SHOW_STATUS_NO, SHOW_STATUS_YES, SHOW_STATUS_TEMPORARY));
27d340c7 3361
463d0d15 3362 if (!MANAGER_IS_SYSTEM(m))
27d340c7
LP
3363 return;
3364
76b6f3f6
ZJS
3365 if (m->show_status != mode)
3366 log_debug("%s showing of status.",
3367 mode == SHOW_STATUS_NO ? "Disabling" : "Enabling");
d450b6f2 3368 m->show_status = mode;
27d340c7 3369
d450b6f2 3370 if (mode > 0)
ac5b0c13 3371 (void) touch("/run/systemd/show-status");
27d340c7 3372 else
ac5b0c13 3373 (void) unlink("/run/systemd/show-status");
27d340c7
LP
3374}
3375
127d5fd1 3376static bool manager_get_show_status(Manager *m, StatusType type) {
27d340c7
LP
3377 assert(m);
3378
463d0d15 3379 if (!MANAGER_IS_SYSTEM(m))
27d340c7
LP
3380 return false;
3381
31a7eb86
ZJS
3382 if (m->no_console_output)
3383 return false;
3384
d81afec1 3385 if (!IN_SET(manager_state(m), MANAGER_INITIALIZING, MANAGER_STARTING, MANAGER_STOPPING))
08510627
LP
3386 return false;
3387
e46b13c8 3388 /* If we cannot find out the status properly, just proceed. */
ebc5788e 3389 if (type != STATUS_TYPE_EMERGENCY && manager_check_ask_password(m) > 0)
e46b13c8
ZJS
3390 return false;
3391
d450b6f2 3392 if (m->show_status > 0)
27d340c7
LP
3393 return true;
3394
031886ed 3395 return false;
27d340c7 3396}
68b29a9f 3397
7d5ceb64
FB
3398const char *manager_get_confirm_spawn(Manager *m) {
3399 static int last_errno = 0;
3400 const char *vc = m->confirm_spawn;
3401 struct stat st;
3402 int r;
3403
3404 /* Here's the deal: we want to test the validity of the console but don't want
3405 * PID1 to go through the whole console process which might block. But we also
3406 * want to warn the user only once if something is wrong with the console so we
3407 * cannot do the sanity checks after spawning our children. So here we simply do
3408 * really basic tests to hopefully trap common errors.
3409 *
3410 * If the console suddenly disappear at the time our children will really it
3411 * then they will simply fail to acquire it and a positive answer will be
3412 * assumed. New children will fallback to /dev/console though.
3413 *
3414 * Note: TTYs are devices that can come and go any time, and frequently aren't
3415 * available yet during early boot (consider a USB rs232 dongle...). If for any
3416 * reason the configured console is not ready, we fallback to the default
3417 * console. */
3418
3419 if (!vc || path_equal(vc, "/dev/console"))
3420 return vc;
3421
3422 r = stat(vc, &st);
3423 if (r < 0)
3424 goto fail;
3425
3426 if (!S_ISCHR(st.st_mode)) {
3427 errno = ENOTTY;
3428 goto fail;
3429 }
3430
3431 last_errno = 0;
3432 return vc;
3433fail:
3434 if (last_errno != errno) {
3435 last_errno = errno;
3436 log_warning_errno(errno, "Failed to open %s: %m, using default console", vc);
3437 }
3438 return "/dev/console";
3439}
3440
e2680723
LP
3441void manager_set_first_boot(Manager *m, bool b) {
3442 assert(m);
3443
463d0d15 3444 if (!MANAGER_IS_SYSTEM(m))
e2680723
LP
3445 return;
3446
ae2a2c53
LP
3447 if (m->first_boot != (int) b) {
3448 if (b)
3449 (void) touch("/run/systemd/first-boot");
3450 else
3451 (void) unlink("/run/systemd/first-boot");
3452 }
e2680723 3453
ae2a2c53 3454 m->first_boot = b;
e2680723
LP
3455}
3456
b0eb2944
FB
3457void manager_disable_confirm_spawn(void) {
3458 (void) touch("/run/systemd/confirm_spawn_disabled");
3459}
3460
3461bool manager_is_confirm_spawn_disabled(Manager *m) {
3462 if (!m->confirm_spawn)
3463 return true;
3464
3465 return access("/run/systemd/confirm_spawn_disabled", F_OK) >= 0;
3466}
3467
127d5fd1 3468void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) {
25cee550
MS
3469 va_list ap;
3470
cb6531be
ZJS
3471 /* If m is NULL, assume we're after shutdown and let the messages through. */
3472
3473 if (m && !manager_get_show_status(m, type))
25cee550
MS
3474 return;
3475
03b717a3
MS
3476 /* XXX We should totally drop the check for ephemeral here
3477 * and thus effectively make 'Type=idle' pointless. */
cb6531be 3478 if (type == STATUS_TYPE_EPHEMERAL && m && m->n_on_console > 0)
03b717a3
MS
3479 return;
3480
25cee550 3481 va_start(ap, format);
127d5fd1 3482 status_vprintf(status, true, type == STATUS_TYPE_EPHEMERAL, format, ap);
25cee550
MS
3483 va_end(ap);
3484}
3485
a57f7e2c
LP
3486Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
3487 char p[strlen(path)+1];
3488
3489 assert(m);
3490 assert(path);
3491
3492 strcpy(p, path);
3493 path_kill_slashes(p);
3494
3495 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);
3496}
e66cf1a3 3497
19bbdd98 3498void manager_set_exec_params(Manager *m, ExecParameters *p) {
f755e3b7 3499 assert(m);
3536f49e
YW
3500 assert(p);
3501
3502 p->environment = m->environment;
3503 p->confirm_spawn = manager_get_confirm_spawn(m);
3504 p->cgroup_supported = m->cgroup_supported;
3505 p->prefix = m->prefix;
e66cf1a3 3506
8679efde 3507 SET_FLAG(p->flags, EXEC_PASS_LOG_UNIT|EXEC_CHOWN_DIRECTORIES, MANAGER_IS_SYSTEM(m));
e66cf1a3 3508}
f755e3b7 3509
5269eb6b 3510int manager_update_failed_units(Manager *m, Unit *u, bool failed) {
03455c28 3511 unsigned size;
5269eb6b 3512 int r;
03455c28
LDM
3513
3514 assert(m);
3515 assert(u->manager == m);
3516
3517 size = set_size(m->failed_units);
3518
9fff8981 3519 if (failed) {
5269eb6b
LP
3520 r = set_ensure_allocated(&m->failed_units, NULL);
3521 if (r < 0)
3522 return log_oom();
3523
9fff8981 3524 if (set_put(m->failed_units, u) < 0)
5269eb6b 3525 return log_oom();
9fff8981 3526 } else
5269eb6b 3527 (void) set_remove(m->failed_units, u);
03455c28
LDM
3528
3529 if (set_size(m->failed_units) != size)
3530 bus_manager_send_change_signal(m);
5269eb6b
LP
3531
3532 return 0;
03455c28
LDM
3533}
3534
f755e3b7
LP
3535ManagerState manager_state(Manager *m) {
3536 Unit *u;
3537
3538 assert(m);
3539
3540 /* Did we ever finish booting? If not then we are still starting up */
49d5666c 3541 if (!MANAGER_IS_FINISHED(m)) {
d81afec1
LP
3542
3543 u = manager_get_unit(m, SPECIAL_BASIC_TARGET);
3544 if (!u || !UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u)))
3545 return MANAGER_INITIALIZING;
3546
f755e3b7 3547 return MANAGER_STARTING;
d81afec1 3548 }
f755e3b7 3549
e68537f0 3550 /* Is the special shutdown target active or queued? If so, we are in shutdown state */
f755e3b7 3551 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
706424c2 3552 if (u && unit_active_or_pending(u))
f755e3b7
LP
3553 return MANAGER_STOPPING;
3554
45a7b16b
LP
3555 if (MANAGER_IS_SYSTEM(m)) {
3556 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
3557 u = manager_get_unit(m, SPECIAL_RESCUE_TARGET);
3558 if (u && unit_active_or_pending(u))
3559 return MANAGER_MAINTENANCE;
f755e3b7 3560
45a7b16b
LP
3561 u = manager_get_unit(m, SPECIAL_EMERGENCY_TARGET);
3562 if (u && unit_active_or_pending(u))
3563 return MANAGER_MAINTENANCE;
3564 }
f755e3b7
LP
3565
3566 /* Are there any failed units? If so, we are in degraded mode */
3567 if (set_size(m->failed_units) > 0)
3568 return MANAGER_DEGRADED;
3569
3570 return MANAGER_RUNNING;
3571}
3572
00d9ef85
LP
3573#define DESTROY_IPC_FLAG (UINT32_C(1) << 31)
3574
3575static void manager_unref_uid_internal(
3576 Manager *m,
3577 Hashmap **uid_refs,
3578 uid_t uid,
3579 bool destroy_now,
3580 int (*_clean_ipc)(uid_t uid)) {
3581
3582 uint32_t c, n;
3583
3584 assert(m);
3585 assert(uid_refs);
3586 assert(uid_is_valid(uid));
3587 assert(_clean_ipc);
3588
3589 /* A generic implementation, covering both manager_unref_uid() and manager_unref_gid(), under the assumption
3590 * that uid_t and gid_t are actually defined the same way, with the same validity rules.
3591 *
3592 * We store a hashmap where the UID/GID is they key and the value is a 32bit reference counter, whose highest
3593 * bit is used as flag for marking UIDs/GIDs whose IPC objects to remove when the last reference to the UID/GID
3594 * is dropped. The flag is set to on, once at least one reference from a unit where RemoveIPC= is set is added
3595 * on a UID/GID. It is reset when the UID's/GID's reference counter drops to 0 again. */
3596
3597 assert_cc(sizeof(uid_t) == sizeof(gid_t));
3598 assert_cc(UID_INVALID == (uid_t) GID_INVALID);
3599
3600 if (uid == 0) /* We don't keep track of root, and will never destroy it */
3601 return;
3602
3603 c = PTR_TO_UINT32(hashmap_get(*uid_refs, UID_TO_PTR(uid)));
3604
3605 n = c & ~DESTROY_IPC_FLAG;
3606 assert(n > 0);
3607 n--;
3608
3609 if (destroy_now && n == 0) {
3610 hashmap_remove(*uid_refs, UID_TO_PTR(uid));
3611
3612 if (c & DESTROY_IPC_FLAG) {
3613 log_debug("%s " UID_FMT " is no longer referenced, cleaning up its IPC.",
3614 _clean_ipc == clean_ipc_by_uid ? "UID" : "GID",
3615 uid);
3616 (void) _clean_ipc(uid);
3617 }
3618 } else {
3619 c = n | (c & DESTROY_IPC_FLAG);
3620 assert_se(hashmap_update(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c)) >= 0);
3621 }
3622}
3623
3624void manager_unref_uid(Manager *m, uid_t uid, bool destroy_now) {
3625 manager_unref_uid_internal(m, &m->uid_refs, uid, destroy_now, clean_ipc_by_uid);
3626}
3627
3628void manager_unref_gid(Manager *m, gid_t gid, bool destroy_now) {
3629 manager_unref_uid_internal(m, &m->gid_refs, (uid_t) gid, destroy_now, clean_ipc_by_gid);
3630}
3631
3632static int manager_ref_uid_internal(
3633 Manager *m,
3634 Hashmap **uid_refs,
3635 uid_t uid,
3636 bool clean_ipc) {
3637
3638 uint32_t c, n;
3639 int r;
3640
3641 assert(m);
3642 assert(uid_refs);
3643 assert(uid_is_valid(uid));
3644
3645 /* A generic implementation, covering both manager_ref_uid() and manager_ref_gid(), under the assumption
3646 * that uid_t and gid_t are actually defined the same way, with the same validity rules. */
3647
3648 assert_cc(sizeof(uid_t) == sizeof(gid_t));
3649 assert_cc(UID_INVALID == (uid_t) GID_INVALID);
3650
3651 if (uid == 0) /* We don't keep track of root, and will never destroy it */
3652 return 0;
3653
3654 r = hashmap_ensure_allocated(uid_refs, &trivial_hash_ops);
3655 if (r < 0)
3656 return r;
3657
3658 c = PTR_TO_UINT32(hashmap_get(*uid_refs, UID_TO_PTR(uid)));
3659
3660 n = c & ~DESTROY_IPC_FLAG;
3661 n++;
3662
3663 if (n & DESTROY_IPC_FLAG) /* check for overflow */
3664 return -EOVERFLOW;
3665
3666 c = n | (c & DESTROY_IPC_FLAG) | (clean_ipc ? DESTROY_IPC_FLAG : 0);
3667
3668 return hashmap_replace(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c));
3669}
3670
3671int manager_ref_uid(Manager *m, uid_t uid, bool clean_ipc) {
3672 return manager_ref_uid_internal(m, &m->uid_refs, uid, clean_ipc);
3673}
3674
3675int manager_ref_gid(Manager *m, gid_t gid, bool clean_ipc) {
3676 return manager_ref_uid_internal(m, &m->gid_refs, (uid_t) gid, clean_ipc);
3677}
3678
3679static void manager_vacuum_uid_refs_internal(
3680 Manager *m,
3681 Hashmap **uid_refs,
3682 int (*_clean_ipc)(uid_t uid)) {
3683
3684 Iterator i;
3685 void *p, *k;
3686
3687 assert(m);
3688 assert(uid_refs);
3689 assert(_clean_ipc);
3690
3691 HASHMAP_FOREACH_KEY(p, k, *uid_refs, i) {
3692 uint32_t c, n;
3693 uid_t uid;
3694
3695 uid = PTR_TO_UID(k);
3696 c = PTR_TO_UINT32(p);
3697
3698 n = c & ~DESTROY_IPC_FLAG;
3699 if (n > 0)
3700 continue;
3701
3702 if (c & DESTROY_IPC_FLAG) {
3703 log_debug("Found unreferenced %s " UID_FMT " after reload/reexec. Cleaning up.",
3704 _clean_ipc == clean_ipc_by_uid ? "UID" : "GID",
3705 uid);
3706 (void) _clean_ipc(uid);
3707 }
3708
3709 assert_se(hashmap_remove(*uid_refs, k) == p);
3710 }
3711}
3712
3713void manager_vacuum_uid_refs(Manager *m) {
3714 manager_vacuum_uid_refs_internal(m, &m->uid_refs, clean_ipc_by_uid);
3715}
3716
3717void manager_vacuum_gid_refs(Manager *m) {
3718 manager_vacuum_uid_refs_internal(m, &m->gid_refs, clean_ipc_by_gid);
3719}
3720
3721static void manager_serialize_uid_refs_internal(
3722 Manager *m,
3723 FILE *f,
3724 Hashmap **uid_refs,
3725 const char *field_name) {
3726
3727 Iterator i;
3728 void *p, *k;
3729
3730 assert(m);
3731 assert(f);
3732 assert(uid_refs);
3733 assert(field_name);
3734
3735 /* Serialize the UID reference table. Or actually, just the IPC destruction flag of it, as the actual counter
3736 * of it is better rebuild after a reload/reexec. */
3737
3738 HASHMAP_FOREACH_KEY(p, k, *uid_refs, i) {
3739 uint32_t c;
3740 uid_t uid;
3741
3742 uid = PTR_TO_UID(k);
3743 c = PTR_TO_UINT32(p);
3744
3745 if (!(c & DESTROY_IPC_FLAG))
3746 continue;
3747
3748 fprintf(f, "%s=" UID_FMT "\n", field_name, uid);
3749 }
3750}
3751
3752void manager_serialize_uid_refs(Manager *m, FILE *f) {
3753 manager_serialize_uid_refs_internal(m, f, &m->uid_refs, "destroy-ipc-uid");
3754}
3755
3756void manager_serialize_gid_refs(Manager *m, FILE *f) {
3757 manager_serialize_uid_refs_internal(m, f, &m->gid_refs, "destroy-ipc-gid");
3758}
3759
3760static void manager_deserialize_uid_refs_one_internal(
3761 Manager *m,
3762 Hashmap** uid_refs,
3763 const char *value) {
3764
3765 uid_t uid;
3766 uint32_t c;
3767 int r;
3768
3769 assert(m);
3770 assert(uid_refs);
3771 assert(value);
3772
3773 r = parse_uid(value, &uid);
3774 if (r < 0 || uid == 0) {
3775 log_debug("Unable to parse UID reference serialization");
3776 return;
3777 }
3778
3779 r = hashmap_ensure_allocated(uid_refs, &trivial_hash_ops);
3780 if (r < 0) {
3781 log_oom();
3782 return;
3783 }
3784
3785 c = PTR_TO_UINT32(hashmap_get(*uid_refs, UID_TO_PTR(uid)));
3786 if (c & DESTROY_IPC_FLAG)
3787 return;
3788
3789 c |= DESTROY_IPC_FLAG;
3790
3791 r = hashmap_replace(*uid_refs, UID_TO_PTR(uid), UINT32_TO_PTR(c));
3792 if (r < 0) {
3793 log_debug("Failed to add UID reference entry");
3794 return;
3795 }
3796}
3797
3798void manager_deserialize_uid_refs_one(Manager *m, const char *value) {
3799 manager_deserialize_uid_refs_one_internal(m, &m->uid_refs, value);
3800}
3801
3802void manager_deserialize_gid_refs_one(Manager *m, const char *value) {
3803 manager_deserialize_uid_refs_one_internal(m, &m->gid_refs, value);
3804}
3805
3806int manager_dispatch_user_lookup_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
3807 struct buffer {
3808 uid_t uid;
3809 gid_t gid;
3810 char unit_name[UNIT_NAME_MAX+1];
3811 } _packed_ buffer;
3812
3813 Manager *m = userdata;
3814 ssize_t l;
3815 size_t n;
3816 Unit *u;
3817
3818 assert_se(source);
3819 assert_se(m);
3820
3821 /* Invoked whenever a child process succeeded resolving its user/group to use and sent us the resulting UID/GID
3822 * in a datagram. We parse the datagram here and pass it off to the unit, so that it can add a reference to the
3823 * UID/GID so that it can destroy the UID/GID's IPC objects when the reference counter drops to 0. */
3824
3825 l = recv(fd, &buffer, sizeof(buffer), MSG_DONTWAIT);
3826 if (l < 0) {
4c701096 3827 if (IN_SET(errno, EINTR, EAGAIN))
00d9ef85
LP
3828 return 0;
3829
3830 return log_error_errno(errno, "Failed to read from user lookup fd: %m");
3831 }
3832
3833 if ((size_t) l <= offsetof(struct buffer, unit_name)) {
3834 log_warning("Received too short user lookup message, ignoring.");
3835 return 0;
3836 }
3837
3838 if ((size_t) l > offsetof(struct buffer, unit_name) + UNIT_NAME_MAX) {
3839 log_warning("Received too long user lookup message, ignoring.");
3840 return 0;
3841 }
3842
3843 if (!uid_is_valid(buffer.uid) && !gid_is_valid(buffer.gid)) {
3844 log_warning("Got user lookup message with invalid UID/GID pair, ignoring.");
3845 return 0;
3846 }
3847
3848 n = (size_t) l - offsetof(struct buffer, unit_name);
3849 if (memchr(buffer.unit_name, 0, n)) {
3850 log_warning("Received lookup message with embedded NUL character, ignoring.");
3851 return 0;
3852 }
3853
3854 buffer.unit_name[n] = 0;
3855 u = manager_get_unit(m, buffer.unit_name);
3856 if (!u) {
3857 log_debug("Got user lookup message but unit doesn't exist, ignoring.");
3858 return 0;
3859 }
3860
3861 log_unit_debug(u, "User lookup succeeded: uid=" UID_FMT " gid=" GID_FMT, buffer.uid, buffer.gid);
3862
3863 unit_notify_user_lookup(u, buffer.uid, buffer.gid);
3864 return 0;
3865}
3866
f755e3b7 3867static const char *const manager_state_table[_MANAGER_STATE_MAX] = {
d81afec1 3868 [MANAGER_INITIALIZING] = "initializing",
f755e3b7
LP
3869 [MANAGER_STARTING] = "starting",
3870 [MANAGER_RUNNING] = "running",
3871 [MANAGER_DEGRADED] = "degraded",
3872 [MANAGER_MAINTENANCE] = "maintenance",
3873 [MANAGER_STOPPING] = "stopping",
3874};
3875
3876DEFINE_STRING_TABLE_LOOKUP(manager_state, ManagerState);
9f9f0342
LP
3877
3878static const char *const manager_timestamp_table[_MANAGER_TIMESTAMP_MAX] = {
3879 [MANAGER_TIMESTAMP_FIRMWARE] = "firmware",
3880 [MANAGER_TIMESTAMP_LOADER] = "loader",
3881 [MANAGER_TIMESTAMP_KERNEL] = "kernel",
3882 [MANAGER_TIMESTAMP_INITRD] = "initrd",
3883 [MANAGER_TIMESTAMP_USERSPACE] = "userspace",
3884 [MANAGER_TIMESTAMP_FINISH] = "finish",
3885 [MANAGER_TIMESTAMP_SECURITY_START] = "security-start",
3886 [MANAGER_TIMESTAMP_SECURITY_FINISH] = "security-finish",
3887 [MANAGER_TIMESTAMP_GENERATORS_START] = "generators-start",
3888 [MANAGER_TIMESTAMP_GENERATORS_FINISH] = "generators-finish",
3889 [MANAGER_TIMESTAMP_UNITS_LOAD_START] = "units-load-start",
3890 [MANAGER_TIMESTAMP_UNITS_LOAD_FINISH] = "units-load-finish",
3891};
3892
3893DEFINE_STRING_TABLE_LOOKUP(manager_timestamp, ManagerTimestamp);