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