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