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