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