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