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