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