1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include <sys/epoll.h>
27 #include <sys/signalfd.h>
31 #include <sys/reboot.h>
32 #include <sys/ioctl.h>
36 #include <sys/types.h>
44 #include <systemd/sd-daemon.h>
53 #include "ratelimit.h"
55 #include "mount-setup.h"
56 #include "unit-name.h"
57 #include "dbus-unit.h"
60 #include "path-lookup.h"
62 #include "bus-errors.h"
63 #include "exit-status.h"
66 #include "cgroup-util.h"
68 /* As soon as 16 units are in our GC queue, make sure to run a gc sweep */
69 #define GC_QUEUE_ENTRIES_MAX 16
71 /* As soon as 5s passed since a unit was added to our GC queue, make sure to run a gc sweep */
72 #define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
74 /* Where clients shall send notification messages to */
75 #define NOTIFY_SOCKET_SYSTEM "/run/systemd/notify"
76 #define NOTIFY_SOCKET_USER "@/org/freedesktop/systemd1/notify"
78 static int manager_setup_notify(Manager *m) {
81 struct sockaddr_un un;
83 struct epoll_event ev;
89 m->notify_watch.type = WATCH_NOTIFY;
90 if ((m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
91 log_error("Failed to allocate notification socket: %m");
96 sa.sa.sa_family = AF_UNIX;
99 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET_USER "/%llu", random_ull());
101 unlink(NOTIFY_SOCKET_SYSTEM);
102 strncpy(sa.un.sun_path, NOTIFY_SOCKET_SYSTEM, sizeof(sa.un.sun_path));
105 if (sa.un.sun_path[0] == '@')
106 sa.un.sun_path[0] = 0;
109 r = bind(m->notify_watch.fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
113 log_error("bind() failed: %m");
117 if (setsockopt(m->notify_watch.fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0) {
118 log_error("SO_PASSCRED failed: %m");
124 ev.data.ptr = &m->notify_watch;
126 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev) < 0)
129 if (sa.un.sun_path[0] == 0)
130 sa.un.sun_path[0] = '@';
132 if (!(m->notify_socket = strdup(sa.un.sun_path)))
135 log_debug("Using notification socket %s", m->notify_socket);
140 static int enable_special_signals(Manager *m) {
145 /* Enable that we get SIGINT on control-alt-del. In containers
146 * this will fail with EPERM, so ignore that. */
147 if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM)
148 log_warning("Failed to enable ctrl-alt-del handling: %m");
150 fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
152 /* Support systems without virtual console */
154 log_warning("Failed to open /dev/tty0: %m");
156 /* Enable that we get SIGWINCH on kbrequest */
157 if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0)
158 log_warning("Failed to enable kbrequest handling: %s", strerror(errno));
160 close_nointr_nofail(fd);
166 static int manager_setup_signals(Manager *m) {
168 struct epoll_event ev;
173 /* We are not interested in SIGSTOP and friends. */
175 sa.sa_handler = SIG_DFL;
176 sa.sa_flags = SA_NOCLDSTOP|SA_RESTART;
177 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
179 assert_se(sigemptyset(&mask) == 0);
181 sigset_add_many(&mask,
182 SIGCHLD, /* Child died */
183 SIGTERM, /* Reexecute daemon */
184 SIGHUP, /* Reload configuration */
185 SIGUSR1, /* systemd/upstart: reconnect to D-Bus */
186 SIGUSR2, /* systemd: dump status */
187 SIGINT, /* Kernel sends us this on control-alt-del */
188 SIGWINCH, /* Kernel sends us this on kbrequest (alt-arrowup) */
189 SIGPWR, /* Some kernel drivers and upsd send us this on power failure */
190 SIGRTMIN+0, /* systemd: start default.target */
191 SIGRTMIN+1, /* systemd: isolate rescue.target */
192 SIGRTMIN+2, /* systemd: isolate emergency.target */
193 SIGRTMIN+3, /* systemd: start halt.target */
194 SIGRTMIN+4, /* systemd: start poweroff.target */
195 SIGRTMIN+5, /* systemd: start reboot.target */
196 SIGRTMIN+6, /* systemd: start kexec.target */
197 SIGRTMIN+13, /* systemd: Immediate halt */
198 SIGRTMIN+14, /* systemd: Immediate poweroff */
199 SIGRTMIN+15, /* systemd: Immediate reboot */
200 SIGRTMIN+16, /* systemd: Immediate kexec */
201 SIGRTMIN+20, /* systemd: enable status messages */
202 SIGRTMIN+21, /* systemd: disable status messages */
203 SIGRTMIN+22, /* systemd: set log level to LOG_DEBUG */
204 SIGRTMIN+23, /* systemd: set log level to LOG_INFO */
205 SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */
206 SIGRTMIN+27, /* systemd: set log target to console */
207 SIGRTMIN+28, /* systemd: set log target to kmsg */
208 SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg */
210 assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
212 m->signal_watch.type = WATCH_SIGNAL;
213 if ((m->signal_watch.fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC)) < 0)
218 ev.data.ptr = &m->signal_watch;
220 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->signal_watch.fd, &ev) < 0)
223 if (m->running_as == MANAGER_SYSTEM)
224 return enable_special_signals(m);
229 static void manager_strip_environment(Manager *m) {
232 /* Remove variables from the inherited set that are part of
233 * the container interface:
234 * http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface */
235 strv_remove_prefix(m->environment, "container=");
236 strv_remove_prefix(m->environment, "container_");
238 /* Remove variables from the inherited set that are part of
239 * the initrd interface:
240 * http://www.freedesktop.org/wiki/Software/systemd/InitrdInterface */
241 strv_remove_prefix(m->environment, "RD_");
244 int manager_new(ManagerRunningAs running_as, Manager **_m) {
249 assert(running_as >= 0);
250 assert(running_as < _MANAGER_RUNNING_AS_MAX);
252 if (!(m = new0(Manager, 1)))
255 dual_timestamp_get(&m->startup_timestamp);
257 m->running_as = running_as;
258 m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
259 m->exit_code = _MANAGER_EXIT_CODE_INVALID;
260 m->pin_cgroupfs_fd = -1;
266 m->signal_watch.fd = m->mount_watch.fd = m->udev_watch.fd = m->epoll_fd = m->dev_autofs_fd = m->swap_watch.fd = -1;
267 m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
269 m->environment = strv_copy(environ);
273 manager_strip_environment(m);
275 if (running_as == MANAGER_SYSTEM) {
276 m->default_controllers = strv_new("cpu", NULL);
277 if (!m->default_controllers)
281 if (!(m->units = hashmap_new(string_hash_func, string_compare_func)))
284 if (!(m->jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
287 if (!(m->transaction_jobs = hashmap_new(trivial_hash_func, trivial_compare_func)))
290 if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
293 if (!(m->cgroup_bondings = hashmap_new(string_hash_func, string_compare_func)))
296 if (!(m->watch_bus = hashmap_new(string_hash_func, string_compare_func)))
299 if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
302 if ((r = lookup_paths_init(&m->lookup_paths, m->running_as, true)) < 0)
305 if ((r = manager_setup_signals(m)) < 0)
308 if ((r = manager_setup_cgroup(m)) < 0)
311 if ((r = manager_setup_notify(m)) < 0)
314 /* Try to connect to the busses, if possible. */
315 if ((r = bus_init(m, running_as != MANAGER_SYSTEM)) < 0)
319 if ((m->audit_fd = audit_open()) < 0 &&
320 /* If the kernel lacks netlink or audit support,
321 * don't worry about it. */
322 errno != EAFNOSUPPORT && errno != EPROTONOSUPPORT)
323 log_error("Failed to connect to audit log: %m");
326 m->taint_usr = dir_is_empty("/usr") > 0;
336 static unsigned manager_dispatch_cleanup_queue(Manager *m) {
342 while ((u = m->cleanup_queue)) {
343 assert(u->in_cleanup_queue);
353 GC_OFFSET_IN_PATH, /* This one is on the path we were traveling */
354 GC_OFFSET_UNSURE, /* No clue */
355 GC_OFFSET_GOOD, /* We still need this unit */
356 GC_OFFSET_BAD, /* We don't need this unit anymore */
360 static void unit_gc_sweep(Unit *u, unsigned gc_marker) {
367 if (u->gc_marker == gc_marker + GC_OFFSET_GOOD ||
368 u->gc_marker == gc_marker + GC_OFFSET_BAD ||
369 u->gc_marker == gc_marker + GC_OFFSET_IN_PATH)
372 if (u->in_cleanup_queue)
375 if (unit_check_gc(u))
378 u->gc_marker = gc_marker + GC_OFFSET_IN_PATH;
382 SET_FOREACH(other, u->dependencies[UNIT_REFERENCED_BY], i) {
383 unit_gc_sweep(other, gc_marker);
385 if (other->gc_marker == gc_marker + GC_OFFSET_GOOD)
388 if (other->gc_marker != gc_marker + GC_OFFSET_BAD)
395 /* We were unable to find anything out about this entry, so
396 * let's investigate it later */
397 u->gc_marker = gc_marker + GC_OFFSET_UNSURE;
398 unit_add_to_gc_queue(u);
402 /* We definitely know that this one is not useful anymore, so
403 * let's mark it for deletion */
404 u->gc_marker = gc_marker + GC_OFFSET_BAD;
405 unit_add_to_cleanup_queue(u);
409 u->gc_marker = gc_marker + GC_OFFSET_GOOD;
412 static unsigned manager_dispatch_gc_queue(Manager *m) {
419 if ((m->n_in_gc_queue < GC_QUEUE_ENTRIES_MAX) &&
420 (m->gc_queue_timestamp <= 0 ||
421 (m->gc_queue_timestamp + GC_QUEUE_USEC_MAX) > now(CLOCK_MONOTONIC)))
424 log_debug("Running GC...");
426 m->gc_marker += _GC_OFFSET_MAX;
427 if (m->gc_marker + _GC_OFFSET_MAX <= _GC_OFFSET_MAX)
430 gc_marker = m->gc_marker;
432 while ((u = m->gc_queue)) {
433 assert(u->in_gc_queue);
435 unit_gc_sweep(u, gc_marker);
437 LIST_REMOVE(Unit, gc_queue, m->gc_queue, u);
438 u->in_gc_queue = false;
442 if (u->gc_marker == gc_marker + GC_OFFSET_BAD ||
443 u->gc_marker == gc_marker + GC_OFFSET_UNSURE) {
444 log_debug("Collecting %s", u->id);
445 u->gc_marker = gc_marker + GC_OFFSET_BAD;
446 unit_add_to_cleanup_queue(u);
450 m->n_in_gc_queue = 0;
451 m->gc_queue_timestamp = 0;
456 static void manager_clear_jobs_and_units(Manager *m) {
462 while ((j = hashmap_first(m->transaction_jobs)))
465 while ((u = hashmap_first(m->units)))
468 manager_dispatch_cleanup_queue(m);
470 assert(!m->load_queue);
471 assert(!m->run_queue);
472 assert(!m->dbus_unit_queue);
473 assert(!m->dbus_job_queue);
474 assert(!m->cleanup_queue);
475 assert(!m->gc_queue);
477 assert(hashmap_isempty(m->transaction_jobs));
478 assert(hashmap_isempty(m->jobs));
479 assert(hashmap_isempty(m->units));
482 void manager_free(Manager *m) {
487 manager_clear_jobs_and_units(m);
489 for (c = 0; c < _UNIT_TYPE_MAX; c++)
490 if (unit_vtable[c]->shutdown)
491 unit_vtable[c]->shutdown(m);
493 /* If we reexecute ourselves, we keep the root cgroup
495 manager_shutdown_cgroup(m, m->exit_code != MANAGER_REEXECUTE);
497 manager_undo_generators(m);
501 hashmap_free(m->units);
502 hashmap_free(m->jobs);
503 hashmap_free(m->transaction_jobs);
504 hashmap_free(m->watch_pids);
505 hashmap_free(m->watch_bus);
507 if (m->epoll_fd >= 0)
508 close_nointr_nofail(m->epoll_fd);
509 if (m->signal_watch.fd >= 0)
510 close_nointr_nofail(m->signal_watch.fd);
511 if (m->notify_watch.fd >= 0)
512 close_nointr_nofail(m->notify_watch.fd);
515 if (m->audit_fd >= 0)
516 audit_close(m->audit_fd);
519 free(m->notify_socket);
521 lookup_paths_free(&m->lookup_paths);
522 strv_free(m->environment);
524 strv_free(m->default_controllers);
526 hashmap_free(m->cgroup_bondings);
527 set_free_free(m->unit_path_cache);
532 int manager_enumerate(Manager *m) {
538 /* Let's ask every type to load all units from disk/kernel
539 * that it might know */
540 for (c = 0; c < _UNIT_TYPE_MAX; c++)
541 if (unit_vtable[c]->enumerate)
542 if ((q = unit_vtable[c]->enumerate(m)) < 0)
545 manager_dispatch_load_queue(m);
549 int manager_coldplug(Manager *m) {
557 /* Then, let's set up their initial state. */
558 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
564 if ((q = unit_coldplug(u)) < 0)
571 static void manager_build_unit_path_cache(Manager *m) {
578 set_free_free(m->unit_path_cache);
580 if (!(m->unit_path_cache = set_new(string_hash_func, string_compare_func))) {
581 log_error("Failed to allocate unit path cache.");
585 /* This simply builds a list of files we know exist, so that
586 * we don't always have to go to disk */
588 STRV_FOREACH(i, m->lookup_paths.unit_path) {
591 if (!(d = opendir(*i))) {
592 log_error("Failed to open directory: %m");
596 while ((de = readdir(d))) {
599 if (ignore_file(de->d_name))
602 p = join(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL);
608 if ((r = set_put(m->unit_path_cache, p)) < 0) {
621 log_error("Failed to build unit path cache: %s", strerror(-r));
623 set_free_free(m->unit_path_cache);
624 m->unit_path_cache = NULL;
630 int manager_startup(Manager *m, FILE *serialization, FDSet *fds) {
635 manager_run_generators(m);
637 manager_build_unit_path_cache(m);
639 /* If we will deserialize make sure that during enumeration
640 * this is already known, so we increase the counter here
645 /* First, enumerate what we can from all config files */
646 r = manager_enumerate(m);
648 /* Second, deserialize if there is something to deserialize */
650 if ((q = manager_deserialize(m, serialization, fds)) < 0)
653 /* Third, fire things up! */
654 if ((q = manager_coldplug(m)) < 0)
658 assert(m->n_reloading > 0);
665 static void transaction_unlink_job(Manager *m, Job *j, bool delete_dependencies);
667 static void transaction_delete_job(Manager *m, Job *j, bool delete_dependencies) {
671 /* Deletes one job from the transaction */
673 transaction_unlink_job(m, j, delete_dependencies);
679 static void transaction_delete_unit(Manager *m, Unit *u) {
682 /* Deletes all jobs associated with a certain unit from the
685 while ((j = hashmap_get(m->transaction_jobs, u)))
686 transaction_delete_job(m, j, true);
689 static void transaction_clean_dependencies(Manager *m) {
695 /* Drops all dependencies of all installed jobs */
697 HASHMAP_FOREACH(j, m->jobs, i) {
698 while (j->subject_list)
699 job_dependency_free(j->subject_list);
700 while (j->object_list)
701 job_dependency_free(j->object_list);
704 assert(!m->transaction_anchor);
707 static void transaction_abort(Manager *m) {
712 while ((j = hashmap_first(m->transaction_jobs)))
713 transaction_delete_job(m, j, true);
715 assert(hashmap_isempty(m->transaction_jobs));
717 transaction_clean_dependencies(m);
720 static void transaction_find_jobs_that_matter_to_anchor(Manager *m, Job *j, unsigned generation) {
725 /* A recursive sweep through the graph that marks all units
726 * that matter to the anchor job, i.e. are directly or
727 * indirectly a dependency of the anchor job via paths that
728 * are fully marked as mattering. */
733 l = m->transaction_anchor;
735 LIST_FOREACH(subject, l, l) {
737 /* This link does not matter */
741 /* This unit has already been marked */
742 if (l->object->generation == generation)
745 l->object->matters_to_anchor = true;
746 l->object->generation = generation;
748 transaction_find_jobs_that_matter_to_anchor(m, l->object, generation);
752 static void transaction_merge_and_delete_job(Manager *m, Job *j, Job *other, JobType t) {
753 JobDependency *l, *last;
757 assert(j->unit == other->unit);
758 assert(!j->installed);
760 /* Merges 'other' into 'j' and then deletes 'other'. */
763 j->state = JOB_WAITING;
764 j->override = j->override || other->override;
766 j->matters_to_anchor = j->matters_to_anchor || other->matters_to_anchor;
768 /* Patch us in as new owner of the JobDependency objects */
770 LIST_FOREACH(subject, l, other->subject_list) {
771 assert(l->subject == other);
776 /* Merge both lists */
778 last->subject_next = j->subject_list;
780 j->subject_list->subject_prev = last;
781 j->subject_list = other->subject_list;
784 /* Patch us in as new owner of the JobDependency objects */
786 LIST_FOREACH(object, l, other->object_list) {
787 assert(l->object == other);
792 /* Merge both lists */
794 last->object_next = j->object_list;
796 j->object_list->object_prev = last;
797 j->object_list = other->object_list;
800 /* Kill the other job */
801 other->subject_list = NULL;
802 other->object_list = NULL;
803 transaction_delete_job(m, other, true);
806 static bool job_is_conflicted_by(Job *j) {
811 /* Returns true if this job is pulled in by a least one
812 * ConflictedBy dependency. */
814 LIST_FOREACH(object, l, j->object_list)
821 static int delete_one_unmergeable_job(Manager *m, Job *j) {
826 /* Tries to delete one item in the linked list
827 * j->transaction_next->transaction_next->... that conflicts
828 * with another one, in an attempt to make an inconsistent
829 * transaction work. */
831 /* We rely here on the fact that if a merged with b does not
832 * merge with c, either a or b merge with c neither */
833 LIST_FOREACH(transaction, j, j)
834 LIST_FOREACH(transaction, k, j->transaction_next) {
837 /* Is this one mergeable? Then skip it */
838 if (job_type_is_mergeable(j->type, k->type))
841 /* Ok, we found two that conflict, let's see if we can
842 * drop one of them */
843 if (!j->matters_to_anchor && !k->matters_to_anchor) {
845 /* Both jobs don't matter, so let's
846 * find the one that is smarter to
847 * remove. Let's think positive and
848 * rather remove stops then starts --
849 * except if something is being
850 * stopped because it is conflicted by
851 * another unit in which case we
852 * rather remove the start. */
854 log_debug("Looking at job %s/%s conflicted_by=%s", j->unit->id, job_type_to_string(j->type), yes_no(j->type == JOB_STOP && job_is_conflicted_by(j)));
855 log_debug("Looking at job %s/%s conflicted_by=%s", k->unit->id, job_type_to_string(k->type), yes_no(k->type == JOB_STOP && job_is_conflicted_by(k)));
857 if (j->type == JOB_STOP) {
859 if (job_is_conflicted_by(j))
864 } else if (k->type == JOB_STOP) {
866 if (job_is_conflicted_by(k))
873 } else if (!j->matters_to_anchor)
875 else if (!k->matters_to_anchor)
880 /* Ok, we can drop one, so let's do so. */
881 log_debug("Fixing conflicting jobs by deleting job %s/%s", d->unit->id, job_type_to_string(d->type));
882 transaction_delete_job(m, d, true);
889 static int transaction_merge_jobs(Manager *m, DBusError *e) {
896 /* First step, check whether any of the jobs for one specific
897 * task conflict. If so, try to drop one of them. */
898 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
903 LIST_FOREACH(transaction, k, j->transaction_next) {
904 if (job_type_merge(&t, k->type) >= 0)
907 /* OK, we could not merge all jobs for this
908 * action. Let's see if we can get rid of one
911 if ((r = delete_one_unmergeable_job(m, j)) >= 0)
912 /* Ok, we managed to drop one, now
913 * let's ask our callers to call us
914 * again after garbage collecting */
917 /* We couldn't merge anything. Failure */
918 dbus_set_error(e, BUS_ERROR_TRANSACTION_JOBS_CONFLICTING, "Transaction contains conflicting jobs '%s' and '%s' for %s. Probably contradicting requirement dependencies configured.",
919 job_type_to_string(t), job_type_to_string(k->type), k->unit->id);
924 /* Second step, merge the jobs. */
925 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
929 /* Merge all transactions */
930 LIST_FOREACH(transaction, k, j->transaction_next)
931 assert_se(job_type_merge(&t, k->type) == 0);
933 /* If an active job is mergeable, merge it too */
935 job_type_merge(&t, j->unit->job->type); /* Might fail. Which is OK */
937 while ((k = j->transaction_next)) {
939 transaction_merge_and_delete_job(m, k, j, t);
942 transaction_merge_and_delete_job(m, j, k, t);
945 if (j->unit->job && !j->installed)
946 transaction_merge_and_delete_job(m, j, j->unit->job, t);
948 assert(!j->transaction_next);
949 assert(!j->transaction_prev);
955 static void transaction_drop_redundant(Manager *m) {
960 /* Goes through the transaction and removes all jobs that are
969 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
970 bool changes_something = false;
973 LIST_FOREACH(transaction, k, j) {
975 if (!job_is_anchor(k) &&
976 (k->installed || job_type_is_redundant(k->type, unit_active_state(k->unit))) &&
977 (!k->unit->job || !job_type_is_conflicting(k->type, k->unit->job->type)))
980 changes_something = true;
984 if (changes_something)
987 /* log_debug("Found redundant job %s/%s, dropping.", j->unit->id, job_type_to_string(j->type)); */
988 transaction_delete_job(m, j, false);
996 static bool unit_matters_to_anchor(Unit *u, Job *j) {
998 assert(!j->transaction_prev);
1000 /* Checks whether at least one of the jobs for this unit
1001 * matters to the anchor. */
1003 LIST_FOREACH(transaction, j, j)
1004 if (j->matters_to_anchor)
1010 static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned generation, DBusError *e) {
1017 assert(!j->transaction_prev);
1019 /* Does a recursive sweep through the ordering graph, looking
1020 * for a cycle. If we find cycle we try to break it. */
1022 /* Have we seen this before? */
1023 if (j->generation == generation) {
1026 /* If the marker is NULL we have been here already and
1027 * decided the job was loop-free from here. Hence
1028 * shortcut things and return right-away. */
1032 /* So, the marker is not NULL and we already have been
1033 * here. We have a cycle. Let's try to break it. We go
1034 * backwards in our path and try to find a suitable
1035 * job to remove. We use the marker to find our way
1036 * back, since smart how we are we stored our way back
1038 log_warning("Found ordering cycle on %s/%s", j->unit->id, job_type_to_string(j->type));
1041 for (k = from; k; k = ((k->generation == generation && k->marker != k) ? k->marker : NULL)) {
1043 log_info("Walked on cycle path to %s/%s", k->unit->id, job_type_to_string(k->type));
1047 !unit_matters_to_anchor(k->unit, k)) {
1048 /* Ok, we can drop this one, so let's
1053 /* Check if this in fact was the beginning of
1061 log_warning("Breaking ordering cycle by deleting job %s/%s", delete->unit->id, job_type_to_string(delete->type));
1062 transaction_delete_unit(m, delete->unit);
1066 log_error("Unable to break cycle");
1068 dbus_set_error(e, BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC, "Transaction order is cyclic. See system logs for details.");
1072 /* Make the marker point to where we come from, so that we can
1073 * find our way backwards if we want to break a cycle. We use
1074 * a special marker for the beginning: we point to
1076 j->marker = from ? from : j;
1077 j->generation = generation;
1079 /* We assume that the the dependencies are bidirectional, and
1080 * hence can ignore UNIT_AFTER */
1081 SET_FOREACH(u, j->unit->dependencies[UNIT_BEFORE], i) {
1084 /* Is there a job for this unit? */
1085 if (!(o = hashmap_get(m->transaction_jobs, u)))
1087 /* Ok, there is no job for this in the
1088 * transaction, but maybe there is already one
1093 if ((r = transaction_verify_order_one(m, o, j, generation, e)) < 0)
1097 /* Ok, let's backtrack, and remember that this entry is not on
1098 * our path anymore. */
1104 static int transaction_verify_order(Manager *m, unsigned *generation, DBusError *e) {
1113 /* Check if the ordering graph is cyclic. If it is, try to fix
1114 * that up by dropping one of the jobs. */
1116 g = (*generation)++;
1118 HASHMAP_FOREACH(j, m->transaction_jobs, i)
1119 if ((r = transaction_verify_order_one(m, j, NULL, g, e)) < 0)
1125 static void transaction_collect_garbage(Manager *m) {
1130 /* Drop jobs that are not required by any other job */
1138 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1139 if (j->object_list) {
1140 /* log_debug("Keeping job %s/%s because of %s/%s", */
1141 /* j->unit->id, job_type_to_string(j->type), */
1142 /* j->object_list->subject ? j->object_list->subject->unit->id : "root", */
1143 /* j->object_list->subject ? job_type_to_string(j->object_list->subject->type) : "root"); */
1147 /* log_debug("Garbage collecting job %s/%s", j->unit->id, job_type_to_string(j->type)); */
1148 transaction_delete_job(m, j, true);
1156 static int transaction_is_destructive(Manager *m, DBusError *e) {
1162 /* Checks whether applying this transaction means that
1163 * existing jobs would be replaced */
1165 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1168 assert(!j->transaction_prev);
1169 assert(!j->transaction_next);
1172 j->unit->job != j &&
1173 !job_type_is_superset(j->type, j->unit->job->type)) {
1175 dbus_set_error(e, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE, "Transaction is destructive.");
1183 static void transaction_minimize_impact(Manager *m) {
1187 /* Drops all unnecessary jobs that reverse already active jobs
1188 * or that stop a running service. */
1196 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1197 LIST_FOREACH(transaction, j, j) {
1198 bool stops_running_service, changes_existing_job;
1200 /* If it matters, we shouldn't drop it */
1201 if (j->matters_to_anchor)
1204 /* Would this stop a running service?
1205 * Would this change an existing job?
1206 * If so, let's drop this entry */
1208 stops_running_service =
1209 j->type == JOB_STOP && UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(j->unit));
1211 changes_existing_job =
1213 job_type_is_conflicting(j->type, j->unit->job->type);
1215 if (!stops_running_service && !changes_existing_job)
1218 if (stops_running_service)
1219 log_debug("%s/%s would stop a running service.", j->unit->id, job_type_to_string(j->type));
1221 if (changes_existing_job)
1222 log_debug("%s/%s would change existing job.", j->unit->id, job_type_to_string(j->type));
1224 /* Ok, let's get rid of this */
1225 log_debug("Deleting %s/%s to minimize impact.", j->unit->id, job_type_to_string(j->type));
1227 transaction_delete_job(m, j, true);
1239 static int transaction_apply(Manager *m, JobMode mode) {
1244 /* Moves the transaction jobs to the set of active jobs */
1246 if (mode == JOB_ISOLATE) {
1248 /* When isolating first kill all installed jobs which
1249 * aren't part of the new transaction */
1251 HASHMAP_FOREACH(j, m->jobs, i) {
1252 assert(j->installed);
1254 if (hashmap_get(m->transaction_jobs, j->unit))
1257 /* 'j' itself is safe to remove, but if other jobs
1258 are invalidated recursively, our iterator may become
1259 invalid and we need to start over. */
1260 if (job_finish_and_invalidate(j, JOB_CANCELED) > 0)
1265 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1267 assert(!j->transaction_prev);
1268 assert(!j->transaction_next);
1273 if ((r = hashmap_put(m->jobs, UINT32_TO_PTR(j->id), j)) < 0)
1277 while ((j = hashmap_steal_first(m->transaction_jobs))) {
1280 /* log_debug("Skipping already installed job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id); */
1291 j->installed = true;
1292 m->n_installed_jobs ++;
1294 /* We're fully installed. Now let's free data we don't
1297 assert(!j->transaction_next);
1298 assert(!j->transaction_prev);
1300 job_add_to_run_queue(j);
1301 job_add_to_dbus_queue(j);
1304 log_debug("Installed new job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
1307 /* As last step, kill all remaining job dependencies. */
1308 transaction_clean_dependencies(m);
1314 HASHMAP_FOREACH(j, m->transaction_jobs, i) {
1318 hashmap_remove(m->jobs, UINT32_TO_PTR(j->id));
1324 static int transaction_activate(Manager *m, JobMode mode, DBusError *e) {
1326 unsigned generation = 1;
1330 /* This applies the changes recorded in transaction_jobs to
1331 * the actual list of jobs, if possible. */
1333 /* First step: figure out which jobs matter */
1334 transaction_find_jobs_that_matter_to_anchor(m, NULL, generation++);
1336 /* Second step: Try not to stop any running services if
1337 * we don't have to. Don't try to reverse running
1338 * jobs if we don't have to. */
1339 if (mode == JOB_FAIL)
1340 transaction_minimize_impact(m);
1342 /* Third step: Drop redundant jobs */
1343 transaction_drop_redundant(m);
1346 /* Fourth step: Let's remove unneeded jobs that might
1348 if (mode != JOB_ISOLATE)
1349 transaction_collect_garbage(m);
1351 /* Fifth step: verify order makes sense and correct
1352 * cycles if necessary and possible */
1353 if ((r = transaction_verify_order(m, &generation, e)) >= 0)
1357 log_warning("Requested transaction contains an unfixable cyclic ordering dependency: %s", bus_error(e, r));
1361 /* Let's see if the resulting transaction ordering
1362 * graph is still cyclic... */
1366 /* Sixth step: let's drop unmergeable entries if
1367 * necessary and possible, merge entries we can
1369 if ((r = transaction_merge_jobs(m, e)) >= 0)
1373 log_warning("Requested transaction contains unmergeable jobs: %s", bus_error(e, r));
1377 /* Seventh step: an entry got dropped, let's garbage
1378 * collect its dependencies. */
1379 if (mode != JOB_ISOLATE)
1380 transaction_collect_garbage(m);
1382 /* Let's see if the resulting transaction still has
1383 * unmergeable entries ... */
1386 /* Eights step: Drop redundant jobs again, if the merging now allows us to drop more. */
1387 transaction_drop_redundant(m);
1389 /* Ninth step: check whether we can actually apply this */
1390 if (mode == JOB_FAIL)
1391 if ((r = transaction_is_destructive(m, e)) < 0) {
1392 log_notice("Requested transaction contradicts existing jobs: %s", bus_error(e, r));
1396 /* Tenth step: apply changes */
1397 if ((r = transaction_apply(m, mode)) < 0) {
1398 log_warning("Failed to apply transaction: %s", strerror(-r));
1402 assert(hashmap_isempty(m->transaction_jobs));
1403 assert(!m->transaction_anchor);
1408 transaction_abort(m);
1412 static Job* transaction_add_one_job(Manager *m, JobType type, Unit *unit, bool override, bool *is_new) {
1418 /* Looks for an existing prospective job and returns that. If
1419 * it doesn't exist it is created and added to the prospective
1422 f = hashmap_get(m->transaction_jobs, unit);
1424 LIST_FOREACH(transaction, j, f) {
1425 assert(j->unit == unit);
1427 if (j->type == type) {
1434 if (unit->job && unit->job->type == type)
1436 else if (!(j = job_new(m, type, unit)))
1441 j->matters_to_anchor = false;
1442 j->override = override;
1444 LIST_PREPEND(Job, transaction, f, j);
1446 if (hashmap_replace(m->transaction_jobs, unit, f) < 0) {
1447 LIST_REMOVE(Job, transaction, f, j);
1455 /* log_debug("Added job %s/%s to transaction.", unit->id, job_type_to_string(type)); */
1460 static void transaction_unlink_job(Manager *m, Job *j, bool delete_dependencies) {
1464 if (j->transaction_prev)
1465 j->transaction_prev->transaction_next = j->transaction_next;
1466 else if (j->transaction_next)
1467 hashmap_replace(m->transaction_jobs, j->unit, j->transaction_next);
1469 hashmap_remove_value(m->transaction_jobs, j->unit, j);
1471 if (j->transaction_next)
1472 j->transaction_next->transaction_prev = j->transaction_prev;
1474 j->transaction_prev = j->transaction_next = NULL;
1476 while (j->subject_list)
1477 job_dependency_free(j->subject_list);
1479 while (j->object_list) {
1480 Job *other = j->object_list->matters ? j->object_list->subject : NULL;
1482 job_dependency_free(j->object_list);
1484 if (other && delete_dependencies) {
1485 log_debug("Deleting job %s/%s as dependency of job %s/%s",
1486 other->unit->id, job_type_to_string(other->type),
1487 j->unit->id, job_type_to_string(j->type));
1488 transaction_delete_job(m, other, delete_dependencies);
1493 static int transaction_add_job_and_dependencies(
1501 bool ignore_requirements,
1512 assert(type < _JOB_TYPE_MAX);
1515 /* log_debug("Pulling in %s/%s from %s/%s", */
1516 /* unit->id, job_type_to_string(type), */
1517 /* by ? by->unit->id : "NA", */
1518 /* by ? job_type_to_string(by->type) : "NA"); */
1520 if (unit->load_state != UNIT_LOADED &&
1521 unit->load_state != UNIT_ERROR &&
1522 unit->load_state != UNIT_MASKED) {
1523 dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s is not loaded properly.", unit->id);
1527 if (type != JOB_STOP && unit->load_state == UNIT_ERROR) {
1528 dbus_set_error(e, BUS_ERROR_LOAD_FAILED,
1529 "Unit %s failed to load: %s. "
1530 "See system logs and 'systemctl status %s' for details.",
1532 strerror(-unit->load_error),
1537 if (type != JOB_STOP && unit->load_state == UNIT_MASKED) {
1538 dbus_set_error(e, BUS_ERROR_MASKED, "Unit %s is masked.", unit->id);
1542 if (!unit_job_is_applicable(unit, type)) {
1543 dbus_set_error(e, BUS_ERROR_JOB_TYPE_NOT_APPLICABLE, "Job type %s is not applicable for unit %s.", job_type_to_string(type), unit->id);
1547 /* First add the job. */
1548 if (!(ret = transaction_add_one_job(m, type, unit, override, &is_new)))
1551 ret->ignore_order = ret->ignore_order || ignore_order;
1553 /* Then, add a link to the job. */
1554 if (!job_dependency_new(by, ret, matters, conflicts))
1557 if (is_new && !ignore_requirements) {
1560 /* If we are following some other unit, make sure we
1561 * add all dependencies of everybody following. */
1562 if (unit_following_set(ret->unit, &following) > 0) {
1563 SET_FOREACH(dep, following, i)
1564 if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, false, override, false, false, ignore_order, e, NULL)) < 0) {
1565 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1571 set_free(following);
1574 /* Finally, recursively add in all dependencies. */
1575 if (type == JOB_START || type == JOB_RELOAD_OR_START) {
1576 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRES], i)
1577 if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1585 SET_FOREACH(dep, ret->unit->dependencies[UNIT_BIND_TO], i)
1586 if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1595 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1596 if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, !override, override, false, false, ignore_order, e, NULL)) < 0) {
1597 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1603 SET_FOREACH(dep, ret->unit->dependencies[UNIT_WANTS], i)
1604 if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, false, false, false, false, ignore_order, e, NULL)) < 0) {
1605 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1611 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUISITE], i)
1612 if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1621 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1622 if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, !override, override, false, false, ignore_order, e, NULL)) < 0) {
1623 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1629 SET_FOREACH(dep, ret->unit->dependencies[UNIT_CONFLICTS], i)
1630 if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, true, override, true, false, ignore_order, e, NULL)) < 0) {
1639 SET_FOREACH(dep, ret->unit->dependencies[UNIT_CONFLICTED_BY], i)
1640 if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, false, override, false, false, ignore_order, e, NULL)) < 0) {
1641 log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1649 if (type == JOB_STOP || type == JOB_RESTART || type == JOB_TRY_RESTART) {
1651 SET_FOREACH(dep, ret->unit->dependencies[UNIT_REQUIRED_BY], i)
1652 if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1661 SET_FOREACH(dep, ret->unit->dependencies[UNIT_BOUND_BY], i)
1662 if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
1672 if (type == JOB_RELOAD || type == JOB_RELOAD_OR_START) {
1674 SET_FOREACH(dep, ret->unit->dependencies[UNIT_PROPAGATE_RELOAD_TO], i) {
1675 r = transaction_add_job_and_dependencies(m, JOB_RELOAD, dep, ret, false, override, false, false, ignore_order, e, NULL);
1678 log_warning("Cannot add dependency reload job for unit %s, ignoring: %s", dep->id, bus_error(e, r));
1686 /* JOB_VERIFY_STARTED, JOB_RELOAD require no dependency handling */
1698 static int transaction_add_isolate_jobs(Manager *m) {
1706 HASHMAP_FOREACH_KEY(u, k, m->units, i) {
1708 /* ignore aliases */
1712 if (u->ignore_on_isolate)
1715 /* No need to stop inactive jobs */
1716 if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(u)) && !u->job)
1719 /* Is there already something listed for this? */
1720 if (hashmap_get(m->transaction_jobs, u))
1723 if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, u, NULL, true, false, false, false, false, NULL, NULL)) < 0)
1724 log_warning("Cannot add isolate job for unit %s, ignoring: %s", u->id, strerror(-r));
1730 int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool override, DBusError *e, Job **_ret) {
1735 assert(type < _JOB_TYPE_MAX);
1737 assert(mode < _JOB_MODE_MAX);
1739 if (mode == JOB_ISOLATE && type != JOB_START) {
1740 dbus_set_error(e, BUS_ERROR_INVALID_JOB_MODE, "Isolate is only valid for start.");
1744 if (mode == JOB_ISOLATE && !unit->allow_isolate) {
1745 dbus_set_error(e, BUS_ERROR_NO_ISOLATION, "Operation refused, unit may not be isolated.");
1749 log_debug("Trying to enqueue job %s/%s/%s", unit->id, job_type_to_string(type), job_mode_to_string(mode));
1751 if ((r = transaction_add_job_and_dependencies(m, type, unit, NULL, true, override, false,
1752 mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
1753 mode == JOB_IGNORE_DEPENDENCIES, e, &ret)) < 0) {
1754 transaction_abort(m);
1758 if (mode == JOB_ISOLATE)
1759 if ((r = transaction_add_isolate_jobs(m)) < 0) {
1760 transaction_abort(m);
1764 if ((r = transaction_activate(m, mode, e)) < 0)
1767 log_debug("Enqueued job %s/%s as %u", unit->id, job_type_to_string(type), (unsigned) ret->id);
1775 int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode mode, bool override, DBusError *e, Job **_ret) {
1780 assert(type < _JOB_TYPE_MAX);
1782 assert(mode < _JOB_MODE_MAX);
1784 if ((r = manager_load_unit(m, name, NULL, NULL, &unit)) < 0)
1787 return manager_add_job(m, type, unit, mode, override, e, _ret);
1790 Job *manager_get_job(Manager *m, uint32_t id) {
1793 return hashmap_get(m->jobs, UINT32_TO_PTR(id));
1796 Unit *manager_get_unit(Manager *m, const char *name) {
1800 return hashmap_get(m->units, name);
1803 unsigned manager_dispatch_load_queue(Manager *m) {
1809 /* Make sure we are not run recursively */
1810 if (m->dispatching_load_queue)
1813 m->dispatching_load_queue = true;
1815 /* Dispatches the load queue. Takes a unit from the queue and
1816 * tries to load its data until the queue is empty */
1818 while ((u = m->load_queue)) {
1819 assert(u->in_load_queue);
1825 m->dispatching_load_queue = false;
1829 int manager_load_unit_prepare(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
1835 assert(name || path);
1837 /* This will prepare the unit for loading, but not actually
1838 * load anything from disk. */
1840 if (path && !is_path(path)) {
1841 dbus_set_error(e, BUS_ERROR_INVALID_PATH, "Path %s is not absolute.", path);
1846 name = file_name_from_path(path);
1848 t = unit_name_to_type(name);
1850 if (t == _UNIT_TYPE_INVALID || !unit_name_is_valid_no_type(name, false)) {
1851 dbus_set_error(e, BUS_ERROR_INVALID_NAME, "Unit name %s is not valid.", name);
1855 ret = manager_get_unit(m, name);
1861 ret = unit_new(m, unit_vtable[t]->object_size);
1866 ret->fragment_path = strdup(path);
1867 if (!ret->fragment_path) {
1873 if ((r = unit_add_name(ret, name)) < 0) {
1878 unit_add_to_load_queue(ret);
1879 unit_add_to_dbus_queue(ret);
1880 unit_add_to_gc_queue(ret);
1888 int manager_load_unit(Manager *m, const char *name, const char *path, DBusError *e, Unit **_ret) {
1893 /* This will load the service information files, but not actually
1894 * start any services or anything. */
1896 if ((r = manager_load_unit_prepare(m, name, path, e, _ret)) != 0)
1899 manager_dispatch_load_queue(m);
1902 *_ret = unit_follow_merge(*_ret);
1907 void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
1914 HASHMAP_FOREACH(j, s->jobs, i)
1915 job_dump(j, f, prefix);
1918 void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
1926 HASHMAP_FOREACH_KEY(u, t, s->units, i)
1928 unit_dump(u, f, prefix);
1931 void manager_clear_jobs(Manager *m) {
1936 transaction_abort(m);
1938 while ((j = hashmap_first(m->jobs)))
1939 job_finish_and_invalidate(j, JOB_CANCELED);
1942 unsigned manager_dispatch_run_queue(Manager *m) {
1946 if (m->dispatching_run_queue)
1949 m->dispatching_run_queue = true;
1951 while ((j = m->run_queue)) {
1952 assert(j->installed);
1953 assert(j->in_run_queue);
1955 job_run_and_invalidate(j);
1959 m->dispatching_run_queue = false;
1963 unsigned manager_dispatch_dbus_queue(Manager *m) {
1970 if (m->dispatching_dbus_queue)
1973 m->dispatching_dbus_queue = true;
1975 while ((u = m->dbus_unit_queue)) {
1976 assert(u->in_dbus_queue);
1978 bus_unit_send_change_signal(u);
1982 while ((j = m->dbus_job_queue)) {
1983 assert(j->in_dbus_queue);
1985 bus_job_send_change_signal(j);
1989 m->dispatching_dbus_queue = false;
1993 static int manager_process_notify_fd(Manager *m) {
2000 struct msghdr msghdr;
2002 struct ucred *ucred;
2004 struct cmsghdr cmsghdr;
2005 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
2011 iovec.iov_base = buf;
2012 iovec.iov_len = sizeof(buf)-1;
2016 msghdr.msg_iov = &iovec;
2017 msghdr.msg_iovlen = 1;
2018 msghdr.msg_control = &control;
2019 msghdr.msg_controllen = sizeof(control);
2021 if ((n = recvmsg(m->notify_watch.fd, &msghdr, MSG_DONTWAIT)) <= 0) {
2025 if (errno == EAGAIN || errno == EINTR)
2031 if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
2032 control.cmsghdr.cmsg_level != SOL_SOCKET ||
2033 control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
2034 control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
2035 log_warning("Received notify message without credentials. Ignoring.");
2039 ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
2041 if (!(u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid))))
2042 if (!(u = cgroup_unit_by_pid(m, ucred->pid))) {
2043 log_warning("Cannot find unit for notify message of PID %lu.", (unsigned long) ucred->pid);
2047 assert((size_t) n < sizeof(buf));
2049 if (!(tags = strv_split(buf, "\n\r")))
2052 log_debug("Got notification message for unit %s", u->id);
2054 if (UNIT_VTABLE(u)->notify_message)
2055 UNIT_VTABLE(u)->notify_message(u, ucred->pid, tags);
2063 static int manager_dispatch_sigchld(Manager *m) {
2073 /* First we call waitd() for a PID and do not reap the
2074 * zombie. That way we can still access /proc/$PID for
2075 * it while it is a zombie. */
2076 if (waitid(P_ALL, 0, &si, WEXITED|WNOHANG|WNOWAIT) < 0) {
2078 if (errno == ECHILD)
2090 if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
2093 get_process_comm(si.si_pid, &name);
2094 log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
2098 /* Let's flush any message the dying child might still
2099 * have queued for us. This ensures that the process
2100 * still exists in /proc so that we can figure out
2101 * which cgroup and hence unit it belongs to. */
2102 if ((r = manager_process_notify_fd(m)) < 0)
2105 /* And now figure out the unit this belongs to */
2106 if (!(u = hashmap_get(m->watch_pids, LONG_TO_PTR(si.si_pid))))
2107 u = cgroup_unit_by_pid(m, si.si_pid);
2109 /* And now, we actually reap the zombie. */
2110 if (waitid(P_PID, si.si_pid, &si, WEXITED) < 0) {
2117 if (si.si_code != CLD_EXITED && si.si_code != CLD_KILLED && si.si_code != CLD_DUMPED)
2120 log_debug("Child %lu died (code=%s, status=%i/%s)",
2121 (long unsigned) si.si_pid,
2122 sigchld_code_to_string(si.si_code),
2124 strna(si.si_code == CLD_EXITED
2125 ? exit_status_to_string(si.si_status, EXIT_STATUS_FULL)
2126 : signal_to_string(si.si_status)));
2131 log_debug("Child %lu belongs to %s", (long unsigned) si.si_pid, u->id);
2133 hashmap_remove(m->watch_pids, LONG_TO_PTR(si.si_pid));
2134 UNIT_VTABLE(u)->sigchld_event(u, si.si_pid, si.si_code, si.si_status);
2140 static int manager_start_target(Manager *m, const char *name, JobMode mode) {
2144 dbus_error_init(&error);
2146 log_debug("Activating special unit %s", name);
2148 if ((r = manager_add_job_by_name(m, JOB_START, name, mode, true, &error, NULL)) < 0)
2149 log_error("Failed to enqueue %s job: %s", name, bus_error(&error, r));
2151 dbus_error_free(&error);
2156 static int manager_process_signal_fd(Manager *m) {
2158 struct signalfd_siginfo sfsi;
2159 bool sigchld = false;
2164 if ((n = read(m->signal_watch.fd, &sfsi, sizeof(sfsi))) != sizeof(sfsi)) {
2169 if (errno == EINTR || errno == EAGAIN)
2175 if (sfsi.ssi_pid > 0) {
2178 get_process_comm(sfsi.ssi_pid, &p);
2180 log_debug("Received SIG%s from PID %lu (%s).",
2181 signal_to_string(sfsi.ssi_signo),
2182 (unsigned long) sfsi.ssi_pid, strna(p));
2185 log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
2187 switch (sfsi.ssi_signo) {
2194 if (m->running_as == MANAGER_SYSTEM) {
2195 /* This is for compatibility with the
2196 * original sysvinit */
2197 m->exit_code = MANAGER_REEXECUTE;
2204 if (m->running_as == MANAGER_SYSTEM) {
2205 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE);
2209 /* Run the exit target if there is one, if not, just exit. */
2210 if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) {
2211 m->exit_code = MANAGER_EXIT;
2218 if (m->running_as == MANAGER_SYSTEM)
2219 manager_start_target(m, SPECIAL_KBREQUEST_TARGET, JOB_REPLACE);
2221 /* This is a nop on non-init */
2225 if (m->running_as == MANAGER_SYSTEM)
2226 manager_start_target(m, SPECIAL_SIGPWR_TARGET, JOB_REPLACE);
2228 /* This is a nop on non-init */
2234 u = manager_get_unit(m, SPECIAL_DBUS_SERVICE);
2236 if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) {
2237 log_info("Trying to reconnect to bus...");
2241 if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) {
2242 log_info("Loading D-Bus service...");
2243 manager_start_target(m, SPECIAL_DBUS_SERVICE, JOB_REPLACE);
2254 if (!(f = open_memstream(&dump, &size))) {
2255 log_warning("Failed to allocate memory stream.");
2259 manager_dump_units(m, f, "\t");
2260 manager_dump_jobs(m, f, "\t");
2265 log_warning("Failed to write status stream");
2270 log_dump(LOG_INFO, dump);
2277 m->exit_code = MANAGER_RELOAD;
2282 /* Starting SIGRTMIN+0 */
2283 static const char * const target_table[] = {
2284 [0] = SPECIAL_DEFAULT_TARGET,
2285 [1] = SPECIAL_RESCUE_TARGET,
2286 [2] = SPECIAL_EMERGENCY_TARGET,
2287 [3] = SPECIAL_HALT_TARGET,
2288 [4] = SPECIAL_POWEROFF_TARGET,
2289 [5] = SPECIAL_REBOOT_TARGET,
2290 [6] = SPECIAL_KEXEC_TARGET
2293 /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */
2294 static const ManagerExitCode code_table[] = {
2296 [1] = MANAGER_POWEROFF,
2297 [2] = MANAGER_REBOOT,
2301 if ((int) sfsi.ssi_signo >= SIGRTMIN+0 &&
2302 (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) {
2303 int idx = (int) sfsi.ssi_signo - SIGRTMIN;
2304 manager_start_target(m, target_table[idx],
2305 (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE);
2309 if ((int) sfsi.ssi_signo >= SIGRTMIN+13 &&
2310 (int) sfsi.ssi_signo < SIGRTMIN+13+(int) ELEMENTSOF(code_table)) {
2311 m->exit_code = code_table[sfsi.ssi_signo - SIGRTMIN - 13];
2315 switch (sfsi.ssi_signo - SIGRTMIN) {
2318 log_debug("Enabling showing of status.");
2319 manager_set_show_status(m, true);
2323 log_debug("Disabling showing of status.");
2324 manager_set_show_status(m, false);
2328 log_set_max_level(LOG_DEBUG);
2329 log_notice("Setting log level to debug.");
2333 log_set_max_level(LOG_INFO);
2334 log_notice("Setting log level to info.");
2338 log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
2339 log_notice("Setting log target to journal-or-kmsg.");
2343 log_set_target(LOG_TARGET_CONSOLE);
2344 log_notice("Setting log target to console.");
2348 log_set_target(LOG_TARGET_KMSG);
2349 log_notice("Setting log target to kmsg.");
2353 log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
2354 log_notice("Setting log target to syslog-or-kmsg.");
2358 log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
2365 return manager_dispatch_sigchld(m);
2370 static int process_event(Manager *m, struct epoll_event *ev) {
2377 assert_se(w = ev->data.ptr);
2379 if (w->type == WATCH_INVALID)
2386 /* An incoming signal? */
2387 if (ev->events != EPOLLIN)
2390 if ((r = manager_process_signal_fd(m)) < 0)
2397 /* An incoming daemon notification event? */
2398 if (ev->events != EPOLLIN)
2401 if ((r = manager_process_notify_fd(m)) < 0)
2408 /* Some fd event, to be dispatched to the units */
2409 UNIT_VTABLE(w->data.unit)->fd_event(w->data.unit, w->fd, ev->events, w);
2412 case WATCH_UNIT_TIMER:
2413 case WATCH_JOB_TIMER: {
2417 /* Some timer event, to be dispatched to the units */
2418 if ((k = read(w->fd, &v, sizeof(v))) != sizeof(v)) {
2420 if (k < 0 && (errno == EINTR || errno == EAGAIN))
2423 return k < 0 ? -errno : -EIO;
2426 if (w->type == WATCH_UNIT_TIMER)
2427 UNIT_VTABLE(w->data.unit)->timer_event(w->data.unit, v, w);
2429 job_timer_event(w->data.job, v, w);
2434 /* Some mount table change, intended for the mount subsystem */
2435 mount_fd_event(m, ev->events);
2439 /* Some swap table change, intended for the swap subsystem */
2440 swap_fd_event(m, ev->events);
2444 /* Some notification from udev, intended for the device subsystem */
2445 device_fd_event(m, ev->events);
2448 case WATCH_DBUS_WATCH:
2449 bus_watch_event(m, w, ev->events);
2452 case WATCH_DBUS_TIMEOUT:
2453 bus_timeout_event(m, w, ev->events);
2457 log_error("event type=%i", w->type);
2458 assert_not_reached("Unknown epoll event type.");
2464 int manager_loop(Manager *m) {
2467 RATELIMIT_DEFINE(rl, 1*USEC_PER_SEC, 50000);
2470 m->exit_code = MANAGER_RUNNING;
2472 /* Release the path cache */
2473 set_free_free(m->unit_path_cache);
2474 m->unit_path_cache = NULL;
2476 manager_check_finished(m);
2478 /* There might still be some zombies hanging around from
2479 * before we were exec()'ed. Leat's reap them */
2480 r = manager_dispatch_sigchld(m);
2484 while (m->exit_code == MANAGER_RUNNING) {
2485 struct epoll_event event;
2489 if (m->runtime_watchdog > 0 && m->running_as == MANAGER_SYSTEM)
2492 if (!ratelimit_test(&rl)) {
2493 /* Yay, something is going seriously wrong, pause a little */
2494 log_warning("Looping too fast. Throttling execution a little.");
2499 if (manager_dispatch_load_queue(m) > 0)
2502 if (manager_dispatch_run_queue(m) > 0)
2505 if (bus_dispatch(m) > 0)
2508 if (manager_dispatch_cleanup_queue(m) > 0)
2511 if (manager_dispatch_gc_queue(m) > 0)
2514 if (manager_dispatch_dbus_queue(m) > 0)
2517 if (swap_dispatch_reload(m) > 0)
2520 /* Sleep for half the watchdog time */
2521 if (m->runtime_watchdog > 0 && m->running_as == MANAGER_SYSTEM) {
2522 wait_msec = (int) (m->runtime_watchdog / 2 / USEC_PER_MSEC);
2528 n = epoll_wait(m->epoll_fd, &event, 1, wait_msec);
2540 r = process_event(m, &event);
2545 return m->exit_code;
2548 int manager_get_unit_from_dbus_path(Manager *m, const char *s, Unit **_u) {
2556 if (!startswith(s, "/org/freedesktop/systemd1/unit/"))
2559 if (!(n = bus_path_unescape(s+31)))
2562 u = manager_get_unit(m, n);
2573 int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
2582 if (!startswith(s, "/org/freedesktop/systemd1/job/"))
2585 if ((r = safe_atou(s + 30, &id)) < 0)
2588 if (!(j = manager_get_job(m, id)))
2596 void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) {
2601 if (m->audit_fd < 0)
2604 /* Don't generate audit events if the service was already
2605 * started and we're just deserializing */
2606 if (m->n_reloading > 0)
2609 if (m->running_as != MANAGER_SYSTEM)
2612 if (u->type != UNIT_SERVICE)
2615 if (!(p = unit_name_to_prefix_and_instance(u->id))) {
2616 log_error("Failed to allocate unit name for audit message: %s", strerror(ENOMEM));
2620 if (audit_log_user_comm_message(m->audit_fd, type, "", p, NULL, NULL, NULL, success) < 0) {
2621 if (errno == EPERM) {
2622 /* We aren't allowed to send audit messages?
2623 * Then let's not retry again. */
2624 audit_close(m->audit_fd);
2627 log_warning("Failed to send audit message: %m");
2635 void manager_send_unit_plymouth(Manager *m, Unit *u) {
2637 union sockaddr_union sa;
2639 char *message = NULL;
2641 /* Don't generate plymouth events if the service was already
2642 * started and we're just deserializing */
2643 if (m->n_reloading > 0)
2646 if (m->running_as != MANAGER_SYSTEM)
2649 if (u->type != UNIT_SERVICE &&
2650 u->type != UNIT_MOUNT &&
2651 u->type != UNIT_SWAP)
2654 /* We set SOCK_NONBLOCK here so that we rather drop the
2655 * message then wait for plymouth */
2656 if ((fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
2657 log_error("socket() failed: %m");
2662 sa.sa.sa_family = AF_UNIX;
2663 strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
2664 if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
2666 if (errno != EPIPE &&
2669 errno != ECONNREFUSED &&
2670 errno != ECONNRESET &&
2671 errno != ECONNABORTED)
2672 log_error("connect() failed: %m");
2677 if (asprintf(&message, "U\002%c%s%n", (int) (strlen(u->id) + 1), u->id, &n) < 0) {
2678 log_error("Out of memory");
2683 if (write(fd, message, n + 1) != n + 1) {
2685 if (errno != EPIPE &&
2688 errno != ECONNREFUSED &&
2689 errno != ECONNRESET &&
2690 errno != ECONNABORTED)
2691 log_error("Failed to write Plymouth message: %m");
2698 close_nointr_nofail(fd);
2703 void manager_dispatch_bus_name_owner_changed(
2706 const char* old_owner,
2707 const char *new_owner) {
2714 if (!(u = hashmap_get(m->watch_bus, name)))
2717 UNIT_VTABLE(u)->bus_name_owner_change(u, name, old_owner, new_owner);
2720 void manager_dispatch_bus_query_pid_done(
2731 if (!(u = hashmap_get(m->watch_bus, name)))
2734 UNIT_VTABLE(u)->bus_query_pid_done(u, name, pid);
2737 int manager_open_serialization(Manager *m, FILE **_f) {
2745 if (m->running_as == MANAGER_SYSTEM)
2746 asprintf(&path, "/run/systemd/dump-%lu-XXXXXX", (unsigned long) getpid());
2748 asprintf(&path, "/tmp/systemd-dump-%lu-XXXXXX", (unsigned long) getpid());
2753 saved_umask = umask(0077);
2754 fd = mkostemp(path, O_RDWR|O_CLOEXEC);
2764 log_debug("Serializing state to %s", path);
2767 if (!(f = fdopen(fd, "w+")))
2775 int manager_serialize(Manager *m, FILE *f, FDSet *fds) {
2787 fprintf(f, "current-job-id=%i\n", m->current_job_id);
2788 fprintf(f, "taint-usr=%s\n", yes_no(m->taint_usr));
2790 dual_timestamp_serialize(f, "initrd-timestamp", &m->initrd_timestamp);
2791 dual_timestamp_serialize(f, "startup-timestamp", &m->startup_timestamp);
2792 dual_timestamp_serialize(f, "finish-timestamp", &m->finish_timestamp);
2796 HASHMAP_FOREACH_KEY(u, t, m->units, i) {
2800 if (!unit_can_serialize(u))
2807 if ((r = unit_serialize(u, f, fds)) < 0) {
2813 assert(m->n_reloading > 0);
2819 r = bus_fdset_add_all(m, fds);
2826 int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
2832 log_debug("Deserializing state...");
2837 char line[LINE_MAX], *l;
2839 if (!fgets(line, sizeof(line), f)) {
2854 if (startswith(l, "current-job-id=")) {
2857 if (safe_atou32(l+15, &id) < 0)
2858 log_debug("Failed to parse current job id value %s", l+15);
2860 m->current_job_id = MAX(m->current_job_id, id);
2861 } else if (startswith(l, "taint-usr=")) {
2864 if ((b = parse_boolean(l+10)) < 0)
2865 log_debug("Failed to parse taint /usr flag %s", l+10);
2867 m->taint_usr = m->taint_usr || b;
2868 } else if (startswith(l, "initrd-timestamp="))
2869 dual_timestamp_deserialize(l+17, &m->initrd_timestamp);
2870 else if (startswith(l, "startup-timestamp="))
2871 dual_timestamp_deserialize(l+18, &m->startup_timestamp);
2872 else if (startswith(l, "finish-timestamp="))
2873 dual_timestamp_deserialize(l+17, &m->finish_timestamp);
2875 log_debug("Unknown serialization item '%s'", l);
2880 char name[UNIT_NAME_MAX+2];
2883 if (!fgets(name, sizeof(name), f)) {
2894 if ((r = manager_load_unit(m, strstrip(name), NULL, NULL, &u)) < 0)
2897 if ((r = unit_deserialize(u, f, fds)) < 0)
2907 assert(m->n_reloading > 0);
2913 int manager_reload(Manager *m) {
2920 if ((r = manager_open_serialization(m, &f)) < 0)
2925 if (!(fds = fdset_new())) {
2931 if ((r = manager_serialize(m, f, fds)) < 0) {
2936 if (fseeko(f, 0, SEEK_SET) < 0) {
2942 /* From here on there is no way back. */
2943 manager_clear_jobs_and_units(m);
2944 manager_undo_generators(m);
2946 /* Find new unit paths */
2947 lookup_paths_free(&m->lookup_paths);
2948 if ((q = lookup_paths_init(&m->lookup_paths, m->running_as, true)) < 0)
2951 manager_run_generators(m);
2953 manager_build_unit_path_cache(m);
2955 /* First, enumerate what we can from all config files */
2956 if ((q = manager_enumerate(m)) < 0)
2959 /* Second, deserialize our stored data */
2960 if ((q = manager_deserialize(m, f, fds)) < 0)
2966 /* Third, fire things up! */
2967 if ((q = manager_coldplug(m)) < 0)
2970 assert(m->n_reloading > 0);
2983 bool manager_is_booting_or_shutting_down(Manager *m) {
2988 /* Is the initial job still around? */
2989 if (manager_get_job(m, m->default_unit_job_id))
2992 /* Is there a job for the shutdown target? */
2993 u = manager_get_unit(m, SPECIAL_SHUTDOWN_TARGET);
3000 void manager_reset_failed(Manager *m) {
3006 HASHMAP_FOREACH(u, m->units, i)
3007 unit_reset_failed(u);
3010 bool manager_unit_pending_inactive(Manager *m, const char *name) {
3016 /* Returns true if the unit is inactive or going down */
3017 if (!(u = manager_get_unit(m, name)))
3020 return unit_pending_inactive(u);
3023 void manager_check_finished(Manager *m) {
3024 char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
3025 usec_t kernel_usec, initrd_usec, userspace_usec, total_usec;
3029 if (dual_timestamp_is_set(&m->finish_timestamp))
3032 if (hashmap_size(m->jobs) > 0)
3035 dual_timestamp_get(&m->finish_timestamp);
3037 if (m->running_as == MANAGER_SYSTEM && detect_container(NULL) <= 0) {
3039 userspace_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic;
3040 total_usec = m->finish_timestamp.monotonic;
3042 if (dual_timestamp_is_set(&m->initrd_timestamp)) {
3044 kernel_usec = m->initrd_timestamp.monotonic;
3045 initrd_usec = m->startup_timestamp.monotonic - m->initrd_timestamp.monotonic;
3047 log_info("Startup finished in %s (kernel) + %s (initrd) + %s (userspace) = %s.",
3048 format_timespan(kernel, sizeof(kernel), kernel_usec),
3049 format_timespan(initrd, sizeof(initrd), initrd_usec),
3050 format_timespan(userspace, sizeof(userspace), userspace_usec),
3051 format_timespan(sum, sizeof(sum), total_usec));
3053 kernel_usec = m->startup_timestamp.monotonic;
3056 log_info("Startup finished in %s (kernel) + %s (userspace) = %s.",
3057 format_timespan(kernel, sizeof(kernel), kernel_usec),
3058 format_timespan(userspace, sizeof(userspace), userspace_usec),
3059 format_timespan(sum, sizeof(sum), total_usec));
3062 userspace_usec = initrd_usec = kernel_usec = 0;
3063 total_usec = m->finish_timestamp.monotonic - m->startup_timestamp.monotonic;
3065 log_debug("Startup finished in %s.",
3066 format_timespan(sum, sizeof(sum), total_usec));
3069 bus_broadcast_finished(m, kernel_usec, initrd_usec, userspace_usec, total_usec);
3072 "READY=1\nSTATUS=Startup finished in %s.",
3073 format_timespan(sum, sizeof(sum), total_usec));
3076 void manager_run_generators(Manager *m) {
3078 const char *generator_path;
3079 const char *argv[3];
3084 generator_path = m->running_as == MANAGER_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH;
3085 if (!(d = opendir(generator_path))) {
3087 if (errno == ENOENT)
3090 log_error("Failed to enumerate generator directory: %m");
3094 if (!m->generator_unit_path) {
3096 char user_path[] = "/tmp/systemd-generator-XXXXXX";
3098 if (m->running_as == MANAGER_SYSTEM && getpid() == 1) {
3099 p = "/run/systemd/generator";
3101 if (mkdir_p(p, 0755) < 0) {
3102 log_error("Failed to create generator directory: %m");
3107 if (!(p = mkdtemp(user_path))) {
3108 log_error("Failed to create generator directory: %m");
3113 if (!(m->generator_unit_path = strdup(p))) {
3114 log_error("Failed to allocate generator unit path.");
3119 argv[0] = NULL; /* Leave this empty, execute_directory() will fill something in */
3120 argv[1] = m->generator_unit_path;
3124 execute_directory(generator_path, d, (char**) argv);
3127 if (rmdir(m->generator_unit_path) >= 0) {
3128 /* Uh? we were able to remove this dir? I guess that
3129 * means the directory was empty, hence let's shortcut
3132 free(m->generator_unit_path);
3133 m->generator_unit_path = NULL;
3137 if (!strv_find(m->lookup_paths.unit_path, m->generator_unit_path)) {
3140 if (!(l = strv_append(m->lookup_paths.unit_path, m->generator_unit_path))) {
3141 log_error("Failed to add generator directory to unit search path: %m");
3145 strv_free(m->lookup_paths.unit_path);
3146 m->lookup_paths.unit_path = l;
3148 log_debug("Added generator unit path %s to search path.", m->generator_unit_path);
3156 void manager_undo_generators(Manager *m) {
3159 if (!m->generator_unit_path)
3162 strv_remove(m->lookup_paths.unit_path, m->generator_unit_path);
3163 rm_rf(m->generator_unit_path, false, true, false);
3165 free(m->generator_unit_path);
3166 m->generator_unit_path = NULL;
3169 int manager_set_default_controllers(Manager *m, char **controllers) {
3174 l = strv_copy(controllers);
3178 strv_free(m->default_controllers);
3179 m->default_controllers = l;
3181 cg_shorten_controllers(m->default_controllers);
3186 void manager_recheck_journal(Manager *m) {
3191 if (m->running_as != MANAGER_SYSTEM)
3194 u = manager_get_unit(m, SPECIAL_JOURNALD_SOCKET);
3195 if (u && SOCKET(u)->state != SOCKET_RUNNING) {
3196 log_close_journal();
3200 u = manager_get_unit(m, SPECIAL_JOURNALD_SERVICE);
3201 if (u && SERVICE(u)->state != SERVICE_RUNNING) {
3202 log_close_journal();
3206 /* Hmm, OK, so the socket is fully up and the service is up
3207 * too, then let's make use of the thing. */
3211 void manager_set_show_status(Manager *m, bool b) {
3214 if (m->running_as != MANAGER_SYSTEM)
3220 touch("/run/systemd/show-status");
3222 unlink("/run/systemd/show-status");
3225 bool manager_get_show_status(Manager *m) {
3228 if (m->running_as != MANAGER_SYSTEM)
3234 /* If Plymouth is running make sure we show the status, so
3235 * that there's something nice to see when people press Esc */
3237 return plymouth_running();
3240 static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = {
3241 [MANAGER_SYSTEM] = "system",
3242 [MANAGER_USER] = "user"
3245 DEFINE_STRING_TABLE_LOOKUP(manager_running_as, ManagerRunningAs);