1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
29 #include <sys/reboot.h>
30 #include <sys/ioctl.h>
34 #include <sys/types.h>
37 #include <sys/timerfd.h>
43 #include "sd-daemon.h"
45 #include "sd-messages.h"
48 #include "transaction.h"
55 #include "ratelimit.h"
56 #include "locale-setup.h"
57 #include "mount-setup.h"
58 #include "unit-name.h"
60 #include "path-lookup.h"
62 #include "exit-status.h"
65 #include "cgroup-util.h"
66 #include "path-util.h"
68 #include "boot-timestamps.h"
70 #include "bus-errors.h"
71 #include "bus-error.h"
74 #include "dbus-unit.h"
76 #include "dbus-manager.h"
77 #include "bus-kernel.h"
79 /* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
80 #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
82 /* Initial delay and the interval for printing status messages about running jobs */
83 #define JOBS_IN_PROGRESS_WAIT_USEC (5*USEC_PER_SEC)
84 #define JOBS_IN_PROGRESS_PERIOD_USEC (USEC_PER_SEC / 3)
85 #define JOBS_IN_PROGRESS_PERIOD_DIVISOR 3
87 /* 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) {
104 if (m->jobs_in_progress_event_source)
107 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC;
108 return sd_event_add_monotonic(m->event, &m->jobs_in_progress_event_source, next, 0, manager_dispatch_jobs_in_progress, m);
111 #define CYLON_BUFFER_EXTRA (2*(sizeof(ANSI_RED_ON)-1) + sizeof(ANSI_HIGHLIGHT_RED_ON)-1 + 2*(sizeof(ANSI_HIGHLIGHT_OFF)-1))
113 static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned pos) {
116 assert(buflen >= CYLON_BUFFER_EXTRA + width + 1);
117 assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
121 p = mempset(p, ' ', pos-2);
122 p = stpcpy(p, ANSI_RED_ON);
126 if (pos > 0 && pos <= width) {
127 p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
131 p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
134 p = stpcpy(p, ANSI_RED_ON);
137 p = mempset(p, ' ', width-1-pos);
138 strcpy(p, ANSI_HIGHLIGHT_OFF);
142 void manager_flip_auto_status(Manager *m, bool enable) {
146 if (m->show_status == SHOW_STATUS_AUTO)
147 manager_set_show_status(m, SHOW_STATUS_TEMPORARY);
149 if (m->show_status == SHOW_STATUS_TEMPORARY)
150 manager_set_show_status(m, SHOW_STATUS_AUTO);
154 static void manager_print_jobs_in_progress(Manager *m) {
155 _cleanup_free_ char *job_of_n = NULL;
158 unsigned counter = 0, print_nr;
159 char cylon[6 + CYLON_BUFFER_EXTRA + 1];
161 char time[FORMAT_TIMESPAN_MAX], limit[FORMAT_TIMESPAN_MAX] = "no limit";
166 manager_flip_auto_status(m, true);
168 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
170 HASHMAP_FOREACH(j, m->jobs, i)
171 if (j->state == JOB_RUNNING && counter++ == print_nr)
174 /* m->n_running_jobs must be consistent with the contents of m->jobs,
175 * so the above loop must have succeeded in finding j. */
176 assert(counter == print_nr + 1);
179 cylon_pos = m->jobs_in_progress_iteration % 14;
181 cylon_pos = 14 - cylon_pos;
182 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
184 m->jobs_in_progress_iteration++;
186 if (m->n_running_jobs > 1)
187 if (asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs) < 0)
190 format_timespan(time, sizeof(time), now(CLOCK_MONOTONIC) - j->begin_usec, 1*USEC_PER_SEC);
191 if (job_get_timeout(j, &x) > 0)
192 format_timespan(limit, sizeof(limit), x - j->begin_usec, 1*USEC_PER_SEC);
194 manager_status_printf(m, true, cylon,
195 "%sA %s job is running for %s (%s / %s)",
197 job_type_to_string(j->type),
198 unit_description(j->unit),
203 static int manager_watch_idle_pipe(Manager *m) {
208 if (m->idle_pipe_event_source)
211 if (m->idle_pipe[2] < 0)
214 r = sd_event_add_io(m->event, &m->idle_pipe_event_source, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m);
216 log_error("Failed to watch idle pipe: %s", strerror(-r));
223 static void manager_close_idle_pipe(Manager *m) {
226 close_pipe(m->idle_pipe);
227 close_pipe(m->idle_pipe + 2);
230 static int manager_setup_time_change(Manager *m) {
233 /* We only care for the cancellation event, hence we set the
234 * timeout to the latest possible value. */
235 struct itimerspec its = {
236 .it_value.tv_sec = TIME_T_MAX,
240 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
242 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
243 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
245 m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
246 if (m->time_change_fd < 0) {
247 log_error("Failed to create timerfd: %m");
251 if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
252 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
253 m->time_change_fd = safe_close(m->time_change_fd);
257 r = sd_event_add_io(m->event, &m->time_change_event_source, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m);
259 log_error("Failed to create time change event source: %s", strerror(-r));
263 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
268 static int enable_special_signals(Manager *m) {
269 _cleanup_close_ int fd = -1;
273 /* Enable that we get SIGINT on control-alt-del. In containers
274 * this will fail with EPERM (older) or EINVAL (newer), so
276 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
277 log_warning("Failed to enable ctrl-alt-del handling: %m");
279 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
281 /* Support systems without virtual console */
283 log_warning("Failed to open /dev/tty0: %m");
285 /* Enable that we get SIGWINCH on kbrequest */
286 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
287 log_warning("Failed to enable kbrequest handling: %m");
293 static int manager_setup_signals(Manager *m) {
294 struct sigaction sa = {
295 .sa_handler = SIG_DFL,
296 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
303 /* We are not interested in SIGSTOP and friends. */
304 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
306 assert_se(sigemptyset(&mask) == 0);
308 sigset_add_many(&mask,
309 SIGCHLD, /* Child died */
310 SIGTERM, /* Reexecute daemon */
311 SIGHUP, /* Reload configuration */
312 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
313 SIGUSR2, /* systemd: dump status */
314 SIGINT, /* Kernel sends us this on control-alt-del */
315 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
316 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
317 SIGRTMIN+0, /* systemd: start default.target */
318 SIGRTMIN+1, /* systemd: isolate rescue.target */
319 SIGRTMIN+2, /* systemd: isolate emergency.target */
320 SIGRTMIN+3, /* systemd: start halt.target */
321 SIGRTMIN+4, /* systemd: start poweroff.target */
322 SIGRTMIN+5, /* systemd: start reboot.target */
323 SIGRTMIN+6, /* systemd: start kexec.target */
324 SIGRTMIN+13, /* systemd: Immediate halt */
325 SIGRTMIN+14, /* systemd: Immediate poweroff */
326 SIGRTMIN+15, /* systemd: Immediate reboot */
327 SIGRTMIN+16, /* systemd: Immediate kexec */
328 SIGRTMIN+20, /* systemd: enable status messages */
329 SIGRTMIN+21, /* systemd: disable status messages */
330 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
331 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
332 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
333 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
334 SIGRTMIN+27, /* systemd: set log target to console */
335 SIGRTMIN+28, /* systemd: set log target to kmsg */
336 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
338 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
340 m->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
341 if (m->signal_fd < 0)
344 r = sd_event_add_io(m->event, &m->signal_event_source, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m);
348 /* Process signals a bit earlier than the rest of things, but
349 * later that notify_fd processing, so that the notify
350 * processing can still figure out to which process/service a
351 * message belongs, before we reap the process. */
352 r = sd_event_source_set_priority(m->signal_event_source, -5);
356 if (m->running_as == SYSTEMD_SYSTEM)
357 return enable_special_signals(m);
362 static void manager_clean_environment(Manager *m) {
365 /* Let's remove some environment variables that we
366 * need ourselves to communicate with our clients */
379 static int manager_default_environment(Manager *m) {
382 if (m->running_as == SYSTEMD_SYSTEM) {
383 /* The system manager always starts with a clean
384 * environment for its children. It does not import
385 * the kernel or the parents exported variables.
387 * The initial passed environ is untouched to keep
388 * /proc/self/environ valid; it is used for tagging
389 * the init process inside containers. */
390 m->environment = strv_new("PATH=" DEFAULT_PATH,
393 /* Import locale variables LC_*= from configuration */
394 locale_setup(&m->environment);
396 /* The user manager passes its own environment
397 * along to its children. */
398 m->environment = strv_copy(environ);
404 manager_clean_environment(m);
405 strv_sort(m->environment);
410 int manager_new(SystemdRunningAs running_as, Manager **_m) {
415 assert(running_as >= 0);
416 assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
418 m = new0(Manager, 1);
423 if (detect_container(NULL) <= 0)
424 boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
427 m->running_as = running_as;
428 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
430 m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
432 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;
433 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
435 r = manager_default_environment(m);
439 r = hashmap_ensure_allocated(&m->units, string_hash_func, string_compare_func);
443 r = hashmap_ensure_allocated(&m->jobs, trivial_hash_func, trivial_compare_func);
447 r = hashmap_ensure_allocated(&m->cgroup_unit, string_hash_func, string_compare_func);
451 r = hashmap_ensure_allocated(&m->watch_bus, string_hash_func, string_compare_func);
455 r = set_ensure_allocated(&m->failed_units, trivial_hash_func, trivial_compare_func);
459 r = sd_event_default(&m->event);
463 r = sd_event_add_defer(m->event, &m->run_queue_event_source, manager_dispatch_run_queue, m);
467 r = sd_event_source_set_priority(m->run_queue_event_source, SD_EVENT_PRIORITY_IDLE);
471 r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_OFF);
475 r = manager_setup_signals(m);
479 r = manager_setup_cgroup(m);
483 r = manager_setup_time_change(m);
487 m->udev = udev_new();
493 /* Note that we set up neither kdbus, nor the notify fd
494 * here. We do that after deserialization, since they might
495 * have gotten serialized across the reexec. */
497 m->taint_usr = dir_is_empty("/usr") > 0;
507 static int manager_setup_notify(Manager *m) {
510 struct sockaddr_un un;
512 .sa.sa_family = AF_UNIX,
516 if (m->notify_fd < 0) {
517 _cleanup_close_ int fd = -1;
519 /* First free all secondary fields */
520 free(m->notify_socket);
521 m->notify_socket = NULL;
522 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
524 fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
526 log_error("Failed to allocate notification socket: %m");
530 if (getpid() != 1 || detect_container(NULL) > 0)
531 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%" PRIx64, random_u64());
533 strncpy(sa.un.sun_path, NOTIFY_SOCKET, sizeof(sa.un.sun_path));
534 sa.un.sun_path[0] = 0;
536 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
538 log_error("bind() failed: %m");
542 r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
544 log_error("SO_PASSCRED failed: %m");
548 sa.un.sun_path[0] = '@';
549 m->notify_socket = strdup(sa.un.sun_path);
550 if (!m->notify_socket)
556 log_debug("Using notification socket %s", m->notify_socket);
559 if (!m->notify_event_source) {
560 r = sd_event_add_io(m->event, &m->notify_event_source, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m);
562 log_error("Failed to allocate notify event source: %s", strerror(-r));
566 /* Process signals a bit earlier than SIGCHLD, so that we can
567 * still identify to which service an exit message belongs */
568 r = sd_event_source_set_priority(m->notify_event_source, -7);
570 log_error("Failed to set priority of notify event source: %s", strerror(-r));
578 static int manager_setup_kdbus(Manager *m) {
580 _cleanup_free_ char *p = NULL;
586 if (m->kdbus_fd >= 0)
589 m->kdbus_fd = bus_kernel_create_bus(m->running_as == SYSTEMD_SYSTEM ? "system" : "user", m->running_as == SYSTEMD_SYSTEM, &p);
590 if (m->kdbus_fd < 0) {
591 log_debug("Failed to set up kdbus: %s", strerror(-m->kdbus_fd));
595 log_debug("Successfully set up kdbus on %s", p);
597 /* Create the namespace directory here, so that the contents
598 * of that directory is not visible to non-root users. This is
599 * necessary to ensure that users cannot get access to busses
600 * of virtualized users when no UID namespacing is used. */
601 if (m->running_as == SYSTEMD_SYSTEM)
602 mkdir_p_label("/dev/kdbus/domain", 0700);
608 static int manager_connect_bus(Manager *m, bool reexecuting) {
609 bool try_bus_connect;
616 (m->running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS"));
618 /* Try to connect to the busses, if possible. */
619 return bus_init(m, try_bus_connect);
622 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
628 while ((u = m->cleanup_queue)) {
629 assert(u->in_cleanup_queue);
639 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
640 GC_OFFSET_UNSURE, /* No clue */
641 GC_OFFSET_GOOD, /* We still need this unit */
642 GC_OFFSET_BAD, /* We don't need this unit anymore */
646 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
653 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
654 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
655 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
658 if (u->in_cleanup_queue)
661 if (unit_check_gc(u))
664 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
668 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
669 unit_gc_sweep(other, gc_marker);
671 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
674 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
681 /* We were unable to find anything out about this entry, so
682 * let's investigate it later */
683 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
684 unit_add_to_gc_queue(u);
688 /* We definitely know that this one is not useful anymore, so
689 * let's mark it for deletion */
690 u->gc_marker = gc_marker + GC_OFFSET_BAD;
691 unit_add_to_cleanup_queue(u);
695 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
698 static unsigned manager_dispatch_gc_queue(Manager *m) {
705 /* log_debug("Running GC..."); */
707 m->gc_marker += _GC_OFFSET_MAX;
708 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
711 gc_marker = m->gc_marker;
713 while ((u = m->gc_queue)) {
714 assert(u->in_gc_queue);
716 unit_gc_sweep(u, gc_marker);
718 LIST_REMOVE(gc_queue, m->gc_queue, u);
719 u->in_gc_queue = false;
723 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
724 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
725 log_debug_unit(u->id, "Collecting %s", u->id);
726 u->gc_marker = gc_marker + GC_OFFSET_BAD;
727 unit_add_to_cleanup_queue(u);
731 m->n_in_gc_queue = 0;
736 static void manager_clear_jobs_and_units(Manager *m) {
741 while ((u = hashmap_first(m->units)))
744 manager_dispatch_cleanup_queue(m);
746 assert(!m->load_queue);
747 assert(!m->run_queue);
748 assert(!m->dbus_unit_queue);
749 assert(!m->dbus_job_queue);
750 assert(!m->cleanup_queue);
751 assert(!m->gc_queue);
753 assert(hashmap_isempty(m->jobs));
754 assert(hashmap_isempty(m->units));
757 m->n_running_jobs = 0;
760 void manager_free(Manager *m) {
766 manager_clear_jobs_and_units(m);
768 for (c = 0; c < _UNIT_TYPE_MAX; c++)
769 if (unit_vtable[c]->shutdown)
770 unit_vtable[c]->shutdown(m);
772 /* If we reexecute ourselves, we keep the root cgroup
774 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
776 manager_undo_generators(m);
780 hashmap_free(m->units);
781 hashmap_free(m->jobs);
782 hashmap_free(m->watch_pids1);
783 hashmap_free(m->watch_pids2);
784 hashmap_free(m->watch_bus);
786 set_free(m->failed_units);
788 sd_event_source_unref(m->signal_event_source);
789 sd_event_source_unref(m->notify_event_source);
790 sd_event_source_unref(m->time_change_event_source);
791 sd_event_source_unref(m->jobs_in_progress_event_source);
792 sd_event_source_unref(m->idle_pipe_event_source);
793 sd_event_source_unref(m->run_queue_event_source);
795 safe_close(m->signal_fd);
796 safe_close(m->notify_fd);
797 safe_close(m->time_change_fd);
798 safe_close(m->kdbus_fd);
800 manager_close_idle_pipe(m);
803 sd_event_unref(m->event);
805 free(m->notify_socket);
807 lookup_paths_free(&m->lookup_paths);
808 strv_free(m->environment);
810 hashmap_free(m->cgroup_unit);
811 set_free_free(m->unit_path_cache);
813 free(m->switch_root);
814 free(m->switch_root_init);
816 for (i = 0; i < _RLIMIT_MAX; i++)
819 assert(hashmap_isempty(m->units_requiring_mounts_for));
820 hashmap_free(m->units_requiring_mounts_for);
825 int manager_enumerate(Manager *m) {
831 /* Let's ask every type to load all units from disk/kernel
832 * that it might know */
833 for (c = 0; c < _UNIT_TYPE_MAX; c++)
834 if (unit_vtable[c]->enumerate) {
835 q = unit_vtable[c]->enumerate(m);
840 manager_dispatch_load_queue(m);
844 static int manager_coldplug(Manager *m) {
852 /* Then, let's set up their initial state. */
853 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
860 q = unit_coldplug(u);
868 static void manager_build_unit_path_cache(Manager *m) {
870 _cleanup_free_ DIR *d = NULL;
875 set_free_free(m->unit_path_cache);
877 m->unit_path_cache = set_new(string_hash_func, string_compare_func);
878 if (!m->unit_path_cache) {
879 log_error("Failed to allocate unit path cache.");
883 /* This simply builds a list of files we know exist, so that
884 * we don't always have to go to disk */
886 STRV_FOREACH(i, m->lookup_paths.unit_path) {
892 log_error("Failed to open directory %s: %m", *i);
896 while ((de = readdir(d))) {
899 if (ignore_file(de->d_name))
902 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
908 r = set_consume(m->unit_path_cache, p);
920 log_error("Failed to build unit path cache: %s", strerror(-r));
922 set_free_free(m->unit_path_cache);
923 m->unit_path_cache = NULL;
927 static int manager_distribute_fds(Manager *m, FDSet *fds) {
934 HASHMAP_FOREACH(u, m->units, i) {
936 if (fdset_size(fds) <= 0)
939 if (UNIT_VTABLE(u)->distribute_fds) {
940 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
949 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
954 dual_timestamp_get(&m->generators_start_timestamp);
955 manager_run_generators(m);
956 dual_timestamp_get(&m->generators_finish_timestamp);
958 r = lookup_paths_init(
959 &m->lookup_paths, m->running_as, true,
960 m->generator_unit_path,
961 m->generator_unit_path_early,
962 m->generator_unit_path_late);
966 manager_build_unit_path_cache(m);
968 /* If we will deserialize make sure that during enumeration
969 * this is already known, so we increase the counter here
974 /* First, enumerate what we can from all config files */
975 dual_timestamp_get(&m->units_load_start_timestamp);
976 r = manager_enumerate(m);
977 dual_timestamp_get(&m->units_load_finish_timestamp);
979 /* Second, deserialize if there is something to deserialize */
981 q = manager_deserialize(m, serialization, fds);
986 /* Any fds left? Find some unit which wants them. This is
987 * useful to allow container managers to pass some file
988 * descriptors to us pre-initialized. This enables
989 * socket-based activation of entire containers. */
990 if (fdset_size(fds) > 0) {
991 q = manager_distribute_fds(m, fds);
996 /* We might have deserialized the notify fd, but if we didn't
997 * then let's create the bus now */
998 manager_setup_notify(m);
1000 /* We might have deserialized the kdbus control fd, but if we
1001 * didn't, then let's create the bus now. */
1002 manager_setup_kdbus(m);
1003 manager_connect_bus(m, !!serialization);
1004 bus_track_coldplug(m, &m->subscribed, &m->deserialized_subscribed);
1006 /* Third, fire things up! */
1007 q = manager_coldplug(m);
1011 if (serialization) {
1012 assert(m->n_reloading > 0);
1015 /* Let's wait for the UnitNew/JobNew messages being
1016 * sent, before we notify that the reload is
1018 m->send_reloading_done = true;
1024 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1029 assert(type < _JOB_TYPE_MAX);
1031 assert(mode < _JOB_MODE_MAX);
1033 if (mode == JOB_ISOLATE && type != JOB_START) {
1034 sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Isolate is only valid for start.");
1038 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
1039 sd_bus_error_setf(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
1043 log_debug_unit(unit->id,
1044 "Trying to enqueue job %s/%s/%s", unit->id,
1045 job_type_to_string(type), job_mode_to_string(mode));
1047 job_type_collapse(&type, unit);
1049 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
1053 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
1054 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
1055 mode == JOB_IGNORE_DEPENDENCIES, e);
1059 if (mode == JOB_ISOLATE) {
1060 r = transaction_add_isolate_jobs(tr, m);
1065 r = transaction_activate(tr, m, mode, e);
1069 log_debug_unit(unit->id,
1070 "Enqueued job %s/%s as %u", unit->id,
1071 job_type_to_string(type), (unsigned) tr->anchor_job->id);
1074 *_ret = tr->anchor_job;
1076 transaction_free(tr);
1080 transaction_abort(tr);
1081 transaction_free(tr);
1085 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1090 assert(type < _JOB_TYPE_MAX);
1092 assert(mode < _JOB_MODE_MAX);
1094 r = manager_load_unit(m, name, NULL, NULL, &unit);
1098 return manager_add_job(m, type, unit, mode, override, e, _ret);
1101 Job *manager_get_job(Manager *m, uint32_t id) {
1104 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1107 Unit *manager_get_unit(Manager *m, const char *name) {
1111 return hashmap_get(m->units, name);
1114 unsigned manager_dispatch_load_queue(Manager *m) {
1120 /* Make sure we are not run recursively */
1121 if (m->dispatching_load_queue)
1124 m->dispatching_load_queue = true;
1126 /* Dispatches the load queue. Takes a unit from the queue and
1127 * tries to load its data until the queue is empty */
1129 while ((u = m->load_queue)) {
1130 assert(u->in_load_queue);
1136 m->dispatching_load_queue = false;
1140 int manager_load_unit_prepare(
1152 assert(name || path);
1154 /* This will prepare the unit for loading, but not actually
1155 * load anything from disk. */
1157 if (path && !is_path(path))
1158 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
1161 name = basename(path);
1163 t = unit_name_to_type(name);
1165 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, TEMPLATE_INVALID))
1166 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is not valid.", name);
1168 ret = manager_get_unit(m, name);
1174 ret = unit_new(m, unit_vtable[t]->object_size);
1179 ret->fragment_path = strdup(path);
1180 if (!ret->fragment_path) {
1186 r = unit_add_name(ret, name);
1192 unit_add_to_load_queue(ret);
1193 unit_add_to_dbus_queue(ret);
1194 unit_add_to_gc_queue(ret);
1202 int manager_load_unit(
1213 /* This will load the service information files, but not actually
1214 * start any services or anything. */
1216 r = manager_load_unit_prepare(m, name, path, e, _ret);
1220 manager_dispatch_load_queue(m);
1223 *_ret = unit_follow_merge(*_ret);
1228 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
1235 HASHMAP_FOREACH(j, s->jobs, i)
1236 job_dump(j, f, prefix);
1239 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
1247 HASHMAP_FOREACH_KEY(u, t, s->units, i)
1249 unit_dump(u, f, prefix);
1252 void manager_clear_jobs(Manager *m) {
1257 while ((j = hashmap_first(m->jobs)))
1258 /* No need to recurse. We're cancelling all jobs. */
1259 job_finish_and_invalidate(j, JOB_CANCELED, false);
1262 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
1263 Manager *m = userdata;
1269 while ((j = m->run_queue)) {
1270 assert(j->installed);
1271 assert(j->in_run_queue);
1273 job_run_and_invalidate(j);
1276 if (m->n_running_jobs > 0)
1277 manager_watch_jobs_in_progress(m);
1279 if (m->n_on_console > 0)
1280 manager_watch_idle_pipe(m);
1285 static unsigned manager_dispatch_dbus_queue(Manager *m) {
1292 if (m->dispatching_dbus_queue)
1295 m->dispatching_dbus_queue = true;
1297 while ((u = m->dbus_unit_queue)) {
1298 assert(u->in_dbus_queue);
1300 bus_unit_send_change_signal(u);
1304 while ((j = m->dbus_job_queue)) {
1305 assert(j->in_dbus_queue);
1307 bus_job_send_change_signal(j);
1311 m->dispatching_dbus_queue = false;
1313 if (m->send_reloading_done) {
1314 m->send_reloading_done = false;
1316 bus_manager_send_reloading(m, false);
1319 if (m->queued_message)
1320 bus_send_queued_message(m);
1325 static void manager_invoke_notify_message(Manager *m, Unit *u, pid_t pid, char *buf, size_t n) {
1326 _cleanup_strv_free_ char **tags = NULL;
1333 tags = strv_split(buf, "\n\r");
1339 log_debug_unit(u->id, "Got notification message for unit %s", u->id);
1341 if (UNIT_VTABLE(u)->notify_message)
1342 UNIT_VTABLE(u)->notify_message(u, pid, tags);
1345 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1346 Manager *m = userdata;
1350 assert(m->notify_fd == fd);
1352 if (revents != EPOLLIN) {
1353 log_warning("Got unexpected poll event for notify fd.");
1359 struct iovec iovec = {
1361 .iov_len = sizeof(buf)-1,
1366 struct cmsghdr cmsghdr;
1367 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
1370 struct msghdr msghdr = {
1373 .msg_control = &control,
1374 .msg_controllen = sizeof(control),
1376 struct ucred *ucred;
1379 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT);
1384 if (errno == EAGAIN || errno == EINTR)
1390 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1391 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1392 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1393 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1394 log_warning("Received notify message without credentials. Ignoring.");
1398 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1400 assert((size_t) n < sizeof(buf));
1403 u = manager_get_unit_by_pid(m, ucred->pid);
1405 manager_invoke_notify_message(m, u, ucred->pid, buf, n);
1409 u = hashmap_get(m->watch_pids1, LONG_TO_PTR(ucred->pid));
1411 manager_invoke_notify_message(m, u, ucred->pid, buf, n);
1415 u = hashmap_get(m->watch_pids2, LONG_TO_PTR(ucred->pid));
1417 manager_invoke_notify_message(m, u, ucred->pid, buf, n);
1422 log_warning("Cannot find unit for notify message of PID "PID_FMT".", ucred->pid);
1428 static void invoke_sigchld_event(Manager *m, Unit *u, siginfo_t *si) {
1433 log_debug_unit(u->id, "Child "PID_FMT" belongs to %s", si->si_pid, u->id);
1435 unit_unwatch_pid(u, si->si_pid);
1436 UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
1439 static int manager_dispatch_sigchld(Manager *m) {
1445 /* First we call waitd() for a PID and do not reap the
1446 * zombie. That way we can still access /proc/$PID for
1447 * it while it is a zombie. */
1448 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
1450 if (errno == ECHILD)
1462 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
1463 _cleanup_free_ char *name = NULL;
1466 get_process_comm(si.si_pid, &name);
1468 log_debug("Child "PID_FMT" (%s) died (code=%s, status=%i/%s)",
1469 si.si_pid, strna(name),
1470 sigchld_code_to_string(si.si_code),
1472 strna(si.si_code == CLD_EXITED
1473 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1474 : signal_to_string(si.si_status)));
1476 /* And now figure out the unit this belongs
1477 * to, it might be multiple... */
1478 u = manager_get_unit_by_pid(m, si.si_pid);
1480 invoke_sigchld_event(m, u, &si);
1481 u = hashmap_get(m->watch_pids1, LONG_TO_PTR(si.si_pid));
1483 invoke_sigchld_event(m, u, &si);
1484 u = hashmap_get(m->watch_pids2, LONG_TO_PTR(si.si_pid));
1486 invoke_sigchld_event(m, u, &si);
1489 /* And now, we actually reap the zombie. */
1490 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1501 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
1502 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1505 log_debug_unit(name, "Activating special unit %s", name);
1507 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1509 log_error_unit(name, "Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
1514 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1515 Manager *m = userdata;
1517 struct signalfd_siginfo sfsi;
1518 bool sigchld = false;
1521 assert(m->signal_fd == fd);
1523 if (revents != EPOLLIN) {
1524 log_warning("Got unexpected events from signal file descriptor.");
1529 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
1530 if (n != sizeof(sfsi)) {
1535 if (errno == EINTR || errno == EAGAIN)
1541 log_received_signal(sfsi.ssi_signo == SIGCHLD ||
1542 (sfsi.ssi_signo == SIGTERM && m->running_as == SYSTEMD_USER)
1543 ? LOG_DEBUG : LOG_INFO,
1546 switch (sfsi.ssi_signo) {
1553 if (m->running_as == SYSTEMD_SYSTEM) {
1554 /* This is for compatibility with the
1555 * original sysvinit */
1556 m->exit_code = MANAGER_REEXECUTE;
1563 if (m->running_as == SYSTEMD_SYSTEM) {
1564 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
1568 /* Run the exit target if there is one, if not, just exit. */
1569 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
1570 m->exit_code = MANAGER_EXIT;
1577 if (m->running_as == SYSTEMD_SYSTEM)
1578 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
1580 /* This is a nop on non-init */
1584 if (m->running_as == SYSTEMD_SYSTEM)
1585 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
1587 /* This is a nop on non-init */
1593 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1595 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1596 log_info("Trying to reconnect to bus...");
1600 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1601 log_info("Loading D-Bus service...");
1602 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
1609 _cleanup_free_ char *dump = NULL;
1610 _cleanup_fclose_ FILE *f = NULL;
1613 f = open_memstream(&dump, &size);
1615 log_warning("Failed to allocate memory stream.");
1619 manager_dump_units(m, f, "\t");
1620 manager_dump_jobs(m, f, "\t");
1623 log_warning("Failed to write status stream");
1628 log_warning("Failed to flush status stream");
1632 log_dump(LOG_INFO, dump);
1637 m->exit_code = MANAGER_RELOAD;
1642 /* Starting SIGRTMIN+0 */
1643 static const char * const target_table[] = {
1644 [0] = SPECIAL_DEFAULT_TARGET,
1645 [1] = SPECIAL_RESCUE_TARGET,
1646 [2] = SPECIAL_EMERGENCY_TARGET,
1647 [3] = SPECIAL_HALT_TARGET,
1648 [4] = SPECIAL_POWEROFF_TARGET,
1649 [5] = SPECIAL_REBOOT_TARGET,
1650 [6] = SPECIAL_KEXEC_TARGET
1653 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1654 static const ManagerExitCode code_table[] = {
1656 [1] = MANAGER_POWEROFF,
1657 [2] = MANAGER_REBOOT,
1661 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
1662 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
1663 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1664 manager_start_target(m, target_table[idx],
1665 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
1669 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1670 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1671 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1675 switch (sfsi.ssi_signo - SIGRTMIN) {
1678 log_debug("Enabling showing of status.");
1679 manager_set_show_status(m, SHOW_STATUS_YES);
1683 log_debug("Disabling showing of status.");
1684 manager_set_show_status(m, SHOW_STATUS_NO);
1688 log_set_max_level(LOG_DEBUG);
1689 log_notice("Setting log level to debug.");
1693 log_set_max_level(LOG_INFO);
1694 log_notice("Setting log level to info.");
1698 if (m->running_as == SYSTEMD_USER) {
1699 m->exit_code = MANAGER_EXIT;
1703 /* This is a nop on init */
1707 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1708 log_notice("Setting log target to journal-or-kmsg.");
1712 log_set_target(LOG_TARGET_CONSOLE);
1713 log_notice("Setting log target to console.");
1717 log_set_target(LOG_TARGET_KMSG);
1718 log_notice("Setting log target to kmsg.");
1722 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
1723 log_notice("Setting log target to syslog-or-kmsg.");
1727 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
1734 manager_dispatch_sigchld(m);
1739 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1740 Manager *m = userdata;
1745 assert(m->time_change_fd == fd);
1747 log_struct(LOG_INFO,
1748 MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1749 "MESSAGE=Time has been changed",
1752 /* Restart the watch */
1753 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
1754 m->time_change_fd = safe_close(m->time_change_fd);
1756 manager_setup_time_change(m);
1758 HASHMAP_FOREACH(u, m->units, i)
1759 if (UNIT_VTABLE(u)->time_change)
1760 UNIT_VTABLE(u)->time_change(u);
1765 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1766 Manager *m = userdata;
1769 assert(m->idle_pipe[2] == fd);
1771 m->no_console_output = m->n_on_console > 0;
1773 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
1774 manager_close_idle_pipe(m);
1779 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
1780 Manager *m = userdata;
1787 manager_print_jobs_in_progress(m);
1789 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_PERIOD_USEC;
1790 r = sd_event_source_set_time(source, next);
1794 return sd_event_source_set_enabled(source, SD_EVENT_ONESHOT);
1797 int manager_loop(Manager *m) {
1800 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
1803 m->exit_code = MANAGER_OK;
1805 /* Release the path cache */
1806 set_free_free(m->unit_path_cache);
1807 m->unit_path_cache = NULL;
1809 manager_check_finished(m);
1811 /* There might still be some zombies hanging around from
1812 * before we were exec()'ed. Let's reap them. */
1813 r = manager_dispatch_sigchld(m);
1817 while (m->exit_code == MANAGER_OK) {
1820 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
1823 if (!ratelimit_test(&rl)) {
1824 /* Yay, something is going seriously wrong, pause a little */
1825 log_warning("Looping too fast. Throttling execution a little.");
1830 if (manager_dispatch_load_queue(m) > 0)
1833 if (manager_dispatch_gc_queue(m) > 0)
1836 if (manager_dispatch_cleanup_queue(m) > 0)
1839 if (manager_dispatch_cgroup_queue(m) > 0)
1842 if (manager_dispatch_dbus_queue(m) > 0)
1845 /* Sleep for half the watchdog time */
1846 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
1847 wait_usec = m->runtime_watchdog / 2;
1851 wait_usec = (usec_t) -1;
1853 r = sd_event_run(m->event, wait_usec);
1855 log_error("Failed to run event loop: %s", strerror(-r));
1860 return m->exit_code;
1863 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
1864 _cleanup_free_ char *n = NULL;
1872 r = unit_name_from_dbus_path(s, &n);
1876 r = manager_load_unit(m, n, NULL, e, &u);
1885 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
1895 p = startswith(s, "/org/freedesktop/systemd1/job/");
1899 r = safe_atou(p, &id);
1903 j = manager_get_job(m, id);
1912 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
1915 _cleanup_free_ char *p = NULL;
1918 audit_fd = get_audit_fd();
1922 /* Don't generate audit events if the service was already
1923 * started and we're just deserializing */
1924 if (m->n_reloading > 0)
1927 if (m->running_as != SYSTEMD_SYSTEM)
1930 if (u->type != UNIT_SERVICE)
1933 p = unit_name_to_prefix_and_instance(u->id);
1935 log_error_unit(u->id,
1936 "Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
1940 if (audit_log_user_comm_message(audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
1941 if (errno == EPERM) {
1942 /* We aren't allowed to send audit messages?
1943 * Then let's not retry again. */
1946 log_warning("Failed to send audit message: %m");
1952 void manager_send_unit_plymouth(Manager *m, Unit *u) {
1953 union sockaddr_union sa = {
1954 .un.sun_family = AF_UNIX,
1955 .un.sun_path = "\0/org/freedesktop/plymouthd",
1959 _cleanup_free_ char *message = NULL;
1960 _cleanup_close_ int fd = -1;
1962 /* Don't generate plymouth events if the service was already
1963 * started and we're just deserializing */
1964 if (m->n_reloading > 0)
1967 if (m->running_as != SYSTEMD_SYSTEM)
1970 if (detect_container(NULL) > 0)
1973 if (u->type != UNIT_SERVICE &&
1974 u->type != UNIT_MOUNT &&
1975 u->type != UNIT_SWAP)
1978 /* We set SOCK_NONBLOCK here so that we rather drop the
1979 * message then wait for plymouth */
1980 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1982 log_error("socket() failed: %m");
1986 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
1988 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
1989 log_error("connect() failed: %m");
1993 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
1999 if (write(fd, message, n + 1) != n + 1)
2000 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
2001 log_error("Failed to write Plymouth message: %m");
2004 void manager_dispatch_bus_name_owner_changed(
2007 const char* old_owner,
2008 const char *new_owner) {
2015 u = hashmap_get(m->watch_bus, name);
2019 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2022 int manager_open_serialization(Manager *m, FILE **_f) {
2029 path = m->running_as == SYSTEMD_SYSTEM ? "/run/systemd" : "/tmp";
2030 fd = open_tmpfile(path, O_RDWR|O_CLOEXEC);
2034 log_debug("Serializing state to %s", path);
2036 f = fdopen(fd, "w+");
2047 int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
2060 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2061 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
2062 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
2063 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
2065 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
2066 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
2067 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
2068 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
2071 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
2072 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2073 dual_timestamp_serialize(f, "security-start-timestamp", &m->security_start_timestamp);
2074 dual_timestamp_serialize(f, "security-finish-timestamp", &m->security_finish_timestamp);
2075 dual_timestamp_serialize(f, "generators-start-timestamp", &m->generators_start_timestamp);
2076 dual_timestamp_serialize(f, "generators-finish-timestamp", &m->generators_finish_timestamp);
2077 dual_timestamp_serialize(f, "units-load-start-timestamp", &m->units_load_start_timestamp);
2078 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
2081 if (!switching_root) {
2082 STRV_FOREACH(e, m->environment) {
2083 _cleanup_free_ char *ce;
2089 fprintf(f, "env=%s\n", *e);
2093 if (m->notify_fd >= 0) {
2096 copy = fdset_put_dup(fds, m->notify_fd);
2100 fprintf(f, "notify-fd=%i\n", copy);
2101 fprintf(f, "notify-socket=%s\n", m->notify_socket);
2104 if (m->kdbus_fd >= 0) {
2107 copy = fdset_put_dup(fds, m->kdbus_fd);
2111 fprintf(f, "kdbus-fd=%i\n", copy);
2114 bus_track_serialize(m->subscribed, f);
2118 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
2122 if (!unit_can_serialize(u))
2129 r = unit_serialize(u, f, fds, !switching_root);
2136 assert(m->n_reloading > 0);
2142 r = bus_fdset_add_all(m, fds);
2149 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2155 log_debug("Deserializing state...");
2160 char line[LINE_MAX], *l;
2162 if (!fgets(line, sizeof(line), f)) {
2177 if (startswith(l, "current-job-id=")) {
2180 if (safe_atou32(l+15, &id) < 0)
2181 log_debug("Failed to parse current job id value %s", l+15);
2183 m->current_job_id = MAX(m->current_job_id, id);
2185 } else if (startswith(l, "n-installed-jobs=")) {
2188 if (safe_atou32(l+17, &n) < 0)
2189 log_debug("Failed to parse installed jobs counter %s", l+17);
2191 m->n_installed_jobs += n;
2193 } else if (startswith(l, "n-failed-jobs=")) {
2196 if (safe_atou32(l+14, &n) < 0)
2197 log_debug("Failed to parse failed jobs counter %s", l+14);
2199 m->n_failed_jobs += n;
2201 } else if (startswith(l, "taint-usr=")) {
2204 b = parse_boolean(l+10);
2206 log_debug("Failed to parse taint /usr flag %s", l+10);
2208 m->taint_usr = m->taint_usr || b;
2210 } else if (startswith(l, "firmware-timestamp="))
2211 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2212 else if (startswith(l, "loader-timestamp="))
2213 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2214 else if (startswith(l, "kernel-timestamp="))
2215 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2216 else if (startswith(l, "initrd-timestamp="))
2217 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
2218 else if (startswith(l, "userspace-timestamp="))
2219 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
2220 else if (startswith(l, "finish-timestamp="))
2221 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
2222 else if (startswith(l, "security-start-timestamp="))
2223 dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
2224 else if (startswith(l, "security-finish-timestamp="))
2225 dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
2226 else if (startswith(l, "generators-start-timestamp="))
2227 dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
2228 else if (startswith(l, "generators-finish-timestamp="))
2229 dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
2230 else if (startswith(l, "units-load-start-timestamp="))
2231 dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
2232 else if (startswith(l, "units-load-finish-timestamp="))
2233 dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
2234 else if (startswith(l, "env=")) {
2235 _cleanup_free_ char *uce = NULL;
2238 uce = cunescape(l+4);
2244 e = strv_env_set(m->environment, uce);
2250 strv_free(m->environment);
2253 } else if (startswith(l, "notify-fd=")) {
2256 if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2257 log_debug("Failed to parse notify fd: %s", l + 10);
2259 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
2260 safe_close(m->notify_fd);
2261 m->notify_fd = fdset_remove(fds, fd);
2264 } else if (startswith(l, "notify-socket=")) {
2273 free(m->notify_socket);
2274 m->notify_socket = n;
2276 } else if (startswith(l, "kdbus-fd=")) {
2279 if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2280 log_debug("Failed to parse kdbus fd: %s", l + 9);
2282 safe_close(m->kdbus_fd);
2283 m->kdbus_fd = fdset_remove(fds, fd);
2286 } else if (bus_track_deserialize_item(&m->deserialized_subscribed, l) == 0)
2287 log_debug("Unknown serialization item '%s'", l);
2292 char name[UNIT_NAME_MAX+2];
2295 if (!fgets(name, sizeof(name), f)) {
2306 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2310 r = unit_deserialize(u, f, fds);
2319 assert(m->n_reloading > 0);
2325 int manager_reload(Manager *m) {
2327 _cleanup_fclose_ FILE *f = NULL;
2328 _cleanup_fdset_free_ FDSet *fds = NULL;
2332 r = manager_open_serialization(m, &f);
2337 bus_manager_send_reloading(m, true);
2345 r = manager_serialize(m, f, fds, false);
2351 if (fseeko(f, 0, SEEK_SET) < 0) {
2356 /* From here on there is no way back. */
2357 manager_clear_jobs_and_units(m);
2358 manager_undo_generators(m);
2359 lookup_paths_free(&m->lookup_paths);
2361 /* Find new unit paths */
2362 manager_run_generators(m);
2364 q = lookup_paths_init(
2365 &m->lookup_paths, m->running_as, true,
2366 m->generator_unit_path,
2367 m->generator_unit_path_early,
2368 m->generator_unit_path_late);
2372 manager_build_unit_path_cache(m);
2374 /* First, enumerate what we can from all config files */
2375 q = manager_enumerate(m);
2379 /* Second, deserialize our stored data */
2380 q = manager_deserialize(m, f, fds);
2387 /* Re-register notify_fd as event source */
2388 q = manager_setup_notify(m);
2392 /* Third, fire things up! */
2393 q = manager_coldplug(m);
2397 assert(m->n_reloading > 0);
2400 m->send_reloading_done = true;
2405 bool manager_is_reloading_or_reexecuting(Manager *m) {
2408 return m->n_reloading != 0;
2411 void manager_reset_failed(Manager *m) {
2417 HASHMAP_FOREACH(u, m->units, i)
2418 unit_reset_failed(u);
2421 bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
2427 /* Returns true if the unit is inactive or going down */
2428 u = manager_get_unit(m, name);
2432 return unit_inactive_or_pending(u);
2435 void manager_check_finished(Manager *m) {
2436 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
2437 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
2441 if (m->n_running_jobs == 0)
2442 m->jobs_in_progress_event_source = sd_event_source_unref(m->jobs_in_progress_event_source);
2444 if (hashmap_size(m->jobs) > 0) {
2446 if (m->jobs_in_progress_event_source) {
2447 sd_event_source_set_time(m->jobs_in_progress_event_source,
2448 now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
2454 manager_flip_auto_status(m, false);
2456 /* Notify Type=idle units that we are done now */
2457 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
2458 manager_close_idle_pipe(m);
2460 /* Turn off confirm spawn now */
2461 m->confirm_spawn = false;
2463 if (dual_timestamp_is_set(&m->finish_timestamp))
2466 dual_timestamp_get(&m->finish_timestamp);
2468 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
2470 /* Note that m->kernel_usec.monotonic is always at 0,
2471 * and m->firmware_usec.monotonic and
2472 * m->loader_usec.monotonic should be considered
2473 * negative values. */
2475 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2476 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
2477 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2478 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
2480 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
2482 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2483 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
2485 if (!log_on_console())
2486 log_struct(LOG_INFO,
2487 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2488 "KERNEL_USEC="USEC_FMT, kernel_usec,
2489 "INITRD_USEC="USEC_FMT, initrd_usec,
2490 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2491 "MESSAGE=Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2492 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2493 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2494 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2495 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2498 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
2501 if (!log_on_console())
2502 log_struct(LOG_INFO,
2503 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2504 "KERNEL_USEC="USEC_FMT, kernel_usec,
2505 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2506 "MESSAGE=Startup finished in %s (kernel) + %s (userspace) = %s.",
2507 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2508 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2509 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2513 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2514 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2516 if (!log_on_console())
2517 log_struct(LOG_INFO,
2518 MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2519 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2520 "MESSAGE=Startup finished in %s.",
2521 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC),
2525 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
2528 "READY=1\nSTATUS=Startup finished in %s.",
2529 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
2532 static int create_generator_dir(Manager *m, char **generator, const char *name) {
2543 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
2544 /* systemd --system, not running --test */
2546 p = strappend("/run/systemd/", name);
2550 r = mkdir_p_label(p, 0755);
2552 log_error("Failed to create generator directory %s: %s",
2557 } else if (m->running_as == SYSTEMD_USER) {
2558 const char *s = NULL;
2560 s = getenv("XDG_RUNTIME_DIR");
2563 p = strjoin(s, "/systemd/", name, NULL);
2567 r = mkdir_p_label(p, 0755);
2569 log_error("Failed to create generator directory %s: %s",
2575 /* systemd --system --test */
2577 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
2582 log_error("Failed to create generator directory %s: %m",
2593 static void trim_generator_dir(Manager *m, char **generator) {
2600 if (rmdir(*generator) >= 0) {
2608 void manager_run_generators(Manager *m) {
2609 _cleanup_closedir_ DIR *d = NULL;
2610 const char *generator_path;
2611 const char *argv[5];
2616 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
2617 d = opendir(generator_path);
2619 if (errno == ENOENT)
2622 log_error("Failed to enumerate generator directory %s: %m",
2627 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2631 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2635 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2639 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2640 argv[1] = m->generator_unit_path;
2641 argv[2] = m->generator_unit_path_early;
2642 argv[3] = m->generator_unit_path_late;
2645 RUN_WITH_UMASK(0022)
2646 execute_directory(generator_path, d, DEFAULT_TIMEOUT_USEC, (char**) argv);
2649 trim_generator_dir(m, &m->generator_unit_path);
2650 trim_generator_dir(m, &m->generator_unit_path_early);
2651 trim_generator_dir(m, &m->generator_unit_path_late);
2654 static void remove_generator_dir(Manager *m, char **generator) {
2661 strv_remove(m->lookup_paths.unit_path, *generator);
2662 rm_rf(*generator, false, true, false);
2668 void manager_undo_generators(Manager *m) {
2671 remove_generator_dir(m, &m->generator_unit_path);
2672 remove_generator_dir(m, &m->generator_unit_path_early);
2673 remove_generator_dir(m, &m->generator_unit_path_late);
2676 int manager_environment_add(Manager *m, char **minus, char **plus) {
2677 char **a = NULL, **b = NULL, **l;
2682 if (!strv_isempty(minus)) {
2683 a = strv_env_delete(l, 1, minus);
2690 if (!strv_isempty(plus)) {
2691 b = strv_env_merge(2, l, plus);
2698 if (m->environment != l)
2699 strv_free(m->environment);
2706 manager_clean_environment(m);
2707 strv_sort(m->environment);
2712 int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2717 for (i = 0; i < _RLIMIT_MAX; i++) {
2718 if (!default_rlimit[i])
2721 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2729 void manager_recheck_journal(Manager *m) {
2734 if (m->running_as != SYSTEMD_SYSTEM)
2737 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2738 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
2739 log_close_journal();
2743 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2744 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
2745 log_close_journal();
2749 /* Hmm, OK, so the socket is fully up and the service is up
2750 * too, then let's make use of the thing. */
2754 void manager_set_show_status(Manager *m, ShowStatus mode) {
2756 assert(IN_SET(mode, SHOW_STATUS_AUTO, SHOW_STATUS_NO, SHOW_STATUS_YES, SHOW_STATUS_TEMPORARY));
2758 if (m->running_as != SYSTEMD_SYSTEM)
2761 m->show_status = mode;
2764 touch("/run/systemd/show-status");
2766 unlink("/run/systemd/show-status");
2769 static bool manager_get_show_status(Manager *m) {
2772 if (m->running_as != SYSTEMD_SYSTEM)
2775 if (m->no_console_output)
2778 if (!IN_SET(manager_state(m), MANAGER_STARTING, MANAGER_STOPPING))
2781 if (m->show_status > 0)
2784 /* If Plymouth is running make sure we show the status, so
2785 * that there's something nice to see when people press Esc */
2787 return plymouth_running();
2790 void manager_status_printf(Manager *m, bool ephemeral, const char *status, const char *format, ...) {
2793 if (!manager_get_show_status(m))
2796 /* XXX We should totally drop the check for ephemeral here
2797 * and thus effectively make 'Type=idle' pointless. */
2798 if (ephemeral && m->n_on_console > 0)
2801 va_start(ap, format);
2802 status_vprintf(status, true, ephemeral, format, ap);
2806 int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
2807 _cleanup_free_ char *p = NULL;
2815 p = unit_name_from_path(path, suffix);
2819 found = manager_get_unit(m, p);
2829 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
2830 char p[strlen(path)+1];
2836 path_kill_slashes(p);
2838 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);
2841 const char *manager_get_runtime_prefix(Manager *m) {
2844 return m->running_as == SYSTEMD_SYSTEM ?
2846 getenv("XDG_RUNTIME_DIR");
2849 ManagerState manager_state(Manager *m) {
2854 /* Did we ever finish booting? If not then we are still starting up */
2855 if (!dual_timestamp_is_set(&m->finish_timestamp))
2856 return MANAGER_STARTING;
2858 /* Is the special shutdown target queued? If so, we are in shutdown state */
2859 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
2860 if (u && u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))
2861 return MANAGER_STOPPING;
2863 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
2864 u = manager_get_unit(m, SPECIAL_RESCUE_TARGET);
2865 if (u && (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)) ||
2866 (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))))
2867 return MANAGER_MAINTENANCE;
2869 u = manager_get_unit(m, SPECIAL_EMERGENCY_TARGET);
2870 if (u && (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)) ||
2871 (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))))
2872 return MANAGER_MAINTENANCE;
2874 /* Are there any failed units? If so, we are in degraded mode */
2875 if (set_size(m->failed_units) > 0)
2876 return MANAGER_DEGRADED;
2878 return MANAGER_RUNNING;
2881 static const char *const manager_state_table[_MANAGER_STATE_MAX] = {
2882 [MANAGER_STARTING] = "starting",
2883 [MANAGER_RUNNING] = "running",
2884 [MANAGER_DEGRADED] = "degraded",
2885 [MANAGER_MAINTENANCE] = "maintenance",
2886 [MANAGER_STOPPING] = "stopping",
2889 DEFINE_STRING_TABLE_LOOKUP(manager_state, ManagerState);