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>
26 #include <sys/timerfd.h>
36 #include "load-fragment.h"
37 #include "load-dropin.h"
39 #include "unit-name.h"
40 #include "specifier.h"
41 #include "dbus-unit.h"
43 #include "cgroup-util.h"
45 #include "cgroup-attr.h"
47 const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
48 [UNIT_SERVICE] = &service_vtable,
49 [UNIT_TIMER] = &timer_vtable,
50 [UNIT_SOCKET] = &socket_vtable,
51 [UNIT_TARGET] = &target_vtable,
52 [UNIT_DEVICE] = &device_vtable,
53 [UNIT_MOUNT] = &mount_vtable,
54 [UNIT_AUTOMOUNT] = &automount_vtable,
55 [UNIT_SNAPSHOT] = &snapshot_vtable,
56 [UNIT_SWAP] = &swap_vtable,
57 [UNIT_PATH] = &path_vtable
60 Unit *unit_new(Manager *m, size_t size) {
64 assert(size >= sizeof(Unit));
70 u->names = set_new(string_hash_func, string_compare_func);
77 u->type = _UNIT_TYPE_INVALID;
78 u->deserialized_job = _JOB_TYPE_INVALID;
79 u->default_dependencies = true;
80 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
85 bool unit_has_name(Unit *u, const char *name) {
89 return !!set_get(u->names, (char*) name);
92 int unit_add_name(Unit *u, const char *text) {
100 if (unit_name_is_template(text)) {
104 s = unit_name_replace_instance(text, u->instance);
111 if (!unit_name_is_valid(s, false)) {
116 assert_se((t = unit_name_to_type(s)) >= 0);
118 if (u->type != _UNIT_TYPE_INVALID && t != u->type) {
123 if ((r = unit_name_to_instance(s, &i)) < 0)
126 if (i && unit_vtable[t]->no_instances) {
131 /* Ensure that this unit is either instanced or not instanced,
133 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i) {
138 if (unit_vtable[t]->no_alias &&
139 !set_isempty(u->names) &&
140 !set_get(u->names, s)) {
145 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES) {
150 if ((r = set_put(u->names, s)) < 0) {
156 if ((r = hashmap_put(u->manager->units, s, u)) < 0) {
157 set_remove(u->names, s);
161 if (u->type == _UNIT_TYPE_INVALID) {
167 LIST_PREPEND(Unit, units_by_type, u->manager->units_by_type[t], u);
169 if (UNIT_VTABLE(u)->init)
170 UNIT_VTABLE(u)->init(u);
174 unit_add_to_dbus_queue(u);
184 int unit_choose_id(Unit *u, const char *name) {
185 char *s, *t = NULL, *i;
191 if (unit_name_is_template(name)) {
196 if (!(t = unit_name_replace_instance(name, u->instance)))
202 /* Selects one of the names of this unit as the id */
203 s = set_get(u->names, (char*) name);
209 if ((r = unit_name_to_instance(s, &i)) < 0)
217 unit_add_to_dbus_queue(u);
222 int unit_set_description(Unit *u, const char *description) {
227 if (!(s = strdup(description)))
230 free(u->description);
233 unit_add_to_dbus_queue(u);
237 bool unit_check_gc(Unit *u) {
240 if (u->load_state == UNIT_STUB)
243 if (UNIT_VTABLE(u)->no_gc)
255 if (unit_active_state(u) != UNIT_INACTIVE)
258 if (UNIT_VTABLE(u)->check_gc)
259 if (UNIT_VTABLE(u)->check_gc(u))
265 void unit_add_to_load_queue(Unit *u) {
267 assert(u->type != _UNIT_TYPE_INVALID);
269 if (u->load_state != UNIT_STUB || u->in_load_queue)
272 LIST_PREPEND(Unit, load_queue, u->manager->load_queue, u);
273 u->in_load_queue = true;
276 void unit_add_to_cleanup_queue(Unit *u) {
279 if (u->in_cleanup_queue)
282 LIST_PREPEND(Unit, cleanup_queue, u->manager->cleanup_queue, u);
283 u->in_cleanup_queue = true;
286 void unit_add_to_gc_queue(Unit *u) {
289 if (u->in_gc_queue || u->in_cleanup_queue)
292 if (unit_check_gc(u))
295 LIST_PREPEND(Unit, gc_queue, u->manager->gc_queue, u);
296 u->in_gc_queue = true;
298 u->manager->n_in_gc_queue ++;
300 if (u->manager->gc_queue_timestamp <= 0)
301 u->manager->gc_queue_timestamp = now(CLOCK_MONOTONIC);
304 void unit_add_to_dbus_queue(Unit *u) {
306 assert(u->type != _UNIT_TYPE_INVALID);
308 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
311 /* Shortcut things if nobody cares */
312 if (!bus_has_subscriber(u->manager)) {
313 u->sent_dbus_new_signal = true;
317 LIST_PREPEND(Unit, dbus_queue, u->manager->dbus_unit_queue, u);
318 u->in_dbus_queue = true;
321 static void bidi_set_free(Unit *u, Set *s) {
327 /* Frees the set and makes sure we are dropped from the
328 * inverse pointers */
330 SET_FOREACH(other, s, i) {
333 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
334 set_remove(other->dependencies[d], u);
336 unit_add_to_gc_queue(other);
342 void unit_free(Unit *u) {
349 bus_unit_send_removed_signal(u);
351 if (u->load_state != UNIT_STUB)
352 if (UNIT_VTABLE(u)->done)
353 UNIT_VTABLE(u)->done(u);
355 SET_FOREACH(t, u->names, i)
356 hashmap_remove_value(u->manager->units, t, u);
370 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
371 bidi_set_free(u, u->dependencies[d]);
373 if (u->type != _UNIT_TYPE_INVALID)
374 LIST_REMOVE(Unit, units_by_type, u->manager->units_by_type[u->type], u);
376 if (u->in_load_queue)
377 LIST_REMOVE(Unit, load_queue, u->manager->load_queue, u);
379 if (u->in_dbus_queue)
380 LIST_REMOVE(Unit, dbus_queue, u->manager->dbus_unit_queue, u);
382 if (u->in_cleanup_queue)
383 LIST_REMOVE(Unit, cleanup_queue, u->manager->cleanup_queue, u);
385 if (u->in_gc_queue) {
386 LIST_REMOVE(Unit, gc_queue, u->manager->gc_queue, u);
387 u->manager->n_in_gc_queue--;
390 cgroup_bonding_free_list(u->cgroup_bondings, u->manager->n_reloading <= 0);
391 cgroup_attribute_free_list(u->cgroup_attributes);
393 free(u->description);
394 free(u->fragment_path);
397 set_free_free(u->names);
399 condition_free_list(u->conditions);
402 unit_ref_unset(u->refs);
407 UnitActiveState unit_active_state(Unit *u) {
410 if (u->load_state == UNIT_MERGED)
411 return unit_active_state(unit_follow_merge(u));
413 /* After a reload it might happen that a unit is not correctly
414 * loaded but still has a process around. That's why we won't
415 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
417 return UNIT_VTABLE(u)->active_state(u);
420 const char* unit_sub_state_to_string(Unit *u) {
423 return UNIT_VTABLE(u)->sub_state_to_string(u);
426 static void complete_move(Set **s, Set **other) {
434 set_move(*s, *other);
441 static void merge_names(Unit *u, Unit *other) {
448 complete_move(&u->names, &other->names);
450 set_free_free(other->names);
454 SET_FOREACH(t, u->names, i)
455 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
458 static void merge_dependencies(Unit *u, Unit *other, UnitDependency d) {
465 assert(d < _UNIT_DEPENDENCY_MAX);
467 /* Fix backwards pointers */
468 SET_FOREACH(back, other->dependencies[d], i) {
471 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++)
472 if ((r = set_remove_and_put(back->dependencies[k], other, u)) < 0) {
475 set_remove(back->dependencies[k], other);
477 assert(r == -ENOENT);
481 complete_move(&u->dependencies[d], &other->dependencies[d]);
483 set_free(other->dependencies[d]);
484 other->dependencies[d] = NULL;
487 int unit_merge(Unit *u, Unit *other) {
492 assert(u->manager == other->manager);
493 assert(u->type != _UNIT_TYPE_INVALID);
495 other = unit_follow_merge(other);
500 if (u->type != other->type)
503 if (!u->instance != !other->instance)
506 if (other->load_state != UNIT_STUB &&
507 other->load_state != UNIT_ERROR)
516 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
520 merge_names(u, other);
522 /* Redirect all references */
524 unit_ref_set(other->refs, u);
526 /* Merge dependencies */
527 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
528 merge_dependencies(u, other, d);
530 other->load_state = UNIT_MERGED;
531 other->merged_into = u;
533 /* If there is still some data attached to the other node, we
534 * don't need it anymore, and can free it. */
535 if (other->load_state != UNIT_STUB)
536 if (UNIT_VTABLE(other)->done)
537 UNIT_VTABLE(other)->done(other);
539 unit_add_to_dbus_queue(u);
540 unit_add_to_cleanup_queue(other);
545 int unit_merge_by_name(Unit *u, const char *name) {
553 if (unit_name_is_template(name)) {
557 if (!(s = unit_name_replace_instance(name, u->instance)))
563 if (!(other = manager_get_unit(u->manager, name)))
564 r = unit_add_name(u, name);
566 r = unit_merge(u, other);
572 Unit* unit_follow_merge(Unit *u) {
575 while (u->load_state == UNIT_MERGED)
576 assert_se(u = u->merged_into);
581 int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
587 if (c->std_output != EXEC_OUTPUT_KMSG &&
588 c->std_output != EXEC_OUTPUT_SYSLOG &&
589 c->std_output != EXEC_OUTPUT_JOURNAL &&
590 c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
591 c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
592 c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
593 c->std_error != EXEC_OUTPUT_KMSG &&
594 c->std_error != EXEC_OUTPUT_SYSLOG &&
595 c->std_error != EXEC_OUTPUT_JOURNAL &&
596 c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
597 c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
598 c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
601 /* If syslog or kernel logging is requested, make sure our own
602 * logging daemon is run first. */
604 if (u->manager->running_as == MANAGER_SYSTEM)
605 if ((r = unit_add_two_dependencies_by_name(u, UNIT_REQUIRES, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true)) < 0)
611 const char *unit_description(Unit *u) {
615 return u->description;
620 void unit_dump(Unit *u, FILE *f, const char *prefix) {
627 timestamp1[FORMAT_TIMESTAMP_MAX],
628 timestamp2[FORMAT_TIMESTAMP_MAX],
629 timestamp3[FORMAT_TIMESTAMP_MAX],
630 timestamp4[FORMAT_TIMESTAMP_MAX],
631 timespan[FORMAT_TIMESPAN_MAX];
635 assert(u->type >= 0);
639 p2 = strappend(prefix, "\t");
640 prefix2 = p2 ? p2 : prefix;
644 "%s\tDescription: %s\n"
646 "%s\tUnit Load State: %s\n"
647 "%s\tUnit Active State: %s\n"
648 "%s\tInactive Exit Timestamp: %s\n"
649 "%s\tActive Enter Timestamp: %s\n"
650 "%s\tActive Exit Timestamp: %s\n"
651 "%s\tInactive Enter Timestamp: %s\n"
652 "%s\tGC Check Good: %s\n"
653 "%s\tNeed Daemon Reload: %s\n",
655 prefix, unit_description(u),
656 prefix, strna(u->instance),
657 prefix, unit_load_state_to_string(u->load_state),
658 prefix, unit_active_state_to_string(unit_active_state(u)),
659 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
660 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
661 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
662 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
663 prefix, yes_no(unit_check_gc(u)),
664 prefix, yes_no(unit_need_daemon_reload(u)));
666 SET_FOREACH(t, u->names, i)
667 fprintf(f, "%s\tName: %s\n", prefix, t);
669 if ((following = unit_following(u)))
670 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
672 if (u->fragment_path)
673 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
675 if (u->job_timeout > 0)
676 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout));
678 condition_dump_list(u->conditions, f, prefix);
680 if (dual_timestamp_is_set(&u->condition_timestamp))
682 "%s\tCondition Timestamp: %s\n"
683 "%s\tCondition Result: %s\n",
684 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
685 prefix, yes_no(u->condition_result));
687 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
690 SET_FOREACH(other, u->dependencies[d], i)
691 fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
694 if (u->load_state == UNIT_LOADED) {
699 "%s\tStopWhenUnneeded: %s\n"
700 "%s\tRefuseManualStart: %s\n"
701 "%s\tRefuseManualStop: %s\n"
702 "%s\tDefaultDependencies: %s\n"
703 "%s\tOnFailureIsolate: %s\n"
704 "%s\tIgnoreOnIsolate: %s\n"
705 "%s\tIgnoreOnSnapshot: %s\n",
706 prefix, yes_no(u->stop_when_unneeded),
707 prefix, yes_no(u->refuse_manual_start),
708 prefix, yes_no(u->refuse_manual_stop),
709 prefix, yes_no(u->default_dependencies),
710 prefix, yes_no(u->on_failure_isolate),
711 prefix, yes_no(u->ignore_on_isolate),
712 prefix, yes_no(u->ignore_on_snapshot));
714 LIST_FOREACH(by_unit, b, u->cgroup_bondings)
715 fprintf(f, "%s\tControlGroup: %s:%s\n",
716 prefix, b->controller, b->path);
718 LIST_FOREACH(by_unit, a, u->cgroup_attributes) {
722 a->map_callback(a->controller, a->name, a->value, &v);
724 fprintf(f, "%s\tControlGroupAttribute: %s %s \"%s\"\n",
725 prefix, a->controller, a->name, v ? v : a->value);
730 if (UNIT_VTABLE(u)->dump)
731 UNIT_VTABLE(u)->dump(u, f, prefix2);
733 } else if (u->load_state == UNIT_MERGED)
735 "%s\tMerged into: %s\n",
736 prefix, u->merged_into->id);
737 else if (u->load_state == UNIT_ERROR)
738 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
742 job_dump(u->job, f, prefix2);
745 job_dump(u->nop_job, f, prefix2);
750 /* Common implementation for multiple backends */
751 int unit_load_fragment_and_dropin(Unit *u) {
756 /* Load a .service file */
757 if ((r = unit_load_fragment(u)) < 0)
760 if (u->load_state == UNIT_STUB)
763 /* Load drop-in directory data */
764 if ((r = unit_load_dropin(unit_follow_merge(u))) < 0)
770 /* Common implementation for multiple backends */
771 int unit_load_fragment_and_dropin_optional(Unit *u) {
776 /* Same as unit_load_fragment_and_dropin(), but whether
777 * something can be loaded or not doesn't matter. */
779 /* Load a .service file */
780 if ((r = unit_load_fragment(u)) < 0)
783 if (u->load_state == UNIT_STUB)
784 u->load_state = UNIT_LOADED;
786 /* Load drop-in directory data */
787 if ((r = unit_load_dropin(unit_follow_merge(u))) < 0)
793 int unit_add_default_target_dependency(Unit *u, Unit *target) {
797 if (target->type != UNIT_TARGET)
800 /* Only add the dependency if both units are loaded, so that
801 * that loop check below is reliable */
802 if (u->load_state != UNIT_LOADED ||
803 target->load_state != UNIT_LOADED)
806 /* If either side wants no automatic dependencies, then let's
808 if (!u->default_dependencies ||
809 !target->default_dependencies)
812 /* Don't create loops */
813 if (set_get(target->dependencies[UNIT_BEFORE], u))
816 return unit_add_dependency(target, UNIT_AFTER, u, true);
819 static int unit_add_default_dependencies(Unit *u) {
820 static const UnitDependency deps[] = {
822 UNIT_REQUIRED_BY_OVERRIDABLE,
834 for (k = 0; k < ELEMENTSOF(deps); k++)
835 SET_FOREACH(target, u->dependencies[deps[k]], i)
836 if ((r = unit_add_default_target_dependency(u, target)) < 0)
842 int unit_load(Unit *u) {
847 if (u->in_load_queue) {
848 LIST_REMOVE(Unit, load_queue, u->manager->load_queue, u);
849 u->in_load_queue = false;
852 if (u->type == _UNIT_TYPE_INVALID)
855 if (u->load_state != UNIT_STUB)
858 if (UNIT_VTABLE(u)->load)
859 if ((r = UNIT_VTABLE(u)->load(u)) < 0)
862 if (u->load_state == UNIT_STUB) {
867 if (u->load_state == UNIT_LOADED &&
868 u->default_dependencies)
869 if ((r = unit_add_default_dependencies(u)) < 0)
872 if (u->on_failure_isolate &&
873 set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
875 log_error("More than one OnFailure= dependencies specified for %s but OnFailureIsolate= enabled. Refusing.",
882 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
884 unit_add_to_dbus_queue(unit_follow_merge(u));
885 unit_add_to_gc_queue(u);
890 u->load_state = UNIT_ERROR;
892 unit_add_to_dbus_queue(u);
893 unit_add_to_gc_queue(u);
895 log_debug("Failed to load configuration for %s: %s", u->id, strerror(-r));
900 bool unit_condition_test(Unit *u) {
903 dual_timestamp_get(&u->condition_timestamp);
904 u->condition_result = condition_test_list(u->conditions);
906 return u->condition_result;
910 * -EBADR: This unit type does not support starting.
911 * -EALREADY: Unit is already started.
912 * -EAGAIN: An operation is already in progress. Retry later.
913 * -ECANCELED: Too many requests for now.
915 int unit_start(Unit *u) {
916 UnitActiveState state;
921 if (u->load_state != UNIT_LOADED)
924 /* If this is already started, then this will succeed. Note
925 * that this will even succeed if this unit is not startable
926 * by the user. This is relied on to detect when we need to
927 * wait for units and when waiting is finished. */
928 state = unit_active_state(u);
929 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
932 /* If the conditions failed, don't do anything at all. If we
933 * already are activating this call might still be useful to
934 * speed up activation in case there is some hold-off time,
935 * but we don't want to recheck the condition in that case. */
936 if (state != UNIT_ACTIVATING &&
937 !unit_condition_test(u)) {
938 log_debug("Starting of %s requested but condition failed. Ignoring.", u->id);
942 /* Forward to the main object, if we aren't it. */
943 if ((following = unit_following(u))) {
944 log_debug("Redirecting start request from %s to %s.", u->id, following->id);
945 return unit_start(following);
948 /* If it is stopped, but we cannot start it, then fail */
949 if (!UNIT_VTABLE(u)->start)
952 /* We don't suppress calls to ->start() here when we are
953 * already starting, to allow this request to be used as a
954 * "hurry up" call, for example when the unit is in some "auto
955 * restart" state where it waits for a holdoff timer to elapse
956 * before it will start again. */
958 unit_add_to_dbus_queue(u);
960 unit_status_printf(u, NULL, "Starting %s...", unit_description(u));
961 return UNIT_VTABLE(u)->start(u);
964 bool unit_can_start(Unit *u) {
967 return !!UNIT_VTABLE(u)->start;
970 bool unit_can_isolate(Unit *u) {
973 return unit_can_start(u) &&
978 * -EBADR: This unit type does not support stopping.
979 * -EALREADY: Unit is already stopped.
980 * -EAGAIN: An operation is already in progress. Retry later.
982 int unit_stop(Unit *u) {
983 UnitActiveState state;
988 state = unit_active_state(u);
989 if (UNIT_IS_INACTIVE_OR_FAILED(state))
992 if ((following = unit_following(u))) {
993 log_debug("Redirecting stop request from %s to %s.", u->id, following->id);
994 return unit_stop(following);
997 if (!UNIT_VTABLE(u)->stop)
1000 unit_add_to_dbus_queue(u);
1002 unit_status_printf(u, NULL, "Stopping %s...", unit_description(u));
1003 return UNIT_VTABLE(u)->stop(u);
1007 * -EBADR: This unit type does not support reloading.
1008 * -ENOEXEC: Unit is not started.
1009 * -EAGAIN: An operation is already in progress. Retry later.
1011 int unit_reload(Unit *u) {
1012 UnitActiveState state;
1017 if (u->load_state != UNIT_LOADED)
1020 if (!unit_can_reload(u))
1023 state = unit_active_state(u);
1024 if (state == UNIT_RELOADING)
1027 if (state != UNIT_ACTIVE)
1030 if ((following = unit_following(u))) {
1031 log_debug("Redirecting reload request from %s to %s.", u->id, following->id);
1032 return unit_reload(following);
1035 unit_add_to_dbus_queue(u);
1036 return UNIT_VTABLE(u)->reload(u);
1039 bool unit_can_reload(Unit *u) {
1042 if (!UNIT_VTABLE(u)->reload)
1045 if (!UNIT_VTABLE(u)->can_reload)
1048 return UNIT_VTABLE(u)->can_reload(u);
1051 static void unit_check_unneeded(Unit *u) {
1057 /* If this service shall be shut down when unneeded then do
1060 if (!u->stop_when_unneeded)
1063 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1066 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
1067 if (unit_pending_active(other))
1070 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
1071 if (unit_pending_active(other))
1074 SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
1075 if (unit_pending_active(other))
1078 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1079 if (unit_pending_active(other))
1082 log_info("Service %s is not needed anymore. Stopping.", u->id);
1084 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1085 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1088 static void retroactively_start_dependencies(Unit *u) {
1093 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1095 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1096 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1097 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1098 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1100 SET_FOREACH(other, u->dependencies[UNIT_BIND_TO], i)
1101 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1102 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1103 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1105 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1106 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1107 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1108 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1110 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1111 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1112 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1113 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1115 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1116 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1117 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1118 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1120 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
1121 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1122 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1124 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
1125 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1126 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1129 static void retroactively_stop_dependencies(Unit *u) {
1134 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1136 /* Pull down units which are bound to us recursively if enabled */
1137 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1138 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1139 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1142 static void check_unneeded_dependencies(Unit *u) {
1147 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1149 /* Garbage collect services that might not be needed anymore, if enabled */
1150 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1151 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1152 unit_check_unneeded(other);
1153 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1154 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1155 unit_check_unneeded(other);
1156 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1157 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1158 unit_check_unneeded(other);
1159 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1160 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1161 unit_check_unneeded(other);
1162 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1163 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1164 unit_check_unneeded(other);
1165 SET_FOREACH(other, u->dependencies[UNIT_BIND_TO], i)
1166 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1167 unit_check_unneeded(other);
1170 void unit_trigger_on_failure(Unit *u) {
1176 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
1179 log_info("Triggering OnFailure= dependencies of %s.", u->id);
1181 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
1184 if ((r = manager_add_job(u->manager, JOB_START, other, u->on_failure_isolate ? JOB_ISOLATE : JOB_REPLACE, true, NULL, NULL)) < 0)
1185 log_error("Failed to enqueue OnFailure= job: %s", strerror(-r));
1189 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
1193 assert(os < _UNIT_ACTIVE_STATE_MAX);
1194 assert(ns < _UNIT_ACTIVE_STATE_MAX);
1196 /* Note that this is called for all low-level state changes,
1197 * even if they might map to the same high-level
1198 * UnitActiveState! That means that ns == os is OK an expected
1199 * behaviour here. For example: if a mount point is remounted
1200 * this function will be called too! */
1202 if (u->manager->n_reloading <= 0) {
1205 dual_timestamp_get(&ts);
1207 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
1208 u->inactive_exit_timestamp = ts;
1209 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
1210 u->inactive_enter_timestamp = ts;
1212 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
1213 u->active_enter_timestamp = ts;
1214 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
1215 u->active_exit_timestamp = ts;
1217 timer_unit_notify(u, ns);
1218 path_unit_notify(u, ns);
1221 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1222 cgroup_bonding_trim_list(u->cgroup_bondings, true);
1227 if (u->job->state == JOB_WAITING)
1229 /* So we reached a different state for this
1230 * job. Let's see if we can run it now if it
1231 * failed previously due to EAGAIN. */
1232 job_add_to_run_queue(u->job);
1234 /* Let's check whether this state change constitutes a
1235 * finished job, or maybe contradicts a running job and
1236 * hence needs to invalidate jobs. */
1238 switch (u->job->type) {
1241 case JOB_VERIFY_ACTIVE:
1243 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1244 job_finish_and_invalidate(u->job, JOB_DONE, true);
1245 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1248 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1249 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1255 case JOB_RELOAD_OR_START:
1257 if (u->job->state == JOB_RUNNING) {
1258 if (ns == UNIT_ACTIVE)
1259 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
1260 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1263 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1264 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1272 case JOB_TRY_RESTART:
1274 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1275 job_finish_and_invalidate(u->job, JOB_DONE, true);
1276 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1278 job_finish_and_invalidate(u->job, JOB_FAILED, true);
1284 assert_not_reached("Job type unknown");
1290 if (u->manager->n_reloading <= 0) {
1292 /* If this state change happened without being
1293 * requested by a job, then let's retroactively start
1294 * or stop dependencies. We skip that step when
1295 * deserializing, since we don't want to create any
1296 * additional jobs just because something is already
1300 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1301 retroactively_start_dependencies(u);
1302 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1303 retroactively_stop_dependencies(u);
1306 /* stop unneeded units regardless if going down was expected or not */
1307 if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1308 check_unneeded_dependencies(u);
1310 if (ns != os && ns == UNIT_FAILED) {
1311 log_notice("Unit %s entered failed state.", u->id);
1312 unit_trigger_on_failure(u);
1316 /* Some names are special */
1317 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1319 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1320 /* The bus just might have become available,
1321 * hence try to connect to it, if we aren't
1323 bus_init(u->manager, true);
1325 if (u->type == UNIT_SERVICE &&
1326 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1327 u->manager->n_reloading <= 0) {
1328 /* Write audit record if we have just finished starting up */
1329 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, true);
1333 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1334 manager_send_unit_plymouth(u->manager, u);
1338 /* We don't care about D-Bus here, since we'll get an
1339 * asynchronous notification for it anyway. */
1341 if (u->type == UNIT_SERVICE &&
1342 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1343 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1344 u->manager->n_reloading <= 0) {
1346 /* Hmm, if there was no start record written
1347 * write it now, so that we always have a nice
1350 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1352 if (ns == UNIT_INACTIVE)
1353 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, true);
1355 /* Write audit record if we have just finished shutting down */
1356 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1358 u->in_audit = false;
1362 manager_recheck_journal(u->manager);
1364 /* Maybe we finished startup and are now ready for being
1365 * stopped because unneeded? */
1366 unit_check_unneeded(u);
1368 unit_add_to_dbus_queue(u);
1369 unit_add_to_gc_queue(u);
1372 int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) {
1373 struct epoll_event ev;
1378 assert(w->type == WATCH_INVALID || (w->type == WATCH_FD && w->fd == fd && w->data.unit == u));
1384 if (epoll_ctl(u->manager->epoll_fd,
1385 w->type == WATCH_INVALID ? EPOLL_CTL_ADD : EPOLL_CTL_MOD,
1397 void unit_unwatch_fd(Unit *u, Watch *w) {
1401 if (w->type == WATCH_INVALID)
1404 assert(w->type == WATCH_FD);
1405 assert(w->data.unit == u);
1406 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1409 w->type = WATCH_INVALID;
1410 w->data.unit = NULL;
1413 int unit_watch_pid(Unit *u, pid_t pid) {
1417 /* Watch a specific PID. We only support one unit watching
1418 * each PID for now. */
1420 return hashmap_put(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1423 void unit_unwatch_pid(Unit *u, pid_t pid) {
1427 hashmap_remove_value(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1430 int unit_watch_timer(Unit *u, usec_t delay, Watch *w) {
1431 struct itimerspec its;
1437 assert(w->type == WATCH_INVALID || (w->type == WATCH_UNIT_TIMER && w->data.unit == u));
1439 /* This will try to reuse the old timer if there is one */
1441 if (w->type == WATCH_UNIT_TIMER) {
1442 assert(w->data.unit == u);
1447 } else if (w->type == WATCH_INVALID) {
1450 if ((fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC)) < 0)
1453 assert_not_reached("Invalid watch type");
1458 /* Set absolute time in the past, but not 0, since we
1459 * don't want to disarm the timer */
1460 its.it_value.tv_sec = 0;
1461 its.it_value.tv_nsec = 1;
1463 flags = TFD_TIMER_ABSTIME;
1465 timespec_store(&its.it_value, delay);
1469 /* This will also flush the elapse counter */
1470 if (timerfd_settime(fd, flags, &its, NULL) < 0)
1473 if (w->type == WATCH_INVALID) {
1474 struct epoll_event ev;
1478 ev.events = EPOLLIN;
1480 if (epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
1484 w->type = WATCH_UNIT_TIMER;
1492 close_nointr_nofail(fd);
1497 void unit_unwatch_timer(Unit *u, Watch *w) {
1501 if (w->type == WATCH_INVALID)
1504 assert(w->type == WATCH_UNIT_TIMER);
1505 assert(w->data.unit == u);
1508 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1509 close_nointr_nofail(w->fd);
1512 w->type = WATCH_INVALID;
1513 w->data.unit = NULL;
1516 bool unit_job_is_applicable(Unit *u, JobType j) {
1518 assert(j >= 0 && j < _JOB_TYPE_MAX);
1522 case JOB_VERIFY_ACTIVE:
1529 case JOB_TRY_RESTART:
1530 return unit_can_start(u);
1533 return unit_can_reload(u);
1535 case JOB_RELOAD_OR_START:
1536 return unit_can_reload(u) && unit_can_start(u);
1539 assert_not_reached("Invalid job type");
1543 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1545 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1546 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1547 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1548 [UNIT_WANTS] = UNIT_WANTED_BY,
1549 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1550 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1551 [UNIT_BIND_TO] = UNIT_BOUND_BY,
1552 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1553 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1554 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1555 [UNIT_BOUND_BY] = UNIT_BIND_TO,
1556 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
1557 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
1558 [UNIT_BEFORE] = UNIT_AFTER,
1559 [UNIT_AFTER] = UNIT_BEFORE,
1560 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
1561 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1562 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
1563 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
1564 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
1565 [UNIT_PROPAGATE_RELOAD_TO] = UNIT_PROPAGATE_RELOAD_FROM,
1566 [UNIT_PROPAGATE_RELOAD_FROM] = UNIT_PROPAGATE_RELOAD_TO
1568 int r, q = 0, v = 0, w = 0;
1571 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1574 u = unit_follow_merge(u);
1575 other = unit_follow_merge(other);
1577 /* We won't allow dependencies on ourselves. We will not
1578 * consider them an error however. */
1582 if ((r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func)) < 0)
1585 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1586 if ((r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func)) < 0)
1590 if ((r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func)) < 0 ||
1591 (r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func)) < 0)
1594 if ((q = set_put(u->dependencies[d], other)) < 0)
1597 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1598 if ((v = set_put(other->dependencies[inverse_table[d]], u)) < 0) {
1603 if (add_reference) {
1604 if ((w = set_put(u->dependencies[UNIT_REFERENCES], other)) < 0) {
1609 if ((r = set_put(other->dependencies[UNIT_REFERENCED_BY], u)) < 0)
1613 unit_add_to_dbus_queue(u);
1618 set_remove(u->dependencies[d], other);
1621 set_remove(other->dependencies[inverse_table[d]], u);
1624 set_remove(u->dependencies[UNIT_REFERENCES], other);
1629 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
1634 if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
1637 if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
1643 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
1647 assert(name || path);
1650 name = file_name_from_path(path);
1652 if (!unit_name_is_template(name)) {
1658 s = unit_name_replace_instance(name, u->instance);
1662 if (!(i = unit_name_to_prefix(u->id)))
1665 s = unit_name_replace_instance(name, i);
1676 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1682 assert(name || path);
1684 if (!(name = resolve_template(u, name, path, &s)))
1687 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1690 r = unit_add_dependency(u, d, other, add_reference);
1697 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1703 assert(name || path);
1705 if (!(name = resolve_template(u, name, path, &s)))
1708 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1711 r = unit_add_two_dependencies(u, d, e, other, add_reference);
1718 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1724 assert(name || path);
1726 if (!(name = resolve_template(u, name, path, &s)))
1729 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1732 r = unit_add_dependency(other, d, u, add_reference);
1739 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1745 assert(name || path);
1747 if (!(name = resolve_template(u, name, path, &s)))
1750 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1753 if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
1761 int set_unit_path(const char *p) {
1765 /* This is mostly for debug purposes */
1767 if (path_is_absolute(p)) {
1768 if (!(c = strdup(p)))
1771 if (!(cwd = get_current_dir_name()))
1774 r = asprintf(&c, "%s/%s", cwd, p);
1781 if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0) {
1790 char *unit_dbus_path(Unit *u) {
1798 if (!(e = bus_path_escape(u->id)))
1801 p = strappend("/org/freedesktop/systemd1/unit/", e);
1807 int unit_add_cgroup(Unit *u, CGroupBonding *b) {
1815 if (!b->controller) {
1816 if (!(b->controller = strdup(SYSTEMD_CGROUP_CONTROLLER)))
1822 /* Ensure this hasn't been added yet */
1825 if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) {
1828 l = hashmap_get(u->manager->cgroup_bondings, b->path);
1829 LIST_PREPEND(CGroupBonding, by_path, l, b);
1831 if ((r = hashmap_replace(u->manager->cgroup_bondings, b->path, l)) < 0) {
1832 LIST_REMOVE(CGroupBonding, by_path, l, b);
1837 LIST_PREPEND(CGroupBonding, by_unit, u->cgroup_bondings, b);
1843 static char *default_cgroup_path(Unit *u) {
1851 t = unit_name_template(u->id);
1855 p = join(u->manager->cgroup_hierarchy, "/", t, "/", u->instance, NULL);
1858 p = join(u->manager->cgroup_hierarchy, "/", u->id, NULL);
1863 int unit_add_cgroup_from_text(Unit *u, const char *name) {
1864 char *controller = NULL, *path = NULL;
1865 CGroupBonding *b = NULL;
1872 if ((r = cg_split_spec(name, &controller, &path)) < 0)
1876 path = default_cgroup_path(u);
1881 controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
1885 if (!path || !controller) {
1892 if (cgroup_bonding_find_list(u->cgroup_bondings, controller)) {
1897 if (!(b = new0(CGroupBonding, 1))) {
1902 b->controller = controller;
1905 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
1907 if ((r = unit_add_cgroup(u, b)) < 0)
1920 static int unit_add_one_default_cgroup(Unit *u, const char *controller) {
1921 CGroupBonding *b = NULL;
1927 controller = SYSTEMD_CGROUP_CONTROLLER;
1929 if (cgroup_bonding_find_list(u->cgroup_bondings, controller))
1932 if (!(b = new0(CGroupBonding, 1)))
1935 if (!(b->controller = strdup(controller)))
1938 if (!(b->path = default_cgroup_path(u)))
1942 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
1944 if ((r = unit_add_cgroup(u, b)) < 0)
1951 free(b->controller);
1957 int unit_add_default_cgroups(Unit *u) {
1964 /* Adds in the default cgroups, if they weren't specified
1967 if (!u->manager->cgroup_hierarchy)
1970 if ((r = unit_add_one_default_cgroup(u, NULL)) < 0)
1973 STRV_FOREACH(c, u->manager->default_controllers)
1974 unit_add_one_default_cgroup(u, *c);
1976 LIST_FOREACH(by_unit, a, u->cgroup_attributes)
1977 unit_add_one_default_cgroup(u, a->controller);
1982 CGroupBonding* unit_get_default_cgroup(Unit *u) {
1985 return cgroup_bonding_find_list(u->cgroup_bondings, SYSTEMD_CGROUP_CONTROLLER);
1988 int unit_add_cgroup_attribute(Unit *u, const char *controller, const char *name, const char *value, CGroupAttributeMapCallback map_callback) {
2000 dot = strchr(name, '.');
2004 c = strndup(name, dot - name);
2011 if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
2016 a = new0(CGroupAttribute, 1);
2026 a->controller = strdup(controller);
2028 a->name = strdup(name);
2029 a->value = strdup(value);
2031 if (!a->controller || !a->name || !a->value) {
2032 free(a->controller);
2040 a->map_callback = map_callback;
2042 LIST_PREPEND(CGroupAttribute, by_unit, u->cgroup_attributes, a);
2051 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2059 if (!(t = unit_name_change_suffix(u->id, type)))
2062 assert(!unit_has_name(u, t));
2064 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2067 assert(r < 0 || *_found != u);
2072 int unit_get_related_unit(Unit *u, const char *type, Unit **_found) {
2080 if (!(t = unit_name_change_suffix(u->id, type)))
2083 assert(!unit_has_name(u, t));
2085 found = manager_get_unit(u->manager, t);
2095 static char *specifier_prefix_and_instance(char specifier, void *data, void *userdata) {
2099 return unit_name_to_prefix_and_instance(u->id);
2102 static char *specifier_prefix(char specifier, void *data, void *userdata) {
2106 return unit_name_to_prefix(u->id);
2109 static char *specifier_prefix_unescaped(char specifier, void *data, void *userdata) {
2115 if (!(p = unit_name_to_prefix(u->id)))
2118 r = unit_name_unescape(p);
2124 static char *specifier_instance_unescaped(char specifier, void *data, void *userdata) {
2129 return unit_name_unescape(u->instance);
2134 static char *specifier_filename(char specifier, void *data, void *userdata) {
2139 return unit_name_path_unescape(u->instance);
2141 return unit_name_to_path(u->instance);
2144 static char *specifier_cgroup(char specifier, void *data, void *userdata) {
2148 return default_cgroup_path(u);
2151 static char *specifier_cgroup_root(char specifier, void *data, void *userdata) {
2156 if (specifier == 'r')
2157 return strdup(u->manager->cgroup_hierarchy);
2159 if (parent_of_path(u->manager->cgroup_hierarchy, &p) < 0)
2162 if (streq(p, "/")) {
2170 static char *specifier_runtime(char specifier, void *data, void *userdata) {
2174 if (u->manager->running_as == MANAGER_USER) {
2177 e = getenv("XDG_RUNTIME_DIR");
2182 return strdup("/run");
2185 char *unit_name_printf(Unit *u, const char* format) {
2188 * This will use the passed string as format string and
2189 * replace the following specifiers:
2191 * %n: the full id of the unit (foo@bar.waldo)
2192 * %N: the id of the unit without the suffix (foo@bar)
2193 * %p: the prefix (foo)
2194 * %i: the instance (bar)
2197 const Specifier table[] = {
2198 { 'n', specifier_string, u->id },
2199 { 'N', specifier_prefix_and_instance, NULL },
2200 { 'p', specifier_prefix, NULL },
2201 { 'i', specifier_string, u->instance },
2208 return specifier_printf(format, table, u);
2211 char *unit_full_printf(Unit *u, const char *format) {
2213 /* This is similar to unit_name_printf() but also supports
2214 * unescaping. Also, adds a couple of additional codes:
2216 * %c cgroup path of unit
2217 * %r root cgroup path of this systemd instance (e.g. "/user/lennart/shared/systemd-4711")
2218 * %R parent of root cgroup path (e.g. "/usr/lennart/shared")
2219 * %t the runtime directory to place sockets in (e.g. "/run" or $XDG_RUNTIME_DIR)
2222 const Specifier table[] = {
2223 { 'n', specifier_string, u->id },
2224 { 'N', specifier_prefix_and_instance, NULL },
2225 { 'p', specifier_prefix, NULL },
2226 { 'P', specifier_prefix_unescaped, NULL },
2227 { 'i', specifier_string, u->instance },
2228 { 'I', specifier_instance_unescaped, NULL },
2229 { 'f', specifier_filename, NULL },
2230 { 'c', specifier_cgroup, NULL },
2231 { 'r', specifier_cgroup_root, NULL },
2232 { 'R', specifier_cgroup_root, NULL },
2233 { 't', specifier_runtime, NULL },
2240 return specifier_printf(format, table, u);
2243 char **unit_full_printf_strv(Unit *u, char **l) {
2247 /* Applies unit_full_printf to every entry in l */
2252 if (!(r = new(char*, n+1)))
2255 for (i = l, j = r; *i; i++, j++)
2256 if (!(*j = unit_full_printf(u, *i)))
2263 for (j--; j >= r; j--)
2271 int unit_watch_bus_name(Unit *u, const char *name) {
2275 /* Watch a specific name on the bus. We only support one unit
2276 * watching each name for now. */
2278 return hashmap_put(u->manager->watch_bus, name, u);
2281 void unit_unwatch_bus_name(Unit *u, const char *name) {
2285 hashmap_remove_value(u->manager->watch_bus, name, u);
2288 bool unit_can_serialize(Unit *u) {
2291 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2294 int unit_serialize(Unit *u, FILE *f, FDSet *fds) {
2301 if (!unit_can_serialize(u))
2304 if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0)
2308 fprintf(f, "job\n");
2309 job_serialize(u->job, f, fds);
2313 fprintf(f, "job\n");
2314 job_serialize(u->nop_job, f, fds);
2317 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2318 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2319 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2320 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2321 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2323 if (dual_timestamp_is_set(&u->condition_timestamp))
2324 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2331 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2342 va_start(ap, format);
2343 vfprintf(f, format, ap);
2349 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2355 fprintf(f, "%s=%s\n", key, value);
2358 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2365 if (!unit_can_serialize(u))
2369 char line[LINE_MAX], *l, *v;
2372 if (!fgets(line, sizeof(line), f)) {
2385 k = strcspn(l, "=");
2393 if (streq(l, "job")) {
2395 /* new-style serialized job */
2396 Job *j = job_new_raw(u);
2400 r = job_deserialize(j, f, fds);
2406 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2412 r = job_install_deserialized(j);
2414 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2420 JobType type = job_type_from_string(v);
2422 log_debug("Failed to parse job type value %s", v);
2424 u->deserialized_job = type;
2427 } else if (streq(l, "inactive-exit-timestamp")) {
2428 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2430 } else if (streq(l, "active-enter-timestamp")) {
2431 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2433 } else if (streq(l, "active-exit-timestamp")) {
2434 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2436 } else if (streq(l, "inactive-enter-timestamp")) {
2437 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2439 } else if (streq(l, "condition-timestamp")) {
2440 dual_timestamp_deserialize(v, &u->condition_timestamp);
2442 } else if (streq(l, "condition-result")) {
2445 if ((b = parse_boolean(v)) < 0)
2446 log_debug("Failed to parse condition result value %s", v);
2448 u->condition_result = b;
2453 if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0)
2458 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2468 /* Adds in links to the device node that this unit is based on */
2470 if (!is_device_path(what))
2473 if (!(e = unit_name_build_escape(what+1, NULL, ".device")))
2476 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2482 if ((r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BIND_TO, device, true)) < 0)
2486 if ((r = unit_add_dependency(device, UNIT_WANTS, u, false)) < 0)
2492 int unit_coldplug(Unit *u) {
2497 if (UNIT_VTABLE(u)->coldplug)
2498 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2502 r = job_coldplug(u->job);
2505 } else if (u->deserialized_job >= 0) {
2507 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2511 u->deserialized_job = _JOB_TYPE_INVALID;
2517 void unit_status_printf(Unit *u, const char *status, const char *format, ...) {
2523 if (!UNIT_VTABLE(u)->show_status)
2526 if (!manager_get_show_status(u->manager))
2529 if (!manager_is_booting_or_shutting_down(u->manager))
2532 va_start(ap, format);
2533 status_vprintf(status, true, format, ap);
2537 bool unit_need_daemon_reload(Unit *u) {
2540 if (u->fragment_path) {
2544 if (stat(u->fragment_path, &st) < 0)
2545 /* What, cannot access this anymore? */
2548 if (u->fragment_mtime > 0 &&
2549 timespec_load(&st.st_mtim) != u->fragment_mtime)
2553 if (UNIT_VTABLE(u)->need_daemon_reload)
2554 return UNIT_VTABLE(u)->need_daemon_reload(u);
2559 void unit_reset_failed(Unit *u) {
2562 if (UNIT_VTABLE(u)->reset_failed)
2563 UNIT_VTABLE(u)->reset_failed(u);
2566 Unit *unit_following(Unit *u) {
2569 if (UNIT_VTABLE(u)->following)
2570 return UNIT_VTABLE(u)->following(u);
2575 bool unit_pending_inactive(Unit *u) {
2578 /* Returns true if the unit is inactive or going down */
2580 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2583 if (u->job && u->job->type == JOB_STOP)
2589 bool unit_pending_active(Unit *u) {
2592 /* Returns true if the unit is active or going up */
2594 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2598 (u->job->type == JOB_START ||
2599 u->job->type == JOB_RELOAD_OR_START ||
2600 u->job->type == JOB_RESTART))
2606 UnitType unit_name_to_type(const char *n) {
2611 for (t = 0; t < _UNIT_TYPE_MAX; t++)
2612 if (endswith(n, unit_vtable[t]->suffix))
2615 return _UNIT_TYPE_INVALID;
2618 bool unit_name_is_valid(const char *n, bool template_ok) {
2621 t = unit_name_to_type(n);
2622 if (t < 0 || t >= _UNIT_TYPE_MAX)
2625 return unit_name_is_valid_no_type(n, template_ok);
2628 int unit_kill(Unit *u, KillWho w, KillMode m, int signo, DBusError *error) {
2630 assert(w >= 0 && w < _KILL_WHO_MAX);
2631 assert(m >= 0 && m < _KILL_MODE_MAX);
2633 assert(signo < _NSIG);
2638 if (!UNIT_VTABLE(u)->kill)
2641 return UNIT_VTABLE(u)->kill(u, w, m, signo, error);
2644 int unit_following_set(Unit *u, Set **s) {
2648 if (UNIT_VTABLE(u)->following_set)
2649 return UNIT_VTABLE(u)->following_set(u, s);
2655 UnitFileState unit_get_unit_file_state(Unit *u) {
2658 if (u->unit_file_state < 0 && u->fragment_path)
2659 u->unit_file_state = unit_file_get_state(
2660 u->manager->running_as == MANAGER_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2661 NULL, file_name_from_path(u->fragment_path));
2663 return u->unit_file_state;
2666 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2671 unit_ref_unset(ref);
2674 LIST_PREPEND(UnitRef, refs, u->refs, ref);
2678 void unit_ref_unset(UnitRef *ref) {
2684 LIST_REMOVE(UnitRef, refs, ref->unit->refs, ref);
2688 static const char* const unit_load_state_table[_UNIT_LOAD_STATE_MAX] = {
2689 [UNIT_STUB] = "stub",
2690 [UNIT_LOADED] = "loaded",
2691 [UNIT_ERROR] = "error",
2692 [UNIT_MERGED] = "merged",
2693 [UNIT_MASKED] = "masked"
2696 DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState);
2698 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
2699 [UNIT_ACTIVE] = "active",
2700 [UNIT_RELOADING] = "reloading",
2701 [UNIT_INACTIVE] = "inactive",
2702 [UNIT_FAILED] = "failed",
2703 [UNIT_ACTIVATING] = "activating",
2704 [UNIT_DEACTIVATING] = "deactivating"
2707 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
2709 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
2710 [UNIT_REQUIRES] = "Requires",
2711 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
2712 [UNIT_WANTS] = "Wants",
2713 [UNIT_REQUISITE] = "Requisite",
2714 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
2715 [UNIT_REQUIRED_BY] = "RequiredBy",
2716 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
2717 [UNIT_BIND_TO] = "BindTo",
2718 [UNIT_WANTED_BY] = "WantedBy",
2719 [UNIT_CONFLICTS] = "Conflicts",
2720 [UNIT_CONFLICTED_BY] = "ConflictedBy",
2721 [UNIT_BOUND_BY] = "BoundBy",
2722 [UNIT_BEFORE] = "Before",
2723 [UNIT_AFTER] = "After",
2724 [UNIT_REFERENCES] = "References",
2725 [UNIT_REFERENCED_BY] = "ReferencedBy",
2726 [UNIT_ON_FAILURE] = "OnFailure",
2727 [UNIT_TRIGGERS] = "Triggers",
2728 [UNIT_TRIGGERED_BY] = "TriggeredBy",
2729 [UNIT_PROPAGATE_RELOAD_TO] = "PropagateReloadTo",
2730 [UNIT_PROPAGATE_RELOAD_FROM] = "PropagateReloadFrom"
2733 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);