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