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