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_SEC 5
84 #define JOBS_IN_PROGRESS_PERIOD_SEC 1
85 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
87 /* Where clients shall send notification messages to */
88 #define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
90 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
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);
99 static int manager_watch_jobs_in_progress(Manager *m) {
102 if (m->jobs_in_progress_event_source)
105 return sd_event_add_monotonic(m->event, JOBS_IN_PROGRESS_WAIT_SEC, 0, manager_dispatch_jobs_in_progress, m, &m->jobs_in_progress_event_source);
108 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED_ON)-1) + sizeof(ANSI_HIGHLIGHT_RED_ON)-1 + 2*(sizeof(ANSI_HIGHLIGHT_OFF)-1))
110 static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
113 assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
114 assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
118 p = mempset(p, ' ', pos-2);
119 p = stpcpy(p, ANSI_RED_ON);
123 if (pos > 0 && pos <= width) {
124 p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
128 p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
131 p = stpcpy(p, ANSI_RED_ON);
134 p = mempset(p, ' ', width-1-pos);
135 strcpy(p, ANSI_HIGHLIGHT_OFF);
139 static void manager_print_jobs_in_progress(Manager *m) {
140 _cleanup_free_ char *job_of_n = NULL;
143 unsigned counter = 0, print_nr;
144 char cylon[6 + CYLON_BUFFER_EXTRA + 1];
149 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
151 HASHMAP_FOREACH(j, m->jobs, i)
152 if (j->state == JOB_RUNNING && counter++ == print_nr)
155 /* m->n_running_jobs must be consistent with the contents of m->jobs,
156 * so the above loop must have succeeded in finding j. */
157 assert(counter == print_nr + 1);
160 cylon_pos = m->jobs_in_progress_iteration % 14;
162 cylon_pos = 14 - cylon_pos;
163 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
165 if (m->n_running_jobs > 1)
166 if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
169 manager_status_printf(m, true, cylon, "%sA %s job is running for %s",
170 strempty(job_of_n), job_type_to_string(j->type), unit_description(j->unit));
172 m->jobs_in_progress_iteration++;
175 static int manager_watch_idle_pipe(Manager *m) {
180 if (m->idle_pipe_event_source)
183 if (m->idle_pipe[2] < 0)
186 r = sd_event_add_io(m->event, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m, &m->idle_pipe_event_source);
188 log_error("Failed to watch idle pipe: %s", strerror(-r));
195 static void manager_close_idle_pipe(Manager *m) {
198 close_pipe(m->idle_pipe);
199 close_pipe(m->idle_pipe + 2);
202 static int manager_setup_time_change(Manager *m) {
205 /* We only care for the cancellation event, hence we set the
206 * timeout to the latest possible value. */
207 struct itimerspec its = {
208 .it_value.tv_sec = TIME_T_MAX,
212 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
214 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
215 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
217 m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
218 if (m->time_change_fd < 0) {
219 log_error("Failed to create timerfd: %m");
223 if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
224 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
225 close_nointr_nofail(m->time_change_fd);
226 m->time_change_fd = -1;
230 r = sd_event_add_io(m->event, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m, &m->time_change_event_source);
232 log_error("Failed to create time change event source: %s", strerror(-r));
236 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
241 static int enable_special_signals(Manager *m) {
242 _cleanup_close_ int fd = -1;
246 /* Enable that we get SIGINT on control-alt-del. In containers
247 * this will fail with EPERM (older) or EINVAL (newer), so
249 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
250 log_warning("Failed to enable ctrl-alt-del handling: %m");
252 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
254 /* Support systems without virtual console */
256 log_warning("Failed to open /dev/tty0: %m");
258 /* Enable that we get SIGWINCH on kbrequest */
259 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
260 log_warning("Failed to enable kbrequest handling: %m");
266 static int manager_setup_signals(Manager *m) {
267 struct sigaction sa = {
268 .sa_handler = SIG_DFL,
269 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
276 /* We are not interested in SIGSTOP and friends. */
277 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
279 assert_se(sigemptyset(&mask) == 0);
281 sigset_add_many(&mask,
282 SIGCHLD, /* Child died */
283 SIGTERM, /* Reexecute daemon */
284 SIGHUP, /* Reload configuration */
285 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
286 SIGUSR2, /* systemd: dump status */
287 SIGINT, /* Kernel sends us this on control-alt-del */
288 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
289 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
290 SIGRTMIN+0, /* systemd: start default.target */
291 SIGRTMIN+1, /* systemd: isolate rescue.target */
292 SIGRTMIN+2, /* systemd: isolate emergency.target */
293 SIGRTMIN+3, /* systemd: start halt.target */
294 SIGRTMIN+4, /* systemd: start poweroff.target */
295 SIGRTMIN+5, /* systemd: start reboot.target */
296 SIGRTMIN+6, /* systemd: start kexec.target */
297 SIGRTMIN+13, /* systemd: Immediate halt */
298 SIGRTMIN+14, /* systemd: Immediate poweroff */
299 SIGRTMIN+15, /* systemd: Immediate reboot */
300 SIGRTMIN+16, /* systemd: Immediate kexec */
301 SIGRTMIN+20, /* systemd: enable status messages */
302 SIGRTMIN+21, /* systemd: disable status messages */
303 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
304 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
305 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
306 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
307 SIGRTMIN+27, /* systemd: set log target to console */
308 SIGRTMIN+28, /* systemd: set log target to kmsg */
309 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
311 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
313 m->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
314 if (m->signal_fd < 0)
317 r = sd_event_add_io(m->event, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m, &m->signal_event_source);
321 /* Process signals a bit earlier than the rest of things, but
322 * later that notify_fd processing, so that the notify
323 * processing can still figure out to which process/service a
324 * message belongs, before we reap the process. */
325 r = sd_event_source_set_priority(m->signal_event_source, -5);
329 if (m->running_as == SYSTEMD_SYSTEM)
330 return enable_special_signals(m);
335 static int manager_default_environment(Manager *m) {
338 if (m->running_as == SYSTEMD_SYSTEM) {
339 /* The system manager always starts with a clean
340 * environment for its children. It does not import
341 * the kernel or the parents exported variables.
343 * The initial passed environ is untouched to keep
344 * /proc/self/environ valid; it is used for tagging
345 * the init process inside containers. */
346 m->environment = strv_new("PATH=" DEFAULT_PATH,
349 /* Import locale variables LC_*= from configuration */
350 locale_setup(&m->environment);
352 /* The user manager passes its own environment
353 * along to its children. */
354 m->environment = strv_copy(environ);
356 /* Let's remove some environment variables that we
357 * need ourselves to communicate with our clients */
373 strv_sort(m->environment);
378 int manager_new(SystemdRunningAs running_as, Manager **_m) {
383 assert(running_as >= 0);
384 assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
386 m = new0(Manager, 1);
391 if (detect_container(NULL) <= 0)
392 boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
395 m->running_as = running_as;
396 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
398 m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
400 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;
401 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
403 r = manager_default_environment(m);
407 r = hashmap_ensure_allocated(&m->units, string_hash_func, string_compare_func);
411 r = hashmap_ensure_allocated(&m->jobs, trivial_hash_func, trivial_compare_func);
415 r = hashmap_ensure_allocated(&m->cgroup_unit, string_hash_func, string_compare_func);
419 r = hashmap_ensure_allocated(&m->watch_pids, trivial_hash_func, trivial_compare_func);
423 r = hashmap_ensure_allocated(&m->watch_bus, string_hash_func, string_compare_func);
427 r = sd_event_default(&m->event);
431 r = sd_event_add_defer(m->event, manager_dispatch_run_queue, m, &m->run_queue_event_source);
435 r = sd_event_source_set_priority(m->run_queue_event_source, SD_EVENT_PRIORITY_IDLE);
439 r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_OFF);
443 r = manager_setup_signals(m);
447 r = manager_setup_cgroup(m);
451 r = manager_setup_time_change(m);
455 m->udev = udev_new();
461 /* Note that we set up neither kdbus, nor the notify fd
462 * here. We do that after deserialization, since they might
463 * have gotten serialized across the reexec. */
465 m->taint_usr = dir_is_empty("/usr") > 0;
475 static int manager_setup_notify(Manager *m) {
478 struct sockaddr_un un;
480 .sa.sa_family = AF_UNIX,
484 if (m->notify_fd < 0) {
485 _cleanup_close_ int fd = -1;
487 /* First free all secondary fields */
488 free(m->notify_socket);
489 m->notify_socket = NULL;
490 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
492 fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
494 log_error("Failed to allocate notification socket: %m");
498 if (getpid() != 1 || detect_container(NULL) > 0)
499 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%" PRIx64, random_u64());
501 strncpy(sa.un.sun_path, NOTIFY_SOCKET, sizeof(sa.un.sun_path));
502 sa.un.sun_path[0] = 0;
504 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
506 log_error("bind() failed: %m");
510 r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
512 log_error("SO_PASSCRED failed: %m");
516 sa.un.sun_path[0] = '@';
517 m->notify_socket = strdup(sa.un.sun_path);
518 if (!m->notify_socket)
524 log_debug("Using notification socket %s", m->notify_socket);
527 if (!m->notify_event_source) {
528 r = sd_event_add_io(m->event, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m, &m->notify_event_source);
530 log_error("Failed to allocate notify event source: %s", strerror(-r));
534 /* Process signals a bit earlier than SIGCHLD, so that we can
535 * still identify to which service an exit message belongs */
536 r = sd_event_source_set_priority(m->notify_event_source, -7);
538 log_error("Failed to set priority of notify event source: %s", strerror(-r));
546 static int manager_setup_kdbus(Manager *m) {
548 _cleanup_free_ char *p = NULL;
554 if (m->kdbus_fd >= 0)
557 m->kdbus_fd = bus_kernel_create_bus(m->running_as == SYSTEMD_SYSTEM ? "system" : "user", m->running_as == SYSTEMD_SYSTEM, &p);
558 if (m->kdbus_fd < 0) {
559 log_debug("Failed to set up kdbus: %s", strerror(-m->kdbus_fd));
563 log_debug("Successfully set up kdbus on %s", p);
565 /* Create the namespace directory here, so that the contents
566 * of that directory is not visible to non-root users. This is
567 * necessary to ensure that users cannot get access to busses
568 * of virtualized users when no UID namespacing is used. */
569 if (m->running_as == SYSTEMD_SYSTEM)
570 mkdir_p_label("/dev/kdbus/ns", 0700);
576 static int manager_connect_bus(Manager *m, bool reexecuting) {
577 bool try_bus_connect;
584 (m->running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS"));
586 /* Try to connect to the busses, if possible. */
587 return bus_init(m, try_bus_connect);
590 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
596 while ((u = m->cleanup_queue)) {
597 assert(u->in_cleanup_queue);
607 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
608 GC_OFFSET_UNSURE, /* No clue */
609 GC_OFFSET_GOOD, /* We still need this unit */
610 GC_OFFSET_BAD, /* We don't need this unit anymore */
614 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
621 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
622 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
623 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
626 if (u->in_cleanup_queue)
629 if (unit_check_gc(u))
632 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
636 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
637 unit_gc_sweep(other, gc_marker);
639 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
642 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
649 /* We were unable to find anything out about this entry, so
650 * let's investigate it later */
651 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
652 unit_add_to_gc_queue(u);
656 /* We definitely know that this one is not useful anymore, so
657 * let's mark it for deletion */
658 u->gc_marker = gc_marker + GC_OFFSET_BAD;
659 unit_add_to_cleanup_queue(u);
663 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
666 static unsigned manager_dispatch_gc_queue(Manager *m) {
673 /* log_debug("Running GC..."); */
675 m->gc_marker += _GC_OFFSET_MAX;
676 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
679 gc_marker = m->gc_marker;
681 while ((u = m->gc_queue)) {
682 assert(u->in_gc_queue);
684 unit_gc_sweep(u, gc_marker);
686 LIST_REMOVE(gc_queue, m->gc_queue, u);
687 u->in_gc_queue = false;
691 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
692 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
693 log_debug_unit(u->id, "Collecting %s", u->id);
694 u->gc_marker = gc_marker + GC_OFFSET_BAD;
695 unit_add_to_cleanup_queue(u);
699 m->n_in_gc_queue = 0;
704 static void manager_clear_jobs_and_units(Manager *m) {
709 while ((u = hashmap_first(m->units)))
712 manager_dispatch_cleanup_queue(m);
714 assert(!m->load_queue);
715 assert(!m->run_queue);
716 assert(!m->dbus_unit_queue);
717 assert(!m->dbus_job_queue);
718 assert(!m->cleanup_queue);
719 assert(!m->gc_queue);
721 assert(hashmap_isempty(m->jobs));
722 assert(hashmap_isempty(m->units));
725 m->n_running_jobs = 0;
728 void manager_free(Manager *m) {
734 manager_clear_jobs_and_units(m);
736 for (c = 0; c < _UNIT_TYPE_MAX; c++)
737 if (unit_vtable[c]->shutdown)
738 unit_vtable[c]->shutdown(m);
740 /* If we reexecute ourselves, we keep the root cgroup
742 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
744 manager_undo_generators(m);
748 hashmap_free(m->units);
749 hashmap_free(m->jobs);
750 hashmap_free(m->watch_pids);
751 hashmap_free(m->watch_bus);
753 sd_event_source_unref(m->signal_event_source);
754 sd_event_source_unref(m->notify_event_source);
755 sd_event_source_unref(m->time_change_event_source);
756 sd_event_source_unref(m->jobs_in_progress_event_source);
757 sd_event_source_unref(m->idle_pipe_event_source);
758 sd_event_source_unref(m->run_queue_event_source);
760 if (m->signal_fd >= 0)
761 close_nointr_nofail(m->signal_fd);
762 if (m->notify_fd >= 0)
763 close_nointr_nofail(m->notify_fd);
764 if (m->time_change_fd >= 0)
765 close_nointr_nofail(m->time_change_fd);
766 if (m->kdbus_fd >= 0)
767 close_nointr_nofail(m->kdbus_fd);
769 manager_close_idle_pipe(m);
772 sd_event_unref(m->event);
774 free(m->notify_socket);
776 lookup_paths_free(&m->lookup_paths);
777 strv_free(m->environment);
779 hashmap_free(m->cgroup_unit);
780 set_free_free(m->unit_path_cache);
782 free(m->switch_root);
783 free(m->switch_root_init);
785 for (i = 0; i < RLIMIT_NLIMITS; i++)
788 assert(hashmap_isempty(m->units_requiring_mounts_for));
789 hashmap_free(m->units_requiring_mounts_for);
794 int manager_enumerate(Manager *m) {
800 /* Let's ask every type to load all units from disk/kernel
801 * that it might know */
802 for (c = 0; c < _UNIT_TYPE_MAX; c++)
803 if (unit_vtable[c]->enumerate) {
804 q = unit_vtable[c]->enumerate(m);
809 manager_dispatch_load_queue(m);
813 static int manager_coldplug(Manager *m) {
821 /* Then, let's set up their initial state. */
822 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
828 if ((q = unit_coldplug(u)) < 0)
835 static void manager_build_unit_path_cache(Manager *m) {
837 _cleanup_free_ DIR *d = NULL;
842 set_free_free(m->unit_path_cache);
844 m->unit_path_cache = set_new(string_hash_func, string_compare_func);
845 if (!m->unit_path_cache) {
846 log_error("Failed to allocate unit path cache.");
850 /* This simply builds a list of files we know exist, so that
851 * we don't always have to go to disk */
853 STRV_FOREACH(i, m->lookup_paths.unit_path) {
859 log_error("Failed to open directory %s: %m", *i);
863 while ((de = readdir(d))) {
866 if (ignore_file(de->d_name))
869 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
875 r = set_consume(m->unit_path_cache, p);
887 log_error("Failed to build unit path cache: %s", strerror(-r));
889 set_free_free(m->unit_path_cache);
890 m->unit_path_cache = NULL;
894 static int manager_distribute_fds(Manager *m, FDSet *fds) {
901 HASHMAP_FOREACH(u, m->units, i) {
903 if (fdset_size(fds) <= 0)
906 if (UNIT_VTABLE(u)->distribute_fds) {
907 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
916 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
921 dual_timestamp_get(&m->generators_start_timestamp);
922 manager_run_generators(m);
923 dual_timestamp_get(&m->generators_finish_timestamp);
925 r = lookup_paths_init(
926 &m->lookup_paths, m->running_as, true,
927 m->generator_unit_path,
928 m->generator_unit_path_early,
929 m->generator_unit_path_late);
933 manager_build_unit_path_cache(m);
935 /* If we will deserialize make sure that during enumeration
936 * this is already known, so we increase the counter here
941 /* First, enumerate what we can from all config files */
942 dual_timestamp_get(&m->units_load_start_timestamp);
943 r = manager_enumerate(m);
944 dual_timestamp_get(&m->units_load_finish_timestamp);
946 /* Second, deserialize if there is something to deserialize */
948 q = manager_deserialize(m, serialization, fds);
953 /* Any fds left? Find some unit which wants them. This is
954 * useful to allow container managers to pass some file
955 * descriptors to us pre-initialized. This enables
956 * socket-based activation of entire containers. */
957 if (fdset_size(fds) > 0) {
958 q = manager_distribute_fds(m, fds);
963 /* We might have deserialized the notify fd, but if we didn't
964 * then let's create the bus now */
965 manager_setup_notify(m);
967 /* We might have deserialized the kdbus control fd, but if we
968 * didn't, then let's create the bus now. */
969 manager_setup_kdbus(m);
970 manager_connect_bus(m, !!serialization);
972 /* Third, fire things up! */
973 q = manager_coldplug(m);
978 assert(m->n_reloading > 0);
981 /* Let's wait for the UnitNew/JobNew messages being
982 * sent, before we notify that the reload is
984 m->send_reloading_done = true;
990 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
995 assert(type < _JOB_TYPE_MAX);
997 assert(mode < _JOB_MODE_MAX);
999 if (mode == JOB_ISOLATE && type != JOB_START) {
1000 sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Isolate is only valid for start.");
1004 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
1005 sd_bus_error_setf(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
1009 log_debug_unit(unit->id,
1010 "Trying to enqueue job %s/%s/%s", unit->id,
1011 job_type_to_string(type), job_mode_to_string(mode));
1013 job_type_collapse(&type, unit);
1015 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
1019 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
1020 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
1021 mode == JOB_IGNORE_DEPENDENCIES, e);
1025 if (mode == JOB_ISOLATE) {
1026 r = transaction_add_isolate_jobs(tr, m);
1031 r = transaction_activate(tr, m, mode, e);
1035 log_debug_unit(unit->id,
1036 "Enqueued job %s/%s as %u", unit->id,
1037 job_type_to_string(type), (unsigned) tr->anchor_job->id);
1040 *_ret = tr->anchor_job;
1042 transaction_free(tr);
1046 transaction_abort(tr);
1047 transaction_free(tr);
1051 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1056 assert(type < _JOB_TYPE_MAX);
1058 assert(mode < _JOB_MODE_MAX);
1060 r = manager_load_unit(m, name, NULL, NULL, &unit);
1064 return manager_add_job(m, type, unit, mode, override, e, _ret);
1067 Job *manager_get_job(Manager *m, uint32_t id) {
1070 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1073 Unit *manager_get_unit(Manager *m, const char *name) {
1077 return hashmap_get(m->units, name);
1080 unsigned manager_dispatch_load_queue(Manager *m) {
1086 /* Make sure we are not run recursively */
1087 if (m->dispatching_load_queue)
1090 m->dispatching_load_queue = true;
1092 /* Dispatches the load queue. Takes a unit from the queue and
1093 * tries to load its data until the queue is empty */
1095 while ((u = m->load_queue)) {
1096 assert(u->in_load_queue);
1102 m->dispatching_load_queue = false;
1106 int manager_load_unit_prepare(
1118 assert(name || path);
1120 /* This will prepare the unit for loading, but not actually
1121 * load anything from disk. */
1123 if (path && !is_path(path))
1124 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
1127 name = basename(path);
1129 t = unit_name_to_type(name);
1131 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, TEMPLATE_INVALID))
1132 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is not valid.", name);
1134 ret = manager_get_unit(m, name);
1140 ret = unit_new(m, unit_vtable[t]->object_size);
1145 ret->fragment_path = strdup(path);
1146 if (!ret->fragment_path) {
1152 r = unit_add_name(ret, name);
1158 unit_add_to_load_queue(ret);
1159 unit_add_to_dbus_queue(ret);
1160 unit_add_to_gc_queue(ret);
1168 int manager_load_unit(
1179 /* This will load the service information files, but not actually
1180 * start any services or anything. */
1182 r = manager_load_unit_prepare(m, name, path, e, _ret);
1186 manager_dispatch_load_queue(m);
1189 *_ret = unit_follow_merge(*_ret);
1194 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
1201 HASHMAP_FOREACH(j, s->jobs, i)
1202 job_dump(j, f, prefix);
1205 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
1213 HASHMAP_FOREACH_KEY(u, t, s->units, i)
1215 unit_dump(u, f, prefix);
1218 void manager_clear_jobs(Manager *m) {
1223 while ((j = hashmap_first(m->jobs)))
1224 /* No need to recurse. We're cancelling all jobs. */
1225 job_finish_and_invalidate(j, JOB_CANCELED, false);
1228 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
1229 Manager *m = userdata;
1235 while ((j = m->run_queue)) {
1236 assert(j->installed);
1237 assert(j->in_run_queue);
1239 job_run_and_invalidate(j);
1242 if (m->n_running_jobs > 0)
1243 manager_watch_jobs_in_progress(m);
1245 if (m->n_on_console > 0)
1246 manager_watch_idle_pipe(m);
1251 static unsigned manager_dispatch_dbus_queue(Manager *m) {
1258 if (m->dispatching_dbus_queue)
1261 m->dispatching_dbus_queue = true;
1263 while ((u = m->dbus_unit_queue)) {
1264 assert(u->in_dbus_queue);
1266 bus_unit_send_change_signal(u);
1270 while ((j = m->dbus_job_queue)) {
1271 assert(j->in_dbus_queue);
1273 bus_job_send_change_signal(j);
1277 m->dispatching_dbus_queue = false;
1279 if (m->send_reloading_done) {
1280 m->send_reloading_done = false;
1282 bus_manager_send_reloading(m, false);
1285 if (m->queued_message)
1286 bus_send_queued_message(m);
1291 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1292 Manager *m = userdata;
1296 assert(m->notify_fd == fd);
1298 if (revents != EPOLLIN) {
1299 log_warning("Got unexpected poll event for notify fd.");
1305 struct iovec iovec = {
1307 .iov_len = sizeof(buf)-1,
1311 struct cmsghdr cmsghdr;
1312 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
1315 struct msghdr msghdr = {
1318 .msg_control = &control,
1319 .msg_controllen = sizeof(control),
1321 struct ucred *ucred;
1323 _cleanup_strv_free_ char **tags = NULL;
1325 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT);
1330 if (errno == EAGAIN || errno == EINTR)
1336 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1337 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1338 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1339 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1340 log_warning("Received notify message without credentials. Ignoring.");
1344 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1346 u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid));
1348 u = manager_get_unit_by_pid(m, ucred->pid);
1350 log_warning("Cannot find unit for notify message of PID "PID_FMT".", ucred->pid);
1355 assert((size_t) n < sizeof(buf));
1357 tags = strv_split(buf, "\n\r");
1361 log_debug_unit(u->id, "Got notification message for unit %s", u->id);
1363 if (UNIT_VTABLE(u)->notify_message)
1364 UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
1370 static int manager_dispatch_sigchld(Manager *m) {
1377 /* First we call waitd() for a PID and do not reap the
1378 * zombie. That way we can still access /proc/$PID for
1379 * it while it is a zombie. */
1380 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
1382 if (errno == ECHILD)
1394 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
1395 _cleanup_free_ char *name = NULL;
1397 get_process_comm(si.si_pid, &name);
1398 log_debug("Got SIGCHLD for process "PID_FMT" (%s)", si.si_pid, strna(name));
1401 /* And now figure out the unit this belongs to */
1402 u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid));
1404 u = manager_get_unit_by_pid(m, si.si_pid);
1406 /* And now, we actually reap the zombie. */
1407 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1414 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
1417 log_debug("Child %lu died (code=%s, status=%i/%s)",
1418 (long unsigned) si.si_pid,
1419 sigchld_code_to_string(si.si_code),
1421 strna(si.si_code == CLD_EXITED
1422 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1423 : signal_to_string(si.si_status)));
1428 log_debug_unit(u->id,
1429 "Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
1431 hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
1432 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
1438 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
1439 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1442 log_debug_unit(name, "Activating special unit %s", name);
1444 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1446 log_error_unit(name, "Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
1451 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1452 Manager *m = userdata;
1454 struct signalfd_siginfo sfsi;
1455 bool sigchld = false;
1458 assert(m->signal_fd == fd);
1460 if (revents != EPOLLIN) {
1461 log_warning("Got unexpected events from signal file descriptor.");
1466 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
1467 if (n != sizeof(sfsi)) {
1472 if (errno == EINTR || errno == EAGAIN)
1478 if (sfsi.ssi_pid > 0) {
1479 _cleanup_free_ char *p = NULL;
1481 get_process_comm(sfsi.ssi_pid, &p);
1483 log_full(sfsi.ssi_signo == SIGCHLD ||
1484 (sfsi.ssi_signo == SIGTERM && m->running_as == SYSTEMD_USER)
1485 ? LOG_DEBUG : LOG_INFO,
1486 "Received SIG%s from PID "PID_FMT" (%s).",
1487 signal_to_string(sfsi.ssi_signo),
1488 sfsi.ssi_pid, strna(p));
1490 log_full(sfsi.ssi_signo == SIGCHLD ||
1491 (sfsi.ssi_signo == SIGTERM && m->running_as == SYSTEMD_USER)
1492 ? LOG_DEBUG : LOG_INFO,
1494 signal_to_string(sfsi.ssi_signo));
1496 switch (sfsi.ssi_signo) {
1503 if (m->running_as == SYSTEMD_SYSTEM) {
1504 /* This is for compatibility with the
1505 * original sysvinit */
1506 m->exit_code = MANAGER_REEXECUTE;
1513 if (m->running_as == SYSTEMD_SYSTEM) {
1514 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
1518 /* Run the exit target if there is one, if not, just exit. */
1519 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
1520 m->exit_code = MANAGER_EXIT;
1527 if (m->running_as == SYSTEMD_SYSTEM)
1528 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
1530 /* This is a nop on non-init */
1534 if (m->running_as == SYSTEMD_SYSTEM)
1535 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
1537 /* This is a nop on non-init */
1543 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1545 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1546 log_info("Trying to reconnect to bus...");
1550 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1551 log_info("Loading D-Bus service...");
1552 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
1559 _cleanup_free_ char *dump = NULL;
1560 _cleanup_fclose_ FILE *f = NULL;
1563 f = open_memstream(&dump, &size);
1565 log_warning("Failed to allocate memory stream.");
1569 manager_dump_units(m, f, "\t");
1570 manager_dump_jobs(m, f, "\t");
1573 log_warning("Failed to write status stream");
1577 log_dump(LOG_INFO, dump);
1582 m->exit_code = MANAGER_RELOAD;
1587 /* Starting SIGRTMIN+0 */
1588 static const char * const target_table[] = {
1589 [0] = SPECIAL_DEFAULT_TARGET,
1590 [1] = SPECIAL_RESCUE_TARGET,
1591 [2] = SPECIAL_EMERGENCY_TARGET,
1592 [3] = SPECIAL_HALT_TARGET,
1593 [4] = SPECIAL_POWEROFF_TARGET,
1594 [5] = SPECIAL_REBOOT_TARGET,
1595 [6] = SPECIAL_KEXEC_TARGET
1598 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1599 static const ManagerExitCode code_table[] = {
1601 [1] = MANAGER_POWEROFF,
1602 [2] = MANAGER_REBOOT,
1606 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
1607 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
1608 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1609 manager_start_target(m, target_table[idx],
1610 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
1614 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1615 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1616 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1620 switch (sfsi.ssi_signo - SIGRTMIN) {
1623 log_debug("Enabling showing of status.");
1624 manager_set_show_status(m, true);
1628 log_debug("Disabling showing of status.");
1629 manager_set_show_status(m, false);
1633 log_set_max_level(LOG_DEBUG);
1634 log_notice("Setting log level to debug.");
1638 log_set_max_level(LOG_INFO);
1639 log_notice("Setting log level to info.");
1643 if (m->running_as == SYSTEMD_USER) {
1644 m->exit_code = MANAGER_EXIT;
1648 /* This is a nop on init */
1652 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1653 log_notice("Setting log target to journal-or-kmsg.");
1657 log_set_target(LOG_TARGET_CONSOLE);
1658 log_notice("Setting log target to console.");
1662 log_set_target(LOG_TARGET_KMSG);
1663 log_notice("Setting log target to kmsg.");
1667 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
1668 log_notice("Setting log target to syslog-or-kmsg.");
1672 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
1679 manager_dispatch_sigchld(m);
1684 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1685 Manager *m = userdata;
1690 assert(m->time_change_fd == fd);
1692 log_struct(LOG_INFO,
1693 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1694 "MESSAGE=Time has been changed",
1697 /* Restart the watch */
1698 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
1700 close_nointr_nofail(m->time_change_fd);
1701 m->time_change_fd = -1;
1703 manager_setup_time_change(m);
1705 HASHMAP_FOREACH(u, m->units, i)
1706 if (UNIT_VTABLE(u)->time_change)
1707 UNIT_VTABLE(u)->time_change(u);
1712 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1713 Manager *m = userdata;
1716 assert(m->idle_pipe[2] == fd);
1718 m->no_console_output = m->n_on_console > 0;
1720 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
1721 manager_close_idle_pipe(m);
1726 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
1727 Manager *m = userdata;
1731 manager_print_jobs_in_progress(m);
1735 int manager_loop(Manager *m) {
1738 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
1741 m->exit_code = MANAGER_RUNNING;
1743 /* Release the path cache */
1744 set_free_free(m->unit_path_cache);
1745 m->unit_path_cache = NULL;
1747 manager_check_finished(m);
1749 /* There might still be some zombies hanging around from
1750 * before we were exec()'ed. Let's reap them. */
1751 r = manager_dispatch_sigchld(m);
1755 while (m->exit_code == MANAGER_RUNNING) {
1758 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
1761 if (!ratelimit_test(&rl)) {
1762 /* Yay, something is going seriously wrong, pause a little */
1763 log_warning("Looping too fast. Throttling execution a little.");
1768 if (manager_dispatch_load_queue(m) > 0)
1771 if (manager_dispatch_gc_queue(m) > 0)
1774 if (manager_dispatch_cleanup_queue(m) > 0)
1777 if (manager_dispatch_cgroup_queue(m) > 0)
1780 if (manager_dispatch_dbus_queue(m) > 0)
1783 /* Sleep for half the watchdog time */
1784 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
1785 wait_usec = m->runtime_watchdog / 2;
1789 wait_usec = (usec_t) -1;
1791 r = sd_event_run(m->event, wait_usec);
1793 log_error("Failed to run event loop: %s", strerror(-r));
1798 return m->exit_code;
1801 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
1802 _cleanup_free_ char *n = NULL;
1810 r = unit_name_from_dbus_path(s, &n);
1814 r = manager_load_unit(m, n, NULL, e, &u);
1823 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
1833 p = startswith(s, "/org/freedesktop/systemd1/job/");
1837 r = safe_atou(p, &id);
1841 j = manager_get_job(m, id);
1850 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
1856 audit_fd = get_audit_fd();
1860 /* Don't generate audit events if the service was already
1861 * started and we're just deserializing */
1862 if (m->n_reloading > 0)
1865 if (m->running_as != SYSTEMD_SYSTEM)
1868 if (u->type != UNIT_SERVICE)
1871 p = unit_name_to_prefix_and_instance(u->id);
1873 log_error_unit(u->id,
1874 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
1878 if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
1879 if (errno == EPERM) {
1880 /* We aren't allowed to send audit messages?
1881 * Then let's not retry again. */
1884 log_warning("Failed to send audit message: %m");
1892 void manager_send_unit_plymouth(Manager *m, Unit *u) {
1894 union sockaddr_union sa;
1896 char *message = NULL;
1898 /* Don't generate plymouth events if the service was already
1899 * started and we're just deserializing */
1900 if (m->n_reloading > 0)
1903 if (m->running_as != SYSTEMD_SYSTEM)
1906 if (detect_container(NULL) > 0)
1909 if (u->type != UNIT_SERVICE &&
1910 u->type != UNIT_MOUNT &&
1911 u->type != UNIT_SWAP)
1914 /* We set SOCK_NONBLOCK here so that we rather drop the
1915 * message then wait for plymouth */
1916 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1918 log_error("socket() failed: %m");
1923 sa.sa.sa_family = AF_UNIX;
1924 strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
1925 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
1927 if (errno != EPIPE &&
1930 errno != ECONNREFUSED &&
1931 errno != ECONNRESET &&
1932 errno != ECONNABORTED)
1933 log_error("connect() failed: %m");
1938 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
1944 if (write(fd, message, n + 1) != n + 1) {
1946 if (errno != EPIPE &&
1949 errno != ECONNREFUSED &&
1950 errno != ECONNRESET &&
1951 errno != ECONNABORTED)
1952 log_error("Failed to write Plymouth message: %m");
1959 close_nointr_nofail(fd);
1964 void manager_dispatch_bus_name_owner_changed(
1967 const char* old_owner,
1968 const char *new_owner) {
1975 u = hashmap_get(m->watch_bus, name);
1979 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
1982 int manager_open_serialization(Manager *m, FILE **_f) {
1983 _cleanup_free_ char *path = NULL;
1989 if (m->running_as == SYSTEMD_SYSTEM)
1990 asprintf(&path, "/run/systemd/dump-"PID_FMT"-XXXXXX", getpid());
1992 asprintf(&path, "/tmp/systemd-dump-"PID_FMT"-XXXXXX", getpid());
1997 RUN_WITH_UMASK(0077) {
1998 fd = mkostemp(path, O_RDWR|O_CLOEXEC);
2005 log_debug("Serializing state to %s", path);
2007 f = fdopen(fd, "w+");
2009 close_nointr_nofail(fd);
2018 int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
2031 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2032 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
2033 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
2034 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
2036 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
2037 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
2038 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
2039 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
2042 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
2043 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2044 dual_timestamp_serialize(f, "security-start-timestamp", &m->security_start_timestamp);
2045 dual_timestamp_serialize(f, "security-finish-timestamp", &m->security_finish_timestamp);
2046 dual_timestamp_serialize(f, "generators-start-timestamp", &m->generators_start_timestamp);
2047 dual_timestamp_serialize(f, "generators-finish-timestamp", &m->generators_finish_timestamp);
2048 dual_timestamp_serialize(f, "units-load-start-timestamp", &m->units_load_start_timestamp);
2049 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
2052 if (!switching_root) {
2053 STRV_FOREACH(e, m->environment) {
2054 _cleanup_free_ char *ce;
2060 fprintf(f, "env=%s\n", *e);
2064 if (m->notify_fd >= 0) {
2067 copy = fdset_put_dup(fds, m->notify_fd);
2071 fprintf(f, "notify-fd=%i\n", copy);
2072 fprintf(f, "notify-socket=%s\n", m->notify_socket);
2075 if (m->kdbus_fd >= 0) {
2078 copy = fdset_put_dup(fds, m->kdbus_fd);
2082 fprintf(f, "kdbus-fd=%i\n", copy);
2085 bus_serialize(m, f);
2089 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
2093 if (!unit_can_serialize(u))
2100 r = unit_serialize(u, f, fds, !switching_root);
2107 assert(m->n_reloading > 0);
2113 r = bus_fdset_add_all(m, fds);
2120 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2126 log_debug("Deserializing state...");
2131 char line[LINE_MAX], *l;
2133 if (!fgets(line, sizeof(line), f)) {
2148 if (startswith(l, "current-job-id=")) {
2151 if (safe_atou32(l+15, &id) < 0)
2152 log_debug("Failed to parse current job id value %s", l+15);
2154 m->current_job_id = MAX(m->current_job_id, id);
2156 } else if (startswith(l, "n-installed-jobs=")) {
2159 if (safe_atou32(l+17, &n) < 0)
2160 log_debug("Failed to parse installed jobs counter %s", l+17);
2162 m->n_installed_jobs += n;
2164 } else if (startswith(l, "n-failed-jobs=")) {
2167 if (safe_atou32(l+14, &n) < 0)
2168 log_debug("Failed to parse failed jobs counter %s", l+14);
2170 m->n_failed_jobs += n;
2172 } else if (startswith(l, "taint-usr=")) {
2175 b = parse_boolean(l+10);
2177 log_debug("Failed to parse taint /usr flag %s", l+10);
2179 m->taint_usr = m->taint_usr || b;
2181 } else if (startswith(l, "firmware-timestamp="))
2182 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2183 else if (startswith(l, "loader-timestamp="))
2184 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2185 else if (startswith(l, "kernel-timestamp="))
2186 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2187 else if (startswith(l, "initrd-timestamp="))
2188 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
2189 else if (startswith(l, "userspace-timestamp="))
2190 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
2191 else if (startswith(l, "finish-timestamp="))
2192 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
2193 else if (startswith(l, "security-start-timestamp="))
2194 dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
2195 else if (startswith(l, "security-finish-timestamp="))
2196 dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
2197 else if (startswith(l, "generators-start-timestamp="))
2198 dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
2199 else if (startswith(l, "generators-finish-timestamp="))
2200 dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
2201 else if (startswith(l, "units-load-start-timestamp="))
2202 dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
2203 else if (startswith(l, "units-load-finish-timestamp="))
2204 dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
2205 else if (startswith(l, "env=")) {
2206 _cleanup_free_ char *uce = NULL;
2209 uce = cunescape(l+4);
2215 e = strv_env_set(m->environment, uce);
2221 strv_free(m->environment);
2224 } else if (startswith(l, "notify-fd=")) {
2227 if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2228 log_debug("Failed to parse notify fd: %s", l + 10);
2230 if (m->notify_fd >= 0) {
2231 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
2232 close_nointr_nofail(m->notify_fd);
2235 m->notify_fd = fdset_remove(fds, fd);
2238 } else if (startswith(l, "notify-socket=")) {
2247 free(m->notify_socket);
2248 m->notify_socket = n;
2250 } else if (startswith(l, "kdbus-fd=")) {
2253 if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2254 log_debug("Failed to parse kdbus fd: %s", l + 9);
2256 if (m->kdbus_fd >= 0)
2257 close_nointr_nofail(m->kdbus_fd);
2259 m->kdbus_fd = fdset_remove(fds, fd);
2262 } else if (bus_deserialize_item(m, l) == 0)
2263 log_debug("Unknown serialization item '%s'", l);
2268 char name[UNIT_NAME_MAX+2];
2271 if (!fgets(name, sizeof(name), f)) {
2282 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2286 r = unit_deserialize(u, f, fds);
2295 assert(m->n_reloading > 0);
2301 int manager_reload(Manager *m) {
2303 _cleanup_fclose_ FILE *f = NULL;
2304 _cleanup_fdset_free_ FDSet *fds = NULL;
2308 r = manager_open_serialization(m, &f);
2313 bus_manager_send_reloading(m, true);
2321 r = manager_serialize(m, f, fds, false);
2327 if (fseeko(f, 0, SEEK_SET) < 0) {
2332 /* From here on there is no way back. */
2333 manager_clear_jobs_and_units(m);
2334 manager_undo_generators(m);
2335 lookup_paths_free(&m->lookup_paths);
2337 /* Find new unit paths */
2338 manager_run_generators(m);
2340 q = lookup_paths_init(
2341 &m->lookup_paths, m->running_as, true,
2342 m->generator_unit_path,
2343 m->generator_unit_path_early,
2344 m->generator_unit_path_late);
2348 manager_build_unit_path_cache(m);
2350 /* First, enumerate what we can from all config files */
2351 q = manager_enumerate(m);
2355 /* Second, deserialize our stored data */
2356 q = manager_deserialize(m, f, fds);
2363 /* Re-register notify_fd as event source */
2364 q = manager_setup_notify(m);
2368 /* Third, fire things up! */
2369 q = manager_coldplug(m);
2373 assert(m->n_reloading > 0);
2376 m->send_reloading_done = true;
2381 static bool manager_is_booting_or_shutting_down(Manager *m) {
2386 /* Is the initial job still around? */
2387 if (manager_get_job(m, m->default_unit_job_id))
2390 /* Is there a job for the shutdown target? */
2391 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2398 bool manager_is_reloading_or_reexecuting(Manager *m) {
2401 return m->n_reloading != 0;
2404 void manager_reset_failed(Manager *m) {
2410 HASHMAP_FOREACH(u, m->units, i)
2411 unit_reset_failed(u);
2414 bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
2420 /* Returns true if the unit is inactive or going down */
2421 u = manager_get_unit(m, name);
2425 return unit_inactive_or_pending(u);
2428 void manager_check_finished(Manager *m) {
2429 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
2430 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
2434 if (m->n_running_jobs == 0)
2435 m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
2437 if (hashmap_size(m->jobs) > 0) {
2438 if (m->jobs_in_progress_event_source)
2439 sd_event_source_set_time(m->jobs_in_progress_event_source, JOBS_IN_PROGRESS_PERIOD_SEC);
2443 /* Notify Type=idle units that we are done now */
2444 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
2445 manager_close_idle_pipe(m);
2447 /* Turn off confirm spawn now */
2448 m->confirm_spawn = false;
2450 if (dual_timestamp_is_set(&m->finish_timestamp))
2453 dual_timestamp_get(&m->finish_timestamp);
2455 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
2457 /* Note that m->kernel_usec.monotonic is always at 0,
2458 * and m->firmware_usec.monotonic and
2459 * m->loader_usec.monotonic should be considered
2460 * negative values. */
2462 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2463 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
2464 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2465 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
2467 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
2469 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2470 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
2472 if (!log_on_console())
2473 log_struct(LOG_INFO,
2474 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2475 "KERNEL_USEC="USEC_FMT, kernel_usec,
2476 "INITRD_USEC="USEC_FMT, initrd_usec,
2477 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2478 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2479 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2480 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2481 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2482 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2485 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
2488 if (!log_on_console())
2489 log_struct(LOG_INFO,
2490 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2491 "KERNEL_USEC="USEC_FMT, kernel_usec,
2492 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2493 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2494 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2495 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2496 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2500 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2501 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2503 if (!log_on_console())
2504 log_struct(LOG_INFO,
2505 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2506 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2507 "MESSAGE=Startup finished in %s.",
2508 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2512 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
2515 "READY=1\nSTATUS=Startup finished in %s.",
2516 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
2519 static int create_generator_dir(Manager *m, char **generator, const char *name) {
2530 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
2531 /* systemd --system, not running --test */
2533 p = strappend("/run/systemd/", name);
2537 r = mkdir_p_label(p, 0755);
2539 log_error("Failed to create generator directory %s: %s",
2544 } else if (m->running_as == SYSTEMD_USER) {
2545 const char *s = NULL;
2547 s = getenv("XDG_RUNTIME_DIR");
2550 p = strjoin(s, "/systemd/", name, NULL);
2554 r = mkdir_p_label(p, 0755);
2556 log_error("Failed to create generator directory %s: %s",
2562 /* systemd --system --test */
2564 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
2569 log_error("Failed to create generator directory %s: %m",
2580 static void trim_generator_dir(Manager *m, char **generator) {
2587 if (rmdir(*generator) >= 0) {
2595 void manager_run_generators(Manager *m) {
2596 _cleanup_closedir_ DIR *d = NULL;
2597 const char *generator_path;
2598 const char *argv[5];
2603 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
2604 d = opendir(generator_path);
2606 if (errno == ENOENT)
2609 log_error("Failed to enumerate generator directory %s: %m",
2614 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2618 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2622 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2626 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2627 argv[1] = m->generator_unit_path;
2628 argv[2] = m->generator_unit_path_early;
2629 argv[3] = m->generator_unit_path_late;
2632 RUN_WITH_UMASK(0022)
2633 execute_directory(generator_path, d, (char**) argv);
2636 trim_generator_dir(m, &m->generator_unit_path);
2637 trim_generator_dir(m, &m->generator_unit_path_early);
2638 trim_generator_dir(m, &m->generator_unit_path_late);
2641 static void remove_generator_dir(Manager *m, char **generator) {
2648 strv_remove(m->lookup_paths.unit_path, *generator);
2649 rm_rf(*generator, false, true, false);
2655 void manager_undo_generators(Manager *m) {
2658 remove_generator_dir(m, &m->generator_unit_path);
2659 remove_generator_dir(m, &m->generator_unit_path_early);
2660 remove_generator_dir(m, &m->generator_unit_path_late);
2663 int manager_environment_add(Manager *m, char **minus, char **plus) {
2664 char **a = NULL, **b = NULL, **l;
2669 if (!strv_isempty(minus)) {
2670 a = strv_env_delete(l, 1, minus);
2677 if (!strv_isempty(plus)) {
2678 b = strv_env_merge(2, l, plus);
2685 if (m->environment != l)
2686 strv_free(m->environment);
2692 m->environment = strv_sort(l);
2696 int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2701 for (i = 0; i < RLIMIT_NLIMITS; i++) {
2702 if (!default_rlimit[i])
2705 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2713 void manager_recheck_journal(Manager *m) {
2718 if (m->running_as != SYSTEMD_SYSTEM)
2721 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2722 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
2723 log_close_journal();
2727 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2728 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
2729 log_close_journal();
2733 /* Hmm, OK, so the socket is fully up and the service is up
2734 * too, then let's make use of the thing. */
2738 void manager_set_show_status(Manager *m, bool b) {
2741 if (m->running_as != SYSTEMD_SYSTEM)
2747 touch("/run/systemd/show-status");
2749 unlink("/run/systemd/show-status");
2752 static bool manager_get_show_status(Manager *m) {
2755 if (m->running_as != SYSTEMD_SYSTEM)
2758 if (m->no_console_output)
2764 /* If Plymouth is running make sure we show the status, so
2765 * that there's something nice to see when people press Esc */
2767 return plymouth_running();
2770 void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
2773 if (!manager_get_show_status(m))
2776 /* XXX We should totally drop the check for ephemeral here
2777 * and thus effectively make 'Type=idle' pointless. */
2778 if (ephemeral && m->n_on_console > 0)
2781 if (!manager_is_booting_or_shutting_down(m))
2784 va_start(ap, format);
2785 status_vprintf(status, true, ephemeral, format, ap);
2789 int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
2790 _cleanup_free_ char *p = NULL;
2798 p = unit_name_from_path(path, suffix);
2802 found = manager_get_unit(m, p);
2812 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
2813 char p[strlen(path)+1];
2819 path_kill_slashes(p);
2821 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);