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>
32 #include "systemd/sd-id128.h"
33 #include "systemd/sd-messages.h"
38 #include "path-util.h"
39 #include "load-fragment.h"
40 #include "load-dropin.h"
42 #include "unit-name.h"
43 #include "dbus-unit.h"
45 #include "cgroup-util.h"
47 #include "cgroup-attr.h"
50 #include "fileio-label.h"
51 #include "bus-errors.h"
53 const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
54 [UNIT_SERVICE] = &service_vtable,
55 [UNIT_TIMER] = &timer_vtable,
56 [UNIT_SOCKET] = &socket_vtable,
57 [UNIT_TARGET] = &target_vtable,
58 [UNIT_DEVICE] = &device_vtable,
59 [UNIT_MOUNT] = &mount_vtable,
60 [UNIT_AUTOMOUNT] = &automount_vtable,
61 [UNIT_SNAPSHOT] = &snapshot_vtable,
62 [UNIT_SWAP] = &swap_vtable,
63 [UNIT_PATH] = &path_vtable,
64 [UNIT_SLICE] = &slice_vtable
67 Unit *unit_new(Manager *m, size_t size) {
71 assert(size >= sizeof(Unit));
77 u->names = set_new(string_hash_func, string_compare_func);
84 u->type = _UNIT_TYPE_INVALID;
85 u->deserialized_job = _JOB_TYPE_INVALID;
86 u->default_dependencies = true;
87 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
92 bool unit_has_name(Unit *u, const char *name) {
96 return !!set_get(u->names, (char*) name);
99 int unit_add_name(Unit *u, const char *text) {
107 if (unit_name_is_template(text)) {
111 s = unit_name_replace_instance(text, u->instance);
118 if (!unit_name_is_valid(s, false)) {
123 assert_se((t = unit_name_to_type(s)) >= 0);
125 if (u->type != _UNIT_TYPE_INVALID && t != u->type) {
130 if ((r = unit_name_to_instance(s, &i)) < 0)
133 if (i && unit_vtable[t]->no_instances) {
138 /* Ensure that this unit is either instanced or not instanced,
140 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i) {
145 if (unit_vtable[t]->no_alias &&
146 !set_isempty(u->names) &&
147 !set_get(u->names, s)) {
152 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES) {
157 if ((r = set_put(u->names, s)) < 0) {
163 if ((r = hashmap_put(u->manager->units, s, u)) < 0) {
164 set_remove(u->names, s);
168 if (u->type == _UNIT_TYPE_INVALID) {
174 LIST_PREPEND(Unit, units_by_type, u->manager->units_by_type[t], u);
176 if (UNIT_VTABLE(u)->init)
177 UNIT_VTABLE(u)->init(u);
181 unit_add_to_dbus_queue(u);
191 int unit_choose_id(Unit *u, const char *name) {
192 char *s, *t = NULL, *i;
198 if (unit_name_is_template(name)) {
203 if (!(t = unit_name_replace_instance(name, u->instance)))
209 /* Selects one of the names of this unit as the id */
210 s = set_get(u->names, (char*) name);
216 if ((r = unit_name_to_instance(s, &i)) < 0)
224 unit_add_to_dbus_queue(u);
229 int unit_set_description(Unit *u, const char *description) {
234 if (!(s = strdup(description)))
237 free(u->description);
240 unit_add_to_dbus_queue(u);
244 bool unit_check_gc(Unit *u) {
247 if (u->load_state == UNIT_STUB)
250 if (UNIT_VTABLE(u)->no_gc)
262 if (unit_active_state(u) != UNIT_INACTIVE)
268 if (UNIT_VTABLE(u)->check_gc)
269 if (UNIT_VTABLE(u)->check_gc(u))
275 void unit_add_to_load_queue(Unit *u) {
277 assert(u->type != _UNIT_TYPE_INVALID);
279 if (u->load_state != UNIT_STUB || u->in_load_queue)
282 LIST_PREPEND(Unit, load_queue, u->manager->load_queue, u);
283 u->in_load_queue = true;
286 void unit_add_to_cleanup_queue(Unit *u) {
289 if (u->in_cleanup_queue)
292 LIST_PREPEND(Unit, cleanup_queue, u->manager->cleanup_queue, u);
293 u->in_cleanup_queue = true;
296 void unit_add_to_gc_queue(Unit *u) {
299 if (u->in_gc_queue || u->in_cleanup_queue)
302 if (unit_check_gc(u))
305 LIST_PREPEND(Unit, gc_queue, u->manager->gc_queue, u);
306 u->in_gc_queue = true;
308 u->manager->n_in_gc_queue ++;
310 if (u->manager->gc_queue_timestamp <= 0)
311 u->manager->gc_queue_timestamp = now(CLOCK_MONOTONIC);
314 void unit_add_to_dbus_queue(Unit *u) {
316 assert(u->type != _UNIT_TYPE_INVALID);
318 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
321 /* Shortcut things if nobody cares */
322 if (!bus_has_subscriber(u->manager)) {
323 u->sent_dbus_new_signal = true;
327 LIST_PREPEND(Unit, dbus_queue, u->manager->dbus_unit_queue, u);
328 u->in_dbus_queue = true;
331 static void bidi_set_free(Unit *u, Set *s) {
337 /* Frees the set and makes sure we are dropped from the
338 * inverse pointers */
340 SET_FOREACH(other, s, i) {
343 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
344 set_remove(other->dependencies[d], u);
346 unit_add_to_gc_queue(other);
352 void unit_free(Unit *u) {
359 bus_unit_send_removed_signal(u);
361 if (u->load_state != UNIT_STUB)
362 if (UNIT_VTABLE(u)->done)
363 UNIT_VTABLE(u)->done(u);
365 SET_FOREACH(t, u->names, i)
366 hashmap_remove_value(u->manager->units, t, u);
380 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
381 bidi_set_free(u, u->dependencies[d]);
383 if (u->requires_mounts_for) {
384 LIST_REMOVE(Unit, has_requires_mounts_for, u->manager->has_requires_mounts_for, u);
385 strv_free(u->requires_mounts_for);
388 if (u->type != _UNIT_TYPE_INVALID)
389 LIST_REMOVE(Unit, units_by_type, u->manager->units_by_type[u->type], u);
391 if (u->in_load_queue)
392 LIST_REMOVE(Unit, load_queue, u->manager->load_queue, u);
394 if (u->in_dbus_queue)
395 LIST_REMOVE(Unit, dbus_queue, u->manager->dbus_unit_queue, u);
397 if (u->in_cleanup_queue)
398 LIST_REMOVE(Unit, cleanup_queue, u->manager->cleanup_queue, u);
400 if (u->in_gc_queue) {
401 LIST_REMOVE(Unit, gc_queue, u->manager->gc_queue, u);
402 u->manager->n_in_gc_queue--;
405 cgroup_bonding_free_list(u->cgroup_bondings, u->manager->n_reloading <= 0);
406 cgroup_attribute_free_list(u->cgroup_attributes);
408 free(u->description);
409 strv_free(u->documentation);
410 free(u->fragment_path);
411 free(u->source_path);
412 strv_free(u->dropin_paths);
415 set_free_free(u->names);
417 condition_free_list(u->conditions);
420 unit_ref_unset(u->refs);
425 UnitActiveState unit_active_state(Unit *u) {
428 if (u->load_state == UNIT_MERGED)
429 return unit_active_state(unit_follow_merge(u));
431 /* After a reload it might happen that a unit is not correctly
432 * loaded but still has a process around. That's why we won't
433 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
435 return UNIT_VTABLE(u)->active_state(u);
438 const char* unit_sub_state_to_string(Unit *u) {
441 return UNIT_VTABLE(u)->sub_state_to_string(u);
444 static void complete_move(Set **s, Set **other) {
452 set_move(*s, *other);
459 static void merge_names(Unit *u, Unit *other) {
466 complete_move(&u->names, &other->names);
468 set_free_free(other->names);
472 SET_FOREACH(t, u->names, i)
473 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
476 static void merge_dependencies(Unit *u, Unit *other, UnitDependency d) {
483 assert(d < _UNIT_DEPENDENCY_MAX);
485 /* Fix backwards pointers */
486 SET_FOREACH(back, other->dependencies[d], i) {
489 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++)
490 if ((r = set_remove_and_put(back->dependencies[k], other, u)) < 0) {
493 set_remove(back->dependencies[k], other);
495 assert(r == -ENOENT);
499 complete_move(&u->dependencies[d], &other->dependencies[d]);
501 set_free(other->dependencies[d]);
502 other->dependencies[d] = NULL;
505 int unit_merge(Unit *u, Unit *other) {
510 assert(u->manager == other->manager);
511 assert(u->type != _UNIT_TYPE_INVALID);
513 other = unit_follow_merge(other);
518 if (u->type != other->type)
521 if (!u->instance != !other->instance)
524 if (other->load_state != UNIT_STUB &&
525 other->load_state != UNIT_ERROR)
534 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
538 merge_names(u, other);
540 /* Redirect all references */
542 unit_ref_set(other->refs, u);
544 /* Merge dependencies */
545 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
546 merge_dependencies(u, other, d);
548 other->load_state = UNIT_MERGED;
549 other->merged_into = u;
551 /* If there is still some data attached to the other node, we
552 * don't need it anymore, and can free it. */
553 if (other->load_state != UNIT_STUB)
554 if (UNIT_VTABLE(other)->done)
555 UNIT_VTABLE(other)->done(other);
557 unit_add_to_dbus_queue(u);
558 unit_add_to_cleanup_queue(other);
563 int unit_merge_by_name(Unit *u, const char *name) {
571 if (unit_name_is_template(name)) {
575 if (!(s = unit_name_replace_instance(name, u->instance)))
581 if (!(other = manager_get_unit(u->manager, name)))
582 r = unit_add_name(u, name);
584 r = unit_merge(u, other);
590 Unit* unit_follow_merge(Unit *u) {
593 while (u->load_state == UNIT_MERGED)
594 assert_se(u = u->merged_into);
599 int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
605 if (c->std_output != EXEC_OUTPUT_KMSG &&
606 c->std_output != EXEC_OUTPUT_SYSLOG &&
607 c->std_output != EXEC_OUTPUT_JOURNAL &&
608 c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
609 c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
610 c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
611 c->std_error != EXEC_OUTPUT_KMSG &&
612 c->std_error != EXEC_OUTPUT_SYSLOG &&
613 c->std_error != EXEC_OUTPUT_JOURNAL &&
614 c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
615 c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
616 c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
619 /* If syslog or kernel logging is requested, make sure our own
620 * logging daemon is run first. */
622 if (u->manager->running_as == SYSTEMD_SYSTEM) {
623 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true);
631 const char *unit_description(Unit *u) {
635 return u->description;
640 void unit_dump(Unit *u, FILE *f, const char *prefix) {
647 timestamp1[FORMAT_TIMESTAMP_MAX],
648 timestamp2[FORMAT_TIMESTAMP_MAX],
649 timestamp3[FORMAT_TIMESTAMP_MAX],
650 timestamp4[FORMAT_TIMESTAMP_MAX],
651 timespan[FORMAT_TIMESPAN_MAX];
655 assert(u->type >= 0);
659 p2 = strappend(prefix, "\t");
660 prefix2 = p2 ? p2 : prefix;
664 "%s\tDescription: %s\n"
666 "%s\tUnit Load State: %s\n"
667 "%s\tUnit Active State: %s\n"
668 "%s\tInactive Exit Timestamp: %s\n"
669 "%s\tActive Enter Timestamp: %s\n"
670 "%s\tActive Exit Timestamp: %s\n"
671 "%s\tInactive Enter Timestamp: %s\n"
672 "%s\tGC Check Good: %s\n"
673 "%s\tNeed Daemon Reload: %s\n",
675 prefix, unit_description(u),
676 prefix, strna(u->instance),
677 prefix, unit_load_state_to_string(u->load_state),
678 prefix, unit_active_state_to_string(unit_active_state(u)),
679 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
680 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
681 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
682 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
683 prefix, yes_no(unit_check_gc(u)),
684 prefix, yes_no(unit_need_daemon_reload(u)));
686 SET_FOREACH(t, u->names, i)
687 fprintf(f, "%s\tName: %s\n", prefix, t);
689 STRV_FOREACH(j, u->documentation)
690 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
692 if ((following = unit_following(u)))
693 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
695 if (u->fragment_path)
696 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
699 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
701 STRV_FOREACH(j, u->dropin_paths)
702 fprintf(f, "%s\tDropIn Path: %s\n", prefix, *j);
704 if (u->job_timeout > 0)
705 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
707 condition_dump_list(u->conditions, f, prefix);
709 if (dual_timestamp_is_set(&u->condition_timestamp))
711 "%s\tCondition Timestamp: %s\n"
712 "%s\tCondition Result: %s\n",
713 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
714 prefix, yes_no(u->condition_result));
716 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
719 SET_FOREACH(other, u->dependencies[d], i)
720 fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
723 if (!strv_isempty(u->requires_mounts_for)) {
725 "%s\tRequiresMountsFor:", prefix);
727 STRV_FOREACH(j, u->requires_mounts_for)
728 fprintf(f, " %s", *j);
733 if (u->load_state == UNIT_LOADED) {
738 "%s\tStopWhenUnneeded: %s\n"
739 "%s\tRefuseManualStart: %s\n"
740 "%s\tRefuseManualStop: %s\n"
741 "%s\tDefaultDependencies: %s\n"
742 "%s\tOnFailureIsolate: %s\n"
743 "%s\tIgnoreOnIsolate: %s\n"
744 "%s\tIgnoreOnSnapshot: %s\n",
745 prefix, yes_no(u->stop_when_unneeded),
746 prefix, yes_no(u->refuse_manual_start),
747 prefix, yes_no(u->refuse_manual_stop),
748 prefix, yes_no(u->default_dependencies),
749 prefix, yes_no(u->on_failure_isolate),
750 prefix, yes_no(u->ignore_on_isolate),
751 prefix, yes_no(u->ignore_on_snapshot));
753 LIST_FOREACH(by_unit, b, u->cgroup_bondings)
754 fprintf(f, "%s\tControlGroup: %s:%s\n",
755 prefix, b->controller, b->path);
757 LIST_FOREACH(by_unit, a, u->cgroup_attributes) {
758 _cleanup_free_ char *v = NULL;
760 if (a->semantics && a->semantics->map_write)
761 a->semantics->map_write(a->semantics, a->value, &v);
763 fprintf(f, "%s\tControlGroupAttribute: %s %s \"%s\"\n",
764 prefix, a->controller, a->name, v ? v : a->value);
767 if (UNIT_VTABLE(u)->dump)
768 UNIT_VTABLE(u)->dump(u, f, prefix2);
770 } else if (u->load_state == UNIT_MERGED)
772 "%s\tMerged into: %s\n",
773 prefix, u->merged_into->id);
774 else if (u->load_state == UNIT_ERROR)
775 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
779 job_dump(u->job, f, prefix2);
782 job_dump(u->nop_job, f, prefix2);
787 /* Common implementation for multiple backends */
788 int unit_load_fragment_and_dropin(Unit *u) {
793 /* Load a .service file */
794 if ((r = unit_load_fragment(u)) < 0)
797 if (u->load_state == UNIT_STUB)
800 /* Load drop-in directory data */
801 if ((r = unit_load_dropin(unit_follow_merge(u))) < 0)
807 /* Common implementation for multiple backends */
808 int unit_load_fragment_and_dropin_optional(Unit *u) {
813 /* Same as unit_load_fragment_and_dropin(), but whether
814 * something can be loaded or not doesn't matter. */
816 /* Load a .service file */
817 if ((r = unit_load_fragment(u)) < 0)
820 if (u->load_state == UNIT_STUB)
821 u->load_state = UNIT_LOADED;
823 /* Load drop-in directory data */
824 if ((r = unit_load_dropin(unit_follow_merge(u))) < 0)
830 int unit_add_default_target_dependency(Unit *u, Unit *target) {
834 if (target->type != UNIT_TARGET)
837 /* Only add the dependency if both units are loaded, so that
838 * that loop check below is reliable */
839 if (u->load_state != UNIT_LOADED ||
840 target->load_state != UNIT_LOADED)
843 /* If either side wants no automatic dependencies, then let's
845 if (!u->default_dependencies ||
846 !target->default_dependencies)
849 /* Don't create loops */
850 if (set_get(target->dependencies[UNIT_BEFORE], u))
853 return unit_add_dependency(target, UNIT_AFTER, u, true);
856 static int unit_add_default_dependencies(Unit *u) {
858 static const UnitDependency deps[] = {
860 UNIT_REQUIRED_BY_OVERRIDABLE,
872 for (k = 0; k < ELEMENTSOF(deps); k++)
873 SET_FOREACH(target, u->dependencies[deps[k]], i) {
874 r = unit_add_default_target_dependency(u, target);
879 if (u->default_dependencies && UNIT_DEREF(u->slice)) {
880 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, UNIT_DEREF(u->slice), true);
888 int unit_load(Unit *u) {
893 if (u->in_load_queue) {
894 LIST_REMOVE(Unit, load_queue, u->manager->load_queue, u);
895 u->in_load_queue = false;
898 if (u->type == _UNIT_TYPE_INVALID)
901 if (u->load_state != UNIT_STUB)
904 if (UNIT_VTABLE(u)->load)
905 if ((r = UNIT_VTABLE(u)->load(u)) < 0)
908 if (u->load_state == UNIT_STUB) {
913 if (u->load_state == UNIT_LOADED &&
914 u->default_dependencies)
915 if ((r = unit_add_default_dependencies(u)) < 0)
918 if (u->load_state == UNIT_LOADED) {
919 r = unit_add_mount_links(u);
924 if (u->on_failure_isolate &&
925 set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
927 log_error_unit(u->id,
928 "More than one OnFailure= dependencies specified for %s but OnFailureIsolate= enabled. Refusing.", u->id);
934 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
936 unit_add_to_dbus_queue(unit_follow_merge(u));
937 unit_add_to_gc_queue(u);
942 u->load_state = UNIT_ERROR;
944 unit_add_to_dbus_queue(u);
945 unit_add_to_gc_queue(u);
947 log_debug_unit(u->id, "Failed to load configuration for %s: %s",
948 u->id, strerror(-r));
953 bool unit_condition_test(Unit *u) {
956 dual_timestamp_get(&u->condition_timestamp);
957 u->condition_result = condition_test_list(u->conditions);
959 return u->condition_result;
962 _pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
963 const UnitStatusMessageFormats *format_table;
967 assert(t < _JOB_TYPE_MAX);
969 if (t != JOB_START && t != JOB_STOP)
972 format_table = &UNIT_VTABLE(u)->status_message_formats;
976 return format_table->starting_stopping[t == JOB_STOP];
979 _pure_ static const char *unit_get_status_message_format_try_harder(Unit *u, JobType t) {
984 assert(t < _JOB_TYPE_MAX);
986 format = unit_get_status_message_format(u, t);
990 /* Return generic strings */
992 return "Starting %s.";
993 else if (t == JOB_STOP)
994 return "Stopping %s.";
995 else if (t == JOB_RELOAD)
996 return "Reloading %s.";
1001 static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1006 /* We only print status messages for selected units on
1007 * selected operations. */
1009 format = unit_get_status_message_format(u, t);
1013 unit_status_printf(u, "", format);
1016 #pragma GCC diagnostic push
1017 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
1018 static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1025 if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1028 if (log_on_console())
1031 /* We log status messages for all units and all operations. */
1033 format = unit_get_status_message_format_try_harder(u, t);
1037 snprintf(buf, sizeof(buf), format, unit_description(u));
1040 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1041 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1042 SD_MESSAGE_UNIT_RELOADING;
1044 log_struct_unit(LOG_INFO,
1050 #pragma GCC diagnostic pop
1053 * -EBADR: This unit type does not support starting.
1054 * -EALREADY: Unit is already started.
1055 * -EAGAIN: An operation is already in progress. Retry later.
1056 * -ECANCELED: Too many requests for now.
1058 int unit_start(Unit *u) {
1059 UnitActiveState state;
1064 if (u->load_state != UNIT_LOADED)
1067 /* If this is already started, then this will succeed. Note
1068 * that this will even succeed if this unit is not startable
1069 * by the user. This is relied on to detect when we need to
1070 * wait for units and when waiting is finished. */
1071 state = unit_active_state(u);
1072 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1075 /* If the conditions failed, don't do anything at all. If we
1076 * already are activating this call might still be useful to
1077 * speed up activation in case there is some hold-off time,
1078 * but we don't want to recheck the condition in that case. */
1079 if (state != UNIT_ACTIVATING &&
1080 !unit_condition_test(u)) {
1081 log_debug_unit(u->id, "Starting of %s requested but condition failed. Ignoring.", u->id);
1085 /* Forward to the main object, if we aren't it. */
1086 if ((following = unit_following(u))) {
1087 log_debug_unit(u->id, "Redirecting start request from %s to %s.",
1088 u->id, following->id);
1089 return unit_start(following);
1092 unit_status_log_starting_stopping_reloading(u, JOB_START);
1093 unit_status_print_starting_stopping(u, JOB_START);
1095 /* If it is stopped, but we cannot start it, then fail */
1096 if (!UNIT_VTABLE(u)->start)
1099 /* We don't suppress calls to ->start() here when we are
1100 * already starting, to allow this request to be used as a
1101 * "hurry up" call, for example when the unit is in some "auto
1102 * restart" state where it waits for a holdoff timer to elapse
1103 * before it will start again. */
1105 unit_add_to_dbus_queue(u);
1107 return UNIT_VTABLE(u)->start(u);
1110 bool unit_can_start(Unit *u) {
1113 return !!UNIT_VTABLE(u)->start;
1116 bool unit_can_isolate(Unit *u) {
1119 return unit_can_start(u) &&
1124 * -EBADR: This unit type does not support stopping.
1125 * -EALREADY: Unit is already stopped.
1126 * -EAGAIN: An operation is already in progress. Retry later.
1128 int unit_stop(Unit *u) {
1129 UnitActiveState state;
1134 state = unit_active_state(u);
1135 if (UNIT_IS_INACTIVE_OR_FAILED(state))
1138 if ((following = unit_following(u))) {
1139 log_debug_unit(u->id, "Redirecting stop request from %s to %s.",
1140 u->id, following->id);
1141 return unit_stop(following);
1144 unit_status_log_starting_stopping_reloading(u, JOB_STOP);
1145 unit_status_print_starting_stopping(u, JOB_STOP);
1147 if (!UNIT_VTABLE(u)->stop)
1150 unit_add_to_dbus_queue(u);
1152 return UNIT_VTABLE(u)->stop(u);
1156 * -EBADR: This unit type does not support reloading.
1157 * -ENOEXEC: Unit is not started.
1158 * -EAGAIN: An operation is already in progress. Retry later.
1160 int unit_reload(Unit *u) {
1161 UnitActiveState state;
1166 if (u->load_state != UNIT_LOADED)
1169 if (!unit_can_reload(u))
1172 state = unit_active_state(u);
1173 if (state == UNIT_RELOADING)
1176 if (state != UNIT_ACTIVE)
1179 if ((following = unit_following(u))) {
1180 log_debug_unit(u->id, "Redirecting reload request from %s to %s.",
1181 u->id, following->id);
1182 return unit_reload(following);
1185 unit_status_log_starting_stopping_reloading(u, JOB_RELOAD);
1187 unit_add_to_dbus_queue(u);
1188 return UNIT_VTABLE(u)->reload(u);
1191 bool unit_can_reload(Unit *u) {
1194 if (!UNIT_VTABLE(u)->reload)
1197 if (!UNIT_VTABLE(u)->can_reload)
1200 return UNIT_VTABLE(u)->can_reload(u);
1203 static void unit_check_unneeded(Unit *u) {
1209 /* If this service shall be shut down when unneeded then do
1212 if (!u->stop_when_unneeded)
1215 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1218 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
1219 if (unit_active_or_pending(other))
1222 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
1223 if (unit_active_or_pending(other))
1226 SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
1227 if (unit_active_or_pending(other))
1230 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1231 if (unit_active_or_pending(other))
1234 log_info_unit(u->id, "Service %s is not needed anymore. Stopping.", u->id);
1236 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1237 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1240 static void retroactively_start_dependencies(Unit *u) {
1245 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1247 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1248 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1249 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1250 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1252 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1253 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1254 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1255 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1257 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1258 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1259 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1260 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1262 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1263 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1264 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1265 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1267 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
1268 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1269 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1271 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
1272 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1273 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1276 static void retroactively_stop_dependencies(Unit *u) {
1281 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1283 /* Pull down units which are bound to us recursively if enabled */
1284 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1285 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1286 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1289 static void check_unneeded_dependencies(Unit *u) {
1294 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1296 /* Garbage collect services that might not be needed anymore, if enabled */
1297 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1298 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1299 unit_check_unneeded(other);
1300 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1301 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1302 unit_check_unneeded(other);
1303 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1304 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1305 unit_check_unneeded(other);
1306 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1307 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1308 unit_check_unneeded(other);
1309 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1310 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1311 unit_check_unneeded(other);
1312 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1313 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1314 unit_check_unneeded(other);
1317 void unit_start_on_failure(Unit *u) {
1323 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
1326 log_info_unit(u->id, "Triggering OnFailure= dependencies of %s.", u->id);
1328 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
1331 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_isolate ? JOB_ISOLATE : JOB_REPLACE, true, NULL, NULL);
1333 log_error_unit(u->id, "Failed to enqueue OnFailure= job: %s", strerror(-r));
1337 void unit_trigger_notify(Unit *u) {
1343 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1344 if (UNIT_VTABLE(other)->trigger_notify)
1345 UNIT_VTABLE(other)->trigger_notify(other, u);
1348 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
1353 assert(os < _UNIT_ACTIVE_STATE_MAX);
1354 assert(ns < _UNIT_ACTIVE_STATE_MAX);
1356 /* Note that this is called for all low-level state changes,
1357 * even if they might map to the same high-level
1358 * UnitActiveState! That means that ns == os is OK an expected
1359 * behavior here. For example: if a mount point is remounted
1360 * this function will be called too! */
1364 if (m->n_reloading <= 0) {
1367 dual_timestamp_get(&ts);
1369 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
1370 u->inactive_exit_timestamp = ts;
1371 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
1372 u->inactive_enter_timestamp = ts;
1374 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
1375 u->active_enter_timestamp = ts;
1376 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
1377 u->active_exit_timestamp = ts;
1380 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1381 cgroup_bonding_trim_list(u->cgroup_bondings, true);
1383 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1384 ExecContext *ec = unit_get_exec_context(u);
1385 if (ec && exec_context_may_touch_console(ec)) {
1386 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1396 if (u->job->state == JOB_WAITING)
1398 /* So we reached a different state for this
1399 * job. Let's see if we can run it now if it
1400 * failed previously due to EAGAIN. */
1401 job_add_to_run_queue(u->job);
1403 /* Let's check whether this state change constitutes a
1404 * finished job, or maybe contradicts a running job and
1405 * hence needs to invalidate jobs. */
1407 switch (u->job->type) {
1410 case JOB_VERIFY_ACTIVE:
1412 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1413 job_finish_and_invalidate(u->job, JOB_DONE, true);
1414 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1417 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1418 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1424 case JOB_RELOAD_OR_START:
1426 if (u->job->state == JOB_RUNNING) {
1427 if (ns == UNIT_ACTIVE)
1428 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
1429 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1432 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1433 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1441 case JOB_TRY_RESTART:
1443 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1444 job_finish_and_invalidate(u->job, JOB_DONE, true);
1445 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1447 job_finish_and_invalidate(u->job, JOB_FAILED, true);
1453 assert_not_reached("Job type unknown");
1459 if (m->n_reloading <= 0) {
1461 /* If this state change happened without being
1462 * requested by a job, then let's retroactively start
1463 * or stop dependencies. We skip that step when
1464 * deserializing, since we don't want to create any
1465 * additional jobs just because something is already
1469 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1470 retroactively_start_dependencies(u);
1471 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1472 retroactively_stop_dependencies(u);
1475 /* stop unneeded units regardless if going down was expected or not */
1476 if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1477 check_unneeded_dependencies(u);
1479 if (ns != os && ns == UNIT_FAILED) {
1480 log_notice_unit(u->id,
1481 "Unit %s entered failed state.", u->id);
1482 unit_start_on_failure(u);
1486 /* Some names are special */
1487 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1489 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1490 /* The bus just might have become available,
1491 * hence try to connect to it, if we aren't
1495 if (u->type == UNIT_SERVICE &&
1496 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1497 m->n_reloading <= 0) {
1498 /* Write audit record if we have just finished starting up */
1499 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
1503 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1504 manager_send_unit_plymouth(m, u);
1508 /* We don't care about D-Bus here, since we'll get an
1509 * asynchronous notification for it anyway. */
1511 if (u->type == UNIT_SERVICE &&
1512 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1513 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1514 m->n_reloading <= 0) {
1516 /* Hmm, if there was no start record written
1517 * write it now, so that we always have a nice
1520 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1522 if (ns == UNIT_INACTIVE)
1523 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
1525 /* Write audit record if we have just finished shutting down */
1526 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1528 u->in_audit = false;
1532 manager_recheck_journal(m);
1533 unit_trigger_notify(u);
1535 /* Maybe we finished startup and are now ready for being
1536 * stopped because unneeded? */
1537 if (u->manager->n_reloading <= 0)
1538 unit_check_unneeded(u);
1540 unit_add_to_dbus_queue(u);
1541 unit_add_to_gc_queue(u);
1544 int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) {
1545 struct epoll_event ev = {
1553 assert(w->type == WATCH_INVALID || (w->type == WATCH_FD && w->fd == fd && w->data.unit == u));
1555 if (epoll_ctl(u->manager->epoll_fd,
1556 w->type == WATCH_INVALID ? EPOLL_CTL_ADD : EPOLL_CTL_MOD,
1568 void unit_unwatch_fd(Unit *u, Watch *w) {
1572 if (w->type == WATCH_INVALID)
1575 assert(w->type == WATCH_FD);
1576 assert(w->data.unit == u);
1577 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1580 w->type = WATCH_INVALID;
1581 w->data.unit = NULL;
1584 int unit_watch_pid(Unit *u, pid_t pid) {
1588 /* Watch a specific PID. We only support one unit watching
1589 * each PID for now. */
1591 return hashmap_put(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1594 void unit_unwatch_pid(Unit *u, pid_t pid) {
1598 hashmap_remove_value(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1601 int unit_watch_timer(Unit *u, clockid_t clock_id, bool relative, usec_t usec, Watch *w) {
1602 struct itimerspec its = {};
1608 assert(w->type == WATCH_INVALID || (w->type == WATCH_UNIT_TIMER && w->data.unit == u));
1610 /* This will try to reuse the old timer if there is one */
1612 if (w->type == WATCH_UNIT_TIMER) {
1613 assert(w->data.unit == u);
1618 } else if (w->type == WATCH_INVALID) {
1621 fd = timerfd_create(clock_id, TFD_NONBLOCK|TFD_CLOEXEC);
1625 assert_not_reached("Invalid watch type");
1628 /* Set absolute time in the past, but not 0, since we
1629 * don't want to disarm the timer */
1630 its.it_value.tv_sec = 0;
1631 its.it_value.tv_nsec = 1;
1633 flags = TFD_TIMER_ABSTIME;
1635 timespec_store(&its.it_value, usec);
1636 flags = relative ? 0 : TFD_TIMER_ABSTIME;
1639 /* This will also flush the elapse counter */
1640 if (timerfd_settime(fd, flags, &its, NULL) < 0)
1643 if (w->type == WATCH_INVALID) {
1644 struct epoll_event ev = {
1649 if (epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
1653 w->type = WATCH_UNIT_TIMER;
1661 close_nointr_nofail(fd);
1666 void unit_unwatch_timer(Unit *u, Watch *w) {
1670 if (w->type == WATCH_INVALID)
1673 assert(w->type == WATCH_UNIT_TIMER);
1674 assert(w->data.unit == u);
1677 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1678 close_nointr_nofail(w->fd);
1681 w->type = WATCH_INVALID;
1682 w->data.unit = NULL;
1685 bool unit_job_is_applicable(Unit *u, JobType j) {
1687 assert(j >= 0 && j < _JOB_TYPE_MAX);
1691 case JOB_VERIFY_ACTIVE:
1698 case JOB_TRY_RESTART:
1699 return unit_can_start(u);
1702 return unit_can_reload(u);
1704 case JOB_RELOAD_OR_START:
1705 return unit_can_reload(u) && unit_can_start(u);
1708 assert_not_reached("Invalid job type");
1712 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1714 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1715 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1716 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1717 [UNIT_WANTS] = UNIT_WANTED_BY,
1718 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1719 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1720 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
1721 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
1722 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1723 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1724 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1725 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
1726 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
1727 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
1728 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
1729 [UNIT_BEFORE] = UNIT_AFTER,
1730 [UNIT_AFTER] = UNIT_BEFORE,
1731 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
1732 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1733 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
1734 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
1735 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
1736 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
1737 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
1739 int r, q = 0, v = 0, w = 0;
1742 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1745 u = unit_follow_merge(u);
1746 other = unit_follow_merge(other);
1748 /* We won't allow dependencies on ourselves. We will not
1749 * consider them an error however. */
1753 if ((r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func)) < 0)
1756 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1757 if ((r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func)) < 0)
1761 if ((r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func)) < 0 ||
1762 (r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func)) < 0)
1765 if ((q = set_put(u->dependencies[d], other)) < 0)
1768 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1769 if ((v = set_put(other->dependencies[inverse_table[d]], u)) < 0) {
1774 if (add_reference) {
1775 if ((w = set_put(u->dependencies[UNIT_REFERENCES], other)) < 0) {
1780 if ((r = set_put(other->dependencies[UNIT_REFERENCED_BY], u)) < 0)
1784 unit_add_to_dbus_queue(u);
1789 set_remove(u->dependencies[d], other);
1792 set_remove(other->dependencies[inverse_table[d]], u);
1795 set_remove(u->dependencies[UNIT_REFERENCES], other);
1800 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
1805 if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
1808 if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
1814 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
1818 assert(name || path);
1822 name = path_get_file_name(path);
1824 if (!unit_name_is_template(name)) {
1830 s = unit_name_replace_instance(name, u->instance);
1832 _cleanup_free_ char *i = NULL;
1834 i = unit_name_to_prefix(u->id);
1838 s = unit_name_replace_instance(name, i);
1848 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1851 _cleanup_free_ char *s = NULL;
1854 assert(name || path);
1856 name = resolve_template(u, name, path, &s);
1860 r = manager_load_unit(u->manager, name, path, NULL, &other);
1864 return unit_add_dependency(u, d, other, add_reference);
1867 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1873 assert(name || path);
1875 if (!(name = resolve_template(u, name, path, &s)))
1878 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1881 r = unit_add_two_dependencies(u, d, e, other, add_reference);
1888 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1894 assert(name || path);
1896 if (!(name = resolve_template(u, name, path, &s)))
1899 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1902 r = unit_add_dependency(other, d, u, add_reference);
1909 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1915 assert(name || path);
1917 if (!(name = resolve_template(u, name, path, &s)))
1920 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1923 if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
1931 int set_unit_path(const char *p) {
1932 _cleanup_free_ char *c = NULL;
1934 /* This is mostly for debug purposes */
1935 c = path_make_absolute_cwd(p);
1936 if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0)
1942 char *unit_dbus_path(Unit *u) {
1948 return unit_dbus_path_from_name(u->id);
1951 static int unit_add_cgroup(Unit *u, CGroupBonding *b) {
1959 if (!b->controller) {
1960 b->controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
1967 /* Ensure this hasn't been added yet */
1970 if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) {
1973 l = hashmap_get(u->manager->cgroup_bondings, b->path);
1974 LIST_PREPEND(CGroupBonding, by_path, l, b);
1976 r = hashmap_replace(u->manager->cgroup_bondings, b->path, l);
1978 LIST_REMOVE(CGroupBonding, by_path, l, b);
1983 LIST_PREPEND(CGroupBonding, by_unit, u->cgroup_bondings, b);
1989 char *unit_default_cgroup_path(Unit *u) {
1990 _cleanup_free_ char *escaped_instance = NULL, *slice = NULL;
1995 if (UNIT_DEREF(u->slice)) {
1996 r = cg_slice_to_path(UNIT_DEREF(u->slice)->id, &slice);
2001 escaped_instance = cg_escape(u->id);
2002 if (!escaped_instance)
2006 _cleanup_free_ char *t = NULL, *escaped_template = NULL;
2008 t = unit_name_template(u->id);
2012 escaped_template = cg_escape(t);
2013 if (!escaped_template)
2016 return strjoin(u->manager->cgroup_hierarchy, "/",
2017 slice ? slice : "", slice ? "/" : "",
2018 escaped_template, "/", escaped_instance, NULL);
2020 return strjoin(u->manager->cgroup_hierarchy, "/",
2021 slice ? slice : "", slice ? "/" : "",
2022 escaped_instance, NULL);
2025 int unit_add_cgroup_from_text(Unit *u, const char *name, bool overwrite, CGroupBonding **ret) {
2026 char *controller = NULL, *path = NULL;
2027 CGroupBonding *b = NULL;
2034 r = cg_split_spec(name, &controller, &path);
2039 path = unit_default_cgroup_path(u);
2044 controller = strdup("systemd");
2048 if (!path || !controller) {
2054 if (streq(controller, "systemd")) {
2055 /* Within the systemd unit hierarchy we do not allow changes. */
2056 if (path_startswith(path, "/system")) {
2057 log_warning_unit(u->id, "Manipulating the systemd:/system cgroup hierarchy is not permitted.");
2064 b = cgroup_bonding_find_list(u->cgroup_bondings, controller);
2066 if (streq(path, b->path)) {
2075 if (overwrite && !b->essential) {
2082 b->realized = false;
2095 b = new0(CGroupBonding, 1);
2101 b->controller = controller;
2104 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2106 r = unit_add_cgroup(u, b);
2123 static int unit_add_one_default_cgroup(Unit *u, const char *controller) {
2124 CGroupBonding *b = NULL;
2129 if (controller && !cg_controller_is_valid(controller, true))
2133 controller = SYSTEMD_CGROUP_CONTROLLER;
2135 if (cgroup_bonding_find_list(u->cgroup_bondings, controller))
2138 b = new0(CGroupBonding, 1);
2142 b->controller = strdup(controller);
2146 b->path = unit_default_cgroup_path(u);
2151 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2153 r = unit_add_cgroup(u, b);
2161 free(b->controller);
2167 int unit_add_default_slice(Unit *u) {
2173 if (UNIT_DEREF(u->slice))
2176 if (u->manager->running_as != SYSTEMD_SYSTEM)
2179 r = manager_load_unit(u->manager, SPECIAL_SYSTEM_SLICE, NULL, NULL, &slice);
2183 unit_ref_set(&u->slice, slice);
2187 int unit_add_default_cgroups(Unit *u) {
2194 /* Adds in the default cgroups, if they weren't specified
2197 if (!u->manager->cgroup_hierarchy)
2200 r = unit_add_one_default_cgroup(u, NULL);
2204 STRV_FOREACH(c, u->manager->default_controllers)
2205 unit_add_one_default_cgroup(u, *c);
2207 LIST_FOREACH(by_unit, a, u->cgroup_attributes)
2208 unit_add_one_default_cgroup(u, a->controller);
2213 CGroupBonding* unit_get_default_cgroup(Unit *u) {
2216 return cgroup_bonding_find_list(u->cgroup_bondings, NULL);
2219 int unit_add_cgroup_attribute(
2221 const CGroupSemantics *semantics,
2222 const char *controller,
2225 CGroupAttribute **ret) {
2227 _cleanup_free_ char *c = NULL;
2235 /* Semantics always take precedence */
2236 if (semantics->name)
2237 name = semantics->name;
2239 if (semantics->controller)
2240 controller = semantics->controller;
2247 r = cg_controller_from_attr(name, &c);
2255 streq(controller, SYSTEMD_CGROUP_CONTROLLER) ||
2256 streq(controller, "systemd"))
2259 if (!filename_is_safe(name))
2262 if (!cg_controller_is_valid(controller, false))
2265 /* Check if this attribute already exists. Note that we will
2266 * explicitly check for the value here too, as there are
2267 * attributes which accept multiple values. */
2268 a = cgroup_attribute_find_list(u->cgroup_attributes, controller, name);
2270 if (streq(value, a->value)) {
2271 /* Exactly the same value is always OK, let's ignore this */
2278 if (semantics && !semantics->multiple) {
2281 /* If this is a single-item entry, we can
2282 * simply patch the existing attribute */
2297 a = new0(CGroupAttribute, 1);
2305 a->controller = strdup(controller);
2307 a->name = strdup(name);
2308 a->value = strdup(value);
2310 if (!a->controller || !a->name || !a->value) {
2311 free(a->controller);
2318 a->semantics = semantics;
2321 LIST_PREPEND(CGroupAttribute, by_unit, u->cgroup_attributes, a);
2329 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2330 _cleanup_free_ char *t = NULL;
2337 t = unit_name_change_suffix(u->id, type);
2341 assert(!unit_has_name(u, t));
2343 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2344 assert(r < 0 || *_found != u);
2348 int unit_get_related_unit(Unit *u, const char *type, Unit **_found) {
2349 _cleanup_free_ char *t = NULL;
2356 t = unit_name_change_suffix(u->id, type);
2360 assert(!unit_has_name(u, t));
2362 found = manager_get_unit(u->manager, t);
2370 int unit_watch_bus_name(Unit *u, const char *name) {
2374 /* Watch a specific name on the bus. We only support one unit
2375 * watching each name for now. */
2377 return hashmap_put(u->manager->watch_bus, name, u);
2380 void unit_unwatch_bus_name(Unit *u, const char *name) {
2384 hashmap_remove_value(u->manager->watch_bus, name, u);
2387 bool unit_can_serialize(Unit *u) {
2390 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2393 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2400 if (!unit_can_serialize(u))
2403 if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0)
2407 if (serialize_jobs) {
2409 fprintf(f, "job\n");
2410 job_serialize(u->job, f, fds);
2414 fprintf(f, "job\n");
2415 job_serialize(u->nop_job, f, fds);
2419 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2420 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2421 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2422 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2423 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2425 if (dual_timestamp_is_set(&u->condition_timestamp))
2426 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2433 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2444 va_start(ap, format);
2445 vfprintf(f, format, ap);
2451 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2457 fprintf(f, "%s=%s\n", key, value);
2460 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2467 if (!unit_can_serialize(u))
2471 char line[LINE_MAX], *l, *v;
2474 if (!fgets(line, sizeof(line), f)) {
2487 k = strcspn(l, "=");
2495 if (streq(l, "job")) {
2497 /* new-style serialized job */
2498 Job *j = job_new_raw(u);
2502 r = job_deserialize(j, f, fds);
2508 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2514 r = job_install_deserialized(j);
2516 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2521 if (j->state == JOB_RUNNING)
2522 u->manager->n_running_jobs++;
2525 JobType type = job_type_from_string(v);
2527 log_debug("Failed to parse job type value %s", v);
2529 u->deserialized_job = type;
2532 } else if (streq(l, "inactive-exit-timestamp")) {
2533 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2535 } else if (streq(l, "active-enter-timestamp")) {
2536 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2538 } else if (streq(l, "active-exit-timestamp")) {
2539 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2541 } else if (streq(l, "inactive-enter-timestamp")) {
2542 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2544 } else if (streq(l, "condition-timestamp")) {
2545 dual_timestamp_deserialize(v, &u->condition_timestamp);
2547 } else if (streq(l, "condition-result")) {
2550 if ((b = parse_boolean(v)) < 0)
2551 log_debug("Failed to parse condition result value %s", v);
2553 u->condition_result = b;
2558 if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0)
2563 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2573 /* Adds in links to the device node that this unit is based on */
2575 if (!is_device_path(what))
2578 e = unit_name_from_path(what, ".device");
2582 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2587 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2592 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2600 int unit_coldplug(Unit *u) {
2605 if (UNIT_VTABLE(u)->coldplug)
2606 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2610 r = job_coldplug(u->job);
2613 } else if (u->deserialized_job >= 0) {
2615 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2619 u->deserialized_job = _JOB_TYPE_INVALID;
2625 #pragma GCC diagnostic push
2626 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
2627 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
2628 manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
2630 #pragma GCC diagnostic pop
2632 bool unit_need_daemon_reload(Unit *u) {
2633 _cleanup_strv_free_ char **t = NULL;
2636 unsigned loaded_cnt, current_cnt;
2640 if (u->fragment_path) {
2642 if (stat(u->fragment_path, &st) < 0)
2643 /* What, cannot access this anymore? */
2646 if (u->fragment_mtime > 0 &&
2647 timespec_load(&st.st_mtim) != u->fragment_mtime)
2651 if (u->source_path) {
2653 if (stat(u->source_path, &st) < 0)
2656 if (u->source_mtime > 0 &&
2657 timespec_load(&st.st_mtim) != u->source_mtime)
2661 t = unit_find_dropin_paths(u);
2662 loaded_cnt = strv_length(t);
2663 current_cnt = strv_length(u->dropin_paths);
2665 if (loaded_cnt == current_cnt) {
2666 if (loaded_cnt == 0)
2669 if (strv_overlap(u->dropin_paths, t)) {
2670 STRV_FOREACH(path, u->dropin_paths) {
2672 if (stat(*path, &st) < 0)
2675 if (u->dropin_mtime > 0 &&
2676 timespec_load(&st.st_mtim) > u->dropin_mtime)
2687 void unit_reset_failed(Unit *u) {
2690 if (UNIT_VTABLE(u)->reset_failed)
2691 UNIT_VTABLE(u)->reset_failed(u);
2694 Unit *unit_following(Unit *u) {
2697 if (UNIT_VTABLE(u)->following)
2698 return UNIT_VTABLE(u)->following(u);
2703 bool unit_stop_pending(Unit *u) {
2706 /* This call does check the current state of the unit. It's
2707 * hence useful to be called from state change calls of the
2708 * unit itself, where the state isn't updated yet. This is
2709 * different from unit_inactive_or_pending() which checks both
2710 * the current state and for a queued job. */
2712 return u->job && u->job->type == JOB_STOP;
2715 bool unit_inactive_or_pending(Unit *u) {
2718 /* Returns true if the unit is inactive or going down */
2720 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2723 if (unit_stop_pending(u))
2729 bool unit_active_or_pending(Unit *u) {
2732 /* Returns true if the unit is active or going up */
2734 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2738 (u->job->type == JOB_START ||
2739 u->job->type == JOB_RELOAD_OR_START ||
2740 u->job->type == JOB_RESTART))
2746 int unit_kill(Unit *u, KillWho w, int signo, DBusError *error) {
2748 assert(w >= 0 && w < _KILL_WHO_MAX);
2750 assert(signo < _NSIG);
2752 if (!UNIT_VTABLE(u)->kill)
2755 return UNIT_VTABLE(u)->kill(u, w, signo, error);
2758 int unit_kill_common(
2768 if (who == KILL_MAIN && main_pid <= 0) {
2770 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
2772 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
2776 if (who == KILL_CONTROL && control_pid <= 0) {
2777 if (control_pid < 0)
2778 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
2780 dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
2784 if (who == KILL_CONTROL || who == KILL_ALL)
2785 if (control_pid > 0)
2786 if (kill(control_pid, signo) < 0)
2789 if (who == KILL_MAIN || who == KILL_ALL)
2791 if (kill(main_pid, signo) < 0)
2794 if (who == KILL_ALL) {
2795 _cleanup_set_free_ Set *pid_set = NULL;
2798 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2802 /* Exclude the control/main pid from being killed via the cgroup */
2803 if (control_pid > 0) {
2804 q = set_put(pid_set, LONG_TO_PTR(control_pid));
2810 q = set_put(pid_set, LONG_TO_PTR(main_pid));
2815 q = cgroup_bonding_kill_list(u->cgroup_bondings, signo, false, false, pid_set, NULL);
2816 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2823 int unit_following_set(Unit *u, Set **s) {
2827 if (UNIT_VTABLE(u)->following_set)
2828 return UNIT_VTABLE(u)->following_set(u, s);
2834 UnitFileState unit_get_unit_file_state(Unit *u) {
2837 if (u->unit_file_state < 0 && u->fragment_path)
2838 u->unit_file_state = unit_file_get_state(
2839 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2840 NULL, path_get_file_name(u->fragment_path));
2842 return u->unit_file_state;
2845 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2850 unit_ref_unset(ref);
2853 LIST_PREPEND(UnitRef, refs, u->refs, ref);
2857 void unit_ref_unset(UnitRef *ref) {
2863 LIST_REMOVE(UnitRef, refs, ref->unit->refs, ref);
2867 int unit_add_one_mount_link(Unit *u, Mount *m) {
2873 if (u->load_state != UNIT_LOADED ||
2874 UNIT(m)->load_state != UNIT_LOADED)
2877 STRV_FOREACH(i, u->requires_mounts_for) {
2882 if (!path_startswith(*i, m->where))
2885 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
2891 int unit_add_mount_links(Unit *u) {
2897 LIST_FOREACH(units_by_type, other, u->manager->units_by_type[UNIT_MOUNT]) {
2898 r = unit_add_one_mount_link(u, MOUNT(other));
2906 int unit_exec_context_defaults(Unit *u, ExecContext *c) {
2913 /* This only copies in the ones that need memory */
2915 for (i = 0; i < RLIMIT_NLIMITS; i++)
2916 if (u->manager->rlimit[i] && !c->rlimit[i]) {
2917 c->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2922 if (u->manager->running_as == SYSTEMD_USER &&
2923 !c->working_directory) {
2925 r = get_home_dir(&c->working_directory);
2933 ExecContext *unit_get_exec_context(Unit *u) {
2937 offset = UNIT_VTABLE(u)->exec_context_offset;
2941 return (ExecContext*) ((uint8_t*) u + offset);
2944 static int drop_in_file(Unit *u, bool runtime, const char *name, char **_p, char **_q) {
2953 if (u->manager->running_as == SYSTEMD_USER && runtime)
2956 if (!filename_is_safe(name))
2959 if (u->manager->running_as == SYSTEMD_USER) {
2960 _cleanup_free_ char *c = NULL;
2962 r = user_config_home(&c);
2968 p = strjoin(c, "/", u->id, ".d", NULL);
2970 p = strjoin("/run/systemd/system/", u->id, ".d", NULL);
2972 p = strjoin("/etc/systemd/system/", u->id, ".d", NULL);
2976 q = strjoin(p, "/50-", name, ".conf", NULL);
2987 int unit_write_drop_in(Unit *u, bool runtime, const char *name, const char *data) {
2988 _cleanup_free_ char *p = NULL, *q = NULL;
2993 r = drop_in_file(u, runtime, name, &p, &q);
2998 return write_string_file_atomic_label(q, data);
3001 int unit_remove_drop_in(Unit *u, bool runtime, const char *name) {
3002 _cleanup_free_ char *p = NULL, *q = NULL;
3007 r = drop_in_file(u, runtime, name, &p, &q);
3017 int unit_kill_context(
3023 bool main_pid_alien) {
3025 int sig, wait_for_exit = 0, r;
3030 if (c->kill_mode == KILL_NONE)
3033 sig = sigkill ? SIGKILL : c->kill_signal;
3036 r = kill_and_sigcont(main_pid, sig);
3038 if (r < 0 && r != -ESRCH) {
3039 _cleanup_free_ char *comm = NULL;
3040 get_process_comm(main_pid, &comm);
3042 log_warning_unit(u->id, "Failed to kill main process %li (%s): %s",
3043 (long) main_pid, strna(comm), strerror(-r));
3045 wait_for_exit = !main_pid_alien;
3048 if (control_pid > 0) {
3049 r = kill_and_sigcont(control_pid, sig);
3051 if (r < 0 && r != -ESRCH) {
3052 _cleanup_free_ char *comm = NULL;
3053 get_process_comm(control_pid, &comm);
3055 log_warning_unit(u->id,
3056 "Failed to kill control process %li (%s): %s",
3057 (long) control_pid, strna(comm), strerror(-r));
3059 wait_for_exit = true;
3062 if (c->kill_mode == KILL_CONTROL_GROUP) {
3063 _cleanup_set_free_ Set *pid_set = NULL;
3065 pid_set = set_new(trivial_hash_func, trivial_compare_func);
3069 /* Exclude the main/control pids from being killed via the cgroup */
3071 r = set_put(pid_set, LONG_TO_PTR(main_pid));
3076 if (control_pid > 0) {
3077 r = set_put(pid_set, LONG_TO_PTR(control_pid));
3082 r = cgroup_bonding_kill_list(u->cgroup_bondings, sig, true, false, pid_set, NULL);
3084 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
3085 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
3087 wait_for_exit = true;
3090 return wait_for_exit;
3093 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3094 [UNIT_ACTIVE] = "active",
3095 [UNIT_RELOADING] = "reloading",
3096 [UNIT_INACTIVE] = "inactive",
3097 [UNIT_FAILED] = "failed",
3098 [UNIT_ACTIVATING] = "activating",
3099 [UNIT_DEACTIVATING] = "deactivating"
3102 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
3104 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
3105 [UNIT_REQUIRES] = "Requires",
3106 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
3107 [UNIT_REQUISITE] = "Requisite",
3108 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
3109 [UNIT_WANTS] = "Wants",
3110 [UNIT_BINDS_TO] = "BindsTo",
3111 [UNIT_PART_OF] = "PartOf",
3112 [UNIT_REQUIRED_BY] = "RequiredBy",
3113 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
3114 [UNIT_WANTED_BY] = "WantedBy",
3115 [UNIT_BOUND_BY] = "BoundBy",
3116 [UNIT_CONSISTS_OF] = "ConsistsOf",
3117 [UNIT_CONFLICTS] = "Conflicts",
3118 [UNIT_CONFLICTED_BY] = "ConflictedBy",
3119 [UNIT_BEFORE] = "Before",
3120 [UNIT_AFTER] = "After",
3121 [UNIT_ON_FAILURE] = "OnFailure",
3122 [UNIT_TRIGGERS] = "Triggers",
3123 [UNIT_TRIGGERED_BY] = "TriggeredBy",
3124 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
3125 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
3126 [UNIT_REFERENCES] = "References",
3127 [UNIT_REFERENCED_BY] = "ReferencedBy",
3130 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);