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