]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/manager.c
journalctl: show lines in full with --all
[thirdparty/systemd.git] / src / core / manager.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
60918275
LP
22#include <assert.h>
23#include <errno.h>
87d1515d 24#include <string.h>
9152c765
LP
25#include <sys/epoll.h>
26#include <signal.h>
27#include <sys/signalfd.h>
28#include <sys/wait.h>
29#include <unistd.h>
30#include <sys/poll.h>
e1414003
LP
31#include <sys/reboot.h>
32#include <sys/ioctl.h>
33#include <linux/kd.h>
80876c20
LP
34#include <termios.h>
35#include <fcntl.h>
a16e1123
LP
36#include <sys/types.h>
37#include <sys/stat.h>
fe51822e 38#include <dirent.h>
8742514c 39#include <sys/timerfd.h>
830f6caa
LP
40
41#ifdef HAVE_AUDIT
4927fcae 42#include <libaudit.h>
830f6caa 43#endif
60918275 44
877d54e9
LP
45#include "systemd/sd-daemon.h"
46#include "systemd/sd-id128.h"
47#include "systemd/sd-messages.h"
81527be1 48
60918275 49#include "manager.h"
75778e21 50#include "transaction.h"
60918275
LP
51#include "hashmap.h"
52#include "macro.h"
53#include "strv.h"
16354eff 54#include "log.h"
2a987ee8 55#include "util.h"
49e942b2 56#include "mkdir.h"
ea430986 57#include "ratelimit.h"
8e274523
LP
58#include "cgroup.h"
59#include "mount-setup.h"
9e2f7c11 60#include "unit-name.h"
4139c1b2
LP
61#include "dbus-unit.h"
62#include "dbus-job.h"
1137a57c 63#include "missing.h"
84e3543e 64#include "path-lookup.h"
514f4ef5 65#include "special.h"
398ef8ba 66#include "bus-errors.h"
d06dacd0 67#include "exit-status.h"
5dc4c17f 68#include "virt.h"
e96d6be7 69#include "watchdog.h"
b59e2465 70#include "cgroup-util.h"
9eb977db 71#include "path-util.h"
c1165f82 72#include "audit-fd.h"
4f8d551f 73#include "efivars.h"
8b55b8c4 74#include "env-util.h"
60918275 75
701cc384
LP
76/* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
77#define GC_QUEUE_ENTRIES_MAX 16
78
79/* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
94b6dfa2 80#define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
701cc384 81
03b717a3
MS
82/* Initial delay and the interval for printing status messages about running jobs */
83#define JOBS_IN_PROGRESS_WAIT_SEC 5
84#define JOBS_IN_PROGRESS_PERIOD_SEC 1
85#define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
86
8c47c732 87/* Where clients shall send notification messages to */
29252e9e 88#define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
8c47c732 89
c3e31c7b
ZJS
90#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
91
8c47c732
LP
92static int manager_setup_notify(Manager *m) {
93 union {
94 struct sockaddr sa;
95 struct sockaddr_un un;
b92bea5d
ZJS
96 } sa = {
97 .sa.sa_family = AF_UNIX,
98 };
99 struct epoll_event ev = {
100 .events = EPOLLIN,
101 .data.ptr = &m->notify_watch,
102 };
e62d8c39 103 int one = 1, r;
8c47c732 104
8c47c732 105 m->notify_watch.type = WATCH_NOTIFY;
29252e9e
LP
106 m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
107 if (m->notify_watch.fd < 0) {
8c47c732
LP
108 log_error("Failed to allocate notification socket: %m");
109 return -errno;
110 }
111
31f92a7d 112 if (getpid() != 1 || detect_container(NULL) > 0)
29252e9e
LP
113 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%llu", random_ull());
114 else
115 strncpy(sa.un.sun_path, NOTIFY_SOCKET, sizeof(sa.un.sun_path));
8c47c732 116
29252e9e 117 sa.un.sun_path[0] = 0;
1d6702e8 118
e62d8c39
ZJS
119 r = bind(m->notify_watch.fd, &sa.sa,
120 offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
121 if (r < 0) {
8c47c732
LP
122 log_error("bind() failed: %m");
123 return -errno;
124 }
125
e62d8c39
ZJS
126 r = setsockopt(m->notify_watch.fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
127 if (r < 0) {
8c47c732
LP
128 log_error("SO_PASSCRED failed: %m");
129 return -errno;
130 }
131
e62d8c39
ZJS
132 r = epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev);
133 if (r < 0) {
28137202 134 log_error("Failed to add notification socket fd to epoll: %m");
8c47c732 135 return -errno;
8742514c 136 }
8c47c732 137
29252e9e
LP
138 sa.un.sun_path[0] = '@';
139 m->notify_socket = strdup(sa.un.sun_path);
140 if (!m->notify_socket)
8742514c 141 return log_oom();
8c47c732 142
b2bb3dbe
LP
143 log_debug("Using notification socket %s", m->notify_socket);
144
8c47c732
LP
145 return 0;
146}
147
03b717a3 148static int manager_jobs_in_progress_mod_timer(Manager *m) {
b92bea5d
ZJS
149 struct itimerspec its = {
150 .it_value.tv_sec = JOBS_IN_PROGRESS_WAIT_SEC,
151 .it_interval.tv_sec = JOBS_IN_PROGRESS_PERIOD_SEC,
152 };
03b717a3 153
5b176ee0
MS
154 if (m->jobs_in_progress_watch.type != WATCH_JOBS_IN_PROGRESS)
155 return 0;
156
03b717a3
MS
157 if (timerfd_settime(m->jobs_in_progress_watch.fd, 0, &its, NULL) < 0)
158 return -errno;
159
160 return 0;
161}
162
163static int manager_watch_jobs_in_progress(Manager *m) {
b92bea5d
ZJS
164 struct epoll_event ev = {
165 .events = EPOLLIN,
166 .data.ptr = &m->jobs_in_progress_watch,
167 };
03b717a3
MS
168 int r;
169
03b717a3
MS
170 if (m->jobs_in_progress_watch.type != WATCH_INVALID)
171 return 0;
172
173 m->jobs_in_progress_watch.type = WATCH_JOBS_IN_PROGRESS;
174 m->jobs_in_progress_watch.fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);
175 if (m->jobs_in_progress_watch.fd < 0) {
176 log_error("Failed to create timerfd: %m");
177 r = -errno;
178 goto err;
179 }
180
181 r = manager_jobs_in_progress_mod_timer(m);
182 if (r < 0) {
183 log_error("Failed to set up timer for jobs progress watch: %s", strerror(-r));
184 goto err;
185 }
186
03b717a3
MS
187 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->jobs_in_progress_watch.fd, &ev) < 0) {
188 log_error("Failed to add jobs progress timer fd to epoll: %m");
189 r = -errno;
190 goto err;
191 }
192
193 log_debug("Set up jobs progress timerfd.");
194
195 return 0;
196
197err:
198 if (m->jobs_in_progress_watch.fd >= 0)
199 close_nointr_nofail(m->jobs_in_progress_watch.fd);
200 watch_init(&m->jobs_in_progress_watch);
201 return r;
202}
203
204static void manager_unwatch_jobs_in_progress(Manager *m) {
205 if (m->jobs_in_progress_watch.type != WATCH_JOBS_IN_PROGRESS)
206 return;
207
208 assert_se(epoll_ctl(m->epoll_fd, EPOLL_CTL_DEL, m->jobs_in_progress_watch.fd, NULL) >= 0);
209 close_nointr_nofail(m->jobs_in_progress_watch.fd);
210 watch_init(&m->jobs_in_progress_watch);
211 m->jobs_in_progress_iteration = 0;
212
213 log_debug("Closed jobs progress timerfd.");
214}
215
216#define CYLON_BUFFER_EXTRA (2*strlen(ANSI_RED_ON) + strlen(ANSI_HIGHLIGHT_RED_ON) + 2*strlen(ANSI_HIGHLIGHT_OFF))
217static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
218 char *p = buffer;
219
220 assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
221 assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
222
223 if (pos > 1) {
6282c859
MS
224 if (pos > 2)
225 p = mempset(p, ' ', pos-2);
5052495b 226 p = stpcpy(p, ANSI_RED_ON);
03b717a3
MS
227 *p++ = '*';
228 }
229
230 if (pos > 0 && pos <= width) {
5052495b 231 p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
03b717a3
MS
232 *p++ = '*';
233 }
234
5052495b 235 p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
03b717a3
MS
236
237 if (pos < width) {
5052495b 238 p = stpcpy(p, ANSI_RED_ON);
03b717a3 239 *p++ = '*';
6282c859
MS
240 if (pos < width-1)
241 p = mempset(p, ' ', width-1-pos);
5052495b 242 p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
03b717a3 243 }
03b717a3
MS
244}
245
246static void manager_print_jobs_in_progress(Manager *m) {
247 Iterator i;
248 Job *j;
249 char *job_of_n = NULL;
250 unsigned counter = 0, print_nr;
251 char cylon[6 + CYLON_BUFFER_EXTRA + 1];
252 unsigned cylon_pos;
253
254 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
255
256 HASHMAP_FOREACH(j, m->jobs, i)
257 if (j->state == JOB_RUNNING && counter++ == print_nr)
258 break;
259
e970a72e
MS
260 /* m->n_running_jobs must be consistent with the contents of m->jobs,
261 * so the above loop must have succeeded in finding j. */
262 assert(counter == print_nr + 1);
5a82a91a 263
03b717a3
MS
264 cylon_pos = m->jobs_in_progress_iteration % 14;
265 if (cylon_pos >= 8)
266 cylon_pos = 14 - cylon_pos;
267 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
268
269 if (m->n_running_jobs > 1)
270 if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
271 job_of_n = NULL;
272
273 manager_status_printf(m, true, cylon, "%sA %s job is running for %s",
274 strempty(job_of_n), job_type_to_string(j->type), unit_description(j->unit));
275 free(job_of_n);
276
277 m->jobs_in_progress_iteration++;
278}
279
8742514c 280static int manager_setup_time_change(Manager *m) {
b92bea5d
ZJS
281 struct epoll_event ev = {
282 .events = EPOLLIN,
283 .data.ptr = &m->time_change_watch,
284 };
285
286 /* We only care for the cancellation event, hence we set the
287 * timeout to the latest possible value. */
288 struct itimerspec its = {
289 .it_value.tv_sec = TIME_T_MAX,
290 };
291 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
8742514c 292
8742514c
LP
293 assert(m->time_change_watch.type == WATCH_INVALID);
294
295 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
296 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
297
298 m->time_change_watch.type = WATCH_TIME_CHANGE;
299 m->time_change_watch.fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
300 if (m->time_change_watch.fd < 0) {
301 log_error("Failed to create timerfd: %m");
302 return -errno;
303 }
304
8742514c
LP
305 if (timerfd_settime(m->time_change_watch.fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
306 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
307 close_nointr_nofail(m->time_change_watch.fd);
308 watch_init(&m->time_change_watch);
309 return 0;
310 }
311
8742514c
LP
312 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->time_change_watch.fd, &ev) < 0) {
313 log_error("Failed to add timer change fd to epoll: %m");
314 return -errno;
315 }
316
317 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
318
319 return 0;
320}
321
80876c20 322static int enable_special_signals(Manager *m) {
4466ee6a 323 int fd;
80876c20
LP
324
325 assert(m);
326
a41b539e 327 /* Enable that we get SIGINT on control-alt-del. In containers
c9999773
LP
328 * this will fail with EPERM (older) or EINVAL (newer), so
329 * ignore that. */
330 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
80876c20
LP
331 log_warning("Failed to enable ctrl-alt-del handling: %m");
332
a41b539e
LP
333 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
334 if (fd < 0) {
335 /* Support systems without virtual console */
336 if (fd != -ENOENT)
337 log_warning("Failed to open /dev/tty0: %m");
338 } else {
80876c20
LP
339 /* Enable that we get SIGWINCH on kbrequest */
340 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
341 log_warning("Failed to enable kbrequest handling: %s", strerror(errno));
342
343 close_nointr_nofail(fd);
344 }
345
346 return 0;
347}
348
ce578209 349static int manager_setup_signals(Manager *m) {
9152c765 350 sigset_t mask;
b92bea5d
ZJS
351 struct epoll_event ev = {
352 .events = EPOLLIN,
353 .data.ptr = &m->signal_watch,
354 };
355 struct sigaction sa = {
356 .sa_handler = SIG_DFL,
357 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
358 };
60918275 359
ce578209
LP
360 assert(m);
361
57c0c30e 362 /* We are not interested in SIGSTOP and friends. */
57c0c30e
LP
363 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
364
ce578209 365 assert_se(sigemptyset(&mask) == 0);
7d793605
LP
366
367 sigset_add_many(&mask,
368 SIGCHLD, /* Child died */
369 SIGTERM, /* Reexecute daemon */
370 SIGHUP, /* Reload configuration */
371 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
372 SIGUSR2, /* systemd: dump status */
373 SIGINT, /* Kernel sends us this on control-alt-del */
374 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
375 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
376 SIGRTMIN+0, /* systemd: start default.target */
0003d1ab 377 SIGRTMIN+1, /* systemd: isolate rescue.target */
7d793605
LP
378 SIGRTMIN+2, /* systemd: isolate emergency.target */
379 SIGRTMIN+3, /* systemd: start halt.target */
380 SIGRTMIN+4, /* systemd: start poweroff.target */
381 SIGRTMIN+5, /* systemd: start reboot.target */
0003d1ab
LP
382 SIGRTMIN+6, /* systemd: start kexec.target */
383 SIGRTMIN+13, /* systemd: Immediate halt */
384 SIGRTMIN+14, /* systemd: Immediate poweroff */
385 SIGRTMIN+15, /* systemd: Immediate reboot */
386 SIGRTMIN+16, /* systemd: Immediate kexec */
0658666b
LP
387 SIGRTMIN+20, /* systemd: enable status messages */
388 SIGRTMIN+21, /* systemd: disable status messages */
253ee27a
LP
389 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
390 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
600b704e 391 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
4cfa2c99 392 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
253ee27a
LP
393 SIGRTMIN+27, /* systemd: set log target to console */
394 SIGRTMIN+28, /* systemd: set log target to kmsg */
395 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
7d793605 396 -1);
ce578209
LP
397 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
398
ef734fd6 399 m->signal_watch.type = WATCH_SIGNAL;
8742514c
LP
400 m->signal_watch.fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
401 if (m->signal_watch.fd < 0)
ce578209
LP
402 return -errno;
403
ce578209
LP
404 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->signal_watch.fd, &ev) < 0)
405 return -errno;
406
67445f4e 407 if (m->running_as == SYSTEMD_SYSTEM)
80876c20 408 return enable_special_signals(m);
e1414003 409
ce578209
LP
410 return 0;
411}
412
71ecc858
LP
413static void manager_strip_environment(Manager *m) {
414 assert(m);
415
416 /* Remove variables from the inherited set that are part of
417 * the container interface:
418 * http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface */
419 strv_remove_prefix(m->environment, "container=");
420 strv_remove_prefix(m->environment, "container_");
421
422 /* Remove variables from the inherited set that are part of
423 * the initrd interface:
424 * http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface */
425 strv_remove_prefix(m->environment, "RD_");
8b55b8c4
LP
426
427 /* Drop invalid entries */
428 strv_env_clean(m->environment);
71ecc858
LP
429}
430
67445f4e 431int manager_new(SystemdRunningAs running_as, Manager **_m) {
ce578209 432 Manager *m;
8e274523
LP
433 int r = -ENOMEM;
434
435 assert(_m);
a5dab5ce 436 assert(running_as >= 0);
67445f4e 437 assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
ce578209 438
915b3753
LP
439 m = new0(Manager, 1);
440 if (!m)
8e274523 441 return -ENOMEM;
60918275 442
4f8d551f
ZC
443#ifdef ENABLE_EFI
444 if (detect_container(NULL) <= 0)
445 efi_get_boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
446#endif
447
a5dab5ce 448 m->running_as = running_as;
cbd37330 449 m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
a16e1123 450 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
33be102a 451 m->pin_cgroupfs_fd = -1;
f2b68789 452 m->idle_pipe[0] = m->idle_pipe[1] = -1;
80876c20 453
8742514c
LP
454 watch_init(&m->signal_watch);
455 watch_init(&m->mount_watch);
456 watch_init(&m->swap_watch);
457 watch_init(&m->udev_watch);
458 watch_init(&m->time_change_watch);
03b717a3 459 watch_init(&m->jobs_in_progress_watch);
8742514c
LP
460
461 m->epoll_fd = m->dev_autofs_fd = -1;
ea430986 462 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
9152c765 463
71ecc858
LP
464 m->environment = strv_copy(environ);
465 if (!m->environment)
1137a57c
LP
466 goto fail;
467
71ecc858
LP
468 manager_strip_environment(m);
469
67445f4e 470 if (running_as == SYSTEMD_SYSTEM) {
88f06645
LP
471 m->default_controllers = strv_new("cpu", NULL);
472 if (!m->default_controllers)
473 goto fail;
474 }
06d4c99a 475
87f0e418 476 if (!(m->units = hashmap_new(string_hash_func, string_compare_func)))
60918275
LP
477 goto fail;
478
479 if (!(m->jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
480 goto fail;
481
9152c765
LP
482 if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
483 goto fail;
484
8e274523
LP
485 if (!(m->cgroup_bondings = hashmap_new(string_hash_func, string_compare_func)))
486 goto fail;
487
05e343b7
LP
488 if (!(m->watch_bus = hashmap_new(string_hash_func, string_compare_func)))
489 goto fail;
490
8742514c
LP
491 m->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
492 if (m->epoll_fd < 0)
493 goto fail;
494
495 r = manager_setup_signals(m);
496 if (r < 0)
9152c765
LP
497 goto fail;
498
8742514c
LP
499 r = manager_setup_cgroup(m);
500 if (r < 0)
8e274523
LP
501 goto fail;
502
8742514c
LP
503 r = manager_setup_notify(m);
504 if (r < 0)
9152c765
LP
505 goto fail;
506
8742514c
LP
507 r = manager_setup_time_change(m);
508 if (r < 0)
8c47c732
LP
509 goto fail;
510
f278026d 511 /* Try to connect to the busses, if possible. */
8742514c
LP
512 r = bus_init(m, running_as != SYSTEMD_SYSTEM);
513 if (r < 0)
ea430986
LP
514 goto fail;
515
72bc8d00
LP
516 m->taint_usr = dir_is_empty("/usr") > 0;
517
8e274523
LP
518 *_m = m;
519 return 0;
60918275
LP
520
521fail:
522 manager_free(m);
8e274523 523 return r;
60918275
LP
524}
525
23a177ef 526static unsigned manager_dispatch_cleanup_queue(Manager *m) {
595ed347 527 Unit *u;
23a177ef
LP
528 unsigned n = 0;
529
530 assert(m);
531
595ed347
MS
532 while ((u = m->cleanup_queue)) {
533 assert(u->in_cleanup_queue);
23a177ef 534
595ed347 535 unit_free(u);
23a177ef
LP
536 n++;
537 }
538
539 return n;
540}
541
eced69b3 542enum {
35b8ca3a 543 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
eced69b3
LP
544 GC_OFFSET_UNSURE, /* No clue */
545 GC_OFFSET_GOOD, /* We still need this unit */
546 GC_OFFSET_BAD, /* We don't need this unit anymore */
547 _GC_OFFSET_MAX
548};
549
550static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
701cc384
LP
551 Iterator i;
552 Unit *other;
eced69b3 553 bool is_bad;
701cc384
LP
554
555 assert(u);
556
ac155bb8
MS
557 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
558 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
559 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
701cc384
LP
560 return;
561
ac155bb8 562 if (u->in_cleanup_queue)
701cc384
LP
563 goto bad;
564
565 if (unit_check_gc(u))
566 goto good;
567
ac155bb8 568 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
eced69b3
LP
569
570 is_bad = true;
571
ac155bb8 572 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
701cc384
LP
573 unit_gc_sweep(other, gc_marker);
574
ac155bb8 575 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
701cc384 576 goto good;
eced69b3 577
ac155bb8 578 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
eced69b3 579 is_bad = false;
701cc384
LP
580 }
581
eced69b3
LP
582 if (is_bad)
583 goto bad;
584
585 /* We were unable to find anything out about this entry, so
586 * let's investigate it later */
ac155bb8 587 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
eced69b3
LP
588 unit_add_to_gc_queue(u);
589 return;
590
701cc384 591bad:
eced69b3
LP
592 /* We definitely know that this one is not useful anymore, so
593 * let's mark it for deletion */
ac155bb8 594 u->gc_marker = gc_marker + GC_OFFSET_BAD;
eced69b3 595 unit_add_to_cleanup_queue(u);
701cc384
LP
596 return;
597
598good:
ac155bb8 599 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
701cc384
LP
600}
601
602static unsigned manager_dispatch_gc_queue(Manager *m) {
595ed347 603 Unit *u;
701cc384 604 unsigned n = 0;
eced69b3 605 unsigned gc_marker;
701cc384
LP
606
607 assert(m);
608
609 if ((m->n_in_gc_queue < GC_QUEUE_ENTRIES_MAX) &&
610 (m->gc_queue_timestamp <= 0 ||
611 (m->gc_queue_timestamp + GC_QUEUE_USEC_MAX) > now(CLOCK_MONOTONIC)))
612 return 0;
613
614 log_debug("Running GC...");
615
eced69b3
LP
616 m->gc_marker += _GC_OFFSET_MAX;
617 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
c9c0cadb 618 m->gc_marker = 1;
701cc384 619
eced69b3
LP
620 gc_marker = m->gc_marker;
621
595ed347
MS
622 while ((u = m->gc_queue)) {
623 assert(u->in_gc_queue);
701cc384 624
595ed347 625 unit_gc_sweep(u, gc_marker);
eced69b3 626
595ed347
MS
627 LIST_REMOVE(Unit, gc_queue, m->gc_queue, u);
628 u->in_gc_queue = false;
701cc384
LP
629
630 n++;
631
595ed347
MS
632 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
633 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
66870f90 634 log_debug_unit(u->id, "Collecting %s", u->id);
595ed347
MS
635 u->gc_marker = gc_marker + GC_OFFSET_BAD;
636 unit_add_to_cleanup_queue(u);
701cc384
LP
637 }
638 }
639
640 m->n_in_gc_queue = 0;
641 m->gc_queue_timestamp = 0;
642
643 return n;
644}
645
a16e1123 646static void manager_clear_jobs_and_units(Manager *m) {
a16e1123 647 Unit *u;
60918275
LP
648
649 assert(m);
650
87f0e418
LP
651 while ((u = hashmap_first(m->units)))
652 unit_free(u);
964e0949
LP
653
654 manager_dispatch_cleanup_queue(m);
655
656 assert(!m->load_queue);
657 assert(!m->run_queue);
658 assert(!m->dbus_unit_queue);
659 assert(!m->dbus_job_queue);
660 assert(!m->cleanup_queue);
661 assert(!m->gc_queue);
662
964e0949
LP
663 assert(hashmap_isempty(m->jobs));
664 assert(hashmap_isempty(m->units));
9e9e2b72
MS
665
666 m->n_on_console = 0;
667 m->n_running_jobs = 0;
a16e1123
LP
668}
669
670void manager_free(Manager *m) {
671 UnitType c;
c93ff2e9 672 int i;
87f0e418 673
a16e1123
LP
674 assert(m);
675
676 manager_clear_jobs_and_units(m);
23a177ef 677
7824bbeb
LP
678 for (c = 0; c < _UNIT_TYPE_MAX; c++)
679 if (unit_vtable[c]->shutdown)
680 unit_vtable[c]->shutdown(m);
681
a16e1123
LP
682 /* If we reexecute ourselves, we keep the root cgroup
683 * around */
c6c18be3 684 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
8e274523 685
5a1e9937
LP
686 manager_undo_generators(m);
687
5e8d1c9a 688 bus_done(m);
ea430986 689
87f0e418 690 hashmap_free(m->units);
60918275 691 hashmap_free(m->jobs);
9152c765 692 hashmap_free(m->watch_pids);
05e343b7 693 hashmap_free(m->watch_bus);
9152c765
LP
694
695 if (m->epoll_fd >= 0)
a16e1123 696 close_nointr_nofail(m->epoll_fd);
acbb0225 697 if (m->signal_watch.fd >= 0)
a16e1123 698 close_nointr_nofail(m->signal_watch.fd);
8c47c732
LP
699 if (m->notify_watch.fd >= 0)
700 close_nointr_nofail(m->notify_watch.fd);
8742514c
LP
701 if (m->time_change_watch.fd >= 0)
702 close_nointr_nofail(m->time_change_watch.fd);
03b717a3
MS
703 if (m->jobs_in_progress_watch.fd >= 0)
704 close_nointr_nofail(m->jobs_in_progress_watch.fd);
60918275 705
c952c6ec
LP
706 free(m->notify_socket);
707
84e3543e 708 lookup_paths_free(&m->lookup_paths);
1137a57c 709 strv_free(m->environment);
036643a2 710
06d4c99a
LP
711 strv_free(m->default_controllers);
712
8e274523 713 hashmap_free(m->cgroup_bondings);
c6c18be3 714 set_free_free(m->unit_path_cache);
33be102a 715
f2b68789
LP
716 close_pipe(m->idle_pipe);
717
664f88a7
LP
718 free(m->switch_root);
719 free(m->switch_root_init);
720
c93ff2e9
FC
721 for (i = 0; i < RLIMIT_NLIMITS; i++)
722 free(m->rlimit[i]);
723
60918275
LP
724 free(m);
725}
726
a16e1123
LP
727int manager_enumerate(Manager *m) {
728 int r = 0, q;
f50e0a01 729 UnitType c;
f50e0a01
LP
730
731 assert(m);
732
a16e1123
LP
733 /* Let's ask every type to load all units from disk/kernel
734 * that it might know */
f50e0a01
LP
735 for (c = 0; c < _UNIT_TYPE_MAX; c++)
736 if (unit_vtable[c]->enumerate)
a16e1123
LP
737 if ((q = unit_vtable[c]->enumerate(m)) < 0)
738 r = q;
f50e0a01
LP
739
740 manager_dispatch_load_queue(m);
a16e1123
LP
741 return r;
742}
743
744int manager_coldplug(Manager *m) {
745 int r = 0, q;
746 Iterator i;
747 Unit *u;
748 char *k;
749
750 assert(m);
f50e0a01
LP
751
752 /* Then, let's set up their initial state. */
753 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
754
755 /* ignore aliases */
ac155bb8 756 if (u->id != k)
f50e0a01
LP
757 continue;
758
cca098b0
LP
759 if ((q = unit_coldplug(u)) < 0)
760 r = q;
f50e0a01
LP
761 }
762
a16e1123
LP
763 return r;
764}
765
fe51822e
LP
766static void manager_build_unit_path_cache(Manager *m) {
767 char **i;
7fd1b19b 768 _cleanup_free_ DIR *d = NULL;
fe51822e
LP
769 int r;
770
771 assert(m);
772
773 set_free_free(m->unit_path_cache);
774
874310b7
ZJS
775 m->unit_path_cache = set_new(string_hash_func, string_compare_func);
776 if (!m->unit_path_cache) {
fe51822e
LP
777 log_error("Failed to allocate unit path cache.");
778 return;
779 }
780
781 /* This simply builds a list of files we know exist, so that
782 * we don't always have to go to disk */
783
784 STRV_FOREACH(i, m->lookup_paths.unit_path) {
785 struct dirent *de;
786
bd0af849
ZJS
787 d = opendir(*i);
788 if (!d) {
874310b7
ZJS
789 if (errno != ENOENT)
790 log_error("Failed to open directory %s: %m", *i);
fe51822e
LP
791 continue;
792 }
793
794 while ((de = readdir(d))) {
795 char *p;
796
797 if (ignore_file(de->d_name))
798 continue;
799
b7def684 800 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
44d91056 801 if (!p) {
fe51822e
LP
802 r = -ENOMEM;
803 goto fail;
804 }
805
ef42202a
ZJS
806 r = set_consume(m->unit_path_cache, p);
807 if (r < 0)
fe51822e 808 goto fail;
fe51822e
LP
809 }
810
811 closedir(d);
812 d = NULL;
813 }
814
815 return;
816
817fail:
818 log_error("Failed to build unit path cache: %s", strerror(-r));
819
820 set_free_free(m->unit_path_cache);
821 m->unit_path_cache = NULL;
fe51822e
LP
822}
823
a16e1123
LP
824int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
825 int r, q;
826
827 assert(m);
828
518d10e9 829 dual_timestamp_get(&m->generators_start_timestamp);
5a1e9937 830 manager_run_generators(m);
518d10e9 831 dual_timestamp_get(&m->generators_finish_timestamp);
5a1e9937 832
07719a21
LP
833 r = lookup_paths_init(
834 &m->lookup_paths, m->running_as, true,
835 m->generator_unit_path,
836 m->generator_unit_path_early,
837 m->generator_unit_path_late);
838 if (r < 0)
839 return r;
840
fe51822e
LP
841 manager_build_unit_path_cache(m);
842
9f611ad8
LP
843 /* If we will deserialize make sure that during enumeration
844 * this is already known, so we increase the counter here
845 * already */
846 if (serialization)
a7556052 847 m->n_reloading ++;
9f611ad8 848
a16e1123 849 /* First, enumerate what we can from all config files */
d9acfb71 850 dual_timestamp_get(&m->unitsload_start_timestamp);
a16e1123 851 r = manager_enumerate(m);
d9acfb71 852 dual_timestamp_get(&m->unitsload_finish_timestamp);
a16e1123
LP
853
854 /* Second, deserialize if there is something to deserialize */
07719a21
LP
855 if (serialization) {
856 q = manager_deserialize(m, serialization, fds);
857 if (q < 0)
a16e1123 858 r = q;
07719a21 859 }
a16e1123 860
01e10de3
LP
861 /* Any fds left? Find some unit which wants them. This is
862 * useful to allow container managers to pass some file
863 * descriptors to us pre-initialized. This enables
864 * socket-based activation of entire containers. */
865 if (fdset_size(fds) > 0) {
866 q = manager_distribute_fds(m, fds);
867 if (q < 0)
868 r = q;
869 }
870
a16e1123 871 /* Third, fire things up! */
07719a21
LP
872 q = manager_coldplug(m);
873 if (q < 0)
a16e1123
LP
874 r = q;
875
9f611ad8 876 if (serialization) {
a7556052
LP
877 assert(m->n_reloading > 0);
878 m->n_reloading --;
9f611ad8
LP
879 }
880
a16e1123 881 return r;
f50e0a01
LP
882}
883
398ef8ba 884int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, DBusError *e, Job **_ret) {
e5b5ae50 885 int r;
7527cb52 886 Transaction *tr;
e5b5ae50
LP
887
888 assert(m);
889 assert(type < _JOB_TYPE_MAX);
87f0e418 890 assert(unit);
e5b5ae50 891 assert(mode < _JOB_MODE_MAX);
60918275 892
398ef8ba
LP
893 if (mode == JOB_ISOLATE && type != JOB_START) {
894 dbus_set_error(e, BUS_ERROR_INVALID_JOB_MODE, "Isolate is only valid for start.");
c497c7a9 895 return -EINVAL;
398ef8ba 896 }
c497c7a9 897
ac155bb8 898 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
2528a7a6
LP
899 dbus_set_error(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
900 return -EPERM;
901 }
902
66870f90
ZJS
903 log_debug_unit(unit->id,
904 "Trying to enqueue job %s/%s/%s", unit->id,
905 job_type_to_string(type), job_mode_to_string(mode));
9f04bd52 906
e0209d83
MS
907 job_type_collapse(&type, unit);
908
23ade460 909 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
7527cb52
MS
910 if (!tr)
911 return -ENOMEM;
11dd41ce 912
7527cb52
MS
913 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
914 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
b94fbd30 915 mode == JOB_IGNORE_DEPENDENCIES, e);
7527cb52
MS
916 if (r < 0)
917 goto tr_abort;
c497c7a9 918
7527cb52
MS
919 if (mode == JOB_ISOLATE) {
920 r = transaction_add_isolate_jobs(tr, m);
921 if (r < 0)
922 goto tr_abort;
923 }
924
925 r = transaction_activate(tr, m, mode, e);
926 if (r < 0)
927 goto tr_abort;
e5b5ae50 928
66870f90
ZJS
929 log_debug_unit(unit->id,
930 "Enqueued job %s/%s as %u", unit->id,
931 job_type_to_string(type), (unsigned) tr->anchor_job->id);
f50e0a01 932
e5b5ae50 933 if (_ret)
b94fbd30 934 *_ret = tr->anchor_job;
60918275 935
7527cb52 936 transaction_free(tr);
e5b5ae50 937 return 0;
7527cb52
MS
938
939tr_abort:
940 transaction_abort(tr);
941 transaction_free(tr);
942 return r;
e5b5ae50 943}
60918275 944
398ef8ba 945int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, DBusError *e, Job **_ret) {
28247076
LP
946 Unit *unit;
947 int r;
948
949 assert(m);
950 assert(type < _JOB_TYPE_MAX);
951 assert(name);
952 assert(mode < _JOB_MODE_MAX);
953
c3090674
LP
954 r = manager_load_unit(m, name, NULL, NULL, &unit);
955 if (r < 0)
28247076
LP
956 return r;
957
398ef8ba 958 return manager_add_job(m, type, unit, mode, override, e, _ret);
28247076
LP
959}
960
60918275
LP
961Job *manager_get_job(Manager *m, uint32_t id) {
962 assert(m);
963
964 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
965}
966
87f0e418 967Unit *manager_get_unit(Manager *m, const char *name) {
60918275
LP
968 assert(m);
969 assert(name);
970
87f0e418 971 return hashmap_get(m->units, name);
60918275
LP
972}
973
c1e1601e 974unsigned manager_dispatch_load_queue(Manager *m) {
595ed347 975 Unit *u;
c1e1601e 976 unsigned n = 0;
60918275
LP
977
978 assert(m);
979
223dabab
LP
980 /* Make sure we are not run recursively */
981 if (m->dispatching_load_queue)
c1e1601e 982 return 0;
223dabab
LP
983
984 m->dispatching_load_queue = true;
985
87f0e418 986 /* Dispatches the load queue. Takes a unit from the queue and
60918275
LP
987 * tries to load its data until the queue is empty */
988
595ed347
MS
989 while ((u = m->load_queue)) {
990 assert(u->in_load_queue);
034c6ed7 991
595ed347 992 unit_load(u);
c1e1601e 993 n++;
60918275
LP
994 }
995
223dabab 996 m->dispatching_load_queue = false;
c1e1601e 997 return n;
60918275
LP
998}
999
398ef8ba 1000int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
87f0e418 1001 Unit *ret;
7d17cfbc 1002 UnitType t;
60918275
LP
1003 int r;
1004
1005 assert(m);
9e2f7c11 1006 assert(name || path);
60918275 1007
db06e3b6
LP
1008 /* This will prepare the unit for loading, but not actually
1009 * load anything from disk. */
0301abf4 1010
398ef8ba
LP
1011 if (path && !is_path(path)) {
1012 dbus_set_error(e, BUS_ERROR_INVALID_PATH, "Path %s is not absolute.", path);
9e2f7c11 1013 return -EINVAL;
398ef8ba 1014 }
9e2f7c11
LP
1015
1016 if (!name)
9eb977db 1017 name = path_get_file_name(path);
9e2f7c11 1018
7d17cfbc
MS
1019 t = unit_name_to_type(name);
1020
5f739699 1021 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, false)) {
398ef8ba 1022 dbus_set_error(e, BUS_ERROR_INVALID_NAME, "Unit name %s is not valid.", name);
9e2f7c11 1023 return -EINVAL;
398ef8ba 1024 }
60918275 1025
7d17cfbc
MS
1026 ret = manager_get_unit(m, name);
1027 if (ret) {
034c6ed7 1028 *_ret = ret;
413d6313 1029 return 1;
034c6ed7 1030 }
60918275 1031
7d17cfbc
MS
1032 ret = unit_new(m, unit_vtable[t]->object_size);
1033 if (!ret)
60918275
LP
1034 return -ENOMEM;
1035
7d17cfbc 1036 if (path) {
ac155bb8
MS
1037 ret->fragment_path = strdup(path);
1038 if (!ret->fragment_path) {
0301abf4
LP
1039 unit_free(ret);
1040 return -ENOMEM;
1041 }
7d17cfbc 1042 }
0301abf4 1043
1058cbf2
ZJS
1044 r = unit_add_name(ret, name);
1045 if (r < 0) {
87f0e418 1046 unit_free(ret);
1ffba6fe 1047 return r;
60918275
LP
1048 }
1049
87f0e418 1050 unit_add_to_load_queue(ret);
c1e1601e 1051 unit_add_to_dbus_queue(ret);
949061f0 1052 unit_add_to_gc_queue(ret);
c1e1601e 1053
db06e3b6
LP
1054 if (_ret)
1055 *_ret = ret;
1056
1057 return 0;
1058}
1059
398ef8ba 1060int manager_load_unit(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
db06e3b6
LP
1061 int r;
1062
1063 assert(m);
1064
1065 /* This will load the service information files, but not actually
1066 * start any services or anything. */
1067
c3090674
LP
1068 r = manager_load_unit_prepare(m, name, path, e, _ret);
1069 if (r != 0)
db06e3b6
LP
1070 return r;
1071
f50e0a01 1072 manager_dispatch_load_queue(m);
60918275 1073
9e2f7c11 1074 if (_ret)
413d6313 1075 *_ret = unit_follow_merge(*_ret);
9e2f7c11 1076
60918275
LP
1077 return 0;
1078}
a66d02c3 1079
cea8e32e 1080void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
034c6ed7 1081 Iterator i;
a66d02c3
LP
1082 Job *j;
1083
1084 assert(s);
1085 assert(f);
1086
034c6ed7 1087 HASHMAP_FOREACH(j, s->jobs, i)
cea8e32e 1088 job_dump(j, f, prefix);
a66d02c3
LP
1089}
1090
87f0e418 1091void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
034c6ed7 1092 Iterator i;
87f0e418 1093 Unit *u;
11dd41ce 1094 const char *t;
a66d02c3
LP
1095
1096 assert(s);
1097 assert(f);
1098
87f0e418 1099 HASHMAP_FOREACH_KEY(u, t, s->units, i)
ac155bb8 1100 if (u->id == t)
87f0e418 1101 unit_dump(u, f, prefix);
a66d02c3 1102}
7fad411c
LP
1103
1104void manager_clear_jobs(Manager *m) {
1105 Job *j;
1106
1107 assert(m);
1108
7fad411c 1109 while ((j = hashmap_first(m->jobs)))
5273510e
MS
1110 /* No need to recurse. We're cancelling all jobs. */
1111 job_finish_and_invalidate(j, JOB_CANCELED, false);
7fad411c 1112}
83c60c9f 1113
c1e1601e 1114unsigned manager_dispatch_run_queue(Manager *m) {
83c60c9f 1115 Job *j;
c1e1601e 1116 unsigned n = 0;
83c60c9f 1117
034c6ed7 1118 if (m->dispatching_run_queue)
c1e1601e 1119 return 0;
034c6ed7
LP
1120
1121 m->dispatching_run_queue = true;
9152c765 1122
034c6ed7 1123 while ((j = m->run_queue)) {
ac1135be 1124 assert(j->installed);
034c6ed7
LP
1125 assert(j->in_run_queue);
1126
1127 job_run_and_invalidate(j);
c1e1601e 1128 n++;
9152c765 1129 }
034c6ed7
LP
1130
1131 m->dispatching_run_queue = false;
03b717a3 1132
a0b64226 1133 if (m->n_running_jobs > 0)
03b717a3
MS
1134 manager_watch_jobs_in_progress(m);
1135
c1e1601e
LP
1136 return n;
1137}
1138
1139unsigned manager_dispatch_dbus_queue(Manager *m) {
1140 Job *j;
595ed347 1141 Unit *u;
c1e1601e
LP
1142 unsigned n = 0;
1143
1144 assert(m);
1145
1146 if (m->dispatching_dbus_queue)
1147 return 0;
1148
1149 m->dispatching_dbus_queue = true;
1150
595ed347
MS
1151 while ((u = m->dbus_unit_queue)) {
1152 assert(u->in_dbus_queue);
c1e1601e 1153
595ed347 1154 bus_unit_send_change_signal(u);
c1e1601e
LP
1155 n++;
1156 }
1157
1158 while ((j = m->dbus_job_queue)) {
1159 assert(j->in_dbus_queue);
1160
1161 bus_job_send_change_signal(j);
1162 n++;
1163 }
1164
1165 m->dispatching_dbus_queue = false;
1166 return n;
9152c765
LP
1167}
1168
8c47c732
LP
1169static int manager_process_notify_fd(Manager *m) {
1170 ssize_t n;
1171
1172 assert(m);
1173
1174 for (;;) {
1175 char buf[4096];
b92bea5d
ZJS
1176 struct iovec iovec = {
1177 .iov_base = buf,
1178 .iov_len = sizeof(buf)-1,
1179 };
1180
8c47c732
LP
1181 union {
1182 struct cmsghdr cmsghdr;
1183 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
b92bea5d
ZJS
1184 } control = {};
1185
1186 struct msghdr msghdr = {
1187 .msg_iov = &iovec,
1188 .msg_iovlen = 1,
1189 .msg_control = &control,
1190 .msg_controllen = sizeof(control),
1191 };
1192 struct ucred *ucred;
8c47c732 1193 Unit *u;
7fd1b19b 1194 _cleanup_strv_free_ char **tags = NULL;
8c47c732 1195
bd0af849
ZJS
1196 n = recvmsg(m->notify_watch.fd, &msghdr, MSG_DONTWAIT);
1197 if (n <= 0) {
b92bea5d 1198 if (n == 0)
8c47c732
LP
1199 return -EIO;
1200
f6144808 1201 if (errno == EAGAIN || errno == EINTR)
8c47c732
LP
1202 break;
1203
1204 return -errno;
1205 }
1206
1207 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1208 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1209 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1210 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1211 log_warning("Received notify message without credentials. Ignoring.");
1212 continue;
1213 }
1214
1215 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1216
bd0af849
ZJS
1217 u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid));
1218 if (!u) {
1219 u = cgroup_unit_by_pid(m, ucred->pid);
1220 if (!u) {
7989e1f2 1221 log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred->pid);
8c47c732
LP
1222 continue;
1223 }
bd0af849 1224 }
8c47c732 1225
8c40acf7
LP
1226 assert((size_t) n < sizeof(buf));
1227 buf[n] = 0;
bd0af849
ZJS
1228 tags = strv_split(buf, "\n\r");
1229 if (!tags)
1230 return log_oom();
8c47c732 1231
66870f90 1232 log_debug_unit(u->id, "Got notification message for unit %s", u->id);
8c47c732
LP
1233
1234 if (UNIT_VTABLE(u)->notify_message)
c952c6ec 1235 UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
8c47c732
LP
1236 }
1237
1238 return 0;
1239}
1240
034c6ed7 1241static int manager_dispatch_sigchld(Manager *m) {
9152c765
LP
1242 assert(m);
1243
1244 for (;;) {
b92bea5d 1245 siginfo_t si = {};
87f0e418 1246 Unit *u;
8c47c732 1247 int r;
9152c765 1248
4112df16
LP
1249 /* First we call waitd() for a PID and do not reap the
1250 * zombie. That way we can still access /proc/$PID for
1251 * it while it is a zombie. */
1252 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
acbb0225
LP
1253
1254 if (errno == ECHILD)
1255 break;
1256
4112df16
LP
1257 if (errno == EINTR)
1258 continue;
1259
9152c765 1260 return -errno;
acbb0225 1261 }
9152c765 1262
4112df16 1263 if (si.si_pid <= 0)
9152c765
LP
1264 break;
1265
15d5d9d9 1266 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
7fd1b19b 1267 _cleanup_free_ char *name = NULL;
4112df16 1268
87d2c1ff 1269 get_process_comm(si.si_pid, &name);
bb00e604 1270 log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
4112df16
LP
1271 }
1272
8c47c732
LP
1273 /* Let's flush any message the dying child might still
1274 * have queued for us. This ensures that the process
1275 * still exists in /proc so that we can figure out
1276 * which cgroup and hence unit it belongs to. */
bd0af849
ZJS
1277 r = manager_process_notify_fd(m);
1278 if (r < 0)
8c47c732
LP
1279 return r;
1280
1281 /* And now figure out the unit this belongs to */
bd0af849
ZJS
1282 u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid));
1283 if (!u)
8c47c732
LP
1284 u = cgroup_unit_by_pid(m, si.si_pid);
1285
4112df16
LP
1286 /* And now, we actually reap the zombie. */
1287 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1288 if (errno == EINTR)
1289 continue;
1290
1291 return -errno;
1292 }
1293
034c6ed7
LP
1294 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
1295 continue;
1296
bb00e604
LP
1297 log_debug("Child %lu died (code=%s, status=%i/%s)",
1298 (long unsigned) si.si_pid,
4112df16
LP
1299 sigchld_code_to_string(si.si_code),
1300 si.si_status,
d06dacd0
LP
1301 strna(si.si_code == CLD_EXITED
1302 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1303 : signal_to_string(si.si_status)));
acbb0225 1304
8c47c732 1305 if (!u)
9152c765
LP
1306 continue;
1307
66870f90
ZJS
1308 log_debug_unit(u->id,
1309 "Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
6c1a0478 1310
c6c18be3 1311 hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
87f0e418 1312 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
9152c765
LP
1313 }
1314
1315 return 0;
1316}
1317
7d793605 1318static int manager_start_target(Manager *m, const char *name, JobMode mode) {
28247076 1319 int r;
398ef8ba
LP
1320 DBusError error;
1321
1322 dbus_error_init(&error);
1323
66870f90 1324 log_debug_unit(name, "Activating special unit %s", name);
1e001f52 1325
bd0af849
ZJS
1326 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1327 if (r < 0)
66870f90
ZJS
1328 log_error_unit(name,
1329 "Failed to enqueue %s job: %s", name, bus_error(&error, r));
28247076 1330
398ef8ba 1331 dbus_error_free(&error);
a1b256b0
LP
1332
1333 return r;
28247076
LP
1334}
1335
a16e1123 1336static int manager_process_signal_fd(Manager *m) {
9152c765
LP
1337 ssize_t n;
1338 struct signalfd_siginfo sfsi;
1339 bool sigchld = false;
1340
1341 assert(m);
1342
1343 for (;;) {
57cb4adf
LP
1344 n = read(m->signal_watch.fd, &sfsi, sizeof(sfsi));
1345 if (n != sizeof(sfsi)) {
9152c765
LP
1346
1347 if (n >= 0)
1348 return -EIO;
1349
63090775 1350 if (errno == EINTR || errno == EAGAIN)
acbb0225 1351 break;
9152c765
LP
1352
1353 return -errno;
1354 }
1355
67370238
LP
1356 if (sfsi.ssi_pid > 0) {
1357 char *p = NULL;
1358
87d2c1ff 1359 get_process_comm(sfsi.ssi_pid, &p);
dfa7f7e1 1360
67370238 1361 log_debug("Received SIG%s from PID %lu (%s).",
4e240ab0 1362 signal_to_string(sfsi.ssi_signo),
67370238
LP
1363 (unsigned long) sfsi.ssi_pid, strna(p));
1364 free(p);
1365 } else
4e240ab0 1366 log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
1e001f52 1367
b9cd2ec1
LP
1368 switch (sfsi.ssi_signo) {
1369
4112df16 1370 case SIGCHLD:
9152c765 1371 sigchld = true;
b9cd2ec1
LP
1372 break;
1373
6632c602 1374 case SIGTERM:
67445f4e 1375 if (m->running_as == SYSTEMD_SYSTEM) {
db06e3b6
LP
1376 /* This is for compatibility with the
1377 * original sysvinit */
e11dc4a2 1378 m->exit_code = MANAGER_REEXECUTE;
a1b256b0
LP
1379 break;
1380 }
84e9af1e 1381
a1b256b0 1382 /* Fall through */
e11dc4a2
LP
1383
1384 case SIGINT:
67445f4e 1385 if (m->running_as == SYSTEMD_SYSTEM) {
f49fd1d5 1386 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
84e9af1e
LP
1387 break;
1388 }
1389
a1b256b0 1390 /* Run the exit target if there is one, if not, just exit. */
0003d1ab 1391 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
a1b256b0
LP
1392 m->exit_code = MANAGER_EXIT;
1393 return 0;
1394 }
1395
1396 break;
84e9af1e 1397
28247076 1398 case SIGWINCH:
67445f4e 1399 if (m->running_as == SYSTEMD_SYSTEM)
7d793605 1400 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
84e9af1e 1401
28247076
LP
1402 /* This is a nop on non-init */
1403 break;
84e9af1e 1404
28247076 1405 case SIGPWR:
67445f4e 1406 if (m->running_as == SYSTEMD_SYSTEM)
7d793605 1407 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
84e9af1e 1408
28247076 1409 /* This is a nop on non-init */
84e9af1e 1410 break;
6632c602 1411
1005d14f 1412 case SIGUSR1: {
57ee42ce
LP
1413 Unit *u;
1414
1415 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1416
1417 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1418 log_info("Trying to reconnect to bus...");
3996fbe2 1419 bus_init(m, true);
57ee42ce
LP
1420 }
1421
1422 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1423 log_info("Loading D-Bus service...");
7d793605 1424 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
57ee42ce
LP
1425 }
1426
1427 break;
1428 }
1429
2149e37c
LP
1430 case SIGUSR2: {
1431 FILE *f;
1432 char *dump = NULL;
1433 size_t size;
1434
1435 if (!(f = open_memstream(&dump, &size))) {
1436 log_warning("Failed to allocate memory stream.");
1437 break;
1438 }
1439
1440 manager_dump_units(m, f, "\t");
1441 manager_dump_jobs(m, f, "\t");
1442
1443 if (ferror(f)) {
1444 fclose(f);
1445 free(dump);
1446 log_warning("Failed to write status stream");
1447 break;
1448 }
1449
1450 fclose(f);
1451 log_dump(LOG_INFO, dump);
1452 free(dump);
1453
1005d14f 1454 break;
2149e37c 1455 }
1005d14f 1456
a16e1123
LP
1457 case SIGHUP:
1458 m->exit_code = MANAGER_RELOAD;
1459 break;
1460
7d793605 1461 default: {
253ee27a 1462
0003d1ab
LP
1463 /* Starting SIGRTMIN+0 */
1464 static const char * const target_table[] = {
7d793605
LP
1465 [0] = SPECIAL_DEFAULT_TARGET,
1466 [1] = SPECIAL_RESCUE_TARGET,
f057408c 1467 [2] = SPECIAL_EMERGENCY_TARGET,
7d793605
LP
1468 [3] = SPECIAL_HALT_TARGET,
1469 [4] = SPECIAL_POWEROFF_TARGET,
0003d1ab
LP
1470 [5] = SPECIAL_REBOOT_TARGET,
1471 [6] = SPECIAL_KEXEC_TARGET
1472 };
1473
1474 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1475 static const ManagerExitCode code_table[] = {
1476 [0] = MANAGER_HALT,
1477 [1] = MANAGER_POWEROFF,
1478 [2] = MANAGER_REBOOT,
1479 [3] = MANAGER_KEXEC
7d793605
LP
1480 };
1481
1482 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
0003d1ab 1483 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
764e9b5f
MS
1484 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1485 manager_start_target(m, target_table[idx],
1486 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
7d793605
LP
1487 break;
1488 }
1489
0003d1ab
LP
1490 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1491 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1492 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1493 break;
1494 }
1495
0658666b
LP
1496 switch (sfsi.ssi_signo - SIGRTMIN) {
1497
1498 case 20:
1499 log_debug("Enabling showing of status.");
27d340c7 1500 manager_set_show_status(m, true);
0658666b
LP
1501 break;
1502
1503 case 21:
1504 log_debug("Disabling showing of status.");
27d340c7 1505 manager_set_show_status(m, false);
0658666b
LP
1506 break;
1507
253ee27a
LP
1508 case 22:
1509 log_set_max_level(LOG_DEBUG);
1510 log_notice("Setting log level to debug.");
1511 break;
1512
1513 case 23:
1514 log_set_max_level(LOG_INFO);
1515 log_notice("Setting log level to info.");
1516 break;
1517
600b704e
LP
1518 case 24:
1519 if (m->running_as == SYSTEMD_USER) {
1520 m->exit_code = MANAGER_EXIT;
1521 return 0;
1522 }
1523
1524 /* This is a nop on init */
1525 break;
1526
4cfa2c99
LP
1527 case 26:
1528 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1529 log_notice("Setting log target to journal-or-kmsg.");
1530 break;
1531
253ee27a
LP
1532 case 27:
1533 log_set_target(LOG_TARGET_CONSOLE);
1534 log_notice("Setting log target to console.");
1535 break;
1536
1537 case 28:
1538 log_set_target(LOG_TARGET_KMSG);
1539 log_notice("Setting log target to kmsg.");
1540 break;
1541
1542 case 29:
1543 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
1544 log_notice("Setting log target to syslog-or-kmsg.");
1545 break;
1546
0658666b 1547 default:
4e240ab0 1548 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
0658666b 1549 }
b9cd2ec1 1550 }
7d793605 1551 }
9152c765
LP
1552 }
1553
1554 if (sigchld)
034c6ed7
LP
1555 return manager_dispatch_sigchld(m);
1556
1557 return 0;
1558}
1559
a16e1123 1560static int process_event(Manager *m, struct epoll_event *ev) {
034c6ed7 1561 int r;
acbb0225 1562 Watch *w;
034c6ed7
LP
1563
1564 assert(m);
1565 assert(ev);
1566
3df5bf61 1567 assert_se(w = ev->data.ptr);
034c6ed7 1568
40dde66f
LP
1569 if (w->type == WATCH_INVALID)
1570 return 0;
1571
acbb0225 1572 switch (w->type) {
034c6ed7 1573
ef734fd6 1574 case WATCH_SIGNAL:
034c6ed7 1575
acbb0225 1576 /* An incoming signal? */
f94ea366 1577 if (ev->events != EPOLLIN)
acbb0225 1578 return -EINVAL;
034c6ed7 1579
a16e1123 1580 if ((r = manager_process_signal_fd(m)) < 0)
acbb0225 1581 return r;
034c6ed7 1582
acbb0225 1583 break;
034c6ed7 1584
8c47c732
LP
1585 case WATCH_NOTIFY:
1586
1587 /* An incoming daemon notification event? */
1588 if (ev->events != EPOLLIN)
1589 return -EINVAL;
1590
1591 if ((r = manager_process_notify_fd(m)) < 0)
1592 return r;
1593
1594 break;
1595
acbb0225 1596 case WATCH_FD:
034c6ed7 1597
acbb0225 1598 /* Some fd event, to be dispatched to the units */
ea430986 1599 UNIT_VTABLE(w->data.unit)->fd_event(w->data.unit, w->fd, ev->events, w);
acbb0225 1600 break;
034c6ed7 1601
faf919f1
LP
1602 case WATCH_UNIT_TIMER:
1603 case WATCH_JOB_TIMER: {
acbb0225
LP
1604 uint64_t v;
1605 ssize_t k;
034c6ed7 1606
acbb0225 1607 /* Some timer event, to be dispatched to the units */
68b29a9f
LP
1608 k = read(w->fd, &v, sizeof(v));
1609 if (k != sizeof(v)) {
034c6ed7 1610
acbb0225
LP
1611 if (k < 0 && (errno == EINTR || errno == EAGAIN))
1612 break;
034c6ed7 1613
8742514c 1614 log_error("Failed to read timer event counter: %s", k < 0 ? strerror(-k) : "Short read");
acbb0225 1615 return k < 0 ? -errno : -EIO;
034c6ed7
LP
1616 }
1617
faf919f1
LP
1618 if (w->type == WATCH_UNIT_TIMER)
1619 UNIT_VTABLE(w->data.unit)->timer_event(w->data.unit, v, w);
1620 else
1621 job_timer_event(w->data.job, v, w);
acbb0225
LP
1622 break;
1623 }
1624
ef734fd6
LP
1625 case WATCH_MOUNT:
1626 /* Some mount table change, intended for the mount subsystem */
1627 mount_fd_event(m, ev->events);
1628 break;
1629
4e434314
LP
1630 case WATCH_SWAP:
1631 /* Some swap table change, intended for the swap subsystem */
1632 swap_fd_event(m, ev->events);
1633 break;
1634
f94ea366
LP
1635 case WATCH_UDEV:
1636 /* Some notification from udev, intended for the device subsystem */
1637 device_fd_event(m, ev->events);
1638 break;
1639
ea430986
LP
1640 case WATCH_DBUS_WATCH:
1641 bus_watch_event(m, w, ev->events);
1642 break;
1643
1644 case WATCH_DBUS_TIMEOUT:
1645 bus_timeout_event(m, w, ev->events);
1646 break;
1647
8742514c
LP
1648 case WATCH_TIME_CHANGE: {
1649 Unit *u;
1650 Iterator i;
1651
1652 log_struct(LOG_INFO,
1653 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1654 "MESSAGE=Time has been changed",
1655 NULL);
1656
1657 /* Restart the watch */
f1324eaa
ES
1658 epoll_ctl(m->epoll_fd, EPOLL_CTL_DEL, m->time_change_watch.fd,
1659 NULL);
8742514c
LP
1660 close_nointr_nofail(m->time_change_watch.fd);
1661 watch_init(&m->time_change_watch);
1662 manager_setup_time_change(m);
1663
1664 HASHMAP_FOREACH(u, m->units, i) {
1665 if (UNIT_VTABLE(u)->time_change)
1666 UNIT_VTABLE(u)->time_change(u);
1667 }
1668
1669 break;
1670 }
1671
03b717a3
MS
1672 case WATCH_JOBS_IN_PROGRESS: {
1673 uint64_t v;
1674
1675 /* not interested in the data */
1676 read(w->fd, &v, sizeof(v));
1677
1678 manager_print_jobs_in_progress(m);
1679 break;
1680 }
1681
acbb0225 1682 default:
c5fd1e57 1683 log_error("event type=%i", w->type);
acbb0225 1684 assert_not_reached("Unknown epoll event type.");
034c6ed7 1685 }
9152c765
LP
1686
1687 return 0;
1688}
1689
1690int manager_loop(Manager *m) {
1691 int r;
9152c765 1692
fac9f8df 1693 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
ea430986 1694
9152c765 1695 assert(m);
a16e1123 1696 m->exit_code = MANAGER_RUNNING;
9152c765 1697
fe51822e
LP
1698 /* Release the path cache */
1699 set_free_free(m->unit_path_cache);
1700 m->unit_path_cache = NULL;
1701
b0c918b9
LP
1702 manager_check_finished(m);
1703
a4312405
LP
1704 /* There might still be some zombies hanging around from
1705 * before we were exec()'ed. Leat's reap them */
e96d6be7
LP
1706 r = manager_dispatch_sigchld(m);
1707 if (r < 0)
a4312405
LP
1708 return r;
1709
a16e1123 1710 while (m->exit_code == MANAGER_RUNNING) {
957ca890
LP
1711 struct epoll_event event;
1712 int n;
c757a65b 1713 int wait_msec = -1;
9152c765 1714
67445f4e 1715 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
e96d6be7
LP
1716 watchdog_ping();
1717
ea430986
LP
1718 if (!ratelimit_test(&rl)) {
1719 /* Yay, something is going seriously wrong, pause a little */
1720 log_warning("Looping too fast. Throttling execution a little.");
1721 sleep(1);
e96d6be7 1722 continue;
ea430986
LP
1723 }
1724
37a8e683 1725 if (manager_dispatch_load_queue(m) > 0)
23a177ef
LP
1726 continue;
1727
37a8e683 1728 if (manager_dispatch_run_queue(m) > 0)
701cc384
LP
1729 continue;
1730
37a8e683 1731 if (bus_dispatch(m) > 0)
c1e1601e 1732 continue;
034c6ed7 1733
37a8e683 1734 if (manager_dispatch_cleanup_queue(m) > 0)
c1e1601e
LP
1735 continue;
1736
37a8e683 1737 if (manager_dispatch_gc_queue(m) > 0)
c1e1601e
LP
1738 continue;
1739
1740 if (manager_dispatch_dbus_queue(m) > 0)
ea430986 1741 continue;
ea430986 1742
e04aad61
LP
1743 if (swap_dispatch_reload(m) > 0)
1744 continue;
1745
c757a65b 1746 /* Sleep for half the watchdog time */
67445f4e 1747 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
c757a65b
LP
1748 wait_msec = (int) (m->runtime_watchdog / 2 / USEC_PER_MSEC);
1749 if (wait_msec <= 0)
1750 wait_msec = 1;
1751 } else
1752 wait_msec = -1;
1753
e96d6be7
LP
1754 n = epoll_wait(m->epoll_fd, &event, 1, wait_msec);
1755 if (n < 0) {
9152c765 1756
6089f4a9 1757 if (errno == EINTR)
9152c765
LP
1758 continue;
1759
1760 return -errno;
e96d6be7
LP
1761 } else if (n == 0)
1762 continue;
9152c765 1763
957ca890 1764 assert(n == 1);
b9cd2ec1 1765
e96d6be7
LP
1766 r = process_event(m, &event);
1767 if (r < 0)
957ca890 1768 return r;
a16e1123 1769 }
957ca890 1770
a16e1123 1771 return m->exit_code;
83c60c9f 1772}
ea430986 1773
80fbf05e 1774int manager_load_unit_from_dbus_path(Manager *m, const char *s, DBusError *e, Unit **_u) {
ea430986
LP
1775 char *n;
1776 Unit *u;
80fbf05e 1777 int r;
ea430986
LP
1778
1779 assert(m);
1780 assert(s);
1781 assert(_u);
1782
1783 if (!startswith(s, "/org/freedesktop/systemd1/unit/"))
1784 return -EINVAL;
1785
80fbf05e
MS
1786 n = bus_path_unescape(s+31);
1787 if (!n)
ea430986
LP
1788 return -ENOMEM;
1789
80fbf05e 1790 r = manager_load_unit(m, n, NULL, e, &u);
ea430986
LP
1791 free(n);
1792
80fbf05e
MS
1793 if (r < 0)
1794 return r;
ea430986
LP
1795
1796 *_u = u;
1797
1798 return 0;
1799}
86fbf370
LP
1800
1801int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
1802 Job *j;
1803 unsigned id;
1804 int r;
1805
1806 assert(m);
1807 assert(s);
1808 assert(_j);
1809
1810 if (!startswith(s, "/org/freedesktop/systemd1/job/"))
1811 return -EINVAL;
1812
8742514c
LP
1813 r = safe_atou(s + 30, &id);
1814 if (r < 0)
86fbf370
LP
1815 return r;
1816
8742514c
LP
1817 j = manager_get_job(m, id);
1818 if (!j)
86fbf370
LP
1819 return -ENOENT;
1820
1821 *_j = j;
1822
1823 return 0;
1824}
dfcd764e 1825
4927fcae 1826void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
e537352b 1827
4927fcae
LP
1828#ifdef HAVE_AUDIT
1829 char *p;
c1165f82 1830 int audit_fd;
e537352b 1831
c1165f82
LP
1832 audit_fd = get_audit_fd();
1833 if (audit_fd < 0)
e537352b
LP
1834 return;
1835
bbd3a7ba
LP
1836 /* Don't generate audit events if the service was already
1837 * started and we're just deserializing */
a7556052 1838 if (m->n_reloading > 0)
bbd3a7ba
LP
1839 return;
1840
67445f4e 1841 if (m->running_as != SYSTEMD_SYSTEM)
f1dd0c3f
LP
1842 return;
1843
ac155bb8 1844 if (u->type != UNIT_SERVICE)
f1dd0c3f
LP
1845 return;
1846
bd0af849
ZJS
1847 p = unit_name_to_prefix_and_instance(u->id);
1848 if (!p) {
66870f90
ZJS
1849 log_error_unit(u->id,
1850 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
e537352b
LP
1851 return;
1852 }
1853
c1165f82 1854 if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
391ade86
LP
1855 if (errno == EPERM) {
1856 /* We aren't allowed to send audit messages?
44785992 1857 * Then let's not retry again. */
c1165f82 1858 close_audit_fd();
44785992
LP
1859 } else
1860 log_warning("Failed to send audit message: %m");
391ade86 1861 }
e537352b 1862
4927fcae
LP
1863 free(p);
1864#endif
e537352b 1865
e537352b
LP
1866}
1867
e983b760
LP
1868void manager_send_unit_plymouth(Manager *m, Unit *u) {
1869 int fd = -1;
1870 union sockaddr_union sa;
1871 int n = 0;
1872 char *message = NULL;
e983b760
LP
1873
1874 /* Don't generate plymouth events if the service was already
1875 * started and we're just deserializing */
a7556052 1876 if (m->n_reloading > 0)
e983b760
LP
1877 return;
1878
67445f4e 1879 if (m->running_as != SYSTEMD_SYSTEM)
e983b760
LP
1880 return;
1881
ac155bb8
MS
1882 if (u->type != UNIT_SERVICE &&
1883 u->type != UNIT_MOUNT &&
1884 u->type != UNIT_SWAP)
e983b760
LP
1885 return;
1886
1887 /* We set SOCK_NONBLOCK here so that we rather drop the
1888 * message then wait for plymouth */
e62d8c39
ZJS
1889 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1890 if (fd < 0) {
e983b760
LP
1891 log_error("socket() failed: %m");
1892 return;
1893 }
1894
1895 zero(sa);
1896 sa.sa.sa_family = AF_UNIX;
96707269
LP
1897 strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
1898 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
e983b760
LP
1899
1900 if (errno != EPIPE &&
1901 errno != EAGAIN &&
1902 errno != ENOENT &&
1903 errno != ECONNREFUSED &&
1904 errno != ECONNRESET &&
1905 errno != ECONNABORTED)
1906 log_error("connect() failed: %m");
1907
1908 goto finish;
1909 }
1910
ac155bb8 1911 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
0d0f0c50 1912 log_oom();
e983b760
LP
1913 goto finish;
1914 }
1915
1916 errno = 0;
bd40a2d8 1917 if (write(fd, message, n + 1) != n + 1) {
e983b760
LP
1918
1919 if (errno != EPIPE &&
1920 errno != EAGAIN &&
1921 errno != ENOENT &&
1922 errno != ECONNREFUSED &&
1923 errno != ECONNRESET &&
1924 errno != ECONNABORTED)
1925 log_error("Failed to write Plymouth message: %m");
1926
1927 goto finish;
1928 }
1929
1930finish:
1931 if (fd >= 0)
1932 close_nointr_nofail(fd);
1933
1934 free(message);
1935}
1936
05e343b7
LP
1937void manager_dispatch_bus_name_owner_changed(
1938 Manager *m,
1939 const char *name,
1940 const char* old_owner,
1941 const char *new_owner) {
1942
1943 Unit *u;
1944
1945 assert(m);
1946 assert(name);
1947
1948 if (!(u = hashmap_get(m->watch_bus, name)))
1949 return;
1950
1951 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
1952}
1953
1954void manager_dispatch_bus_query_pid_done(
1955 Manager *m,
1956 const char *name,
1957 pid_t pid) {
1958
1959 Unit *u;
1960
1961 assert(m);
1962 assert(name);
1963 assert(pid >= 1);
1964
1965 if (!(u = hashmap_get(m->watch_bus, name)))
1966 return;
1967
1968 UNIT_VTABLE(u)->bus_query_pid_done(u, name, pid);
1969}
1970
d8d5ab98 1971int manager_open_serialization(Manager *m, FILE **_f) {
b925e726 1972 char *path = NULL;
a16e1123
LP
1973 int fd;
1974 FILE *f;
1975
1976 assert(_f);
1977
67445f4e 1978 if (m->running_as == SYSTEMD_SYSTEM)
2b583ce6 1979 asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
b925e726
LP
1980 else
1981 asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
d8d5ab98 1982
b925e726
LP
1983 if (!path)
1984 return -ENOMEM;
a16e1123 1985
5c0d398d
LP
1986 RUN_WITH_UMASK(0077) {
1987 fd = mkostemp(path, O_RDWR|O_CLOEXEC);
1988 }
a16e1123
LP
1989
1990 if (fd < 0) {
1991 free(path);
1992 return -errno;
1993 }
1994
1995 unlink(path);
1996
1997 log_debug("Serializing state to %s", path);
1998 free(path);
1999
01e10de3
LP
2000 f = fdopen(fd, "w+");
2001 if (!f)
a16e1123
LP
2002 return -errno;
2003
2004 *_f = f;
2005
2006 return 0;
2007}
2008
b3680f49 2009int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
a16e1123
LP
2010 Iterator i;
2011 Unit *u;
2012 const char *t;
4a9fd066 2013 char **e;
a16e1123
LP
2014 int r;
2015
2016 assert(m);
2017 assert(f);
2018 assert(fds);
2019
a7556052 2020 m->n_reloading ++;
38c52d46 2021
01d67b43
LP
2022 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2023 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
33c5fae9
LP
2024 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
2025 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
01d67b43 2026
915b3753
LP
2027 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
2028 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
2029 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
e9ddabc2 2030 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
f38ed060 2031
26a1efdf 2032 if (!in_initrd()) {
915b3753 2033 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
f38ed060
HH
2034 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2035 }
47a483a1 2036
b3680f49
HH
2037 if (!switching_root) {
2038 STRV_FOREACH(e, m->environment) {
2039 _cleanup_free_ char *ce;
4a9fd066 2040
b3680f49
HH
2041 ce = cescape(*e);
2042 if (ce)
2043 fprintf(f, "env=%s\n", *e);
2044 }
4a9fd066
OS
2045 }
2046
f2382a94
LP
2047 fputc('\n', f);
2048
a16e1123 2049 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
ac155bb8 2050 if (u->id != t)
a16e1123
LP
2051 continue;
2052
2053 if (!unit_can_serialize(u))
2054 continue;
2055
2056 /* Start marker */
ac155bb8 2057 fputs(u->id, f);
a16e1123
LP
2058 fputc('\n', f);
2059
b3680f49 2060 if ((r = unit_serialize(u, f, fds, !switching_root)) < 0) {
a7556052 2061 m->n_reloading --;
a16e1123 2062 return r;
38c52d46 2063 }
a16e1123
LP
2064 }
2065
a7556052
LP
2066 assert(m->n_reloading > 0);
2067 m->n_reloading --;
38c52d46 2068
a16e1123
LP
2069 if (ferror(f))
2070 return -EIO;
2071
b23de6af
LP
2072 r = bus_fdset_add_all(m, fds);
2073 if (r < 0)
2074 return r;
2075
a16e1123
LP
2076 return 0;
2077}
2078
2079int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2080 int r = 0;
2081
2082 assert(m);
2083 assert(f);
2084
2085 log_debug("Deserializing state...");
2086
a7556052 2087 m->n_reloading ++;
82c64bf5 2088
10f8e83c 2089 for (;;) {
20c03b7b 2090 char line[LINE_MAX], *l;
10f8e83c
LP
2091
2092 if (!fgets(line, sizeof(line), f)) {
2093 if (feof(f))
2094 r = 0;
2095 else
2096 r = -errno;
2097
2098 goto finish;
2099 }
2100
2101 char_array_0(line);
2102 l = strstrip(line);
2103
2104 if (l[0] == 0)
2105 break;
2106
01d67b43
LP
2107 if (startswith(l, "current-job-id=")) {
2108 uint32_t id;
2109
2110 if (safe_atou32(l+15, &id) < 0)
2111 log_debug("Failed to parse current job id value %s", l+15);
2112 else
2113 m->current_job_id = MAX(m->current_job_id, id);
33c5fae9
LP
2114 } else if (startswith(l, "n-installed-jobs=")) {
2115 uint32_t n;
2116
2117 if (safe_atou32(l+17, &n) < 0)
2118 log_debug("Failed to parse installed jobs counter %s", l+17);
2119 else
2120 m->n_installed_jobs += n;
2121 } else if (startswith(l, "n-failed-jobs=")) {
2122 uint32_t n;
2123
2124 if (safe_atou32(l+14, &n) < 0)
2125 log_debug("Failed to parse failed jobs counter %s", l+14);
2126 else
2127 m->n_failed_jobs += n;
01d67b43
LP
2128 } else if (startswith(l, "taint-usr=")) {
2129 int b;
2130
2131 if ((b = parse_boolean(l+10)) < 0)
2132 log_debug("Failed to parse taint /usr flag %s", l+10);
2133 else
2134 m->taint_usr = m->taint_usr || b;
915b3753
LP
2135 } else if (startswith(l, "firmware-timestamp="))
2136 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2137 else if (startswith(l, "loader-timestamp="))
2138 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2139 else if (startswith(l, "kernel-timestamp="))
2140 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2141 else if (startswith(l, "initrd-timestamp="))
e9ddabc2 2142 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
915b3753
LP
2143 else if (startswith(l, "userspace-timestamp="))
2144 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
10717a1a 2145 else if (startswith(l, "finish-timestamp="))
799fd0fd 2146 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
4a9fd066
OS
2147 else if (startswith(l, "env=")) {
2148 _cleanup_free_ char *uce = NULL;
2149 char **e;
2150
2151 uce = cunescape(l+4);
2152 if (!uce) {
2153 r = -ENOMEM;
2154 goto finish;
2155 }
2156
2157 e = strv_env_set(m->environment, uce);
2158 if (!e) {
2159 r = -ENOMEM;
2160 goto finish;
2161 }
2162
2163 strv_free(m->environment);
2164 m->environment = e;
2165 } else
10f8e83c
LP
2166 log_debug("Unknown serialization item '%s'", l);
2167 }
2168
a16e1123
LP
2169 for (;;) {
2170 Unit *u;
2171 char name[UNIT_NAME_MAX+2];
2172
2173 /* Start marker */
2174 if (!fgets(name, sizeof(name), f)) {
2175 if (feof(f))
10f8e83c
LP
2176 r = 0;
2177 else
2178 r = -errno;
a16e1123 2179
82c64bf5 2180 goto finish;
a16e1123
LP
2181 }
2182
2183 char_array_0(name);
2184
bd0af849
ZJS
2185 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2186 if (r < 0)
82c64bf5 2187 goto finish;
a16e1123 2188
01e10de3
LP
2189 r = unit_deserialize(u, f, fds);
2190 if (r < 0)
82c64bf5 2191 goto finish;
a16e1123
LP
2192 }
2193
10f8e83c 2194finish:
82c64bf5
LP
2195 if (ferror(f)) {
2196 r = -EIO;
2197 goto finish;
2198 }
a16e1123 2199
a7556052
LP
2200 assert(m->n_reloading > 0);
2201 m->n_reloading --;
82c64bf5
LP
2202
2203 return r;
a16e1123
LP
2204}
2205
01e10de3
LP
2206int manager_distribute_fds(Manager *m, FDSet *fds) {
2207 Unit *u;
2208 Iterator i;
2209 int r;
2210
2211 assert(m);
2212
2213 HASHMAP_FOREACH(u, m->units, i) {
2214
2215 if (fdset_size(fds) <= 0)
2216 break;
2217
2218 if (UNIT_VTABLE(u)->distribute_fds) {
2219 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
2220 if (r < 0)
2221 return r;
2222 }
2223 }
2224
2225 return 0;
2226}
2227
a16e1123
LP
2228int manager_reload(Manager *m) {
2229 int r, q;
2230 FILE *f;
2231 FDSet *fds;
2232
2233 assert(m);
2234
07719a21
LP
2235 r = manager_open_serialization(m, &f);
2236 if (r < 0)
a16e1123
LP
2237 return r;
2238
a7556052 2239 m->n_reloading ++;
38c52d46 2240
07719a21
LP
2241 fds = fdset_new();
2242 if (!fds) {
a7556052 2243 m->n_reloading --;
a16e1123
LP
2244 r = -ENOMEM;
2245 goto finish;
2246 }
2247
b3680f49 2248 r = manager_serialize(m, f, fds, false);
07719a21 2249 if (r < 0) {
a7556052 2250 m->n_reloading --;
a16e1123 2251 goto finish;
38c52d46 2252 }
a16e1123
LP
2253
2254 if (fseeko(f, 0, SEEK_SET) < 0) {
a7556052 2255 m->n_reloading --;
a16e1123
LP
2256 r = -errno;
2257 goto finish;
2258 }
2259
2260 /* From here on there is no way back. */
2261 manager_clear_jobs_and_units(m);
5a1e9937 2262 manager_undo_generators(m);
84e3543e 2263 lookup_paths_free(&m->lookup_paths);
2ded0c04 2264
07719a21 2265 /* Find new unit paths */
5a1e9937
LP
2266 manager_run_generators(m);
2267
07719a21
LP
2268 q = lookup_paths_init(
2269 &m->lookup_paths, m->running_as, true,
2270 m->generator_unit_path,
2271 m->generator_unit_path_early,
2272 m->generator_unit_path_late);
2273 if (q < 0)
2274 r = q;
2275
5a1e9937
LP
2276 manager_build_unit_path_cache(m);
2277
a16e1123 2278 /* First, enumerate what we can from all config files */
07719a21
LP
2279 q = manager_enumerate(m);
2280 if (q < 0)
a16e1123
LP
2281 r = q;
2282
2283 /* Second, deserialize our stored data */
07719a21
LP
2284 q = manager_deserialize(m, f, fds);
2285 if (q < 0)
a16e1123
LP
2286 r = q;
2287
2288 fclose(f);
2289 f = NULL;
2290
2291 /* Third, fire things up! */
07719a21
LP
2292 q = manager_coldplug(m);
2293 if (q < 0)
a16e1123
LP
2294 r = q;
2295
a7556052
LP
2296 assert(m->n_reloading > 0);
2297 m->n_reloading--;
9f611ad8 2298
a16e1123
LP
2299finish:
2300 if (f)
2301 fclose(f);
2302
2303 if (fds)
2304 fdset_free(fds);
2305
2306 return r;
2307}
2308
6084e22e 2309static bool manager_is_booting_or_shutting_down(Manager *m) {
9e58ff9c
LP
2310 Unit *u;
2311
2312 assert(m);
2313
2314 /* Is the initial job still around? */
bacbccb7 2315 if (manager_get_job(m, m->default_unit_job_id))
9e58ff9c
LP
2316 return true;
2317
2318 /* Is there a job for the shutdown target? */
27d340c7
LP
2319 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2320 if (u)
ac155bb8 2321 return !!u->job;
9e58ff9c
LP
2322
2323 return false;
2324}
2325
c17ec25e
MS
2326bool manager_is_reloading_or_reexecuting(Manager *m) {
2327 assert(m);
2328
2329 return m->n_reloading != 0;
2330}
2331
fdf20a31 2332void manager_reset_failed(Manager *m) {
5632e374
LP
2333 Unit *u;
2334 Iterator i;
2335
2336 assert(m);
2337
2338 HASHMAP_FOREACH(u, m->units, i)
fdf20a31 2339 unit_reset_failed(u);
5632e374
LP
2340}
2341
31afa0a4 2342bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
8f6df3fa
LP
2343 Unit *u;
2344
2345 assert(m);
2346 assert(name);
2347
2348 /* Returns true if the unit is inactive or going down */
bd0af849
ZJS
2349 u = manager_get_unit(m, name);
2350 if (!u)
8f6df3fa
LP
2351 return true;
2352
31afa0a4 2353 return unit_inactive_or_pending(u);
8f6df3fa
LP
2354}
2355
b0c918b9 2356void manager_check_finished(Manager *m) {
7ceba241 2357 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
915b3753 2358 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
b0c918b9
LP
2359
2360 assert(m);
2361
a0b64226
MS
2362 if (m->n_running_jobs == 0)
2363 manager_unwatch_jobs_in_progress(m);
2364
5b176ee0
MS
2365 if (hashmap_size(m->jobs) > 0) {
2366 manager_jobs_in_progress_mod_timer(m);
b0c918b9 2367 return;
5b176ee0 2368 }
b0c918b9 2369
f2b68789
LP
2370 /* Notify Type=idle units that we are done now */
2371 close_pipe(m->idle_pipe);
2372
af6da548
LP
2373 /* Turn off confirm spawn now */
2374 m->confirm_spawn = false;
2375
f2b68789 2376 if (dual_timestamp_is_set(&m->finish_timestamp))
b0c918b9
LP
2377 return;
2378
2379 dual_timestamp_get(&m->finish_timestamp);
2380
67445f4e 2381 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
e03ae661 2382
915b3753
LP
2383 /* Note that m->kernel_usec.monotonic is always at 0,
2384 * and m->firmware_usec.monotonic and
2385 * m->loader_usec.monotonic should be considered
2386 * negative values. */
2387
7ceba241
LP
2388 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2389 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
915b3753 2390 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
7ceba241 2391 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
18fa6b27 2392
e9ddabc2 2393 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
18fa6b27 2394
915b3753
LP
2395 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2396 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
18fa6b27 2397
81270860
LP
2398 if (!log_on_console())
2399 log_struct(LOG_INFO,
1ca6783f 2400 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
81270860
LP
2401 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
2402 "INITRD_USEC=%llu", (unsigned long long) initrd_usec,
2403 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2404 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2fa4092c
LP
2405 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2406 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2407 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2408 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2409 NULL);
18fa6b27 2410 } else {
915b3753 2411 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
18fa6b27
LP
2412 initrd_usec = 0;
2413
81270860
LP
2414 if (!log_on_console())
2415 log_struct(LOG_INFO,
1ca6783f 2416 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
81270860
LP
2417 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
2418 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2419 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2fa4092c
LP
2420 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2421 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2422 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2423 NULL);
18fa6b27
LP
2424 }
2425 } else {
915b3753
LP
2426 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2427 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
877d54e9 2428
81270860
LP
2429 if (!log_on_console())
2430 log_struct(LOG_INFO,
1ca6783f 2431 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
81270860
LP
2432 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2433 "MESSAGE=Startup finished in %s.",
2fa4092c 2434 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
81270860 2435 NULL);
18fa6b27 2436 }
b0c918b9 2437
915b3753 2438 bus_broadcast_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
530345e7
LP
2439
2440 sd_notifyf(false,
2441 "READY=1\nSTATUS=Startup finished in %s.",
2fa4092c 2442 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
b0c918b9
LP
2443}
2444
07719a21
LP
2445static int create_generator_dir(Manager *m, char **generator, const char *name) {
2446 char *p;
2447 int r;
2448
2449 assert(m);
2450 assert(generator);
2451 assert(name);
2452
2453 if (*generator)
2454 return 0;
2455
67445f4e 2456 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
07719a21
LP
2457
2458 p = strappend("/run/systemd/", name);
0d0f0c50
SL
2459 if (!p)
2460 return log_oom();
07719a21 2461
d2e54fae 2462 r = mkdir_p_label(p, 0755);
07719a21 2463 if (r < 0) {
7ad94c71
ZJS
2464 log_error("Failed to create generator directory %s: %s",
2465 p, strerror(-r));
07719a21
LP
2466 free(p);
2467 return r;
2468 }
2469 } else {
b7def684 2470 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
0d0f0c50
SL
2471 if (!p)
2472 return log_oom();
07719a21
LP
2473
2474 if (!mkdtemp(p)) {
7ad94c71
ZJS
2475 log_error("Failed to create generator directory %s: %m",
2476 p);
34bf0281 2477 free(p);
07719a21
LP
2478 return -errno;
2479 }
2480 }
2481
2482 *generator = p;
2483 return 0;
2484}
2485
2486static void trim_generator_dir(Manager *m, char **generator) {
2487 assert(m);
2488 assert(generator);
2489
2490 if (!*generator)
2491 return;
2492
2493 if (rmdir(*generator) >= 0) {
2494 free(*generator);
2495 *generator = NULL;
2496 }
2497
2498 return;
2499}
2500
5a1e9937
LP
2501void manager_run_generators(Manager *m) {
2502 DIR *d = NULL;
5a1e9937 2503 const char *generator_path;
07719a21 2504 const char *argv[5];
07719a21 2505 int r;
5a1e9937
LP
2506
2507 assert(m);
2508
67445f4e 2509 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
07719a21
LP
2510 d = opendir(generator_path);
2511 if (!d) {
5a1e9937
LP
2512 if (errno == ENOENT)
2513 return;
2514
7ad94c71
ZJS
2515 log_error("Failed to enumerate generator directory %s: %m",
2516 generator_path);
5a1e9937
LP
2517 return;
2518 }
2519
07719a21
LP
2520 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2521 if (r < 0)
2522 goto finish;
f1d19aa4 2523
07719a21
LP
2524 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2525 if (r < 0)
2526 goto finish;
5a1e9937 2527
07719a21
LP
2528 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2529 if (r < 0)
2530 goto finish;
5a1e9937 2531
83cc030f
LP
2532 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2533 argv[1] = m->generator_unit_path;
07719a21
LP
2534 argv[2] = m->generator_unit_path_early;
2535 argv[3] = m->generator_unit_path_late;
2536 argv[4] = NULL;
5a1e9937 2537
5c0d398d
LP
2538 RUN_WITH_UMASK(0022) {
2539 execute_directory(generator_path, d, (char**) argv);
2540 }
5a1e9937 2541
07719a21
LP
2542 trim_generator_dir(m, &m->generator_unit_path);
2543 trim_generator_dir(m, &m->generator_unit_path_early);
2544 trim_generator_dir(m, &m->generator_unit_path_late);
5a1e9937
LP
2545
2546finish:
2547 if (d)
2548 closedir(d);
5a1e9937
LP
2549}
2550
07719a21 2551static void remove_generator_dir(Manager *m, char **generator) {
5a1e9937 2552 assert(m);
07719a21 2553 assert(generator);
5a1e9937 2554
07719a21 2555 if (!*generator)
5a1e9937
LP
2556 return;
2557
07719a21
LP
2558 strv_remove(m->lookup_paths.unit_path, *generator);
2559 rm_rf(*generator, false, true, false);
5a1e9937 2560
07719a21
LP
2561 free(*generator);
2562 *generator = NULL;
2563}
2564
2565void manager_undo_generators(Manager *m) {
2566 assert(m);
2567
2568 remove_generator_dir(m, &m->generator_unit_path);
2569 remove_generator_dir(m, &m->generator_unit_path_early);
2570 remove_generator_dir(m, &m->generator_unit_path_late);
5a1e9937
LP
2571}
2572
06d4c99a
LP
2573int manager_set_default_controllers(Manager *m, char **controllers) {
2574 char **l;
2575
2576 assert(m);
2577
9156e799
LP
2578 l = strv_copy(controllers);
2579 if (!l)
06d4c99a
LP
2580 return -ENOMEM;
2581
2582 strv_free(m->default_controllers);
2583 m->default_controllers = l;
2584
b59e2465 2585 cg_shorten_controllers(m->default_controllers);
9156e799 2586
06d4c99a
LP
2587 return 0;
2588}
2589
c93ff2e9
FC
2590int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2591 int i;
2592
2593 assert(m);
2594
2595 for (i = 0; i < RLIMIT_NLIMITS; i++) {
07719a21
LP
2596 if (!default_rlimit[i])
2597 continue;
c93ff2e9 2598
07719a21
LP
2599 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2600 if (!m->rlimit[i])
2601 return -ENOMEM;
c93ff2e9
FC
2602 }
2603
2604 return 0;
2605}
2606
4cfa2c99 2607void manager_recheck_journal(Manager *m) {
f1dd0c3f
LP
2608 Unit *u;
2609
2610 assert(m);
2611
67445f4e 2612 if (m->running_as != SYSTEMD_SYSTEM)
f1dd0c3f
LP
2613 return;
2614
731a676c
LP
2615 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2616 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
4cfa2c99 2617 log_close_journal();
731a676c 2618 return;
f1dd0c3f
LP
2619 }
2620
731a676c
LP
2621 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2622 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
4cfa2c99 2623 log_close_journal();
731a676c
LP
2624 return;
2625 }
f1dd0c3f 2626
731a676c
LP
2627 /* Hmm, OK, so the socket is fully up and the service is up
2628 * too, then let's make use of the thing. */
f1dd0c3f
LP
2629 log_open();
2630}
2631
27d340c7
LP
2632void manager_set_show_status(Manager *m, bool b) {
2633 assert(m);
2634
67445f4e 2635 if (m->running_as != SYSTEMD_SYSTEM)
27d340c7
LP
2636 return;
2637
2638 m->show_status = b;
2639
2640 if (b)
2641 touch("/run/systemd/show-status");
2642 else
2643 unlink("/run/systemd/show-status");
2644}
2645
6084e22e 2646static bool manager_get_show_status(Manager *m) {
27d340c7
LP
2647 assert(m);
2648
67445f4e 2649 if (m->running_as != SYSTEMD_SYSTEM)
27d340c7
LP
2650 return false;
2651
2652 if (m->show_status)
2653 return true;
2654
2655 /* If Plymouth is running make sure we show the status, so
2656 * that there's something nice to see when people press Esc */
2657
2658 return plymouth_running();
2659}
68b29a9f 2660
984a2be4 2661void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
25cee550
MS
2662 va_list ap;
2663
2664 if (!manager_get_show_status(m))
2665 return;
2666
03b717a3
MS
2667 /* XXX We should totally drop the check for ephemeral here
2668 * and thus effectively make 'Type=idle' pointless. */
2669 if (ephemeral && m->n_on_console > 0)
2670 return;
2671
25cee550
MS
2672 if (!manager_is_booting_or_shutting_down(m))
2673 return;
2674
2675 va_start(ap, format);
984a2be4 2676 status_vprintf(status, true, ephemeral, format, ap);
25cee550
MS
2677 va_end(ap);
2678}
2679
68b29a9f
LP
2680void watch_init(Watch *w) {
2681 assert(w);
2682
2683 w->type = WATCH_INVALID;
2684 w->fd = -1;
2685}