1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
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.
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.
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/>.
29 #include <sys/reboot.h>
30 #include <sys/ioctl.h>
34 #include <sys/types.h>
37 #include <sys/timerfd.h>
43 #include "sd-daemon.h"
45 #include "sd-messages.h"
48 #include "transaction.h"
55 #include "ratelimit.h"
56 #include "locale-setup.h"
57 #include "mount-setup.h"
58 #include "unit-name.h"
60 #include "path-lookup.h"
62 #include "exit-status.h"
65 #include "cgroup-util.h"
66 #include "path-util.h"
68 #include "boot-timestamps.h"
70 #include "bus-errors.h"
71 #include "bus-error.h"
74 #include "dbus-unit.h"
76 #include "dbus-manager.h"
77 #include "bus-kernel.h"
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)
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
87 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
89 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
90 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
91 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
92 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
93 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata);
94 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata);
96 static int manager_watch_jobs_in_progress(Manager *m) {
101 if (m->jobs_in_progress_event_source)
104 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC;
105 return sd_event_add_time(
107 &m->jobs_in_progress_event_source,
110 manager_dispatch_jobs_in_progress, m);
113 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED_ON)-1) + sizeof(ANSI_HIGHLIGHT_RED_ON)-1 + 2*(sizeof(ANSI_HIGHLIGHT_OFF)-1))
115 static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
118 assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
119 assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
123 p = mempset(p, ' ', pos-2);
124 p = stpcpy(p, ANSI_RED_ON);
128 if (pos > 0 && pos <= width) {
129 p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
133 p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
136 p = stpcpy(p, ANSI_RED_ON);
139 p = mempset(p, ' ', width-1-pos);
140 strcpy(p, ANSI_HIGHLIGHT_OFF);
144 void manager_flip_auto_status(Manager *m, bool enable) {
148 if (m->show_status == SHOW_STATUS_AUTO)
149 manager_set_show_status(m, SHOW_STATUS_TEMPORARY);
151 if (m->show_status == SHOW_STATUS_TEMPORARY)
152 manager_set_show_status(m, SHOW_STATUS_AUTO);
156 static void manager_print_jobs_in_progress(Manager *m) {
157 _cleanup_free_ char *job_of_n = NULL;
160 unsigned counter = 0, print_nr;
161 char cylon[6 + CYLON_BUFFER_EXTRA + 1];
163 char time[FORMAT_TIMESPAN_MAX], limit[FORMAT_TIMESPAN_MAX] = "no limit";
168 manager_flip_auto_status(m, true);
170 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
172 HASHMAP_FOREACH(j, m->jobs, i)
173 if (j->state == JOB_RUNNING && counter++ == print_nr)
176 /* m->n_running_jobs must be consistent with the contents of m->jobs,
177 * so the above loop must have succeeded in finding j. */
178 assert(counter == print_nr + 1);
181 cylon_pos = m->jobs_in_progress_iteration % 14;
183 cylon_pos = 14 - cylon_pos;
184 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
186 m->jobs_in_progress_iteration++;
188 if (m->n_running_jobs > 1)
189 if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
192 format_timespan(time, sizeof(time), now(CLOCK_MONOTONIC) - j->begin_usec, 1*USEC_PER_SEC);
193 if (job_get_timeout(j, &x) > 0)
194 format_timespan(limit, sizeof(limit), x - j->begin_usec, 1*USEC_PER_SEC);
196 manager_status_printf(m, true, cylon,
197 "%sA %s job is running for %s (%s / %s)",
199 job_type_to_string(j->type),
200 unit_description(j->unit),
205 static int manager_watch_idle_pipe(Manager *m) {
210 if (m->idle_pipe_event_source)
213 if (m->idle_pipe[2] < 0)
216 r = sd_event_add_io(m->event, &m->idle_pipe_event_source, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m);
218 log_error("Failed to watch idle pipe: %s", strerror(-r));
225 static void manager_close_idle_pipe(Manager *m) {
228 safe_close_pair(m->idle_pipe);
229 safe_close_pair(m->idle_pipe + 2);
232 static int manager_setup_time_change(Manager *m) {
235 /* We only care for the cancellation event, hence we set the
236 * timeout to the latest possible value. */
237 struct itimerspec its = {
238 .it_value.tv_sec = TIME_T_MAX,
242 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
244 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
245 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
247 m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
248 if (m->time_change_fd < 0) {
249 log_error("Failed to create timerfd: %m");
253 if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
254 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
255 m->time_change_fd = safe_close(m->time_change_fd);
259 r = sd_event_add_io(m->event, &m->time_change_event_source, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m);
261 log_error("Failed to create time change event source: %s", strerror(-r));
265 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
270 static int enable_special_signals(Manager *m) {
271 _cleanup_close_ int fd = -1;
275 /* Enable that we get SIGINT on control-alt-del. In containers
276 * this will fail with EPERM (older) or EINVAL (newer), so
278 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
279 log_warning("Failed to enable ctrl-alt-del handling: %m");
281 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
283 /* Support systems without virtual console */
285 log_warning("Failed to open /dev/tty0: %m");
287 /* Enable that we get SIGWINCH on kbrequest */
288 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
289 log_warning("Failed to enable kbrequest handling: %m");
295 static int manager_setup_signals(Manager *m) {
296 struct sigaction sa = {
297 .sa_handler = SIG_DFL,
298 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
305 /* We are not interested in SIGSTOP and friends. */
306 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
308 assert_se(sigemptyset(&mask) == 0);
310 sigset_add_many(&mask,
311 SIGCHLD, /* Child died */
312 SIGTERM, /* Reexecute daemon */
313 SIGHUP, /* Reload configuration */
314 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
315 SIGUSR2, /* systemd: dump status */
316 SIGINT, /* Kernel sends us this on control-alt-del */
317 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
318 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
319 SIGRTMIN+0, /* systemd: start default.target */
320 SIGRTMIN+1, /* systemd: isolate rescue.target */
321 SIGRTMIN+2, /* systemd: isolate emergency.target */
322 SIGRTMIN+3, /* systemd: start halt.target */
323 SIGRTMIN+4, /* systemd: start poweroff.target */
324 SIGRTMIN+5, /* systemd: start reboot.target */
325 SIGRTMIN+6, /* systemd: start kexec.target */
326 SIGRTMIN+13, /* systemd: Immediate halt */
327 SIGRTMIN+14, /* systemd: Immediate poweroff */
328 SIGRTMIN+15, /* systemd: Immediate reboot */
329 SIGRTMIN+16, /* systemd: Immediate kexec */
330 SIGRTMIN+20, /* systemd: enable status messages */
331 SIGRTMIN+21, /* systemd: disable status messages */
332 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
333 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
334 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
335 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
336 SIGRTMIN+27, /* systemd: set log target to console */
337 SIGRTMIN+28, /* systemd: set log target to kmsg */
338 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
340 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
342 m->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
343 if (m->signal_fd < 0)
346 r = sd_event_add_io(m->event, &m->signal_event_source, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m);
350 /* Process signals a bit earlier than the rest of things, but
351 * later that notify_fd processing, so that the notify
352 * processing can still figure out to which process/service a
353 * message belongs, before we reap the process. */
354 r = sd_event_source_set_priority(m->signal_event_source, -5);
358 if (m->running_as == SYSTEMD_SYSTEM)
359 return enable_special_signals(m);
364 static void manager_clean_environment(Manager *m) {
367 /* Let's remove some environment variables that we
368 * need ourselves to communicate with our clients */
381 static int manager_default_environment(Manager *m) {
384 if (m->running_as == SYSTEMD_SYSTEM) {
385 /* The system manager always starts with a clean
386 * environment for its children. It does not import
387 * the kernel or the parents exported variables.
389 * The initial passed environ is untouched to keep
390 * /proc/self/environ valid; it is used for tagging
391 * the init process inside containers. */
392 m->environment = strv_new("PATH=" DEFAULT_PATH,
395 /* Import locale variables LC_*= from configuration */
396 locale_setup(&m->environment);
398 /* The user manager passes its own environment
399 * along to its children. */
400 m->environment = strv_copy(environ);
406 manager_clean_environment(m);
407 strv_sort(m->environment);
412 int manager_new(SystemdRunningAs running_as, Manager **_m) {
417 assert(running_as >= 0);
418 assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
420 m = new0(Manager, 1);
425 if (detect_container(NULL) <= 0)
426 boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
429 m->running_as = running_as;
430 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
432 m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
434 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;
435 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
437 r = manager_default_environment(m);
441 r = hashmap_ensure_allocated(&m->units, string_hash_func, string_compare_func);
445 r = hashmap_ensure_allocated(&m->jobs, trivial_hash_func, trivial_compare_func);
449 r = hashmap_ensure_allocated(&m->cgroup_unit, string_hash_func, string_compare_func);
453 r = hashmap_ensure_allocated(&m->watch_bus, string_hash_func, string_compare_func);
457 r = set_ensure_allocated(&m->failed_units, trivial_hash_func, trivial_compare_func);
461 r = sd_event_default(&m->event);
465 r = sd_event_add_defer(m->event, &m->run_queue_event_source, manager_dispatch_run_queue, m);
469 r = sd_event_source_set_priority(m->run_queue_event_source, SD_EVENT_PRIORITY_IDLE);
473 r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_OFF);
477 r = manager_setup_signals(m);
481 r = manager_setup_cgroup(m);
485 r = manager_setup_time_change(m);
489 m->udev = udev_new();
495 /* Note that we set up neither kdbus, nor the notify fd
496 * here. We do that after deserialization, since they might
497 * have gotten serialized across the reexec. */
499 m->taint_usr = dir_is_empty("/usr") > 0;
509 static int manager_setup_notify(Manager *m) {
512 if (m->notify_fd < 0) {
513 _cleanup_close_ int fd = -1;
516 struct sockaddr_un un;
518 .sa.sa_family = AF_UNIX,
522 /* First free all secondary fields */
523 free(m->notify_socket);
524 m->notify_socket = NULL;
525 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
527 fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
529 log_error("Failed to allocate notification socket: %m");
533 if (m->running_as == SYSTEMD_SYSTEM)
534 m->notify_socket = strdup("/run/systemd/notify");
538 e = getenv("XDG_RUNTIME_DIR");
540 log_error("XDG_RUNTIME_DIR is not set: %m");
544 m->notify_socket = strappend(e, "/systemd/notify");
546 if (!m->notify_socket)
549 strncpy(sa.un.sun_path, m->notify_socket, sizeof(sa.un.sun_path)-1);
550 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
552 log_error("bind() failed: %m");
556 r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
558 log_error("SO_PASSCRED failed: %m");
565 log_debug("Using notification socket %s", m->notify_socket);
568 if (!m->notify_event_source) {
569 r = sd_event_add_io(m->event, &m->notify_event_source, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m);
571 log_error("Failed to allocate notify event source: %s", strerror(-r));
575 /* Process signals a bit earlier than SIGCHLD, so that we can
576 * still identify to which service an exit message belongs */
577 r = sd_event_source_set_priority(m->notify_event_source, -7);
579 log_error("Failed to set priority of notify event source: %s", strerror(-r));
587 static int manager_setup_kdbus(Manager *m) {
589 _cleanup_free_ char *p = NULL;
595 if (m->kdbus_fd >= 0)
598 m->kdbus_fd = bus_kernel_create_bus(m->running_as == SYSTEMD_SYSTEM ? "system" : "user", m->running_as == SYSTEMD_SYSTEM, &p);
599 if (m->kdbus_fd < 0) {
600 log_debug("Failed to set up kdbus: %s", strerror(-m->kdbus_fd));
604 log_debug("Successfully set up kdbus on %s", p);
606 /* Create the namespace directory here, so that the contents
607 * of that directory is not visible to non-root users. This is
608 * necessary to ensure that users cannot get access to busses
609 * of virtualized users when no UID namespacing is used. */
610 if (m->running_as == SYSTEMD_SYSTEM)
611 mkdir_p_label("/dev/kdbus/domain", 0700);
617 static int manager_connect_bus(Manager *m, bool reexecuting) {
618 bool try_bus_connect;
625 (m->running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS"));
627 /* Try to connect to the busses, if possible. */
628 return bus_init(m, try_bus_connect);
631 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
637 while ((u = m->cleanup_queue)) {
638 assert(u->in_cleanup_queue);
648 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
649 GC_OFFSET_UNSURE, /* No clue */
650 GC_OFFSET_GOOD, /* We still need this unit */
651 GC_OFFSET_BAD, /* We don't need this unit anymore */
655 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
662 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
663 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
664 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
667 if (u->in_cleanup_queue)
670 if (unit_check_gc(u))
673 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
677 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
678 unit_gc_sweep(other, gc_marker);
680 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
683 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
690 /* We were unable to find anything out about this entry, so
691 * let's investigate it later */
692 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
693 unit_add_to_gc_queue(u);
697 /* We definitely know that this one is not useful anymore, so
698 * let's mark it for deletion */
699 u->gc_marker = gc_marker + GC_OFFSET_BAD;
700 unit_add_to_cleanup_queue(u);
704 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
707 static unsigned manager_dispatch_gc_queue(Manager *m) {
714 /* log_debug("Running GC..."); */
716 m->gc_marker += _GC_OFFSET_MAX;
717 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
720 gc_marker = m->gc_marker;
722 while ((u = m->gc_queue)) {
723 assert(u->in_gc_queue);
725 unit_gc_sweep(u, gc_marker);
727 LIST_REMOVE(gc_queue, m->gc_queue, u);
728 u->in_gc_queue = false;
732 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
733 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
734 log_debug_unit(u->id, "Collecting %s", u->id);
735 u->gc_marker = gc_marker + GC_OFFSET_BAD;
736 unit_add_to_cleanup_queue(u);
740 m->n_in_gc_queue = 0;
745 static void manager_clear_jobs_and_units(Manager *m) {
750 while ((u = hashmap_first(m->units)))
753 manager_dispatch_cleanup_queue(m);
755 assert(!m->load_queue);
756 assert(!m->run_queue);
757 assert(!m->dbus_unit_queue);
758 assert(!m->dbus_job_queue);
759 assert(!m->cleanup_queue);
760 assert(!m->gc_queue);
762 assert(hashmap_isempty(m->jobs));
763 assert(hashmap_isempty(m->units));
766 m->n_running_jobs = 0;
769 void manager_free(Manager *m) {
775 manager_clear_jobs_and_units(m);
777 for (c = 0; c < _UNIT_TYPE_MAX; c++)
778 if (unit_vtable[c]->shutdown)
779 unit_vtable[c]->shutdown(m);
781 /* If we reexecute ourselves, we keep the root cgroup
783 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
785 manager_undo_generators(m);
789 hashmap_free(m->units);
790 hashmap_free(m->jobs);
791 hashmap_free(m->watch_pids1);
792 hashmap_free(m->watch_pids2);
793 hashmap_free(m->watch_bus);
795 set_free(m->failed_units);
797 sd_event_source_unref(m->signal_event_source);
798 sd_event_source_unref(m->notify_event_source);
799 sd_event_source_unref(m->time_change_event_source);
800 sd_event_source_unref(m->jobs_in_progress_event_source);
801 sd_event_source_unref(m->idle_pipe_event_source);
802 sd_event_source_unref(m->run_queue_event_source);
804 safe_close(m->signal_fd);
805 safe_close(m->notify_fd);
806 safe_close(m->time_change_fd);
807 safe_close(m->kdbus_fd);
809 manager_close_idle_pipe(m);
812 sd_event_unref(m->event);
814 free(m->notify_socket);
816 lookup_paths_free(&m->lookup_paths);
817 strv_free(m->environment);
819 hashmap_free(m->cgroup_unit);
820 set_free_free(m->unit_path_cache);
822 free(m->switch_root);
823 free(m->switch_root_init);
825 for (i = 0; i < _RLIMIT_MAX; i++)
828 assert(hashmap_isempty(m->units_requiring_mounts_for));
829 hashmap_free(m->units_requiring_mounts_for);
834 int manager_enumerate(Manager *m) {
840 /* Let's ask every type to load all units from disk/kernel
841 * that it might know */
842 for (c = 0; c < _UNIT_TYPE_MAX; c++)
843 if (unit_vtable[c]->enumerate) {
844 q = unit_vtable[c]->enumerate(m);
849 manager_dispatch_load_queue(m);
853 static int manager_coldplug(Manager *m) {
861 /* Then, let's set up their initial state. */
862 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
869 q = unit_coldplug(u);
877 static void manager_build_unit_path_cache(Manager *m) {
879 _cleanup_free_ DIR *d = NULL;
884 set_free_free(m->unit_path_cache);
886 m->unit_path_cache = set_new(string_hash_func, string_compare_func);
887 if (!m->unit_path_cache) {
888 log_error("Failed to allocate unit path cache.");
892 /* This simply builds a list of files we know exist, so that
893 * we don't always have to go to disk */
895 STRV_FOREACH(i, m->lookup_paths.unit_path) {
901 log_error("Failed to open directory %s: %m", *i);
905 while ((de = readdir(d))) {
908 if (ignore_file(de->d_name))
911 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
917 r = set_consume(m->unit_path_cache, p);
929 log_error("Failed to build unit path cache: %s", strerror(-r));
931 set_free_free(m->unit_path_cache);
932 m->unit_path_cache = NULL;
936 static int manager_distribute_fds(Manager *m, FDSet *fds) {
943 HASHMAP_FOREACH(u, m->units, i) {
945 if (fdset_size(fds) <= 0)
948 if (UNIT_VTABLE(u)->distribute_fds) {
949 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
958 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
963 dual_timestamp_get(&m->generators_start_timestamp);
964 manager_run_generators(m);
965 dual_timestamp_get(&m->generators_finish_timestamp);
967 r = lookup_paths_init(
968 &m->lookup_paths, m->running_as, true,
969 m->generator_unit_path,
970 m->generator_unit_path_early,
971 m->generator_unit_path_late);
975 manager_build_unit_path_cache(m);
977 /* If we will deserialize make sure that during enumeration
978 * this is already known, so we increase the counter here
983 /* First, enumerate what we can from all config files */
984 dual_timestamp_get(&m->units_load_start_timestamp);
985 r = manager_enumerate(m);
986 dual_timestamp_get(&m->units_load_finish_timestamp);
988 /* Second, deserialize if there is something to deserialize */
990 q = manager_deserialize(m, serialization, fds);
995 /* Any fds left? Find some unit which wants them. This is
996 * useful to allow container managers to pass some file
997 * descriptors to us pre-initialized. This enables
998 * socket-based activation of entire containers. */
999 if (fdset_size(fds) > 0) {
1000 q = manager_distribute_fds(m, fds);
1005 /* We might have deserialized the notify fd, but if we didn't
1006 * then let's create the bus now */
1007 manager_setup_notify(m);
1009 /* We might have deserialized the kdbus control fd, but if we
1010 * didn't, then let's create the bus now. */
1011 manager_setup_kdbus(m);
1012 manager_connect_bus(m, !!serialization);
1013 bus_track_coldplug(m, &m->subscribed, &m->deserialized_subscribed);
1015 /* Third, fire things up! */
1016 q = manager_coldplug(m);
1020 if (serialization) {
1021 assert(m->n_reloading > 0);
1024 /* Let's wait for the UnitNew/JobNew messages being
1025 * sent, before we notify that the reload is
1027 m->send_reloading_done = true;
1033 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1038 assert(type < _JOB_TYPE_MAX);
1040 assert(mode < _JOB_MODE_MAX);
1042 if (mode == JOB_ISOLATE && type != JOB_START) {
1043 sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Isolate is only valid for start.");
1047 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
1048 sd_bus_error_setf(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
1052 log_debug_unit(unit->id,
1053 "Trying to enqueue job %s/%s/%s", unit->id,
1054 job_type_to_string(type), job_mode_to_string(mode));
1056 job_type_collapse(&type, unit);
1058 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
1062 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
1063 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
1064 mode == JOB_IGNORE_DEPENDENCIES, e);
1068 if (mode == JOB_ISOLATE) {
1069 r = transaction_add_isolate_jobs(tr, m);
1074 r = transaction_activate(tr, m, mode, e);
1078 log_debug_unit(unit->id,
1079 "Enqueued job %s/%s as %u", unit->id,
1080 job_type_to_string(type), (unsigned) tr->anchor_job->id);
1083 *_ret = tr->anchor_job;
1085 transaction_free(tr);
1089 transaction_abort(tr);
1090 transaction_free(tr);
1094 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1099 assert(type < _JOB_TYPE_MAX);
1101 assert(mode < _JOB_MODE_MAX);
1103 r = manager_load_unit(m, name, NULL, NULL, &unit);
1107 return manager_add_job(m, type, unit, mode, override, e, _ret);
1110 Job *manager_get_job(Manager *m, uint32_t id) {
1113 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1116 Unit *manager_get_unit(Manager *m, const char *name) {
1120 return hashmap_get(m->units, name);
1123 unsigned manager_dispatch_load_queue(Manager *m) {
1129 /* Make sure we are not run recursively */
1130 if (m->dispatching_load_queue)
1133 m->dispatching_load_queue = true;
1135 /* Dispatches the load queue. Takes a unit from the queue and
1136 * tries to load its data until the queue is empty */
1138 while ((u = m->load_queue)) {
1139 assert(u->in_load_queue);
1145 m->dispatching_load_queue = false;
1149 int manager_load_unit_prepare(
1161 assert(name || path);
1163 /* This will prepare the unit for loading, but not actually
1164 * load anything from disk. */
1166 if (path && !is_path(path))
1167 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
1170 name = basename(path);
1172 t = unit_name_to_type(name);
1174 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, TEMPLATE_INVALID))
1175 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is not valid.", name);
1177 ret = manager_get_unit(m, name);
1183 ret = unit_new(m, unit_vtable[t]->object_size);
1188 ret->fragment_path = strdup(path);
1189 if (!ret->fragment_path) {
1195 r = unit_add_name(ret, name);
1201 unit_add_to_load_queue(ret);
1202 unit_add_to_dbus_queue(ret);
1203 unit_add_to_gc_queue(ret);
1211 int manager_load_unit(
1222 /* This will load the service information files, but not actually
1223 * start any services or anything. */
1225 r = manager_load_unit_prepare(m, name, path, e, _ret);
1229 manager_dispatch_load_queue(m);
1232 *_ret = unit_follow_merge(*_ret);
1237 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
1244 HASHMAP_FOREACH(j, s->jobs, i)
1245 job_dump(j, f, prefix);
1248 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
1256 HASHMAP_FOREACH_KEY(u, t, s->units, i)
1258 unit_dump(u, f, prefix);
1261 void manager_clear_jobs(Manager *m) {
1266 while ((j = hashmap_first(m->jobs)))
1267 /* No need to recurse. We're cancelling all jobs. */
1268 job_finish_and_invalidate(j, JOB_CANCELED, false);
1271 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
1272 Manager *m = userdata;
1278 while ((j = m->run_queue)) {
1279 assert(j->installed);
1280 assert(j->in_run_queue);
1282 job_run_and_invalidate(j);
1285 if (m->n_running_jobs > 0)
1286 manager_watch_jobs_in_progress(m);
1288 if (m->n_on_console > 0)
1289 manager_watch_idle_pipe(m);
1294 static unsigned manager_dispatch_dbus_queue(Manager *m) {
1301 if (m->dispatching_dbus_queue)
1304 m->dispatching_dbus_queue = true;
1306 while ((u = m->dbus_unit_queue)) {
1307 assert(u->in_dbus_queue);
1309 bus_unit_send_change_signal(u);
1313 while ((j = m->dbus_job_queue)) {
1314 assert(j->in_dbus_queue);
1316 bus_job_send_change_signal(j);
1320 m->dispatching_dbus_queue = false;
1322 if (m->send_reloading_done) {
1323 m->send_reloading_done = false;
1325 bus_manager_send_reloading(m, false);
1328 if (m->queued_message)
1329 bus_send_queued_message(m);
1334 static void manager_invoke_notify_message(Manager *m, Unit *u, pid_t pid, char *buf, size_t n) {
1335 _cleanup_strv_free_ char **tags = NULL;
1342 tags = strv_split(buf, "\n\r");
1348 log_debug_unit(u->id, "Got notification message for unit %s", u->id);
1350 if (UNIT_VTABLE(u)->notify_message)
1351 UNIT_VTABLE(u)->notify_message(u, pid, tags);
1354 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1355 Manager *m = userdata;
1359 assert(m->notify_fd == fd);
1361 if (revents != EPOLLIN) {
1362 log_warning("Got unexpected poll event for notify fd.");
1368 struct iovec iovec = {
1370 .iov_len = sizeof(buf)-1,
1375 struct cmsghdr cmsghdr;
1376 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
1379 struct msghdr msghdr = {
1382 .msg_control = &control,
1383 .msg_controllen = sizeof(control),
1385 struct ucred *ucred;
1388 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT);
1393 if (errno == EAGAIN || errno == EINTR)
1399 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1400 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1401 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1402 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1403 log_warning("Received notify message without credentials. Ignoring.");
1407 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1409 assert((size_t) n < sizeof(buf));
1412 u = manager_get_unit_by_pid(m, ucred->pid);
1414 manager_invoke_notify_message(m, u, ucred->pid, buf, n);
1418 u = hashmap_get(m->watch_pids1, LONG_TO_PTR(ucred->pid));
1420 manager_invoke_notify_message(m, u, ucred->pid, buf, n);
1424 u = hashmap_get(m->watch_pids2, LONG_TO_PTR(ucred->pid));
1426 manager_invoke_notify_message(m, u, ucred->pid, buf, n);
1431 log_warning("Cannot find unit for notify message of PID "PID_FMT".", ucred->pid);
1437 static void invoke_sigchld_event(Manager *m, Unit *u, siginfo_t *si) {
1442 log_debug_unit(u->id, "Child "PID_FMT" belongs to %s", si->si_pid, u->id);
1444 unit_unwatch_pid(u, si->si_pid);
1445 UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
1448 static int manager_dispatch_sigchld(Manager *m) {
1454 /* First we call waitd() for a PID and do not reap the
1455 * zombie. That way we can still access /proc/$PID for
1456 * it while it is a zombie. */
1457 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
1459 if (errno == ECHILD)
1471 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
1472 _cleanup_free_ char *name = NULL;
1475 get_process_comm(si.si_pid, &name);
1477 log_debug("Child "PID_FMT" (%s) died (code=%s, status=%i/%s)",
1478 si.si_pid, strna(name),
1479 sigchld_code_to_string(si.si_code),
1481 strna(si.si_code == CLD_EXITED
1482 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1483 : signal_to_string(si.si_status)));
1485 /* And now figure out the unit this belongs
1486 * to, it might be multiple... */
1487 u = manager_get_unit_by_pid(m, si.si_pid);
1489 invoke_sigchld_event(m, u, &si);
1490 u = hashmap_get(m->watch_pids1, LONG_TO_PTR(si.si_pid));
1492 invoke_sigchld_event(m, u, &si);
1493 u = hashmap_get(m->watch_pids2, LONG_TO_PTR(si.si_pid));
1495 invoke_sigchld_event(m, u, &si);
1498 /* And now, we actually reap the zombie. */
1499 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1510 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
1511 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1514 log_debug_unit(name, "Activating special unit %s", name);
1516 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1518 log_error_unit(name, "Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
1523 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1524 Manager *m = userdata;
1526 struct signalfd_siginfo sfsi;
1527 bool sigchld = false;
1530 assert(m->signal_fd == fd);
1532 if (revents != EPOLLIN) {
1533 log_warning("Got unexpected events from signal file descriptor.");
1538 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
1539 if (n != sizeof(sfsi)) {
1544 if (errno == EINTR || errno == EAGAIN)
1550 log_received_signal(sfsi.ssi_signo == SIGCHLD ||
1551 (sfsi.ssi_signo == SIGTERM && m->running_as == SYSTEMD_USER)
1552 ? LOG_DEBUG : LOG_INFO,
1555 switch (sfsi.ssi_signo) {
1562 if (m->running_as == SYSTEMD_SYSTEM) {
1563 /* This is for compatibility with the
1564 * original sysvinit */
1565 m->exit_code = MANAGER_REEXECUTE;
1572 if (m->running_as == SYSTEMD_SYSTEM) {
1573 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
1577 /* Run the exit target if there is one, if not, just exit. */
1578 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
1579 m->exit_code = MANAGER_EXIT;
1586 if (m->running_as == SYSTEMD_SYSTEM)
1587 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
1589 /* This is a nop on non-init */
1593 if (m->running_as == SYSTEMD_SYSTEM)
1594 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
1596 /* This is a nop on non-init */
1602 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1604 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1605 log_info("Trying to reconnect to bus...");
1609 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1610 log_info("Loading D-Bus service...");
1611 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
1618 _cleanup_free_ char *dump = NULL;
1619 _cleanup_fclose_ FILE *f = NULL;
1622 f = open_memstream(&dump, &size);
1624 log_warning("Failed to allocate memory stream.");
1628 manager_dump_units(m, f, "\t");
1629 manager_dump_jobs(m, f, "\t");
1632 log_warning("Failed to write status stream");
1637 log_warning("Failed to flush status stream");
1641 log_dump(LOG_INFO, dump);
1646 m->exit_code = MANAGER_RELOAD;
1651 /* Starting SIGRTMIN+0 */
1652 static const char * const target_table[] = {
1653 [0] = SPECIAL_DEFAULT_TARGET,
1654 [1] = SPECIAL_RESCUE_TARGET,
1655 [2] = SPECIAL_EMERGENCY_TARGET,
1656 [3] = SPECIAL_HALT_TARGET,
1657 [4] = SPECIAL_POWEROFF_TARGET,
1658 [5] = SPECIAL_REBOOT_TARGET,
1659 [6] = SPECIAL_KEXEC_TARGET
1662 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1663 static const ManagerExitCode code_table[] = {
1665 [1] = MANAGER_POWEROFF,
1666 [2] = MANAGER_REBOOT,
1670 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
1671 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
1672 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1673 manager_start_target(m, target_table[idx],
1674 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
1678 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1679 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1680 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1684 switch (sfsi.ssi_signo - SIGRTMIN) {
1687 log_debug("Enabling showing of status.");
1688 manager_set_show_status(m, SHOW_STATUS_YES);
1692 log_debug("Disabling showing of status.");
1693 manager_set_show_status(m, SHOW_STATUS_NO);
1697 log_set_max_level(LOG_DEBUG);
1698 log_notice("Setting log level to debug.");
1702 log_set_max_level(LOG_INFO);
1703 log_notice("Setting log level to info.");
1707 if (m->running_as == SYSTEMD_USER) {
1708 m->exit_code = MANAGER_EXIT;
1712 /* This is a nop on init */
1716 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1717 log_notice("Setting log target to journal-or-kmsg.");
1721 log_set_target(LOG_TARGET_CONSOLE);
1722 log_notice("Setting log target to console.");
1726 log_set_target(LOG_TARGET_KMSG);
1727 log_notice("Setting log target to kmsg.");
1731 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
1732 log_notice("Setting log target to syslog-or-kmsg.");
1736 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
1743 manager_dispatch_sigchld(m);
1748 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1749 Manager *m = userdata;
1754 assert(m->time_change_fd == fd);
1756 log_struct(LOG_INFO,
1757 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1758 "MESSAGE=Time has been changed",
1761 /* Restart the watch */
1762 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
1763 m->time_change_fd = safe_close(m->time_change_fd);
1765 manager_setup_time_change(m);
1767 HASHMAP_FOREACH(u, m->units, i)
1768 if (UNIT_VTABLE(u)->time_change)
1769 UNIT_VTABLE(u)->time_change(u);
1774 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1775 Manager *m = userdata;
1778 assert(m->idle_pipe[2] == fd);
1780 m->no_console_output = m->n_on_console > 0;
1782 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
1783 manager_close_idle_pipe(m);
1788 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
1789 Manager *m = userdata;
1796 manager_print_jobs_in_progress(m);
1798 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_PERIOD_USEC;
1799 r = sd_event_source_set_time(source, next);
1803 return sd_event_source_set_enabled(source, SD_EVENT_ONESHOT);
1806 int manager_loop(Manager *m) {
1809 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
1812 m->exit_code = MANAGER_OK;
1814 /* Release the path cache */
1815 set_free_free(m->unit_path_cache);
1816 m->unit_path_cache = NULL;
1818 manager_check_finished(m);
1820 /* There might still be some zombies hanging around from
1821 * before we were exec()'ed. Let's reap them. */
1822 r = manager_dispatch_sigchld(m);
1826 while (m->exit_code == MANAGER_OK) {
1829 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
1832 if (!ratelimit_test(&rl)) {
1833 /* Yay, something is going seriously wrong, pause a little */
1834 log_warning("Looping too fast. Throttling execution a little.");
1839 if (manager_dispatch_load_queue(m) > 0)
1842 if (manager_dispatch_gc_queue(m) > 0)
1845 if (manager_dispatch_cleanup_queue(m) > 0)
1848 if (manager_dispatch_cgroup_queue(m) > 0)
1851 if (manager_dispatch_dbus_queue(m) > 0)
1854 /* Sleep for half the watchdog time */
1855 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
1856 wait_usec = m->runtime_watchdog / 2;
1860 wait_usec = (usec_t) -1;
1862 r = sd_event_run(m->event, wait_usec);
1864 log_error("Failed to run event loop: %s", strerror(-r));
1869 return m->exit_code;
1872 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
1873 _cleanup_free_ char *n = NULL;
1881 r = unit_name_from_dbus_path(s, &n);
1885 r = manager_load_unit(m, n, NULL, e, &u);
1894 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
1904 p = startswith(s, "/org/freedesktop/systemd1/job/");
1908 r = safe_atou(p, &id);
1912 j = manager_get_job(m, id);
1921 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
1924 _cleanup_free_ char *p = NULL;
1927 audit_fd = get_audit_fd();
1931 /* Don't generate audit events if the service was already
1932 * started and we're just deserializing */
1933 if (m->n_reloading > 0)
1936 if (m->running_as != SYSTEMD_SYSTEM)
1939 if (u->type != UNIT_SERVICE)
1942 p = unit_name_to_prefix_and_instance(u->id);
1944 log_error_unit(u->id,
1945 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
1949 if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
1950 if (errno == EPERM) {
1951 /* We aren't allowed to send audit messages?
1952 * Then let's not retry again. */
1955 log_warning("Failed to send audit message: %m");
1961 void manager_send_unit_plymouth(Manager *m, Unit *u) {
1962 union sockaddr_union sa = {
1963 .un.sun_family = AF_UNIX,
1964 .un.sun_path = "\0/org/freedesktop/plymouthd",
1968 _cleanup_free_ char *message = NULL;
1969 _cleanup_close_ int fd = -1;
1971 /* Don't generate plymouth events if the service was already
1972 * started and we're just deserializing */
1973 if (m->n_reloading > 0)
1976 if (m->running_as != SYSTEMD_SYSTEM)
1979 if (detect_container(NULL) > 0)
1982 if (u->type != UNIT_SERVICE &&
1983 u->type != UNIT_MOUNT &&
1984 u->type != UNIT_SWAP)
1987 /* We set SOCK_NONBLOCK here so that we rather drop the
1988 * message then wait for plymouth */
1989 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1991 log_error("socket() failed: %m");
1995 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
1997 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
1998 log_error("connect() failed: %m");
2002 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
2008 if (write(fd, message, n + 1) != n + 1)
2009 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
2010 log_error("Failed to write Plymouth message: %m");
2013 void manager_dispatch_bus_name_owner_changed(
2016 const char* old_owner,
2017 const char *new_owner) {
2024 u = hashmap_get(m->watch_bus, name);
2028 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2031 int manager_open_serialization(Manager *m, FILE **_f) {
2038 path = m->running_as == SYSTEMD_SYSTEM ? "/run/systemd" : "/tmp";
2039 fd = open_tmpfile(path, O_RDWR|O_CLOEXEC);
2043 log_debug("Serializing state to %s", path);
2045 f = fdopen(fd, "w+");
2056 int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
2069 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2070 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
2071 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
2072 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
2074 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
2075 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
2076 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
2077 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
2080 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
2081 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2082 dual_timestamp_serialize(f, "security-start-timestamp", &m->security_start_timestamp);
2083 dual_timestamp_serialize(f, "security-finish-timestamp", &m->security_finish_timestamp);
2084 dual_timestamp_serialize(f, "generators-start-timestamp", &m->generators_start_timestamp);
2085 dual_timestamp_serialize(f, "generators-finish-timestamp", &m->generators_finish_timestamp);
2086 dual_timestamp_serialize(f, "units-load-start-timestamp", &m->units_load_start_timestamp);
2087 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
2090 if (!switching_root) {
2091 STRV_FOREACH(e, m->environment) {
2092 _cleanup_free_ char *ce;
2098 fprintf(f, "env=%s\n", *e);
2102 if (m->notify_fd >= 0) {
2105 copy = fdset_put_dup(fds, m->notify_fd);
2109 fprintf(f, "notify-fd=%i\n", copy);
2110 fprintf(f, "notify-socket=%s\n", m->notify_socket);
2113 if (m->kdbus_fd >= 0) {
2116 copy = fdset_put_dup(fds, m->kdbus_fd);
2120 fprintf(f, "kdbus-fd=%i\n", copy);
2123 bus_track_serialize(m->subscribed, f);
2127 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
2131 if (!unit_can_serialize(u))
2138 r = unit_serialize(u, f, fds, !switching_root);
2145 assert(m->n_reloading > 0);
2151 r = bus_fdset_add_all(m, fds);
2158 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2164 log_debug("Deserializing state...");
2169 char line[LINE_MAX], *l;
2171 if (!fgets(line, sizeof(line), f)) {
2186 if (startswith(l, "current-job-id=")) {
2189 if (safe_atou32(l+15, &id) < 0)
2190 log_debug("Failed to parse current job id value %s", l+15);
2192 m->current_job_id = MAX(m->current_job_id, id);
2194 } else if (startswith(l, "n-installed-jobs=")) {
2197 if (safe_atou32(l+17, &n) < 0)
2198 log_debug("Failed to parse installed jobs counter %s", l+17);
2200 m->n_installed_jobs += n;
2202 } else if (startswith(l, "n-failed-jobs=")) {
2205 if (safe_atou32(l+14, &n) < 0)
2206 log_debug("Failed to parse failed jobs counter %s", l+14);
2208 m->n_failed_jobs += n;
2210 } else if (startswith(l, "taint-usr=")) {
2213 b = parse_boolean(l+10);
2215 log_debug("Failed to parse taint /usr flag %s", l+10);
2217 m->taint_usr = m->taint_usr || b;
2219 } else if (startswith(l, "firmware-timestamp="))
2220 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2221 else if (startswith(l, "loader-timestamp="))
2222 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2223 else if (startswith(l, "kernel-timestamp="))
2224 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2225 else if (startswith(l, "initrd-timestamp="))
2226 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
2227 else if (startswith(l, "userspace-timestamp="))
2228 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
2229 else if (startswith(l, "finish-timestamp="))
2230 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
2231 else if (startswith(l, "security-start-timestamp="))
2232 dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
2233 else if (startswith(l, "security-finish-timestamp="))
2234 dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
2235 else if (startswith(l, "generators-start-timestamp="))
2236 dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
2237 else if (startswith(l, "generators-finish-timestamp="))
2238 dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
2239 else if (startswith(l, "units-load-start-timestamp="))
2240 dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
2241 else if (startswith(l, "units-load-finish-timestamp="))
2242 dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
2243 else if (startswith(l, "env=")) {
2244 _cleanup_free_ char *uce = NULL;
2247 uce = cunescape(l+4);
2253 e = strv_env_set(m->environment, uce);
2259 strv_free(m->environment);
2262 } else if (startswith(l, "notify-fd=")) {
2265 if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2266 log_debug("Failed to parse notify fd: %s", l + 10);
2268 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
2269 safe_close(m->notify_fd);
2270 m->notify_fd = fdset_remove(fds, fd);
2273 } else if (startswith(l, "notify-socket=")) {
2282 free(m->notify_socket);
2283 m->notify_socket = n;
2285 } else if (startswith(l, "kdbus-fd=")) {
2288 if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2289 log_debug("Failed to parse kdbus fd: %s", l + 9);
2291 safe_close(m->kdbus_fd);
2292 m->kdbus_fd = fdset_remove(fds, fd);
2295 } else if (bus_track_deserialize_item(&m->deserialized_subscribed, l) == 0)
2296 log_debug("Unknown serialization item '%s'", l);
2301 char name[UNIT_NAME_MAX+2];
2304 if (!fgets(name, sizeof(name), f)) {
2315 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2319 r = unit_deserialize(u, f, fds);
2328 assert(m->n_reloading > 0);
2334 int manager_reload(Manager *m) {
2336 _cleanup_fclose_ FILE *f = NULL;
2337 _cleanup_fdset_free_ FDSet *fds = NULL;
2341 r = manager_open_serialization(m, &f);
2346 bus_manager_send_reloading(m, true);
2354 r = manager_serialize(m, f, fds, false);
2360 if (fseeko(f, 0, SEEK_SET) < 0) {
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);
2370 /* Find new unit paths */
2371 manager_run_generators(m);
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);
2381 manager_build_unit_path_cache(m);
2383 /* First, enumerate what we can from all config files */
2384 q = manager_enumerate(m);
2388 /* Second, deserialize our stored data */
2389 q = manager_deserialize(m, f, fds);
2396 /* Re-register notify_fd as event source */
2397 q = manager_setup_notify(m);
2401 /* Third, fire things up! */
2402 q = manager_coldplug(m);
2406 assert(m->n_reloading > 0);
2409 m->send_reloading_done = true;
2414 bool manager_is_reloading_or_reexecuting(Manager *m) {
2417 return m->n_reloading != 0;
2420 void manager_reset_failed(Manager *m) {
2426 HASHMAP_FOREACH(u, m->units, i)
2427 unit_reset_failed(u);
2430 bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
2436 /* Returns true if the unit is inactive or going down */
2437 u = manager_get_unit(m, name);
2441 return unit_inactive_or_pending(u);
2444 void manager_check_finished(Manager *m) {
2445 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
2446 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
2450 if (m->n_running_jobs == 0)
2451 m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
2453 if (hashmap_size(m->jobs) > 0) {
2455 if (m->jobs_in_progress_event_source) {
2456 sd_event_source_set_time(m->jobs_in_progress_event_source,
2457 now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
2463 manager_flip_auto_status(m, false);
2465 /* Notify Type=idle units that we are done now */
2466 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
2467 manager_close_idle_pipe(m);
2469 /* Turn off confirm spawn now */
2470 m->confirm_spawn = false;
2472 if (dual_timestamp_is_set(&m->finish_timestamp))
2475 dual_timestamp_get(&m->finish_timestamp);
2477 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
2479 /* Note that m->kernel_usec.monotonic is always at 0,
2480 * and m->firmware_usec.monotonic and
2481 * m->loader_usec.monotonic should be considered
2482 * negative values. */
2484 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2485 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
2486 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2487 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
2489 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
2491 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2492 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
2494 if (!log_on_console())
2495 log_struct(LOG_INFO,
2496 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2497 "KERNEL_USEC="USEC_FMT, kernel_usec,
2498 "INITRD_USEC="USEC_FMT, initrd_usec,
2499 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2500 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2501 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2502 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2503 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2504 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2507 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
2510 if (!log_on_console())
2511 log_struct(LOG_INFO,
2512 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2513 "KERNEL_USEC="USEC_FMT, kernel_usec,
2514 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2515 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2516 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2517 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2518 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2522 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2523 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2525 if (!log_on_console())
2526 log_struct(LOG_INFO,
2527 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2528 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2529 "MESSAGE=Startup finished in %s.",
2530 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2534 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
2537 "READY=1\nSTATUS=Startup finished in %s.",
2538 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
2541 static int create_generator_dir(Manager *m, char **generator, const char *name) {
2552 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
2553 /* systemd --system, not running --test */
2555 p = strappend("/run/systemd/", name);
2559 r = mkdir_p_label(p, 0755);
2561 log_error("Failed to create generator directory %s: %s",
2566 } else if (m->running_as == SYSTEMD_USER) {
2567 const char *s = NULL;
2569 s = getenv("XDG_RUNTIME_DIR");
2572 p = strjoin(s, "/systemd/", name, NULL);
2576 r = mkdir_p_label(p, 0755);
2578 log_error("Failed to create generator directory %s: %s",
2584 /* systemd --system --test */
2586 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
2591 log_error("Failed to create generator directory %s: %m",
2602 static void trim_generator_dir(Manager *m, char **generator) {
2609 if (rmdir(*generator) >= 0) {
2617 void manager_run_generators(Manager *m) {
2618 _cleanup_closedir_ DIR *d = NULL;
2619 const char *generator_path;
2620 const char *argv[5];
2625 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
2626 d = opendir(generator_path);
2628 if (errno == ENOENT)
2631 log_error("Failed to enumerate generator directory %s: %m",
2636 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2640 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2644 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2648 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2649 argv[1] = m->generator_unit_path;
2650 argv[2] = m->generator_unit_path_early;
2651 argv[3] = m->generator_unit_path_late;
2654 RUN_WITH_UMASK(0022)
2655 execute_directory(generator_path, d, DEFAULT_TIMEOUT_USEC, (char**) argv);
2658 trim_generator_dir(m, &m->generator_unit_path);
2659 trim_generator_dir(m, &m->generator_unit_path_early);
2660 trim_generator_dir(m, &m->generator_unit_path_late);
2663 static void remove_generator_dir(Manager *m, char **generator) {
2670 strv_remove(m->lookup_paths.unit_path, *generator);
2671 rm_rf(*generator, false, true, false);
2677 void manager_undo_generators(Manager *m) {
2680 remove_generator_dir(m, &m->generator_unit_path);
2681 remove_generator_dir(m, &m->generator_unit_path_early);
2682 remove_generator_dir(m, &m->generator_unit_path_late);
2685 int manager_environment_add(Manager *m, char **minus, char **plus) {
2686 char **a = NULL, **b = NULL, **l;
2691 if (!strv_isempty(minus)) {
2692 a = strv_env_delete(l, 1, minus);
2699 if (!strv_isempty(plus)) {
2700 b = strv_env_merge(2, l, plus);
2707 if (m->environment != l)
2708 strv_free(m->environment);
2715 manager_clean_environment(m);
2716 strv_sort(m->environment);
2721 int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2726 for (i = 0; i < _RLIMIT_MAX; i++) {
2727 if (!default_rlimit[i])
2730 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2738 void manager_recheck_journal(Manager *m) {
2743 if (m->running_as != SYSTEMD_SYSTEM)
2746 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2747 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
2748 log_close_journal();
2752 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2753 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
2754 log_close_journal();
2758 /* Hmm, OK, so the socket is fully up and the service is up
2759 * too, then let's make use of the thing. */
2763 void manager_set_show_status(Manager *m, ShowStatus mode) {
2765 assert(IN_SET(mode, SHOW_STATUS_AUTO, SHOW_STATUS_NO, SHOW_STATUS_YES, SHOW_STATUS_TEMPORARY));
2767 if (m->running_as != SYSTEMD_SYSTEM)
2770 m->show_status = mode;
2773 touch("/run/systemd/show-status");
2775 unlink("/run/systemd/show-status");
2778 static bool manager_get_show_status(Manager *m) {
2781 if (m->running_as != SYSTEMD_SYSTEM)
2784 if (m->no_console_output)
2787 if (!IN_SET(manager_state(m), MANAGER_STARTING, MANAGER_STOPPING))
2790 if (m->show_status > 0)
2793 /* If Plymouth is running make sure we show the status, so
2794 * that there's something nice to see when people press Esc */
2796 return plymouth_running();
2799 void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
2802 if (!manager_get_show_status(m))
2805 /* XXX We should totally drop the check for ephemeral here
2806 * and thus effectively make 'Type=idle' pointless. */
2807 if (ephemeral && m->n_on_console > 0)
2810 va_start(ap, format);
2811 status_vprintf(status, true, ephemeral, format, ap);
2815 int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
2816 _cleanup_free_ char *p = NULL;
2824 p = unit_name_from_path(path, suffix);
2828 found = manager_get_unit(m, p);
2838 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
2839 char p[strlen(path)+1];
2845 path_kill_slashes(p);
2847 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);
2850 const char *manager_get_runtime_prefix(Manager *m) {
2853 return m->running_as == SYSTEMD_SYSTEM ?
2855 getenv("XDG_RUNTIME_DIR");
2858 ManagerState manager_state(Manager *m) {
2863 /* Did we ever finish booting? If not then we are still starting up */
2864 if (!dual_timestamp_is_set(&m->finish_timestamp))
2865 return MANAGER_STARTING;
2867 /* Is the special shutdown target queued? If so, we are in shutdown state */
2868 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2869 if (u && u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))
2870 return MANAGER_STOPPING;
2872 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
2873 u = manager_get_unit(m, SPECIAL_RESCUE_TARGET);
2874 if (u && (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)) ||
2875 (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))))
2876 return MANAGER_MAINTENANCE;
2878 u = manager_get_unit(m, SPECIAL_EMERGENCY_TARGET);
2879 if (u && (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)) ||
2880 (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))))
2881 return MANAGER_MAINTENANCE;
2883 /* Are there any failed units? If so, we are in degraded mode */
2884 if (set_size(m->failed_units) > 0)
2885 return MANAGER_DEGRADED;
2887 return MANAGER_RUNNING;
2890 static const char *const manager_state_table[_MANAGER_STATE_MAX] = {
2891 [MANAGER_STARTING] = "starting",
2892 [MANAGER_RUNNING] = "running",
2893 [MANAGER_DEGRADED] = "degraded",
2894 [MANAGER_MAINTENANCE] = "maintenance",
2895 [MANAGER_STOPPING] = "stopping",
2898 DEFINE_STRING_TABLE_LOOKUP(manager_state, ManagerState);