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/>.
25 #include <sys/epoll.h>
27 #include <sys/signalfd.h>
31 #include <sys/reboot.h>
32 #include <sys/ioctl.h>
36 #include <sys/types.h>
39 #include <sys/timerfd.h>
45 #include "sd-daemon.h"
47 #include "sd-messages.h"
50 #include "transaction.h"
57 #include "ratelimit.h"
58 #include "locale-setup.h"
59 #include "mount-setup.h"
60 #include "unit-name.h"
62 #include "path-lookup.h"
64 #include "exit-status.h"
67 #include "cgroup-util.h"
68 #include "path-util.h"
70 #include "boot-timestamps.h"
72 #include "bus-errors.h"
73 #include "bus-error.h"
76 #include "dbus-unit.h"
78 #include "dbus-manager.h"
79 #include "bus-kernel.h"
81 /* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
82 #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
84 /* Initial delay and the interval for printing status messages about running jobs */
85 #define JOBS_IN_PROGRESS_WAIT_SEC 5
86 #define JOBS_IN_PROGRESS_PERIOD_SEC 1
87 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
89 /* Where clients shall send notification messages to */
90 #define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
92 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
94 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
95 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
96 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
97 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
98 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata);
99 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata);
101 static int manager_setup_notify(Manager *m) {
104 struct sockaddr_un un;
106 .sa.sa_family = AF_UNIX,
110 m->notify_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
111 if (m->notify_fd < 0) {
112 log_error("Failed to allocate notification socket: %m");
116 if (getpid() != 1 || detect_container(NULL) > 0)
117 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%llu", random_ull());
119 strncpy(sa.un.sun_path, NOTIFY_SOCKET, sizeof(sa.un.sun_path));
120 sa.un.sun_path[0] = 0;
122 r = bind(m->notify_fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
124 log_error("bind() failed: %m");
128 r = setsockopt(m->notify_fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
130 log_error("SO_PASSCRED failed: %m");
134 r = sd_event_add_io(m->event, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m, &m->notify_event_source);
136 log_error("Failed to allocate notify event source: %s", strerror(-r));
140 sa.un.sun_path[0] = '@';
141 m->notify_socket = strdup(sa.un.sun_path);
142 if (!m->notify_socket)
145 log_debug("Using notification socket %s", m->notify_socket);
150 static int manager_watch_jobs_in_progress(Manager *m) {
153 if (m->jobs_in_progress_event_source)
156 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);
159 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED_ON)-1) + sizeof(ANSI_HIGHLIGHT_RED_ON)-1 + 2*(sizeof(ANSI_HIGHLIGHT_OFF)-1))
161 static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
164 assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
165 assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
169 p = mempset(p, ' ', pos-2);
170 p = stpcpy(p, ANSI_RED_ON);
174 if (pos > 0 && pos <= width) {
175 p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
179 p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
182 p = stpcpy(p, ANSI_RED_ON);
185 p = mempset(p, ' ', width-1-pos);
186 strcpy(p, ANSI_HIGHLIGHT_OFF);
190 static void manager_print_jobs_in_progress(Manager *m) {
191 _cleanup_free_ char *job_of_n = NULL;
194 unsigned counter = 0, print_nr;
195 char cylon[6 + CYLON_BUFFER_EXTRA + 1];
200 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
202 HASHMAP_FOREACH(j, m->jobs, i)
203 if (j->state == JOB_RUNNING && counter++ == print_nr)
206 /* m->n_running_jobs must be consistent with the contents of m->jobs,
207 * so the above loop must have succeeded in finding j. */
208 assert(counter == print_nr + 1);
211 cylon_pos = m->jobs_in_progress_iteration % 14;
213 cylon_pos = 14 - cylon_pos;
214 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
216 if (m->n_running_jobs > 1)
217 if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
220 manager_status_printf(m, true, cylon, "%sA %s job is running for %s",
221 strempty(job_of_n), job_type_to_string(j->type), unit_description(j->unit));
223 m->jobs_in_progress_iteration++;
226 static int manager_watch_idle_pipe(Manager *m) {
231 if (m->idle_pipe_event_source)
234 if (m->idle_pipe[2] < 0)
237 r = sd_event_add_io(m->event, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m, &m->idle_pipe_event_source);
239 log_error("Failed to watch idle pipe: %s", strerror(-r));
246 static void manager_close_idle_pipe(Manager *m) {
249 close_pipe(m->idle_pipe);
250 close_pipe(m->idle_pipe + 2);
253 static int manager_setup_time_change(Manager *m) {
256 /* We only care for the cancellation event, hence we set the
257 * timeout to the latest possible value. */
258 struct itimerspec its = {
259 .it_value.tv_sec = TIME_T_MAX,
263 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
265 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
266 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
268 m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
269 if (m->time_change_fd < 0) {
270 log_error("Failed to create timerfd: %m");
274 if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
275 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
276 close_nointr_nofail(m->time_change_fd);
277 m->time_change_fd = -1;
281 r = sd_event_add_io(m->event, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m, &m->time_change_event_source);
283 log_error("Failed to create time change event source: %s", strerror(-r));
287 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
292 static int enable_special_signals(Manager *m) {
293 _cleanup_close_ int fd = -1;
297 /* Enable that we get SIGINT on control-alt-del. In containers
298 * this will fail with EPERM (older) or EINVAL (newer), so
300 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
301 log_warning("Failed to enable ctrl-alt-del handling: %m");
303 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
305 /* Support systems without virtual console */
307 log_warning("Failed to open /dev/tty0: %m");
309 /* Enable that we get SIGWINCH on kbrequest */
310 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
311 log_warning("Failed to enable kbrequest handling: %m");
317 static int manager_setup_signals(Manager *m) {
318 struct sigaction sa = {
319 .sa_handler = SIG_DFL,
320 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
327 /* We are not interested in SIGSTOP and friends. */
328 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
330 assert_se(sigemptyset(&mask) == 0);
332 sigset_add_many(&mask,
333 SIGCHLD, /* Child died */
334 SIGTERM, /* Reexecute daemon */
335 SIGHUP, /* Reload configuration */
336 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
337 SIGUSR2, /* systemd: dump status */
338 SIGINT, /* Kernel sends us this on control-alt-del */
339 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
340 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
341 SIGRTMIN+0, /* systemd: start default.target */
342 SIGRTMIN+1, /* systemd: isolate rescue.target */
343 SIGRTMIN+2, /* systemd: isolate emergency.target */
344 SIGRTMIN+3, /* systemd: start halt.target */
345 SIGRTMIN+4, /* systemd: start poweroff.target */
346 SIGRTMIN+5, /* systemd: start reboot.target */
347 SIGRTMIN+6, /* systemd: start kexec.target */
348 SIGRTMIN+13, /* systemd: Immediate halt */
349 SIGRTMIN+14, /* systemd: Immediate poweroff */
350 SIGRTMIN+15, /* systemd: Immediate reboot */
351 SIGRTMIN+16, /* systemd: Immediate kexec */
352 SIGRTMIN+20, /* systemd: enable status messages */
353 SIGRTMIN+21, /* systemd: disable status messages */
354 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
355 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
356 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
357 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
358 SIGRTMIN+27, /* systemd: set log target to console */
359 SIGRTMIN+28, /* systemd: set log target to kmsg */
360 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
362 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
364 m->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
365 if (m->signal_fd < 0)
368 r = sd_event_add_io(m->event, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m, &m->signal_event_source);
372 /* Process signals a bit earlier than the rest of things */
373 r = sd_event_source_set_priority(m->signal_event_source, -5);
377 if (m->running_as == SYSTEMD_SYSTEM)
378 return enable_special_signals(m);
383 static int manager_default_environment(Manager *m) {
386 if (m->running_as == SYSTEMD_SYSTEM) {
387 /* The system manager always starts with a clean
388 * environment for its children. It does not import
389 * the kernel or the parents exported variables.
391 * The initial passed environ is untouched to keep
392 * /proc/self/environ valid; it is used for tagging
393 * the init process inside containers. */
394 m->environment = strv_new("PATH=" DEFAULT_PATH,
397 /* Import locale variables LC_*= from configuration */
398 locale_setup(&m->environment);
400 /* The user manager passes its own environment
401 * along to its children. */
402 m->environment = strv_copy(environ);
407 strv_sort(m->environment);
412 static int manager_setup_kdbus(Manager *m) {
413 _cleanup_free_ char *p = NULL;
417 if (m->kdbus_fd >= 0)
420 /* If there's already a bus address set, don't set up kdbus */
421 if (m->running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS"))
424 m->kdbus_fd = bus_kernel_create(m->running_as == SYSTEMD_SYSTEM ? "system" : "user", &p);
425 if (m->kdbus_fd < 0) {
426 log_debug("Failed to set up kdbus: %s", strerror(-m->kdbus_fd));
430 log_info("Successfully set up kdbus on %s", p);
434 static int manager_connect_bus(Manager *m, bool reexecuting) {
435 bool try_bus_connect;
442 (m->running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS"));
444 /* Try to connect to the busses, if possible. */
445 return bus_init(m, try_bus_connect);
448 int manager_new(SystemdRunningAs running_as, Manager **_m) {
453 assert(running_as >= 0);
454 assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
456 m = new0(Manager, 1);
461 if (detect_container(NULL) <= 0)
462 boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
465 m->running_as = running_as;
466 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
468 m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
470 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;
471 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
473 r = manager_default_environment(m);
477 r = hashmap_ensure_allocated(&m->units, string_hash_func, string_compare_func);
481 r = hashmap_ensure_allocated(&m->jobs, trivial_hash_func, trivial_compare_func);
485 r = hashmap_ensure_allocated(&m->cgroup_unit, string_hash_func, string_compare_func);
489 r = hashmap_ensure_allocated(&m->watch_pids, trivial_hash_func, trivial_compare_func);
493 r = hashmap_ensure_allocated(&m->watch_bus, string_hash_func, string_compare_func);
497 r = sd_event_default(&m->event);
501 r = sd_event_add_defer(m->event, manager_dispatch_run_queue, m, &m->run_queue_event_source);
505 r = sd_event_source_set_priority(m->run_queue_event_source, SD_EVENT_PRIORITY_IDLE);
509 r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_OFF);
513 r = manager_setup_signals(m);
517 r = manager_setup_cgroup(m);
521 r = manager_setup_notify(m);
525 r = manager_setup_time_change(m);
529 m->udev = udev_new();
535 m->taint_usr = dir_is_empty("/usr") > 0;
545 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
551 while ((u = m->cleanup_queue)) {
552 assert(u->in_cleanup_queue);
562 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
563 GC_OFFSET_UNSURE, /* No clue */
564 GC_OFFSET_GOOD, /* We still need this unit */
565 GC_OFFSET_BAD, /* We don't need this unit anymore */
569 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
576 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
577 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
578 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
581 if (u->in_cleanup_queue)
584 if (unit_check_gc(u))
587 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
591 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
592 unit_gc_sweep(other, gc_marker);
594 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
597 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
604 /* We were unable to find anything out about this entry, so
605 * let's investigate it later */
606 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
607 unit_add_to_gc_queue(u);
611 /* We definitely know that this one is not useful anymore, so
612 * let's mark it for deletion */
613 u->gc_marker = gc_marker + GC_OFFSET_BAD;
614 unit_add_to_cleanup_queue(u);
618 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
621 static unsigned manager_dispatch_gc_queue(Manager *m) {
628 /* log_debug("Running GC..."); */
630 m->gc_marker += _GC_OFFSET_MAX;
631 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
634 gc_marker = m->gc_marker;
636 while ((u = m->gc_queue)) {
637 assert(u->in_gc_queue);
639 unit_gc_sweep(u, gc_marker);
641 LIST_REMOVE(gc_queue, m->gc_queue, u);
642 u->in_gc_queue = false;
646 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
647 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
648 log_debug_unit(u->id, "Collecting %s", u->id);
649 u->gc_marker = gc_marker + GC_OFFSET_BAD;
650 unit_add_to_cleanup_queue(u);
654 m->n_in_gc_queue = 0;
659 static void manager_clear_jobs_and_units(Manager *m) {
664 while ((u = hashmap_first(m->units)))
667 manager_dispatch_cleanup_queue(m);
669 assert(!m->load_queue);
670 assert(!m->run_queue);
671 assert(!m->dbus_unit_queue);
672 assert(!m->dbus_job_queue);
673 assert(!m->cleanup_queue);
674 assert(!m->gc_queue);
676 assert(hashmap_isempty(m->jobs));
677 assert(hashmap_isempty(m->units));
680 m->n_running_jobs = 0;
683 void manager_free(Manager *m) {
689 manager_clear_jobs_and_units(m);
691 for (c = 0; c < _UNIT_TYPE_MAX; c++)
692 if (unit_vtable[c]->shutdown)
693 unit_vtable[c]->shutdown(m);
695 /* If we reexecute ourselves, we keep the root cgroup
697 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
699 manager_undo_generators(m);
703 hashmap_free(m->units);
704 hashmap_free(m->jobs);
705 hashmap_free(m->watch_pids);
706 hashmap_free(m->watch_bus);
708 sd_event_source_unref(m->signal_event_source);
709 sd_event_source_unref(m->notify_event_source);
710 sd_event_source_unref(m->time_change_event_source);
711 sd_event_source_unref(m->jobs_in_progress_event_source);
712 sd_event_source_unref(m->idle_pipe_event_source);
713 sd_event_source_unref(m->run_queue_event_source);
715 if (m->signal_fd >= 0)
716 close_nointr_nofail(m->signal_fd);
717 if (m->notify_fd >= 0)
718 close_nointr_nofail(m->notify_fd);
719 if (m->time_change_fd >= 0)
720 close_nointr_nofail(m->time_change_fd);
721 if (m->kdbus_fd >= 0)
722 close_nointr_nofail(m->kdbus_fd);
724 manager_close_idle_pipe(m);
727 sd_event_unref(m->event);
729 free(m->notify_socket);
731 lookup_paths_free(&m->lookup_paths);
732 strv_free(m->environment);
734 hashmap_free(m->cgroup_unit);
735 set_free_free(m->unit_path_cache);
737 free(m->switch_root);
738 free(m->switch_root_init);
740 for (i = 0; i < RLIMIT_NLIMITS; i++)
743 assert(hashmap_isempty(m->units_requiring_mounts_for));
744 hashmap_free(m->units_requiring_mounts_for);
749 int manager_enumerate(Manager *m) {
755 /* Let's ask every type to load all units from disk/kernel
756 * that it might know */
757 for (c = 0; c < _UNIT_TYPE_MAX; c++)
758 if (unit_vtable[c]->enumerate) {
759 q = unit_vtable[c]->enumerate(m);
764 manager_dispatch_load_queue(m);
768 static int manager_coldplug(Manager *m) {
776 /* Then, let's set up their initial state. */
777 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
783 if ((q = unit_coldplug(u)) < 0)
790 static void manager_build_unit_path_cache(Manager *m) {
792 _cleanup_free_ DIR *d = NULL;
797 set_free_free(m->unit_path_cache);
799 m->unit_path_cache = set_new(string_hash_func, string_compare_func);
800 if (!m->unit_path_cache) {
801 log_error("Failed to allocate unit path cache.");
805 /* This simply builds a list of files we know exist, so that
806 * we don't always have to go to disk */
808 STRV_FOREACH(i, m->lookup_paths.unit_path) {
814 log_error("Failed to open directory %s: %m", *i);
818 while ((de = readdir(d))) {
821 if (ignore_file(de->d_name))
824 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
830 r = set_consume(m->unit_path_cache, p);
842 log_error("Failed to build unit path cache: %s", strerror(-r));
844 set_free_free(m->unit_path_cache);
845 m->unit_path_cache = NULL;
849 static int manager_distribute_fds(Manager *m, FDSet *fds) {
856 HASHMAP_FOREACH(u, m->units, i) {
858 if (fdset_size(fds) <= 0)
861 if (UNIT_VTABLE(u)->distribute_fds) {
862 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
871 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
876 dual_timestamp_get(&m->generators_start_timestamp);
877 manager_run_generators(m);
878 dual_timestamp_get(&m->generators_finish_timestamp);
880 r = lookup_paths_init(
881 &m->lookup_paths, m->running_as, true,
882 m->generator_unit_path,
883 m->generator_unit_path_early,
884 m->generator_unit_path_late);
888 manager_build_unit_path_cache(m);
890 /* If we will deserialize make sure that during enumeration
891 * this is already known, so we increase the counter here
896 /* First, enumerate what we can from all config files */
897 dual_timestamp_get(&m->units_load_start_timestamp);
898 r = manager_enumerate(m);
899 dual_timestamp_get(&m->units_load_finish_timestamp);
901 /* Second, deserialize if there is something to deserialize */
903 q = manager_deserialize(m, serialization, fds);
908 /* Any fds left? Find some unit which wants them. This is
909 * useful to allow container managers to pass some file
910 * descriptors to us pre-initialized. This enables
911 * socket-based activation of entire containers. */
912 if (fdset_size(fds) > 0) {
913 q = manager_distribute_fds(m, fds);
918 /* We might have deserialized the kdbus control fd, but if we
919 * didn't, then let's create the bus now. */
920 manager_setup_kdbus(m);
921 manager_connect_bus(m, !!serialization);
923 /* Third, fire things up! */
924 q = manager_coldplug(m);
929 assert(m->n_reloading > 0);
932 /* Let's wait for the UnitNew/JobNew messages being
933 * sent, before we notify that the reload is
935 m->send_reloading_done = true;
941 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
946 assert(type < _JOB_TYPE_MAX);
948 assert(mode < _JOB_MODE_MAX);
950 if (mode == JOB_ISOLATE && type != JOB_START) {
951 sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Isolate is only valid for start.");
955 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
956 sd_bus_error_setf(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
960 log_debug_unit(unit->id,
961 "Trying to enqueue job %s/%s/%s", unit->id,
962 job_type_to_string(type), job_mode_to_string(mode));
964 job_type_collapse(&type, unit);
966 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
970 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
971 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
972 mode == JOB_IGNORE_DEPENDENCIES, e);
976 if (mode == JOB_ISOLATE) {
977 r = transaction_add_isolate_jobs(tr, m);
982 r = transaction_activate(tr, m, mode, e);
986 log_debug_unit(unit->id,
987 "Enqueued job %s/%s as %u", unit->id,
988 job_type_to_string(type), (unsigned) tr->anchor_job->id);
991 *_ret = tr->anchor_job;
993 transaction_free(tr);
997 transaction_abort(tr);
998 transaction_free(tr);
1002 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1007 assert(type < _JOB_TYPE_MAX);
1009 assert(mode < _JOB_MODE_MAX);
1011 r = manager_load_unit(m, name, NULL, NULL, &unit);
1015 return manager_add_job(m, type, unit, mode, override, e, _ret);
1018 Job *manager_get_job(Manager *m, uint32_t id) {
1021 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1024 Unit *manager_get_unit(Manager *m, const char *name) {
1028 return hashmap_get(m->units, name);
1031 unsigned manager_dispatch_load_queue(Manager *m) {
1037 /* Make sure we are not run recursively */
1038 if (m->dispatching_load_queue)
1041 m->dispatching_load_queue = true;
1043 /* Dispatches the load queue. Takes a unit from the queue and
1044 * tries to load its data until the queue is empty */
1046 while ((u = m->load_queue)) {
1047 assert(u->in_load_queue);
1053 m->dispatching_load_queue = false;
1057 int manager_load_unit_prepare(
1069 assert(name || path);
1071 /* This will prepare the unit for loading, but not actually
1072 * load anything from disk. */
1074 if (path && !is_path(path))
1075 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
1078 name = path_get_file_name(path);
1080 t = unit_name_to_type(name);
1082 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, false))
1083 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is not valid.", name);
1085 ret = manager_get_unit(m, name);
1091 ret = unit_new(m, unit_vtable[t]->object_size);
1096 ret->fragment_path = strdup(path);
1097 if (!ret->fragment_path) {
1103 r = unit_add_name(ret, name);
1109 unit_add_to_load_queue(ret);
1110 unit_add_to_dbus_queue(ret);
1111 unit_add_to_gc_queue(ret);
1119 int manager_load_unit(
1130 /* This will load the service information files, but not actually
1131 * start any services or anything. */
1133 r = manager_load_unit_prepare(m, name, path, e, _ret);
1137 manager_dispatch_load_queue(m);
1140 *_ret = unit_follow_merge(*_ret);
1145 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
1152 HASHMAP_FOREACH(j, s->jobs, i)
1153 job_dump(j, f, prefix);
1156 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
1164 HASHMAP_FOREACH_KEY(u, t, s->units, i)
1166 unit_dump(u, f, prefix);
1169 void manager_clear_jobs(Manager *m) {
1174 while ((j = hashmap_first(m->jobs)))
1175 /* No need to recurse. We're cancelling all jobs. */
1176 job_finish_and_invalidate(j, JOB_CANCELED, false);
1179 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
1180 Manager *m = userdata;
1186 while ((j = m->run_queue)) {
1187 assert(j->installed);
1188 assert(j->in_run_queue);
1190 job_run_and_invalidate(j);
1193 if (m->n_running_jobs > 0)
1194 manager_watch_jobs_in_progress(m);
1196 if (m->n_on_console > 0)
1197 manager_watch_idle_pipe(m);
1202 static unsigned manager_dispatch_dbus_queue(Manager *m) {
1209 if (m->dispatching_dbus_queue)
1212 m->dispatching_dbus_queue = true;
1214 while ((u = m->dbus_unit_queue)) {
1215 assert(u->in_dbus_queue);
1217 bus_unit_send_change_signal(u);
1221 while ((j = m->dbus_job_queue)) {
1222 assert(j->in_dbus_queue);
1224 bus_job_send_change_signal(j);
1228 m->dispatching_dbus_queue = false;
1230 if (m->send_reloading_done) {
1231 m->send_reloading_done = false;
1233 bus_manager_send_reloading(m, false);
1236 if (m->queued_message)
1237 bus_send_queued_message(m);
1242 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1243 Manager *m = userdata;
1247 assert(m->notify_fd == fd);
1249 if (revents != EPOLLIN) {
1250 log_warning("Got unexpected poll event for notify fd.");
1256 struct iovec iovec = {
1258 .iov_len = sizeof(buf)-1,
1262 struct cmsghdr cmsghdr;
1263 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
1266 struct msghdr msghdr = {
1269 .msg_control = &control,
1270 .msg_controllen = sizeof(control),
1272 struct ucred *ucred;
1274 _cleanup_strv_free_ char **tags = NULL;
1276 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT);
1281 if (errno == EAGAIN || errno == EINTR)
1287 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1288 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1289 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1290 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1291 log_warning("Received notify message without credentials. Ignoring.");
1295 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1297 u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid));
1299 u = manager_get_unit_by_pid(m, ucred->pid);
1301 log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred->pid);
1306 assert((size_t) n < sizeof(buf));
1308 tags = strv_split(buf, "\n\r");
1312 log_debug_unit(u->id, "Got notification message for unit %s", u->id);
1314 if (UNIT_VTABLE(u)->notify_message)
1315 UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
1321 static int manager_dispatch_sigchld(Manager *m) {
1329 /* First we call waitd() for a PID and do not reap the
1330 * zombie. That way we can still access /proc/$PID for
1331 * it while it is a zombie. */
1332 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
1334 if (errno == ECHILD)
1346 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
1347 _cleanup_free_ char *name = NULL;
1349 get_process_comm(si.si_pid, &name);
1350 log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
1353 /* Let's flush any message the dying child might still
1354 * have queued for us. This ensures that the process
1355 * still exists in /proc so that we can figure out
1356 * which cgroup and hence unit it belongs to. */
1357 r = manager_dispatch_notify_fd(m->notify_event_source, m->notify_fd, EPOLLIN, m);
1361 /* And now figure out the unit this belongs to */
1362 u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid));
1364 u = manager_get_unit_by_pid(m, si.si_pid);
1366 /* And now, we actually reap the zombie. */
1367 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1374 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
1377 log_debug("Child %lu died (code=%s, status=%i/%s)",
1378 (long unsigned) si.si_pid,
1379 sigchld_code_to_string(si.si_code),
1381 strna(si.si_code == CLD_EXITED
1382 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1383 : signal_to_string(si.si_status)));
1388 log_debug_unit(u->id,
1389 "Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
1391 hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
1392 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
1398 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
1399 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1402 log_debug_unit(name, "Activating special unit %s", name);
1404 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1406 log_error_unit(name, "Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
1411 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1412 Manager *m = userdata;
1414 struct signalfd_siginfo sfsi;
1415 bool sigchld = false;
1418 assert(m->signal_fd == fd);
1420 if (revents != EPOLLIN) {
1421 log_warning("Got unexpected events from signal file descriptor.");
1426 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
1427 if (n != sizeof(sfsi)) {
1432 if (errno == EINTR || errno == EAGAIN)
1438 if (sfsi.ssi_pid > 0) {
1441 get_process_comm(sfsi.ssi_pid, &p);
1443 log_debug("Received SIG%s from PID %lu (%s).",
1444 signal_to_string(sfsi.ssi_signo),
1445 (unsigned long) sfsi.ssi_pid, strna(p));
1448 log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
1450 switch (sfsi.ssi_signo) {
1457 if (m->running_as == SYSTEMD_SYSTEM) {
1458 /* This is for compatibility with the
1459 * original sysvinit */
1460 m->exit_code = MANAGER_REEXECUTE;
1467 if (m->running_as == SYSTEMD_SYSTEM) {
1468 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
1472 /* Run the exit target if there is one, if not, just exit. */
1473 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
1474 m->exit_code = MANAGER_EXIT;
1481 if (m->running_as == SYSTEMD_SYSTEM)
1482 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
1484 /* This is a nop on non-init */
1488 if (m->running_as == SYSTEMD_SYSTEM)
1489 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
1491 /* This is a nop on non-init */
1497 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1499 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1500 log_info("Trying to reconnect to bus...");
1504 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1505 log_info("Loading D-Bus service...");
1506 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
1513 _cleanup_free_ char *dump = NULL;
1514 _cleanup_fclose_ FILE *f = NULL;
1517 f = open_memstream(&dump, &size);
1519 log_warning("Failed to allocate memory stream.");
1523 manager_dump_units(m, f, "\t");
1524 manager_dump_jobs(m, f, "\t");
1527 log_warning("Failed to write status stream");
1531 log_dump(LOG_INFO, dump);
1536 m->exit_code = MANAGER_RELOAD;
1541 /* Starting SIGRTMIN+0 */
1542 static const char * const target_table[] = {
1543 [0] = SPECIAL_DEFAULT_TARGET,
1544 [1] = SPECIAL_RESCUE_TARGET,
1545 [2] = SPECIAL_EMERGENCY_TARGET,
1546 [3] = SPECIAL_HALT_TARGET,
1547 [4] = SPECIAL_POWEROFF_TARGET,
1548 [5] = SPECIAL_REBOOT_TARGET,
1549 [6] = SPECIAL_KEXEC_TARGET
1552 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1553 static const ManagerExitCode code_table[] = {
1555 [1] = MANAGER_POWEROFF,
1556 [2] = MANAGER_REBOOT,
1560 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
1561 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
1562 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1563 manager_start_target(m, target_table[idx],
1564 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
1568 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1569 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1570 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1574 switch (sfsi.ssi_signo - SIGRTMIN) {
1577 log_debug("Enabling showing of status.");
1578 manager_set_show_status(m, true);
1582 log_debug("Disabling showing of status.");
1583 manager_set_show_status(m, false);
1587 log_set_max_level(LOG_DEBUG);
1588 log_notice("Setting log level to debug.");
1592 log_set_max_level(LOG_INFO);
1593 log_notice("Setting log level to info.");
1597 if (m->running_as == SYSTEMD_USER) {
1598 m->exit_code = MANAGER_EXIT;
1602 /* This is a nop on init */
1606 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1607 log_notice("Setting log target to journal-or-kmsg.");
1611 log_set_target(LOG_TARGET_CONSOLE);
1612 log_notice("Setting log target to console.");
1616 log_set_target(LOG_TARGET_KMSG);
1617 log_notice("Setting log target to kmsg.");
1621 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
1622 log_notice("Setting log target to syslog-or-kmsg.");
1626 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
1633 return manager_dispatch_sigchld(m);
1638 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1639 Manager *m = userdata;
1644 assert(m->time_change_fd == fd);
1646 log_struct(LOG_INFO,
1647 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1648 "MESSAGE=Time has been changed",
1651 /* Restart the watch */
1652 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
1654 close_nointr_nofail(m->time_change_fd);
1655 m->time_change_fd = -1;
1657 manager_setup_time_change(m);
1659 HASHMAP_FOREACH(u, m->units, i)
1660 if (UNIT_VTABLE(u)->time_change)
1661 UNIT_VTABLE(u)->time_change(u);
1666 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1667 Manager *m = userdata;
1670 assert(m->idle_pipe[2] == fd);
1672 m->no_console_output = m->n_on_console > 0;
1674 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
1675 manager_close_idle_pipe(m);
1680 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
1681 Manager *m = userdata;
1685 manager_print_jobs_in_progress(m);
1689 int manager_loop(Manager *m) {
1692 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
1695 m->exit_code = MANAGER_RUNNING;
1697 /* Release the path cache */
1698 set_free_free(m->unit_path_cache);
1699 m->unit_path_cache = NULL;
1701 manager_check_finished(m);
1703 /* There might still be some zombies hanging around from
1704 * before we were exec()'ed. Let's reap them. */
1705 r = manager_dispatch_sigchld(m);
1709 while (m->exit_code == MANAGER_RUNNING) {
1712 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
1715 if (!ratelimit_test(&rl)) {
1716 /* Yay, something is going seriously wrong, pause a little */
1717 log_warning("Looping too fast. Throttling execution a little.");
1722 if (manager_dispatch_load_queue(m) > 0)
1725 if (manager_dispatch_gc_queue(m) > 0)
1728 if (manager_dispatch_cleanup_queue(m) > 0)
1731 if (manager_dispatch_cgroup_queue(m) > 0)
1734 if (manager_dispatch_dbus_queue(m) > 0)
1737 /* Sleep for half the watchdog time */
1738 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
1739 wait_usec = m->runtime_watchdog / 2;
1743 wait_usec = (usec_t) -1;
1745 r = sd_event_run(m->event, wait_usec);
1747 log_error("Failed to run event loop: %s", strerror(-r));
1752 return m->exit_code;
1755 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
1756 _cleanup_free_ char *n = NULL;
1764 r = unit_name_from_dbus_path(s, &n);
1768 r = manager_load_unit(m, n, NULL, e, &u);
1777 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
1787 p = startswith(s, "/org/freedesktop/systemd1/job/");
1791 r = safe_atou(p, &id);
1795 j = manager_get_job(m, id);
1804 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
1810 audit_fd = get_audit_fd();
1814 /* Don't generate audit events if the service was already
1815 * started and we're just deserializing */
1816 if (m->n_reloading > 0)
1819 if (m->running_as != SYSTEMD_SYSTEM)
1822 if (u->type != UNIT_SERVICE)
1825 p = unit_name_to_prefix_and_instance(u->id);
1827 log_error_unit(u->id,
1828 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
1832 if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
1833 if (errno == EPERM) {
1834 /* We aren't allowed to send audit messages?
1835 * Then let's not retry again. */
1838 log_warning("Failed to send audit message: %m");
1846 void manager_send_unit_plymouth(Manager *m, Unit *u) {
1848 union sockaddr_union sa;
1850 char *message = NULL;
1852 /* Don't generate plymouth events if the service was already
1853 * started and we're just deserializing */
1854 if (m->n_reloading > 0)
1857 if (m->running_as != SYSTEMD_SYSTEM)
1860 if (detect_container(NULL) > 0)
1863 if (u->type != UNIT_SERVICE &&
1864 u->type != UNIT_MOUNT &&
1865 u->type != UNIT_SWAP)
1868 /* We set SOCK_NONBLOCK here so that we rather drop the
1869 * message then wait for plymouth */
1870 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1872 log_error("socket() failed: %m");
1877 sa.sa.sa_family = AF_UNIX;
1878 strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
1879 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
1881 if (errno != EPIPE &&
1884 errno != ECONNREFUSED &&
1885 errno != ECONNRESET &&
1886 errno != ECONNABORTED)
1887 log_error("connect() failed: %m");
1892 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
1898 if (write(fd, message, n + 1) != n + 1) {
1900 if (errno != EPIPE &&
1903 errno != ECONNREFUSED &&
1904 errno != ECONNRESET &&
1905 errno != ECONNABORTED)
1906 log_error("Failed to write Plymouth message: %m");
1913 close_nointr_nofail(fd);
1918 void manager_dispatch_bus_name_owner_changed(
1921 const char* old_owner,
1922 const char *new_owner) {
1929 u = hashmap_get(m->watch_bus, name);
1933 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
1936 int manager_open_serialization(Manager *m, FILE **_f) {
1943 if (m->running_as == SYSTEMD_SYSTEM)
1944 asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
1946 asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
1951 RUN_WITH_UMASK(0077) {
1952 fd = mkostemp(path, O_RDWR|O_CLOEXEC);
1962 log_debug("Serializing state to %s", path);
1965 f = fdopen(fd, "w+");
1974 int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
1987 fprintf(f, "current-job-id=%i\n", m->current_job_id);
1988 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
1989 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
1990 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
1992 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
1993 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
1994 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
1995 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
1998 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
1999 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2000 dual_timestamp_serialize(f, "security-start-timestamp", &m->security_start_timestamp);
2001 dual_timestamp_serialize(f, "security-finish-timestamp", &m->security_finish_timestamp);
2002 dual_timestamp_serialize(f, "generators-start-timestamp", &m->generators_start_timestamp);
2003 dual_timestamp_serialize(f, "generators-finish-timestamp", &m->generators_finish_timestamp);
2004 dual_timestamp_serialize(f, "units-load-start-timestamp", &m->units_load_start_timestamp);
2005 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
2008 if (!switching_root) {
2009 STRV_FOREACH(e, m->environment) {
2010 _cleanup_free_ char *ce;
2016 fprintf(f, "env=%s\n", *e);
2020 if (m->kdbus_fd >= 0) {
2023 copy = fdset_put_dup(fds, m->kdbus_fd);
2027 fprintf(f, "kdbus-fd=%i\n", copy);
2030 bus_serialize(m, f);
2034 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
2038 if (!unit_can_serialize(u))
2045 r = unit_serialize(u, f, fds, !switching_root);
2052 assert(m->n_reloading > 0);
2058 r = bus_fdset_add_all(m, fds);
2065 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2071 log_debug("Deserializing state...");
2076 char line[LINE_MAX], *l;
2078 if (!fgets(line, sizeof(line), f)) {
2093 if (startswith(l, "current-job-id=")) {
2096 if (safe_atou32(l+15, &id) < 0)
2097 log_debug("Failed to parse current job id value %s", l+15);
2099 m->current_job_id = MAX(m->current_job_id, id);
2101 } else if (startswith(l, "n-installed-jobs=")) {
2104 if (safe_atou32(l+17, &n) < 0)
2105 log_debug("Failed to parse installed jobs counter %s", l+17);
2107 m->n_installed_jobs += n;
2109 } else if (startswith(l, "n-failed-jobs=")) {
2112 if (safe_atou32(l+14, &n) < 0)
2113 log_debug("Failed to parse failed jobs counter %s", l+14);
2115 m->n_failed_jobs += n;
2117 } else if (startswith(l, "taint-usr=")) {
2120 b = parse_boolean(l+10);
2122 log_debug("Failed to parse taint /usr flag %s", l+10);
2124 m->taint_usr = m->taint_usr || b;
2126 } else if (startswith(l, "firmware-timestamp="))
2127 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2128 else if (startswith(l, "loader-timestamp="))
2129 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2130 else if (startswith(l, "kernel-timestamp="))
2131 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2132 else if (startswith(l, "initrd-timestamp="))
2133 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
2134 else if (startswith(l, "userspace-timestamp="))
2135 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
2136 else if (startswith(l, "finish-timestamp="))
2137 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
2138 else if (startswith(l, "security-start-timestamp="))
2139 dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
2140 else if (startswith(l, "security-finish-timestamp="))
2141 dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
2142 else if (startswith(l, "generators-start-timestamp="))
2143 dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
2144 else if (startswith(l, "generators-finish-timestamp="))
2145 dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
2146 else if (startswith(l, "units-load-start-timestamp="))
2147 dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
2148 else if (startswith(l, "units-load-finish-timestamp="))
2149 dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
2150 else if (startswith(l, "env=")) {
2151 _cleanup_free_ char *uce = NULL;
2154 uce = cunescape(l+4);
2160 e = strv_env_set(m->environment, uce);
2166 strv_free(m->environment);
2169 } else if (startswith(l, "kdbus-fd=")) {
2172 if (safe_atoi(l + 9, &fd) < 0 || !fdset_contains(fds, fd))
2173 log_debug("Failed to parse kdbus fd: %s", l + 9);
2175 if (m->kdbus_fd >= 0)
2176 close_nointr_nofail(m->kdbus_fd);
2178 m->kdbus_fd = fdset_remove(fds, fd);
2181 } else if (bus_deserialize_item(m, l) == 0)
2182 log_debug("Unknown serialization item '%s'", l);
2187 char name[UNIT_NAME_MAX+2];
2190 if (!fgets(name, sizeof(name), f)) {
2201 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2205 r = unit_deserialize(u, f, fds);
2216 assert(m->n_reloading > 0);
2222 int manager_reload(Manager *m) {
2224 _cleanup_fclose_ FILE *f = NULL;
2225 _cleanup_fdset_free_ FDSet *fds = NULL;
2229 r = manager_open_serialization(m, &f);
2234 bus_manager_send_reloading(m, true);
2242 r = manager_serialize(m, f, fds, false);
2248 if (fseeko(f, 0, SEEK_SET) < 0) {
2253 /* From here on there is no way back. */
2254 manager_clear_jobs_and_units(m);
2255 manager_undo_generators(m);
2256 lookup_paths_free(&m->lookup_paths);
2258 /* Find new unit paths */
2259 manager_run_generators(m);
2261 q = lookup_paths_init(
2262 &m->lookup_paths, m->running_as, true,
2263 m->generator_unit_path,
2264 m->generator_unit_path_early,
2265 m->generator_unit_path_late);
2269 manager_build_unit_path_cache(m);
2271 /* First, enumerate what we can from all config files */
2272 q = manager_enumerate(m);
2276 /* Second, deserialize our stored data */
2277 q = manager_deserialize(m, f, fds);
2284 /* Third, fire things up! */
2285 q = manager_coldplug(m);
2289 assert(m->n_reloading > 0);
2292 m->send_reloading_done = true;
2297 static bool manager_is_booting_or_shutting_down(Manager *m) {
2302 /* Is the initial job still around? */
2303 if (manager_get_job(m, m->default_unit_job_id))
2306 /* Is there a job for the shutdown target? */
2307 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2314 bool manager_is_reloading_or_reexecuting(Manager *m) {
2317 return m->n_reloading != 0;
2320 void manager_reset_failed(Manager *m) {
2326 HASHMAP_FOREACH(u, m->units, i)
2327 unit_reset_failed(u);
2330 bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
2336 /* Returns true if the unit is inactive or going down */
2337 u = manager_get_unit(m, name);
2341 return unit_inactive_or_pending(u);
2344 void manager_check_finished(Manager *m) {
2345 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
2346 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
2350 if (m->n_running_jobs == 0)
2351 m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
2353 if (hashmap_size(m->jobs) > 0) {
2354 if (m->jobs_in_progress_event_source)
2355 sd_event_source_set_time(m->jobs_in_progress_event_source, JOBS_IN_PROGRESS_PERIOD_SEC);
2359 /* Notify Type=idle units that we are done now */
2360 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
2361 manager_close_idle_pipe(m);
2363 /* Turn off confirm spawn now */
2364 m->confirm_spawn = false;
2366 if (dual_timestamp_is_set(&m->finish_timestamp))
2369 dual_timestamp_get(&m->finish_timestamp);
2371 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
2373 /* Note that m->kernel_usec.monotonic is always at 0,
2374 * and m->firmware_usec.monotonic and
2375 * m->loader_usec.monotonic should be considered
2376 * negative values. */
2378 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2379 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
2380 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2381 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
2383 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
2385 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2386 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
2388 if (!log_on_console())
2389 log_struct(LOG_INFO,
2390 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2391 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
2392 "INITRD_USEC=%llu", (unsigned long long) initrd_usec,
2393 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2394 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2395 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2396 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2397 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2398 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2401 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
2404 if (!log_on_console())
2405 log_struct(LOG_INFO,
2406 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2407 "KERNEL_USEC=%llu", (unsigned long long) kernel_usec,
2408 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2409 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2410 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2411 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2412 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2416 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2417 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2419 if (!log_on_console())
2420 log_struct(LOG_INFO,
2421 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2422 "USERSPACE_USEC=%llu", (unsigned long long) userspace_usec,
2423 "MESSAGE=Startup finished in %s.",
2424 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2428 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
2431 "READY=1\nSTATUS=Startup finished in %s.",
2432 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
2435 static int create_generator_dir(Manager *m, char **generator, const char *name) {
2446 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
2448 p = strappend("/run/systemd/", name);
2452 r = mkdir_p_label(p, 0755);
2454 log_error("Failed to create generator directory %s: %s",
2460 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
2465 log_error("Failed to create generator directory %s: %m",
2476 static void trim_generator_dir(Manager *m, char **generator) {
2483 if (rmdir(*generator) >= 0) {
2491 void manager_run_generators(Manager *m) {
2492 _cleanup_closedir_ DIR *d = NULL;
2493 const char *generator_path;
2494 const char *argv[5];
2499 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
2500 d = opendir(generator_path);
2502 if (errno == ENOENT)
2505 log_error("Failed to enumerate generator directory %s: %m",
2510 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2514 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2518 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2522 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2523 argv[1] = m->generator_unit_path;
2524 argv[2] = m->generator_unit_path_early;
2525 argv[3] = m->generator_unit_path_late;
2528 RUN_WITH_UMASK(0022)
2529 execute_directory(generator_path, d, (char**) argv);
2532 trim_generator_dir(m, &m->generator_unit_path);
2533 trim_generator_dir(m, &m->generator_unit_path_early);
2534 trim_generator_dir(m, &m->generator_unit_path_late);
2537 static void remove_generator_dir(Manager *m, char **generator) {
2544 strv_remove(m->lookup_paths.unit_path, *generator);
2545 rm_rf(*generator, false, true, false);
2551 void manager_undo_generators(Manager *m) {
2554 remove_generator_dir(m, &m->generator_unit_path);
2555 remove_generator_dir(m, &m->generator_unit_path_early);
2556 remove_generator_dir(m, &m->generator_unit_path_late);
2559 int manager_environment_add(Manager *m, char **minus, char **plus) {
2560 char **a = NULL, **b = NULL, **l;
2565 if (!strv_isempty(minus)) {
2566 a = strv_env_delete(l, 1, minus);
2573 if (!strv_isempty(plus)) {
2574 b = strv_env_merge(2, l, plus);
2581 if (m->environment != l)
2582 strv_free(m->environment);
2588 m->environment = strv_sort(l);
2592 int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2597 for (i = 0; i < RLIMIT_NLIMITS; i++) {
2598 if (!default_rlimit[i])
2601 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2609 void manager_recheck_journal(Manager *m) {
2614 if (m->running_as != SYSTEMD_SYSTEM)
2617 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2618 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
2619 log_close_journal();
2623 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2624 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
2625 log_close_journal();
2629 /* Hmm, OK, so the socket is fully up and the service is up
2630 * too, then let's make use of the thing. */
2634 void manager_set_show_status(Manager *m, bool b) {
2637 if (m->running_as != SYSTEMD_SYSTEM)
2643 touch("/run/systemd/show-status");
2645 unlink("/run/systemd/show-status");
2648 static bool manager_get_show_status(Manager *m) {
2651 if (m->running_as != SYSTEMD_SYSTEM)
2654 if (m->no_console_output)
2660 /* If Plymouth is running make sure we show the status, so
2661 * that there's something nice to see when people press Esc */
2663 return plymouth_running();
2666 void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
2669 if (!manager_get_show_status(m))
2672 /* XXX We should totally drop the check for ephemeral here
2673 * and thus effectively make 'Type=idle' pointless. */
2674 if (ephemeral && m->n_on_console > 0)
2677 if (!manager_is_booting_or_shutting_down(m))
2680 va_start(ap, format);
2681 status_vprintf(status, true, ephemeral, format, ap);
2685 int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
2686 _cleanup_free_ char *p = NULL;
2694 p = unit_name_from_path(path, suffix);
2698 found = manager_get_unit(m, p);
2708 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
2709 char p[strlen(path)+1];
2715 path_kill_slashes(p);
2717 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);