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/>.
28 #include <sys/inotify.h>
29 #include <sys/epoll.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-common-errors.h"
73 #include "bus-error.h"
76 #include "dbus-unit.h"
78 #include "dbus-manager.h"
79 #include "bus-kernel.h"
80 #include "time-util.h"
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 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
88 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
89 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
90 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata);
91 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata);
92 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata);
94 static int manager_watch_jobs_in_progress(Manager *m) {
99 if (m->jobs_in_progress_event_source)
102 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC;
103 return sd_event_add_time(
105 &m->jobs_in_progress_event_source,
108 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";
165 assert(m->n_running_jobs > 0);
167 manager_flip_auto_status(m, true);
169 print_nr = (m->jobs_in_progress_iteration / JOBS_IN_PROGRESS_PERIOD_DIVISOR) % m->n_running_jobs;
171 HASHMAP_FOREACH(j, m->jobs, i)
172 if (j->state == JOB_RUNNING && counter++ == print_nr)
175 /* m->n_running_jobs must be consistent with the contents of m->jobs,
176 * so the above loop must have succeeded in finding j. */
177 assert(counter == print_nr + 1);
180 cylon_pos = m->jobs_in_progress_iteration % 14;
182 cylon_pos = 14 - cylon_pos;
183 draw_cylon(cylon, sizeof(cylon), 6, cylon_pos);
185 m->jobs_in_progress_iteration++;
187 if (m->n_running_jobs > 1)
188 asprintf(&job_of_n, "(%u of %u) ", counter, m->n_running_jobs);
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, STATUS_TYPE_EPHEMERAL, cylon,
195 "%sA %s job is running for %s (%s / %s)",
197 job_type_to_string(j->type),
198 unit_description(j->unit),
202 static int have_ask_password(void) {
203 _cleanup_closedir_ DIR *dir;
205 dir = opendir("/run/systemd/ask-password");
218 if (!de && errno != 0)
223 if (startswith(de->d_name, "ask."))
228 static int manager_dispatch_ask_password_fd(sd_event_source *source,
229 int fd, uint32_t revents, void *userdata) {
230 Manager *m = userdata;
236 m->have_ask_password = have_ask_password();
237 if (m->have_ask_password < 0)
238 /* Log error but continue. Negative have_ask_password
239 * is treated as unknown status. */
240 log_error_errno(m->have_ask_password, "Failed to list /run/systemd/ask-password: %m");
245 static void manager_close_ask_password(Manager *m) {
248 m->ask_password_inotify_fd = safe_close(m->ask_password_inotify_fd);
249 m->ask_password_event_source = sd_event_source_unref(m->ask_password_event_source);
250 m->have_ask_password = -EINVAL;
253 static int manager_check_ask_password(Manager *m) {
258 if (!m->ask_password_event_source) {
259 assert(m->ask_password_inotify_fd < 0);
261 mkdir_p_label("/run/systemd/ask-password", 0755);
263 m->ask_password_inotify_fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC);
264 if (m->ask_password_inotify_fd < 0)
265 return log_error_errno(errno, "inotify_init1() failed: %m");
267 if (inotify_add_watch(m->ask_password_inotify_fd, "/run/systemd/ask-password", IN_CREATE|IN_DELETE|IN_MOVE) < 0) {
268 log_error_errno(errno, "Failed to add watch on /run/systemd/ask-password: %m");
269 manager_close_ask_password(m);
273 r = sd_event_add_io(m->event, &m->ask_password_event_source,
274 m->ask_password_inotify_fd, EPOLLIN,
275 manager_dispatch_ask_password_fd, m);
277 log_error_errno(errno, "Failed to add event source for /run/systemd/ask-password: %m");
278 manager_close_ask_password(m);
282 /* Queries might have been added meanwhile... */
283 manager_dispatch_ask_password_fd(m->ask_password_event_source,
284 m->ask_password_inotify_fd, EPOLLIN, m);
287 return m->have_ask_password;
290 static int manager_watch_idle_pipe(Manager *m) {
295 if (m->idle_pipe_event_source)
298 if (m->idle_pipe[2] < 0)
301 r = sd_event_add_io(m->event, &m->idle_pipe_event_source, m->idle_pipe[2], EPOLLIN, manager_dispatch_idle_pipe_fd, m);
303 return log_error_errno(r, "Failed to watch idle pipe: %m");
308 static void manager_close_idle_pipe(Manager *m) {
311 safe_close_pair(m->idle_pipe);
312 safe_close_pair(m->idle_pipe + 2);
315 static int manager_setup_time_change(Manager *m) {
318 /* We only care for the cancellation event, hence we set the
319 * timeout to the latest possible value. */
320 struct itimerspec its = {
321 .it_value.tv_sec = TIME_T_MAX,
325 assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
330 /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
331 * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */
333 m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
334 if (m->time_change_fd < 0)
335 return log_error_errno(errno, "Failed to create timerfd: %m");
337 if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
338 log_debug_errno(errno, "Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
339 m->time_change_fd = safe_close(m->time_change_fd);
343 r = sd_event_add_io(m->event, &m->time_change_event_source, m->time_change_fd, EPOLLIN, manager_dispatch_time_change_fd, m);
345 return log_error_errno(r, "Failed to create time change event source: %m");
347 log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
352 static int enable_special_signals(Manager *m) {
353 _cleanup_close_ int fd = -1;
357 /* Enable that we get SIGINT on control-alt-del. In containers
358 * this will fail with EPERM (older) or EINVAL (newer), so
360 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL)
361 log_warning_errno(errno, "Failed to enable ctrl-alt-del handling: %m");
363 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
365 /* Support systems without virtual console */
367 log_warning_errno(errno, "Failed to open /dev/tty0: %m");
369 /* Enable that we get SIGWINCH on kbrequest */
370 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
371 log_warning_errno(errno, "Failed to enable kbrequest handling: %m");
377 static int manager_setup_signals(Manager *m) {
378 struct sigaction sa = {
379 .sa_handler = SIG_DFL,
380 .sa_flags = SA_NOCLDSTOP|SA_RESTART,
387 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
389 /* We make liberal use of realtime signals here. On
390 * Linux/glibc we have 30 of them (with the exception of Linux
391 * on hppa, see below), between SIGRTMIN+0 ... SIGRTMIN+30
394 assert_se(sigemptyset(&mask) == 0);
395 sigset_add_many(&mask,
396 SIGCHLD, /* Child died */
397 SIGTERM, /* Reexecute daemon */
398 SIGHUP, /* Reload configuration */
399 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
400 SIGUSR2, /* systemd: dump status */
401 SIGINT, /* Kernel sends us this on control-alt-del */
402 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
403 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
405 SIGRTMIN+0, /* systemd: start default.target */
406 SIGRTMIN+1, /* systemd: isolate rescue.target */
407 SIGRTMIN+2, /* systemd: isolate emergency.target */
408 SIGRTMIN+3, /* systemd: start halt.target */
409 SIGRTMIN+4, /* systemd: start poweroff.target */
410 SIGRTMIN+5, /* systemd: start reboot.target */
411 SIGRTMIN+6, /* systemd: start kexec.target */
413 /* ... space for more special targets ... */
415 SIGRTMIN+13, /* systemd: Immediate halt */
416 SIGRTMIN+14, /* systemd: Immediate poweroff */
417 SIGRTMIN+15, /* systemd: Immediate reboot */
418 SIGRTMIN+16, /* systemd: Immediate kexec */
420 /* ... space for more immediate system state changes ... */
422 SIGRTMIN+20, /* systemd: enable status messages */
423 SIGRTMIN+21, /* systemd: disable status messages */
424 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
425 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
426 SIGRTMIN+24, /* systemd: Immediate exit (--user only) */
428 /* .. one free signal here ... */
430 #if !defined(__hppa64__) && !defined(__hppa__)
431 /* Apparently Linux on hppa has fewer RT
432 * signals (SIGRTMAX is SIGRTMIN+25 there),
433 * hence let's not try to make use of them
434 * here. Since these commands are accessible
435 * by different means and only really a safety
436 * net, the missing functionality on hppa
437 * shouldn't matter. */
439 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
440 SIGRTMIN+27, /* systemd: set log target to console */
441 SIGRTMIN+28, /* systemd: set log target to kmsg */
442 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg (obsolete) */
444 /* ... one free signal here SIGRTMIN+30 ... */
447 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
449 m->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
450 if (m->signal_fd < 0)
453 r = sd_event_add_io(m->event, &m->signal_event_source, m->signal_fd, EPOLLIN, manager_dispatch_signal_fd, m);
457 /* Process signals a bit earlier than the rest of things, but
458 * later than notify_fd processing, so that the notify
459 * processing can still figure out to which process/service a
460 * message belongs, before we reap the process. */
461 r = sd_event_source_set_priority(m->signal_event_source, -5);
465 if (m->running_as == SYSTEMD_SYSTEM)
466 return enable_special_signals(m);
471 static void manager_clean_environment(Manager *m) {
474 /* Let's remove some environment variables that we
475 * need ourselves to communicate with our clients */
488 static int manager_default_environment(Manager *m) {
491 if (m->running_as == SYSTEMD_SYSTEM) {
492 /* The system manager always starts with a clean
493 * environment for its children. It does not import
494 * the kernel or the parents exported variables.
496 * The initial passed environ is untouched to keep
497 * /proc/self/environ valid; it is used for tagging
498 * the init process inside containers. */
499 m->environment = strv_new("PATH=" DEFAULT_PATH,
502 /* Import locale variables LC_*= from configuration */
503 locale_setup(&m->environment);
505 /* The user manager passes its own environment
506 * along to its children. */
507 m->environment = strv_copy(environ);
513 manager_clean_environment(m);
514 strv_sort(m->environment);
519 int manager_new(SystemdRunningAs running_as, bool test_run, Manager **_m) {
524 assert(running_as >= 0);
525 assert(running_as < _SYSTEMD_RUNNING_AS_MAX);
527 m = new0(Manager, 1);
532 if (running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0)
533 boot_timestamps(&m->userspace_timestamp, &m->firmware_timestamp, &m->loader_timestamp);
536 m->running_as = running_as;
537 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
538 m->default_timer_accuracy_usec = USEC_PER_MINUTE;
540 m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1;
542 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 = m->utab_inotify_fd = -1;
543 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
545 m->ask_password_inotify_fd = -1;
546 m->have_ask_password = -EINVAL; /* we don't know */
548 m->test_run = test_run;
550 r = manager_default_environment(m);
554 r = hashmap_ensure_allocated(&m->units, &string_hash_ops);
558 r = hashmap_ensure_allocated(&m->jobs, NULL);
562 r = hashmap_ensure_allocated(&m->cgroup_unit, &string_hash_ops);
566 r = hashmap_ensure_allocated(&m->watch_bus, &string_hash_ops);
570 r = set_ensure_allocated(&m->startup_units, NULL);
574 r = set_ensure_allocated(&m->failed_units, NULL);
578 r = sd_event_default(&m->event);
582 r = sd_event_add_defer(m->event, &m->run_queue_event_source, manager_dispatch_run_queue, m);
586 r = sd_event_source_set_priority(m->run_queue_event_source, SD_EVENT_PRIORITY_IDLE);
590 r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_OFF);
594 r = manager_setup_signals(m);
598 r = manager_setup_cgroup(m);
602 r = manager_setup_time_change(m);
606 m->udev = udev_new();
612 /* Note that we set up neither kdbus, nor the notify fd
613 * here. We do that after deserialization, since they might
614 * have gotten serialized across the reexec. */
616 m->taint_usr = dir_is_empty("/usr") > 0;
626 static int manager_setup_notify(Manager *m) {
632 if (m->notify_fd < 0) {
633 _cleanup_close_ int fd = -1;
634 union sockaddr_union sa = {
635 .sa.sa_family = AF_UNIX,
637 static const int one = 1;
639 /* First free all secondary fields */
640 free(m->notify_socket);
641 m->notify_socket = NULL;
642 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
644 fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
646 return log_error_errno(errno, "Failed to allocate notification socket: %m");
648 if (m->running_as == SYSTEMD_SYSTEM)
649 m->notify_socket = strdup("/run/systemd/notify");
653 e = getenv("XDG_RUNTIME_DIR");
655 log_error_errno(errno, "XDG_RUNTIME_DIR is not set: %m");
659 m->notify_socket = strappend(e, "/systemd/notify");
661 if (!m->notify_socket)
664 (void) mkdir_parents_label(m->notify_socket, 0755);
665 (void) unlink(m->notify_socket);
667 strncpy(sa.un.sun_path, m->notify_socket, sizeof(sa.un.sun_path)-1);
668 r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
670 return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path);
672 r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
674 return log_error_errno(errno, "SO_PASSCRED failed: %m");
679 log_debug("Using notification socket %s", m->notify_socket);
682 if (!m->notify_event_source) {
683 r = sd_event_add_io(m->event, &m->notify_event_source, m->notify_fd, EPOLLIN, manager_dispatch_notify_fd, m);
685 return log_error_errno(r, "Failed to allocate notify event source: %m");
687 /* Process signals a bit earlier than SIGCHLD, so that we can
688 * still identify to which service an exit message belongs */
689 r = sd_event_source_set_priority(m->notify_event_source, -7);
691 return log_error_errno(r, "Failed to set priority of notify event source: %m");
697 static int manager_setup_kdbus(Manager *m) {
699 _cleanup_free_ char *p = NULL;
703 if (m->test_run || m->kdbus_fd >= 0)
707 bus_kernel_fix_attach_mask();
709 m->kdbus_fd = bus_kernel_create_bus(
710 m->running_as == SYSTEMD_SYSTEM ? "system" : "user",
711 m->running_as == SYSTEMD_SYSTEM, &p);
714 return log_debug_errno(m->kdbus_fd, "Failed to set up kdbus: %m");
716 log_debug("Successfully set up kdbus on %s", p);
722 static int manager_connect_bus(Manager *m, bool reexecuting) {
723 bool try_bus_connect;
733 (m->running_as == SYSTEMD_USER && getenv("DBUS_SESSION_BUS_ADDRESS"));
735 /* Try to connect to the busses, if possible. */
736 return bus_init(m, try_bus_connect);
739 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
745 while ((u = m->cleanup_queue)) {
746 assert(u->in_cleanup_queue);
756 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
757 GC_OFFSET_UNSURE, /* No clue */
758 GC_OFFSET_GOOD, /* We still need this unit */
759 GC_OFFSET_BAD, /* We don't need this unit anymore */
763 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
770 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
771 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
772 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
775 if (u->in_cleanup_queue)
778 if (unit_check_gc(u))
781 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
785 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
786 unit_gc_sweep(other, gc_marker);
788 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
791 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
798 /* We were unable to find anything out about this entry, so
799 * let's investigate it later */
800 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
801 unit_add_to_gc_queue(u);
805 /* We definitely know that this one is not useful anymore, so
806 * let's mark it for deletion */
807 u->gc_marker = gc_marker + GC_OFFSET_BAD;
808 unit_add_to_cleanup_queue(u);
812 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
815 static unsigned manager_dispatch_gc_queue(Manager *m) {
822 /* log_debug("Running GC..."); */
824 m->gc_marker += _GC_OFFSET_MAX;
825 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
828 gc_marker = m->gc_marker;
830 while ((u = m->gc_queue)) {
831 assert(u->in_gc_queue);
833 unit_gc_sweep(u, gc_marker);
835 LIST_REMOVE(gc_queue, m->gc_queue, u);
836 u->in_gc_queue = false;
840 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
841 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
842 log_unit_debug(u->id, "Collecting %s", u->id);
843 u->gc_marker = gc_marker + GC_OFFSET_BAD;
844 unit_add_to_cleanup_queue(u);
848 m->n_in_gc_queue = 0;
853 static void manager_clear_jobs_and_units(Manager *m) {
858 while ((u = hashmap_first(m->units)))
861 manager_dispatch_cleanup_queue(m);
863 assert(!m->load_queue);
864 assert(!m->run_queue);
865 assert(!m->dbus_unit_queue);
866 assert(!m->dbus_job_queue);
867 assert(!m->cleanup_queue);
868 assert(!m->gc_queue);
870 assert(hashmap_isempty(m->jobs));
871 assert(hashmap_isempty(m->units));
874 m->n_running_jobs = 0;
877 Manager* manager_free(Manager *m) {
884 manager_clear_jobs_and_units(m);
886 for (c = 0; c < _UNIT_TYPE_MAX; c++)
887 if (unit_vtable[c]->shutdown)
888 unit_vtable[c]->shutdown(m);
890 /* If we reexecute ourselves, we keep the root cgroup
892 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
894 manager_undo_generators(m);
898 hashmap_free(m->units);
899 hashmap_free(m->jobs);
900 hashmap_free(m->watch_pids1);
901 hashmap_free(m->watch_pids2);
902 hashmap_free(m->watch_bus);
904 set_free(m->startup_units);
905 set_free(m->failed_units);
907 sd_event_source_unref(m->signal_event_source);
908 sd_event_source_unref(m->notify_event_source);
909 sd_event_source_unref(m->time_change_event_source);
910 sd_event_source_unref(m->jobs_in_progress_event_source);
911 sd_event_source_unref(m->idle_pipe_event_source);
912 sd_event_source_unref(m->run_queue_event_source);
914 safe_close(m->signal_fd);
915 safe_close(m->notify_fd);
916 safe_close(m->time_change_fd);
917 safe_close(m->kdbus_fd);
919 manager_close_ask_password(m);
921 manager_close_idle_pipe(m);
924 sd_event_unref(m->event);
926 free(m->notify_socket);
928 lookup_paths_free(&m->lookup_paths);
929 strv_free(m->environment);
931 hashmap_free(m->cgroup_unit);
932 set_free_free(m->unit_path_cache);
934 free(m->switch_root);
935 free(m->switch_root_init);
937 for (i = 0; i < _RLIMIT_MAX; i++)
940 assert(hashmap_isempty(m->units_requiring_mounts_for));
941 hashmap_free(m->units_requiring_mounts_for);
947 int manager_enumerate(Manager *m) {
953 /* Let's ask every type to load all units from disk/kernel
954 * that it might know */
955 for (c = 0; c < _UNIT_TYPE_MAX; c++) {
958 if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) {
959 log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c));
963 if (!unit_vtable[c]->enumerate)
966 q = unit_vtable[c]->enumerate(m);
971 manager_dispatch_load_queue(m);
975 static int manager_coldplug(Manager *m) {
983 /* Then, let's set up their initial state. */
984 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
991 q = unit_coldplug(u);
999 static void manager_build_unit_path_cache(Manager *m) {
1001 _cleanup_closedir_ DIR *d = NULL;
1006 set_free_free(m->unit_path_cache);
1008 m->unit_path_cache = set_new(&string_hash_ops);
1009 if (!m->unit_path_cache) {
1010 log_error("Failed to allocate unit path cache.");
1014 /* This simply builds a list of files we know exist, so that
1015 * we don't always have to go to disk */
1017 STRV_FOREACH(i, m->lookup_paths.unit_path) {
1022 if (errno != ENOENT)
1023 log_error_errno(errno, "Failed to open directory %s: %m", *i);
1027 while ((de = readdir(d))) {
1030 if (hidden_file(de->d_name))
1033 p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
1039 r = set_consume(m->unit_path_cache, p);
1051 log_error_errno(r, "Failed to build unit path cache: %m");
1053 set_free_free(m->unit_path_cache);
1054 m->unit_path_cache = NULL;
1058 static int manager_distribute_fds(Manager *m, FDSet *fds) {
1065 HASHMAP_FOREACH(u, m->units, i) {
1067 if (fdset_size(fds) <= 0)
1070 if (UNIT_VTABLE(u)->distribute_fds) {
1071 r = UNIT_VTABLE(u)->distribute_fds(u, fds);
1080 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
1085 dual_timestamp_get(&m->generators_start_timestamp);
1086 manager_run_generators(m);
1087 dual_timestamp_get(&m->generators_finish_timestamp);
1089 r = lookup_paths_init(
1090 &m->lookup_paths, m->running_as, true,
1092 m->generator_unit_path,
1093 m->generator_unit_path_early,
1094 m->generator_unit_path_late);
1098 manager_build_unit_path_cache(m);
1100 /* If we will deserialize make sure that during enumeration
1101 * this is already known, so we increase the counter here
1106 /* First, enumerate what we can from all config files */
1107 dual_timestamp_get(&m->units_load_start_timestamp);
1108 r = manager_enumerate(m);
1109 dual_timestamp_get(&m->units_load_finish_timestamp);
1111 /* Second, deserialize if there is something to deserialize */
1113 r = manager_deserialize(m, serialization, fds);
1115 /* Any fds left? Find some unit which wants them. This is
1116 * useful to allow container managers to pass some file
1117 * descriptors to us pre-initialized. This enables
1118 * socket-based activation of entire containers. */
1119 if (fdset_size(fds) > 0) {
1120 q = manager_distribute_fds(m, fds);
1121 if (q < 0 && r == 0)
1125 /* We might have deserialized the notify fd, but if we didn't
1126 * then let's create the bus now */
1127 q = manager_setup_notify(m);
1128 if (q < 0 && r == 0)
1131 /* We might have deserialized the kdbus control fd, but if we
1132 * didn't, then let's create the bus now. */
1133 manager_setup_kdbus(m);
1134 manager_connect_bus(m, !!serialization);
1135 bus_track_coldplug(m, &m->subscribed, &m->deserialized_subscribed);
1137 /* Third, fire things up! */
1138 q = manager_coldplug(m);
1139 if (q < 0 && r == 0)
1142 if (serialization) {
1143 assert(m->n_reloading > 0);
1146 /* Let's wait for the UnitNew/JobNew messages being
1147 * sent, before we notify that the reload is
1149 m->send_reloading_done = true;
1155 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1160 assert(type < _JOB_TYPE_MAX);
1162 assert(mode < _JOB_MODE_MAX);
1164 if (mode == JOB_ISOLATE && type != JOB_START)
1165 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Isolate is only valid for start.");
1167 if (mode == JOB_ISOLATE && !unit->allow_isolate)
1168 return sd_bus_error_setf(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
1170 log_unit_debug(unit->id,
1171 "Trying to enqueue job %s/%s/%s", unit->id,
1172 job_type_to_string(type), job_mode_to_string(mode));
1174 job_type_collapse(&type, unit);
1176 tr = transaction_new(mode == JOB_REPLACE_IRREVERSIBLY);
1180 r = transaction_add_job_and_dependencies(tr, type, unit, NULL, true, override, false,
1181 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
1182 mode == JOB_IGNORE_DEPENDENCIES, e);
1186 if (mode == JOB_ISOLATE) {
1187 r = transaction_add_isolate_jobs(tr, m);
1192 r = transaction_activate(tr, m, mode, e);
1196 log_unit_debug(unit->id,
1197 "Enqueued job %s/%s as %u", unit->id,
1198 job_type_to_string(type), (unsigned) tr->anchor_job->id);
1201 *_ret = tr->anchor_job;
1203 transaction_free(tr);
1207 transaction_abort(tr);
1208 transaction_free(tr);
1212 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, sd_bus_error *e, Job **_ret) {
1217 assert(type < _JOB_TYPE_MAX);
1219 assert(mode < _JOB_MODE_MAX);
1221 r = manager_load_unit(m, name, NULL, NULL, &unit);
1225 return manager_add_job(m, type, unit, mode, override, e, _ret);
1228 Job *manager_get_job(Manager *m, uint32_t id) {
1231 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1234 Unit *manager_get_unit(Manager *m, const char *name) {
1238 return hashmap_get(m->units, name);
1241 unsigned manager_dispatch_load_queue(Manager *m) {
1247 /* Make sure we are not run recursively */
1248 if (m->dispatching_load_queue)
1251 m->dispatching_load_queue = true;
1253 /* Dispatches the load queue. Takes a unit from the queue and
1254 * tries to load its data until the queue is empty */
1256 while ((u = m->load_queue)) {
1257 assert(u->in_load_queue);
1263 m->dispatching_load_queue = false;
1267 int manager_load_unit_prepare(
1279 assert(name || path);
1281 /* This will prepare the unit for loading, but not actually
1282 * load anything from disk. */
1284 if (path && !is_path(path))
1285 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Path %s is not absolute.", path);
1288 name = basename(path);
1290 t = unit_name_to_type(name);
1292 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid(name, TEMPLATE_INVALID))
1293 return sd_bus_error_setf(e, SD_BUS_ERROR_INVALID_ARGS, "Unit name %s is not valid.", name);
1295 ret = manager_get_unit(m, name);
1301 ret = unit_new(m, unit_vtable[t]->object_size);
1306 ret->fragment_path = strdup(path);
1307 if (!ret->fragment_path) {
1313 r = unit_add_name(ret, name);
1319 unit_add_to_load_queue(ret);
1320 unit_add_to_dbus_queue(ret);
1321 unit_add_to_gc_queue(ret);
1329 int manager_load_unit(
1340 /* This will load the service information files, but not actually
1341 * start any services or anything. */
1343 r = manager_load_unit_prepare(m, name, path, e, _ret);
1347 manager_dispatch_load_queue(m);
1350 *_ret = unit_follow_merge(*_ret);
1355 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
1362 HASHMAP_FOREACH(j, s->jobs, i)
1363 job_dump(j, f, prefix);
1366 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
1374 HASHMAP_FOREACH_KEY(u, t, s->units, i)
1376 unit_dump(u, f, prefix);
1379 void manager_clear_jobs(Manager *m) {
1384 while ((j = hashmap_first(m->jobs)))
1385 /* No need to recurse. We're cancelling all jobs. */
1386 job_finish_and_invalidate(j, JOB_CANCELED, false);
1389 static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
1390 Manager *m = userdata;
1396 while ((j = m->run_queue)) {
1397 assert(j->installed);
1398 assert(j->in_run_queue);
1400 job_run_and_invalidate(j);
1403 if (m->n_running_jobs > 0)
1404 manager_watch_jobs_in_progress(m);
1406 if (m->n_on_console > 0)
1407 manager_watch_idle_pipe(m);
1412 static unsigned manager_dispatch_dbus_queue(Manager *m) {
1419 if (m->dispatching_dbus_queue)
1422 m->dispatching_dbus_queue = true;
1424 while ((u = m->dbus_unit_queue)) {
1425 assert(u->in_dbus_queue);
1427 bus_unit_send_change_signal(u);
1431 while ((j = m->dbus_job_queue)) {
1432 assert(j->in_dbus_queue);
1434 bus_job_send_change_signal(j);
1438 m->dispatching_dbus_queue = false;
1440 if (m->send_reloading_done) {
1441 m->send_reloading_done = false;
1443 bus_manager_send_reloading(m, false);
1446 if (m->queued_message)
1447 bus_send_queued_message(m);
1452 static void manager_invoke_notify_message(Manager *m, Unit *u, pid_t pid, char *buf, size_t n) {
1453 _cleanup_strv_free_ char **tags = NULL;
1460 tags = strv_split(buf, "\n\r");
1466 log_unit_debug(u->id, "Got notification message for unit %s", u->id);
1468 if (UNIT_VTABLE(u)->notify_message)
1469 UNIT_VTABLE(u)->notify_message(u, pid, tags);
1472 static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1473 Manager *m = userdata;
1477 assert(m->notify_fd == fd);
1479 if (revents != EPOLLIN) {
1480 log_warning("Got unexpected poll event for notify fd.");
1486 struct iovec iovec = {
1488 .iov_len = sizeof(buf)-1,
1493 struct cmsghdr cmsghdr;
1494 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
1497 struct msghdr msghdr = {
1500 .msg_control = &control,
1501 .msg_controllen = sizeof(control),
1503 struct ucred *ucred;
1506 n = recvmsg(m->notify_fd, &msghdr, MSG_DONTWAIT);
1511 if (errno == EAGAIN || errno == EINTR)
1517 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
1518 control.cmsghdr.cmsg_level != SOL_SOCKET ||
1519 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
1520 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
1521 log_warning("Received notify message without credentials. Ignoring.");
1525 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
1527 assert((size_t) n < sizeof(buf));
1530 /* Notify every unit that might be interested, but try
1531 * to avoid notifying the same one multiple times. */
1532 u1 = manager_get_unit_by_pid(m, ucred->pid);
1534 manager_invoke_notify_message(m, u1, ucred->pid, buf, n);
1538 u2 = hashmap_get(m->watch_pids1, LONG_TO_PTR(ucred->pid));
1539 if (u2 && u2 != u1) {
1540 manager_invoke_notify_message(m, u2, ucred->pid, buf, n);
1544 u3 = hashmap_get(m->watch_pids2, LONG_TO_PTR(ucred->pid));
1545 if (u3 && u3 != u2 && u3 != u1) {
1546 manager_invoke_notify_message(m, u3, ucred->pid, buf, n);
1551 log_warning("Cannot find unit for notify message of PID "PID_FMT".", ucred->pid);
1557 static void invoke_sigchld_event(Manager *m, Unit *u, siginfo_t *si) {
1562 log_unit_debug(u->id, "Child "PID_FMT" belongs to %s", si->si_pid, u->id);
1564 unit_unwatch_pid(u, si->si_pid);
1565 UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
1568 static int manager_dispatch_sigchld(Manager *m) {
1574 /* First we call waitd() for a PID and do not reap the
1575 * zombie. That way we can still access /proc/$PID for
1576 * it while it is a zombie. */
1577 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
1579 if (errno == ECHILD)
1591 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
1592 _cleanup_free_ char *name = NULL;
1595 get_process_comm(si.si_pid, &name);
1597 log_debug("Child "PID_FMT" (%s) died (code=%s, status=%i/%s)",
1598 si.si_pid, strna(name),
1599 sigchld_code_to_string(si.si_code),
1601 strna(si.si_code == CLD_EXITED
1602 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
1603 : signal_to_string(si.si_status)));
1605 /* And now figure out the unit this belongs
1606 * to, it might be multiple... */
1607 u1 = manager_get_unit_by_pid(m, si.si_pid);
1609 invoke_sigchld_event(m, u1, &si);
1610 u2 = hashmap_get(m->watch_pids1, LONG_TO_PTR(si.si_pid));
1612 invoke_sigchld_event(m, u2, &si);
1613 u3 = hashmap_get(m->watch_pids2, LONG_TO_PTR(si.si_pid));
1614 if (u3 && u3 != u2 && u3 != u1)
1615 invoke_sigchld_event(m, u3, &si);
1618 /* And now, we actually reap the zombie. */
1619 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
1630 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
1631 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1634 log_unit_debug(name, "Activating special unit %s", name);
1636 r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL);
1638 log_unit_error(name, "Failed to enqueue %s job: %s", name, bus_error_message(&error, r));
1643 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1644 Manager *m = userdata;
1646 struct signalfd_siginfo sfsi;
1647 bool sigchld = false;
1650 assert(m->signal_fd == fd);
1652 if (revents != EPOLLIN) {
1653 log_warning("Got unexpected events from signal file descriptor.");
1658 n = read(m->signal_fd, &sfsi, sizeof(sfsi));
1659 if (n != sizeof(sfsi)) {
1664 if (errno == EINTR || errno == EAGAIN)
1670 log_received_signal(sfsi.ssi_signo == SIGCHLD ||
1671 (sfsi.ssi_signo == SIGTERM && m->running_as == SYSTEMD_USER)
1672 ? LOG_DEBUG : LOG_INFO,
1675 switch (sfsi.ssi_signo) {
1682 if (m->running_as == SYSTEMD_SYSTEM) {
1683 /* This is for compatibility with the
1684 * original sysvinit */
1685 m->exit_code = MANAGER_REEXECUTE;
1692 if (m->running_as == SYSTEMD_SYSTEM) {
1693 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
1697 /* Run the exit target if there is one, if not, just exit. */
1698 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
1699 m->exit_code = MANAGER_EXIT;
1706 if (m->running_as == SYSTEMD_SYSTEM)
1707 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
1709 /* This is a nop on non-init */
1713 if (m->running_as == SYSTEMD_SYSTEM)
1714 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
1716 /* This is a nop on non-init */
1722 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
1724 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
1725 log_info("Trying to reconnect to bus...");
1729 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
1730 log_info("Loading D-Bus service...");
1731 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
1738 _cleanup_free_ char *dump = NULL;
1739 _cleanup_fclose_ FILE *f = NULL;
1742 f = open_memstream(&dump, &size);
1744 log_warning("Failed to allocate memory stream.");
1748 manager_dump_units(m, f, "\t");
1749 manager_dump_jobs(m, f, "\t");
1752 log_warning("Failed to write status stream");
1757 log_warning("Failed to flush status stream");
1761 log_dump(LOG_INFO, dump);
1766 m->exit_code = MANAGER_RELOAD;
1771 /* Starting SIGRTMIN+0 */
1772 static const char * const target_table[] = {
1773 [0] = SPECIAL_DEFAULT_TARGET,
1774 [1] = SPECIAL_RESCUE_TARGET,
1775 [2] = SPECIAL_EMERGENCY_TARGET,
1776 [3] = SPECIAL_HALT_TARGET,
1777 [4] = SPECIAL_POWEROFF_TARGET,
1778 [5] = SPECIAL_REBOOT_TARGET,
1779 [6] = SPECIAL_KEXEC_TARGET
1782 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
1783 static const ManagerExitCode code_table[] = {
1785 [1] = MANAGER_POWEROFF,
1786 [2] = MANAGER_REBOOT,
1790 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
1791 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
1792 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
1793 manager_start_target(m, target_table[idx],
1794 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
1798 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
1799 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
1800 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
1804 switch (sfsi.ssi_signo - SIGRTMIN) {
1807 log_debug("Enabling showing of status.");
1808 manager_set_show_status(m, SHOW_STATUS_YES);
1812 log_debug("Disabling showing of status.");
1813 manager_set_show_status(m, SHOW_STATUS_NO);
1817 log_set_max_level(LOG_DEBUG);
1818 log_notice("Setting log level to debug.");
1822 log_set_max_level(LOG_INFO);
1823 log_notice("Setting log level to info.");
1827 if (m->running_as == SYSTEMD_USER) {
1828 m->exit_code = MANAGER_EXIT;
1832 /* This is a nop on init */
1836 case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */
1837 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
1838 log_notice("Setting log target to journal-or-kmsg.");
1842 log_set_target(LOG_TARGET_CONSOLE);
1843 log_notice("Setting log target to console.");
1847 log_set_target(LOG_TARGET_KMSG);
1848 log_notice("Setting log target to kmsg.");
1852 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
1859 manager_dispatch_sigchld(m);
1864 static int manager_dispatch_time_change_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1865 Manager *m = userdata;
1870 assert(m->time_change_fd == fd);
1872 log_struct(LOG_INFO,
1873 LOG_MESSAGE_ID(SD_MESSAGE_TIME_CHANGE),
1874 LOG_MESSAGE("Time has been changed"),
1877 /* Restart the watch */
1878 m->time_change_event_source = sd_event_source_unref(m->time_change_event_source);
1879 m->time_change_fd = safe_close(m->time_change_fd);
1881 manager_setup_time_change(m);
1883 HASHMAP_FOREACH(u, m->units, i)
1884 if (UNIT_VTABLE(u)->time_change)
1885 UNIT_VTABLE(u)->time_change(u);
1890 static int manager_dispatch_idle_pipe_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1891 Manager *m = userdata;
1894 assert(m->idle_pipe[2] == fd);
1896 m->no_console_output = m->n_on_console > 0;
1898 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
1899 manager_close_idle_pipe(m);
1904 static int manager_dispatch_jobs_in_progress(sd_event_source *source, usec_t usec, void *userdata) {
1905 Manager *m = userdata;
1912 manager_print_jobs_in_progress(m);
1914 next = now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_PERIOD_USEC;
1915 r = sd_event_source_set_time(source, next);
1919 return sd_event_source_set_enabled(source, SD_EVENT_ONESHOT);
1922 int manager_loop(Manager *m) {
1925 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
1928 m->exit_code = MANAGER_OK;
1930 /* Release the path cache */
1931 set_free_free(m->unit_path_cache);
1932 m->unit_path_cache = NULL;
1934 manager_check_finished(m);
1936 /* There might still be some zombies hanging around from
1937 * before we were exec()'ed. Let's reap them. */
1938 r = manager_dispatch_sigchld(m);
1942 while (m->exit_code == MANAGER_OK) {
1945 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM)
1948 if (!ratelimit_test(&rl)) {
1949 /* Yay, something is going seriously wrong, pause a little */
1950 log_warning("Looping too fast. Throttling execution a little.");
1955 if (manager_dispatch_load_queue(m) > 0)
1958 if (manager_dispatch_gc_queue(m) > 0)
1961 if (manager_dispatch_cleanup_queue(m) > 0)
1964 if (manager_dispatch_cgroup_queue(m) > 0)
1967 if (manager_dispatch_dbus_queue(m) > 0)
1970 /* Sleep for half the watchdog time */
1971 if (m->runtime_watchdog > 0 && m->running_as == SYSTEMD_SYSTEM) {
1972 wait_usec = m->runtime_watchdog / 2;
1976 wait_usec = USEC_INFINITY;
1978 r = sd_event_run(m->event, wait_usec);
1980 return log_error_errno(r, "Failed to run event loop: %m");
1983 return m->exit_code;
1986 int manager_load_unit_from_dbus_path(Manager *m, const char *s, sd_bus_error *e, Unit **_u) {
1987 _cleanup_free_ char *n = NULL;
1995 r = unit_name_from_dbus_path(s, &n);
1999 r = manager_load_unit(m, n, NULL, e, &u);
2008 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
2018 p = startswith(s, "/org/freedesktop/systemd1/job/");
2022 r = safe_atou(p, &id);
2026 j = manager_get_job(m, id);
2035 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
2038 _cleanup_free_ char *p = NULL;
2042 audit_fd = get_audit_fd();
2046 /* Don't generate audit events if the service was already
2047 * started and we're just deserializing */
2048 if (m->n_reloading > 0)
2051 if (m->running_as != SYSTEMD_SYSTEM)
2054 if (u->type != UNIT_SERVICE)
2057 p = unit_name_to_prefix_and_instance(u->id);
2063 msg = strappenda("unit=", p);
2065 if (audit_log_user_comm_message(audit_fd, type, msg, "systemd", NULL, NULL, NULL, success) < 0) {
2067 /* We aren't allowed to send audit messages?
2068 * Then let's not retry again. */
2071 log_warning_errno(errno, "Failed to send audit message: %m");
2077 void manager_send_unit_plymouth(Manager *m, Unit *u) {
2078 union sockaddr_union sa = PLYMOUTH_SOCKET;
2081 _cleanup_free_ char *message = NULL;
2082 _cleanup_close_ int fd = -1;
2084 /* Don't generate plymouth events if the service was already
2085 * started and we're just deserializing */
2086 if (m->n_reloading > 0)
2089 if (m->running_as != SYSTEMD_SYSTEM)
2092 if (detect_container(NULL) > 0)
2095 if (u->type != UNIT_SERVICE &&
2096 u->type != UNIT_MOUNT &&
2097 u->type != UNIT_SWAP)
2100 /* We set SOCK_NONBLOCK here so that we rather drop the
2101 * message then wait for plymouth */
2102 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
2104 log_error_errno(errno, "socket() failed: %m");
2108 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
2110 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
2111 log_error_errno(errno, "connect() failed: %m");
2115 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
2121 if (write(fd, message, n + 1) != n + 1)
2122 if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED))
2123 log_error_errno(errno, "Failed to write Plymouth message: %m");
2126 void manager_dispatch_bus_name_owner_changed(
2129 const char* old_owner,
2130 const char *new_owner) {
2137 u = hashmap_get(m->watch_bus, name);
2141 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2144 int manager_open_serialization(Manager *m, FILE **_f) {
2151 path = m->running_as == SYSTEMD_SYSTEM ? "/run/systemd" : "/tmp";
2152 fd = open_tmpfile(path, O_RDWR|O_CLOEXEC);
2156 log_debug("Serializing state to %s", path);
2158 f = fdopen(fd, "w+");
2169 int manager_serialize(Manager *m, FILE *f, FDSet *fds, bool switching_root) {
2182 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2183 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
2184 fprintf(f, "n-installed-jobs=%u\n", m->n_installed_jobs);
2185 fprintf(f, "n-failed-jobs=%u\n", m->n_failed_jobs);
2187 dual_timestamp_serialize(f, "firmware-timestamp", &m->firmware_timestamp);
2188 dual_timestamp_serialize(f, "loader-timestamp", &m->loader_timestamp);
2189 dual_timestamp_serialize(f, "kernel-timestamp", &m->kernel_timestamp);
2190 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
2193 dual_timestamp_serialize(f, "userspace-timestamp", &m->userspace_timestamp);
2194 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2195 dual_timestamp_serialize(f, "security-start-timestamp", &m->security_start_timestamp);
2196 dual_timestamp_serialize(f, "security-finish-timestamp", &m->security_finish_timestamp);
2197 dual_timestamp_serialize(f, "generators-start-timestamp", &m->generators_start_timestamp);
2198 dual_timestamp_serialize(f, "generators-finish-timestamp", &m->generators_finish_timestamp);
2199 dual_timestamp_serialize(f, "units-load-start-timestamp", &m->units_load_start_timestamp);
2200 dual_timestamp_serialize(f, "units-load-finish-timestamp", &m->units_load_finish_timestamp);
2203 if (!switching_root) {
2204 STRV_FOREACH(e, m->environment) {
2205 _cleanup_free_ char *ce;
2211 fprintf(f, "env=%s\n", *e);
2215 if (m->notify_fd >= 0) {
2218 copy = fdset_put_dup(fds, m->notify_fd);
2222 fprintf(f, "notify-fd=%i\n", copy);
2223 fprintf(f, "notify-socket=%s\n", m->notify_socket);
2226 if (m->kdbus_fd >= 0) {
2229 copy = fdset_put_dup(fds, m->kdbus_fd);
2233 fprintf(f, "kdbus-fd=%i\n", copy);
2236 bus_track_serialize(m->subscribed, f);
2240 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
2248 r = unit_serialize(u, f, fds, !switching_root);
2255 assert(m->n_reloading > 0);
2261 r = bus_fdset_add_all(m, fds);
2268 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2274 log_debug("Deserializing state...");
2279 char line[LINE_MAX], *l;
2281 if (!fgets(line, sizeof(line), f)) {
2296 if (startswith(l, "current-job-id=")) {
2299 if (safe_atou32(l+15, &id) < 0)
2300 log_debug("Failed to parse current job id value %s", l+15);
2302 m->current_job_id = MAX(m->current_job_id, id);
2304 } else if (startswith(l, "n-installed-jobs=")) {
2307 if (safe_atou32(l+17, &n) < 0)
2308 log_debug("Failed to parse installed jobs counter %s", l+17);
2310 m->n_installed_jobs += n;
2312 } else if (startswith(l, "n-failed-jobs=")) {
2315 if (safe_atou32(l+14, &n) < 0)
2316 log_debug("Failed to parse failed jobs counter %s", l+14);
2318 m->n_failed_jobs += n;
2320 } else if (startswith(l, "taint-usr=")) {
2323 b = parse_boolean(l+10);
2325 log_debug("Failed to parse taint /usr flag %s", l+10);
2327 m->taint_usr = m->taint_usr || b;
2329 } else if (startswith(l, "firmware-timestamp="))
2330 dual_timestamp_deserialize(l+19, &m->firmware_timestamp);
2331 else if (startswith(l, "loader-timestamp="))
2332 dual_timestamp_deserialize(l+17, &m->loader_timestamp);
2333 else if (startswith(l, "kernel-timestamp="))
2334 dual_timestamp_deserialize(l+17, &m->kernel_timestamp);
2335 else if (startswith(l, "initrd-timestamp="))
2336 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
2337 else if (startswith(l, "userspace-timestamp="))
2338 dual_timestamp_deserialize(l+20, &m->userspace_timestamp);
2339 else if (startswith(l, "finish-timestamp="))
2340 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
2341 else if (startswith(l, "security-start-timestamp="))
2342 dual_timestamp_deserialize(l+25, &m->security_start_timestamp);
2343 else if (startswith(l, "security-finish-timestamp="))
2344 dual_timestamp_deserialize(l+26, &m->security_finish_timestamp);
2345 else if (startswith(l, "generators-start-timestamp="))
2346 dual_timestamp_deserialize(l+27, &m->generators_start_timestamp);
2347 else if (startswith(l, "generators-finish-timestamp="))
2348 dual_timestamp_deserialize(l+28, &m->generators_finish_timestamp);
2349 else if (startswith(l, "units-load-start-timestamp="))
2350 dual_timestamp_deserialize(l+27, &m->units_load_start_timestamp);
2351 else if (startswith(l, "units-load-finish-timestamp="))
2352 dual_timestamp_deserialize(l+28, &m->units_load_finish_timestamp);
2353 else if (startswith(l, "env=")) {
2354 _cleanup_free_ char *uce = NULL;
2357 uce = cunescape(l+4);
2363 e = strv_env_set(m->environment, uce);
2369 strv_free(m->environment);
2372 } else if (startswith(l, "notify-fd=")) {
2375 if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2376 log_debug("Failed to parse notify fd: %s", l + 10);
2378 m->notify_event_source = sd_event_source_unref(m->notify_event_source);
2379 safe_close(m->notify_fd);
2380 m->notify_fd = fdset_remove(fds, fd);
2383 } else if (startswith(l, "notify-socket=")) {
2392 free(m->notify_socket);
2393 m->notify_socket = n;
2395 } else if (startswith(l, "kdbus-fd=")) {
2398 if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
2399 log_debug("Failed to parse kdbus fd: %s", l + 9);
2401 safe_close(m->kdbus_fd);
2402 m->kdbus_fd = fdset_remove(fds, fd);
2408 k = bus_track_deserialize_item(&m->deserialized_subscribed, l);
2410 log_debug_errno(k, "Failed to deserialize bus tracker object: %m");
2412 log_debug("Unknown serialization item '%s'", l);
2418 char name[UNIT_NAME_MAX+2];
2421 if (!fgets(name, sizeof(name), f)) {
2432 r = manager_load_unit(m, strstrip(name), NULL, NULL, &u);
2436 r = unit_deserialize(u, f, fds);
2445 assert(m->n_reloading > 0);
2451 int manager_reload(Manager *m) {
2453 _cleanup_fclose_ FILE *f = NULL;
2454 _cleanup_fdset_free_ FDSet *fds = NULL;
2458 r = manager_open_serialization(m, &f);
2463 bus_manager_send_reloading(m, true);
2471 r = manager_serialize(m, f, fds, false);
2477 if (fseeko(f, 0, SEEK_SET) < 0) {
2482 /* From here on there is no way back. */
2483 manager_clear_jobs_and_units(m);
2484 manager_undo_generators(m);
2485 lookup_paths_free(&m->lookup_paths);
2487 /* Find new unit paths */
2488 manager_run_generators(m);
2490 q = lookup_paths_init(
2491 &m->lookup_paths, m->running_as, true,
2493 m->generator_unit_path,
2494 m->generator_unit_path_early,
2495 m->generator_unit_path_late);
2499 manager_build_unit_path_cache(m);
2501 /* First, enumerate what we can from all config files */
2502 q = manager_enumerate(m);
2506 /* Second, deserialize our stored data */
2507 q = manager_deserialize(m, f, fds);
2514 /* Re-register notify_fd as event source */
2515 q = manager_setup_notify(m);
2519 /* Third, fire things up! */
2520 q = manager_coldplug(m);
2524 assert(m->n_reloading > 0);
2527 m->send_reloading_done = true;
2532 bool manager_is_reloading_or_reexecuting(Manager *m) {
2535 return m->n_reloading != 0;
2538 void manager_reset_failed(Manager *m) {
2544 HASHMAP_FOREACH(u, m->units, i)
2545 unit_reset_failed(u);
2548 bool manager_unit_inactive_or_pending(Manager *m, const char *name) {
2554 /* Returns true if the unit is inactive or going down */
2555 u = manager_get_unit(m, name);
2559 return unit_inactive_or_pending(u);
2562 static void manager_notify_finished(Manager *m) {
2563 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
2564 usec_t firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec;
2569 if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0) {
2571 /* Note that m->kernel_usec.monotonic is always at 0,
2572 * and m->firmware_usec.monotonic and
2573 * m->loader_usec.monotonic should be considered
2574 * negative values. */
2576 firmware_usec = m->firmware_timestamp.monotonic - m->loader_timestamp.monotonic;
2577 loader_usec = m->loader_timestamp.monotonic - m->kernel_timestamp.monotonic;
2578 userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2579 total_usec = m->firmware_timestamp.monotonic + m->finish_timestamp.monotonic;
2581 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
2583 kernel_usec = m->initrd_timestamp.monotonic - m->kernel_timestamp.monotonic;
2584 initrd_usec = m->userspace_timestamp.monotonic - m->initrd_timestamp.monotonic;
2586 log_struct(LOG_INFO,
2587 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2588 "KERNEL_USEC="USEC_FMT, kernel_usec,
2589 "INITRD_USEC="USEC_FMT, initrd_usec,
2590 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2591 LOG_MESSAGE("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
2592 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2593 format_timespan(initrd, sizeof(initrd), initrd_usec, USEC_PER_MSEC),
2594 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2595 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC)),
2598 kernel_usec = m->userspace_timestamp.monotonic - m->kernel_timestamp.monotonic;
2601 log_struct(LOG_INFO,
2602 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2603 "KERNEL_USEC="USEC_FMT, kernel_usec,
2604 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2605 LOG_MESSAGE("Startup finished in %s (kernel) + %s (userspace) = %s.",
2606 format_timespan(kernel, sizeof(kernel), kernel_usec, USEC_PER_MSEC),
2607 format_timespan(userspace, sizeof(userspace), userspace_usec, USEC_PER_MSEC),
2608 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC)),
2612 firmware_usec = loader_usec = initrd_usec = kernel_usec = 0;
2613 total_usec = userspace_usec = m->finish_timestamp.monotonic - m->userspace_timestamp.monotonic;
2615 log_struct(LOG_INFO,
2616 LOG_MESSAGE_ID(SD_MESSAGE_STARTUP_FINISHED),
2617 "USERSPACE_USEC="USEC_FMT, userspace_usec,
2618 LOG_MESSAGE("Startup finished in %s.",
2619 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC)),
2623 bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec);
2627 "STATUS=Startup finished in %s.",
2628 format_timespan(sum, sizeof(sum), total_usec, USEC_PER_MSEC));
2631 void manager_check_finished(Manager *m) {
2637 if (hashmap_size(m->jobs) > 0) {
2639 if (m->jobs_in_progress_event_source)
2640 sd_event_source_set_time(m->jobs_in_progress_event_source, now(CLOCK_MONOTONIC) + JOBS_IN_PROGRESS_WAIT_USEC);
2645 manager_flip_auto_status(m, false);
2647 /* Notify Type=idle units that we are done now */
2648 m->idle_pipe_event_source = sd_event_source_unref(m->idle_pipe_event_source);
2649 manager_close_idle_pipe(m);
2651 /* Turn off confirm spawn now */
2652 m->confirm_spawn = false;
2654 /* No need to update ask password status when we're going non-interactive */
2655 manager_close_ask_password(m);
2657 /* This is no longer the first boot */
2658 manager_set_first_boot(m, false);
2660 if (dual_timestamp_is_set(&m->finish_timestamp))
2663 dual_timestamp_get(&m->finish_timestamp);
2665 manager_notify_finished(m);
2667 SET_FOREACH(u, m->startup_units, i)
2669 cgroup_context_apply(unit_get_cgroup_context(u), unit_get_cgroup_mask(u), u->cgroup_path, manager_state(m));
2672 static int create_generator_dir(Manager *m, char **generator, const char *name) {
2683 if (m->running_as == SYSTEMD_SYSTEM && getpid() == 1) {
2684 /* systemd --system, not running --test */
2686 p = strappend("/run/systemd/", name);
2690 r = mkdir_p_label(p, 0755);
2692 log_error_errno(r, "Failed to create generator directory %s: %m", p);
2696 } else if (m->running_as == SYSTEMD_USER) {
2697 const char *s = NULL;
2699 s = getenv("XDG_RUNTIME_DIR");
2702 p = strjoin(s, "/systemd/", name, NULL);
2706 r = mkdir_p_label(p, 0755);
2708 log_error_errno(r, "Failed to create generator directory %s: %m", p);
2713 /* systemd --system --test */
2715 p = strjoin("/tmp/systemd-", name, ".XXXXXX", NULL);
2720 log_error_errno(errno, "Failed to create generator directory %s: %m",
2731 static void trim_generator_dir(Manager *m, char **generator) {
2738 if (rmdir(*generator) >= 0) {
2746 void manager_run_generators(Manager *m) {
2747 _cleanup_closedir_ DIR *d = NULL;
2748 const char *generator_path;
2749 const char *argv[5];
2757 generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
2758 d = opendir(generator_path);
2760 if (errno == ENOENT)
2763 log_error_errno(errno, "Failed to enumerate generator directory %s: %m",
2768 r = create_generator_dir(m, &m->generator_unit_path, "generator");
2772 r = create_generator_dir(m, &m->generator_unit_path_early, "generator.early");
2776 r = create_generator_dir(m, &m->generator_unit_path_late, "generator.late");
2780 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
2781 argv[1] = m->generator_unit_path;
2782 argv[2] = m->generator_unit_path_early;
2783 argv[3] = m->generator_unit_path_late;
2786 RUN_WITH_UMASK(0022)
2787 execute_directory(generator_path, d, DEFAULT_TIMEOUT_USEC, (char**) argv);
2790 trim_generator_dir(m, &m->generator_unit_path);
2791 trim_generator_dir(m, &m->generator_unit_path_early);
2792 trim_generator_dir(m, &m->generator_unit_path_late);
2795 static void remove_generator_dir(Manager *m, char **generator) {
2802 strv_remove(m->lookup_paths.unit_path, *generator);
2803 rm_rf(*generator, false, true, false);
2809 void manager_undo_generators(Manager *m) {
2812 remove_generator_dir(m, &m->generator_unit_path);
2813 remove_generator_dir(m, &m->generator_unit_path_early);
2814 remove_generator_dir(m, &m->generator_unit_path_late);
2817 int manager_environment_add(Manager *m, char **minus, char **plus) {
2818 char **a = NULL, **b = NULL, **l;
2823 if (!strv_isempty(minus)) {
2824 a = strv_env_delete(l, 1, minus);
2831 if (!strv_isempty(plus)) {
2832 b = strv_env_merge(2, l, plus);
2841 if (m->environment != l)
2842 strv_free(m->environment);
2849 manager_clean_environment(m);
2850 strv_sort(m->environment);
2855 int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
2860 for (i = 0; i < _RLIMIT_MAX; i++) {
2861 if (!default_rlimit[i])
2864 m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
2872 void manager_recheck_journal(Manager *m) {
2877 if (m->running_as != SYSTEMD_SYSTEM)
2880 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
2881 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
2882 log_close_journal();
2886 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
2887 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
2888 log_close_journal();
2892 /* Hmm, OK, so the socket is fully up and the service is up
2893 * too, then let's make use of the thing. */
2897 void manager_set_show_status(Manager *m, ShowStatus mode) {
2899 assert(IN_SET(mode, SHOW_STATUS_AUTO, SHOW_STATUS_NO, SHOW_STATUS_YES, SHOW_STATUS_TEMPORARY));
2901 if (m->running_as != SYSTEMD_SYSTEM)
2904 m->show_status = mode;
2907 touch("/run/systemd/show-status");
2909 unlink("/run/systemd/show-status");
2912 static bool manager_get_show_status(Manager *m, StatusType type) {
2915 if (m->running_as != SYSTEMD_SYSTEM)
2918 if (m->no_console_output)
2921 if (!IN_SET(manager_state(m), MANAGER_INITIALIZING, MANAGER_STARTING, MANAGER_STOPPING))
2924 /* If we cannot find out the status properly, just proceed. */
2925 if (type != STATUS_TYPE_EMERGENCY && manager_check_ask_password(m) > 0)
2928 if (m->show_status > 0)
2931 /* If Plymouth is running make sure we show the status, so
2932 * that there's something nice to see when people press Esc */
2933 return plymouth_running();
2936 void manager_set_first_boot(Manager *m, bool b) {
2939 if (m->running_as != SYSTEMD_SYSTEM)
2945 touch("/run/systemd/first-boot");
2947 unlink("/run/systemd/first-boot");
2950 void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) {
2953 /* If m is NULL, assume we're after shutdown and let the messages through. */
2955 if (m && !manager_get_show_status(m, type))
2958 /* XXX We should totally drop the check for ephemeral here
2959 * and thus effectively make 'Type=idle' pointless. */
2960 if (type == STATUS_TYPE_EPHEMERAL && m && m->n_on_console > 0)
2963 va_start(ap, format);
2964 status_vprintf(status, true, type == STATUS_TYPE_EPHEMERAL, format, ap);
2968 int manager_get_unit_by_path(Manager *m, const char *path, const char *suffix, Unit **_found) {
2969 _cleanup_free_ char *p = NULL;
2977 p = unit_name_from_path(path, suffix);
2981 found = manager_get_unit(m, p);
2991 Set *manager_get_units_requiring_mounts_for(Manager *m, const char *path) {
2992 char p[strlen(path)+1];
2998 path_kill_slashes(p);
3000 return hashmap_get(m->units_requiring_mounts_for, streq(p, "/") ? "" : p);
3003 const char *manager_get_runtime_prefix(Manager *m) {
3006 return m->running_as == SYSTEMD_SYSTEM ?
3008 getenv("XDG_RUNTIME_DIR");
3011 ManagerState manager_state(Manager *m) {
3016 /* Did we ever finish booting? If not then we are still starting up */
3017 if (!dual_timestamp_is_set(&m->finish_timestamp)) {
3019 u = manager_get_unit(m, SPECIAL_BASIC_TARGET);
3020 if (!u || !UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u)))
3021 return MANAGER_INITIALIZING;
3023 return MANAGER_STARTING;
3026 /* Is the special shutdown target queued? If so, we are in shutdown state */
3027 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
3028 if (u && u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))
3029 return MANAGER_STOPPING;
3031 /* Are the rescue or emergency targets active or queued? If so we are in maintenance state */
3032 u = manager_get_unit(m, SPECIAL_RESCUE_TARGET);
3033 if (u && (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)) ||
3034 (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))))
3035 return MANAGER_MAINTENANCE;
3037 u = manager_get_unit(m, SPECIAL_EMERGENCY_TARGET);
3038 if (u && (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)) ||
3039 (u->job && IN_SET(u->job->type, JOB_START, JOB_RESTART, JOB_TRY_RESTART, JOB_RELOAD_OR_START))))
3040 return MANAGER_MAINTENANCE;
3042 /* Are there any failed units? If so, we are in degraded mode */
3043 if (set_size(m->failed_units) > 0)
3044 return MANAGER_DEGRADED;
3046 return MANAGER_RUNNING;
3049 static const char *const manager_state_table[_MANAGER_STATE_MAX] = {
3050 [MANAGER_INITIALIZING] = "initializing",
3051 [MANAGER_STARTING] = "starting",
3052 [MANAGER_RUNNING] = "running",
3053 [MANAGER_DEGRADED] = "degraded",
3054 [MANAGER_MAINTENANCE] = "maintenance",
3055 [MANAGER_STOPPING] = "stopping",
3058 DEFINE_STRING_TABLE_LOOKUP(manager_state, ManagerState);