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