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>
33 #include "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"
49 #include "fileio-label.h"
50 #include "bus-errors.h"
55 const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
56 [UNIT_SERVICE] = &service_vtable,
57 [UNIT_SOCKET] = &socket_vtable,
58 [UNIT_BUSNAME] = &busname_vtable,
59 [UNIT_TARGET] = &target_vtable,
60 [UNIT_SNAPSHOT] = &snapshot_vtable,
61 [UNIT_DEVICE] = &device_vtable,
62 [UNIT_MOUNT] = &mount_vtable,
63 [UNIT_AUTOMOUNT] = &automount_vtable,
64 [UNIT_SWAP] = &swap_vtable,
65 [UNIT_TIMER] = &timer_vtable,
66 [UNIT_PATH] = &path_vtable,
67 [UNIT_SLICE] = &slice_vtable,
68 [UNIT_SCOPE] = &scope_vtable
71 Unit *unit_new(Manager *m, size_t size) {
75 assert(size >= sizeof(Unit));
81 u->names = set_new(string_hash_func, string_compare_func);
88 u->type = _UNIT_TYPE_INVALID;
89 u->deserialized_job = _JOB_TYPE_INVALID;
90 u->default_dependencies = true;
91 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
92 u->on_failure_job_mode = JOB_REPLACE;
97 bool unit_has_name(Unit *u, const char *name) {
101 return !!set_get(u->names, (char*) name);
104 static void unit_init(Unit *u) {
111 assert(u->type >= 0);
113 cc = unit_get_cgroup_context(u);
115 cgroup_context_init(cc);
117 /* Copy in the manager defaults into the cgroup
118 * context, _before_ the rest of the settings have
119 * been initialized */
121 cc->cpu_accounting = u->manager->default_cpu_accounting;
122 cc->blockio_accounting = u->manager->default_blockio_accounting;
123 cc->memory_accounting = u->manager->default_memory_accounting;
124 cc->cpu_quota_period_usec = u->manager->default_cpu_quota_period_usec;
127 ec = unit_get_exec_context(u);
129 exec_context_init(ec);
131 kc = unit_get_kill_context(u);
133 kill_context_init(kc);
135 if (UNIT_VTABLE(u)->init)
136 UNIT_VTABLE(u)->init(u);
139 int unit_add_name(Unit *u, const char *text) {
140 _cleanup_free_ char *s = NULL, *i = NULL;
147 if (unit_name_is_template(text)) {
152 s = unit_name_replace_instance(text, u->instance);
158 if (!unit_name_is_valid(s, TEMPLATE_INVALID))
161 assert_se((t = unit_name_to_type(s)) >= 0);
163 if (u->type != _UNIT_TYPE_INVALID && t != u->type)
166 r = unit_name_to_instance(s, &i);
170 if (i && unit_vtable[t]->no_instances)
173 /* Ensure that this unit is either instanced or not instanced,
175 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i)
178 if (unit_vtable[t]->no_alias &&
179 !set_isempty(u->names) &&
180 !set_get(u->names, s))
183 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES)
186 r = set_put(u->names, s);
194 r = hashmap_put(u->manager->units, s, u);
196 set_remove(u->names, s);
200 if (u->type == _UNIT_TYPE_INVALID) {
205 LIST_PREPEND(units_by_type, u->manager->units_by_type[t], u);
214 unit_add_to_dbus_queue(u);
218 int unit_choose_id(Unit *u, const char *name) {
219 _cleanup_free_ char *t = NULL;
226 if (unit_name_is_template(name)) {
231 t = unit_name_replace_instance(name, u->instance);
238 /* Selects one of the names of this unit as the id */
239 s = set_get(u->names, (char*) name);
243 r = unit_name_to_instance(s, &i);
252 unit_add_to_dbus_queue(u);
257 int unit_set_description(Unit *u, const char *description) {
262 if (isempty(description))
265 s = strdup(description);
270 free(u->description);
273 unit_add_to_dbus_queue(u);
277 bool unit_check_gc(Unit *u) {
280 if (UNIT_VTABLE(u)->no_gc)
292 if (unit_active_state(u) != UNIT_INACTIVE)
298 if (UNIT_VTABLE(u)->check_gc)
299 if (UNIT_VTABLE(u)->check_gc(u))
305 void unit_add_to_load_queue(Unit *u) {
307 assert(u->type != _UNIT_TYPE_INVALID);
309 if (u->load_state != UNIT_STUB || u->in_load_queue)
312 LIST_PREPEND(load_queue, u->manager->load_queue, u);
313 u->in_load_queue = true;
316 void unit_add_to_cleanup_queue(Unit *u) {
319 if (u->in_cleanup_queue)
322 LIST_PREPEND(cleanup_queue, u->manager->cleanup_queue, u);
323 u->in_cleanup_queue = true;
326 void unit_add_to_gc_queue(Unit *u) {
329 if (u->in_gc_queue || u->in_cleanup_queue)
332 if (unit_check_gc(u))
335 LIST_PREPEND(gc_queue, u->manager->gc_queue, u);
336 u->in_gc_queue = true;
338 u->manager->n_in_gc_queue ++;
341 void unit_add_to_dbus_queue(Unit *u) {
343 assert(u->type != _UNIT_TYPE_INVALID);
345 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
348 /* Shortcut things if nobody cares */
349 if (sd_bus_track_count(u->manager->subscribed) <= 0 &&
350 set_isempty(u->manager->private_buses)) {
351 u->sent_dbus_new_signal = true;
355 LIST_PREPEND(dbus_queue, u->manager->dbus_unit_queue, u);
356 u->in_dbus_queue = true;
359 static void bidi_set_free(Unit *u, Set *s) {
365 /* Frees the set and makes sure we are dropped from the
366 * inverse pointers */
368 SET_FOREACH(other, s, i) {
371 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
372 set_remove(other->dependencies[d], u);
374 unit_add_to_gc_queue(other);
380 static void unit_remove_transient(Unit *u) {
388 if (u->fragment_path)
389 unlink(u->fragment_path);
391 STRV_FOREACH(i, u->dropin_paths) {
392 _cleanup_free_ char *p = NULL;
397 r = path_get_parent(*i, &p);
403 static void unit_free_requires_mounts_for(Unit *u) {
406 STRV_FOREACH(j, u->requires_mounts_for) {
407 char s[strlen(*j) + 1];
409 PATH_FOREACH_PREFIX_MORE(s, *j) {
413 x = hashmap_get2(u->manager->units_requiring_mounts_for, s, (void**) &y);
419 if (set_isempty(x)) {
420 hashmap_remove(u->manager->units_requiring_mounts_for, y);
427 strv_free(u->requires_mounts_for);
428 u->requires_mounts_for = NULL;
431 static void unit_done(Unit *u) {
440 if (UNIT_VTABLE(u)->done)
441 UNIT_VTABLE(u)->done(u);
443 ec = unit_get_exec_context(u);
445 exec_context_done(ec);
447 cc = unit_get_cgroup_context(u);
449 cgroup_context_done(cc);
452 void unit_free(Unit *u) {
459 if (u->manager->n_reloading <= 0)
460 unit_remove_transient(u);
462 bus_unit_send_removed_signal(u);
466 unit_free_requires_mounts_for(u);
468 SET_FOREACH(t, u->names, i)
469 hashmap_remove_value(u->manager->units, t, u);
483 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
484 bidi_set_free(u, u->dependencies[d]);
486 if (u->type != _UNIT_TYPE_INVALID)
487 LIST_REMOVE(units_by_type, u->manager->units_by_type[u->type], u);
489 if (u->in_load_queue)
490 LIST_REMOVE(load_queue, u->manager->load_queue, u);
492 if (u->in_dbus_queue)
493 LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u);
495 if (u->in_cleanup_queue)
496 LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
498 if (u->in_gc_queue) {
499 LIST_REMOVE(gc_queue, u->manager->gc_queue, u);
500 u->manager->n_in_gc_queue--;
503 if (u->in_cgroup_queue)
504 LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u);
506 if (u->cgroup_path) {
507 hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
508 free(u->cgroup_path);
511 set_remove(u->manager->failed_units, u);
513 free(u->description);
514 strv_free(u->documentation);
515 free(u->fragment_path);
516 free(u->source_path);
517 strv_free(u->dropin_paths);
520 set_free_free(u->names);
522 unit_unwatch_all_pids(u);
524 condition_free_list(u->conditions);
526 unit_ref_unset(&u->slice);
529 unit_ref_unset(u->refs);
534 UnitActiveState unit_active_state(Unit *u) {
537 if (u->load_state == UNIT_MERGED)
538 return unit_active_state(unit_follow_merge(u));
540 /* After a reload it might happen that a unit is not correctly
541 * loaded but still has a process around. That's why we won't
542 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
544 return UNIT_VTABLE(u)->active_state(u);
547 const char* unit_sub_state_to_string(Unit *u) {
550 return UNIT_VTABLE(u)->sub_state_to_string(u);
553 static void complete_move(Set **s, Set **other) {
561 set_move(*s, *other);
568 static void merge_names(Unit *u, Unit *other) {
575 complete_move(&u->names, &other->names);
577 set_free_free(other->names);
581 SET_FOREACH(t, u->names, i)
582 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
585 static void merge_dependencies(Unit *u, Unit *other, UnitDependency d) {
592 assert(d < _UNIT_DEPENDENCY_MAX);
594 /* Fix backwards pointers */
595 SET_FOREACH(back, other->dependencies[d], i) {
598 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
599 r = set_remove_and_put(back->dependencies[k], other, u);
601 set_remove(back->dependencies[k], other);
603 assert(r >= 0 || r == -ENOENT);
607 complete_move(&u->dependencies[d], &other->dependencies[d]);
609 set_free(other->dependencies[d]);
610 other->dependencies[d] = NULL;
613 int unit_merge(Unit *u, Unit *other) {
618 assert(u->manager == other->manager);
619 assert(u->type != _UNIT_TYPE_INVALID);
621 other = unit_follow_merge(other);
626 if (u->type != other->type)
629 if (!u->instance != !other->instance)
632 if (other->load_state != UNIT_STUB &&
633 other->load_state != UNIT_NOT_FOUND)
642 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
646 merge_names(u, other);
648 /* Redirect all references */
650 unit_ref_set(other->refs, u);
652 /* Merge dependencies */
653 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
654 merge_dependencies(u, other, d);
656 other->load_state = UNIT_MERGED;
657 other->merged_into = u;
659 /* If there is still some data attached to the other node, we
660 * don't need it anymore, and can free it. */
661 if (other->load_state != UNIT_STUB)
662 if (UNIT_VTABLE(other)->done)
663 UNIT_VTABLE(other)->done(other);
665 unit_add_to_dbus_queue(u);
666 unit_add_to_cleanup_queue(other);
671 int unit_merge_by_name(Unit *u, const char *name) {
674 _cleanup_free_ char *s = NULL;
679 if (unit_name_is_template(name)) {
683 s = unit_name_replace_instance(name, u->instance);
690 other = manager_get_unit(u->manager, name);
692 r = unit_add_name(u, name);
694 r = unit_merge(u, other);
699 Unit* unit_follow_merge(Unit *u) {
702 while (u->load_state == UNIT_MERGED)
703 assert_se(u = u->merged_into);
708 int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
714 if (c->working_directory) {
715 r = unit_require_mounts_for(u, c->working_directory);
720 if (c->root_directory) {
721 r = unit_require_mounts_for(u, c->root_directory);
726 if (u->manager->running_as != SYSTEMD_SYSTEM)
729 if (c->private_tmp) {
730 r = unit_require_mounts_for(u, "/tmp");
734 r = unit_require_mounts_for(u, "/var/tmp");
739 if (c->std_output != EXEC_OUTPUT_KMSG &&
740 c->std_output != EXEC_OUTPUT_SYSLOG &&
741 c->std_output != EXEC_OUTPUT_JOURNAL &&
742 c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
743 c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
744 c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
745 c->std_error != EXEC_OUTPUT_KMSG &&
746 c->std_error != EXEC_OUTPUT_SYSLOG &&
747 c->std_error != EXEC_OUTPUT_JOURNAL &&
748 c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
749 c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
750 c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
753 /* If syslog or kernel logging is requested, make sure our own
754 * logging daemon is run first. */
756 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true);
763 const char *unit_description(Unit *u) {
767 return u->description;
772 void unit_dump(Unit *u, FILE *f, const char *prefix) {
776 _cleanup_free_ char *p2 = NULL;
779 timestamp1[FORMAT_TIMESTAMP_MAX],
780 timestamp2[FORMAT_TIMESTAMP_MAX],
781 timestamp3[FORMAT_TIMESTAMP_MAX],
782 timestamp4[FORMAT_TIMESTAMP_MAX],
783 timespan[FORMAT_TIMESPAN_MAX];
785 _cleanup_set_free_ Set *following_set = NULL;
789 assert(u->type >= 0);
793 p2 = strappend(prefix, "\t");
794 prefix2 = p2 ? p2 : prefix;
798 "%s\tDescription: %s\n"
800 "%s\tUnit Load State: %s\n"
801 "%s\tUnit Active State: %s\n"
802 "%s\tInactive Exit Timestamp: %s\n"
803 "%s\tActive Enter Timestamp: %s\n"
804 "%s\tActive Exit Timestamp: %s\n"
805 "%s\tInactive Enter Timestamp: %s\n"
806 "%s\tGC Check Good: %s\n"
807 "%s\tNeed Daemon Reload: %s\n"
808 "%s\tTransient: %s\n"
811 "%s\tCGroup realized: %s\n"
812 "%s\tCGroup mask: 0x%x\n"
813 "%s\tCGroup members mask: 0x%x\n",
815 prefix, unit_description(u),
816 prefix, strna(u->instance),
817 prefix, unit_load_state_to_string(u->load_state),
818 prefix, unit_active_state_to_string(unit_active_state(u)),
819 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
820 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
821 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
822 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
823 prefix, yes_no(unit_check_gc(u)),
824 prefix, yes_no(unit_need_daemon_reload(u)),
825 prefix, yes_no(u->transient),
826 prefix, strna(unit_slice_name(u)),
827 prefix, strna(u->cgroup_path),
828 prefix, yes_no(u->cgroup_realized),
829 prefix, u->cgroup_realized_mask,
830 prefix, u->cgroup_members_mask);
832 SET_FOREACH(t, u->names, i)
833 fprintf(f, "%s\tName: %s\n", prefix, t);
835 STRV_FOREACH(j, u->documentation)
836 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
838 following = unit_following(u);
840 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
842 r = unit_following_set(u, &following_set);
846 SET_FOREACH(other, following_set, i)
847 fprintf(f, "%s\tFollowing Set Member: %s\n", prefix, other->id);
850 if (u->fragment_path)
851 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
854 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
856 STRV_FOREACH(j, u->dropin_paths)
857 fprintf(f, "%s\tDropIn Path: %s\n", prefix, *j);
859 if (u->job_timeout > 0)
860 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
862 condition_dump_list(u->conditions, f, prefix);
864 if (dual_timestamp_is_set(&u->condition_timestamp))
866 "%s\tCondition Timestamp: %s\n"
867 "%s\tCondition Result: %s\n",
868 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
869 prefix, yes_no(u->condition_result));
871 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
874 SET_FOREACH(other, u->dependencies[d], i)
875 fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
878 if (!strv_isempty(u->requires_mounts_for)) {
880 "%s\tRequiresMountsFor:", prefix);
882 STRV_FOREACH(j, u->requires_mounts_for)
883 fprintf(f, " %s", *j);
888 if (u->load_state == UNIT_LOADED) {
891 "%s\tStopWhenUnneeded: %s\n"
892 "%s\tRefuseManualStart: %s\n"
893 "%s\tRefuseManualStop: %s\n"
894 "%s\tDefaultDependencies: %s\n"
895 "%s\tOnFailureJobMode: %s\n"
896 "%s\tIgnoreOnIsolate: %s\n"
897 "%s\tIgnoreOnSnapshot: %s\n",
898 prefix, yes_no(u->stop_when_unneeded),
899 prefix, yes_no(u->refuse_manual_start),
900 prefix, yes_no(u->refuse_manual_stop),
901 prefix, yes_no(u->default_dependencies),
902 prefix, job_mode_to_string(u->on_failure_job_mode),
903 prefix, yes_no(u->ignore_on_isolate),
904 prefix, yes_no(u->ignore_on_snapshot));
906 if (UNIT_VTABLE(u)->dump)
907 UNIT_VTABLE(u)->dump(u, f, prefix2);
909 } else if (u->load_state == UNIT_MERGED)
911 "%s\tMerged into: %s\n",
912 prefix, u->merged_into->id);
913 else if (u->load_state == UNIT_ERROR)
914 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
918 job_dump(u->job, f, prefix2);
921 job_dump(u->nop_job, f, prefix2);
925 /* Common implementation for multiple backends */
926 int unit_load_fragment_and_dropin(Unit *u) {
931 /* Load a .{service,socket,...} file */
932 r = unit_load_fragment(u);
936 if (u->load_state == UNIT_STUB)
939 /* Load drop-in directory data */
940 r = unit_load_dropin(unit_follow_merge(u));
947 /* Common implementation for multiple backends */
948 int unit_load_fragment_and_dropin_optional(Unit *u) {
953 /* Same as unit_load_fragment_and_dropin(), but whether
954 * something can be loaded or not doesn't matter. */
956 /* Load a .service file */
957 r = unit_load_fragment(u);
961 if (u->load_state == UNIT_STUB)
962 u->load_state = UNIT_LOADED;
964 /* Load drop-in directory data */
965 r = unit_load_dropin(unit_follow_merge(u));
972 int unit_add_default_target_dependency(Unit *u, Unit *target) {
976 if (target->type != UNIT_TARGET)
979 /* Only add the dependency if both units are loaded, so that
980 * that loop check below is reliable */
981 if (u->load_state != UNIT_LOADED ||
982 target->load_state != UNIT_LOADED)
985 /* If either side wants no automatic dependencies, then let's
987 if (!u->default_dependencies ||
988 !target->default_dependencies)
991 /* Don't create loops */
992 if (set_get(target->dependencies[UNIT_BEFORE], u))
995 return unit_add_dependency(target, UNIT_AFTER, u, true);
998 static int unit_add_target_dependencies(Unit *u) {
1000 static const UnitDependency deps[] = {
1002 UNIT_REQUIRED_BY_OVERRIDABLE,
1014 for (k = 0; k < ELEMENTSOF(deps); k++)
1015 SET_FOREACH(target, u->dependencies[deps[k]], i) {
1016 r = unit_add_default_target_dependency(u, target);
1024 static int unit_add_slice_dependencies(Unit *u) {
1027 if (!unit_get_cgroup_context(u))
1030 if (UNIT_ISSET(u->slice))
1031 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, UNIT_DEREF(u->slice), true);
1033 return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, SPECIAL_ROOT_SLICE, NULL, true);
1036 static int unit_add_mount_dependencies(Unit *u) {
1042 STRV_FOREACH(i, u->requires_mounts_for) {
1043 char prefix[strlen(*i) + 1];
1045 PATH_FOREACH_PREFIX_MORE(prefix, *i) {
1048 r = manager_get_unit_by_path(u->manager, prefix, ".mount", &m);
1056 if (m->load_state != UNIT_LOADED)
1059 r = unit_add_dependency(u, UNIT_AFTER, m, true);
1063 if (m->fragment_path) {
1064 r = unit_add_dependency(u, UNIT_REQUIRES, m, true);
1074 static int unit_add_startup_units(Unit *u) {
1078 c = unit_get_cgroup_context(u);
1079 if (c != NULL && manager_state(u->manager) == MANAGER_STARTING &&
1080 (c->startup_cpu_shares_set || c->startup_blockio_weight_set)) {
1081 r = set_put(u->manager->startup_units, u);
1088 int unit_load(Unit *u) {
1093 if (u->in_load_queue) {
1094 LIST_REMOVE(load_queue, u->manager->load_queue, u);
1095 u->in_load_queue = false;
1098 if (u->type == _UNIT_TYPE_INVALID)
1101 if (u->load_state != UNIT_STUB)
1104 if (UNIT_VTABLE(u)->load) {
1105 r = UNIT_VTABLE(u)->load(u);
1110 if (u->load_state == UNIT_STUB) {
1115 if (u->load_state == UNIT_LOADED) {
1117 r = unit_add_target_dependencies(u);
1121 r = unit_add_slice_dependencies(u);
1125 r = unit_add_mount_dependencies(u);
1129 r = unit_add_startup_units(u);
1133 if (u->on_failure_job_mode == JOB_ISOLATE && set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
1134 log_error_unit(u->id, "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u->id);
1139 unit_update_cgroup_members_masks(u);
1142 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
1144 unit_add_to_dbus_queue(unit_follow_merge(u));
1145 unit_add_to_gc_queue(u);
1150 u->load_state = u->load_state == UNIT_STUB ? UNIT_NOT_FOUND : UNIT_ERROR;
1152 unit_add_to_dbus_queue(u);
1153 unit_add_to_gc_queue(u);
1155 log_debug_unit(u->id, "Failed to load configuration for %s: %s",
1156 u->id, strerror(-r));
1161 static bool unit_condition_test(Unit *u) {
1164 dual_timestamp_get(&u->condition_timestamp);
1165 u->condition_result = condition_test_list(u->id, u->conditions);
1167 return u->condition_result;
1170 _pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
1171 const UnitStatusMessageFormats *format_table;
1175 assert(t < _JOB_TYPE_MAX);
1177 if (t != JOB_START && t != JOB_STOP)
1180 format_table = &UNIT_VTABLE(u)->status_message_formats;
1184 return format_table->starting_stopping[t == JOB_STOP];
1187 _pure_ static const char *unit_get_status_message_format_try_harder(Unit *u, JobType t) {
1192 assert(t < _JOB_TYPE_MAX);
1194 format = unit_get_status_message_format(u, t);
1198 /* Return generic strings */
1200 return "Starting %s.";
1201 else if (t == JOB_STOP)
1202 return "Stopping %s.";
1203 else if (t == JOB_RELOAD)
1204 return "Reloading %s.";
1209 static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1214 /* We only print status messages for selected units on
1215 * selected operations. */
1217 format = unit_get_status_message_format(u, t);
1221 DISABLE_WARNING_FORMAT_NONLITERAL;
1222 unit_status_printf(u, "", format);
1226 static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1233 if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1236 if (log_on_console())
1239 /* We log status messages for all units and all operations. */
1241 format = unit_get_status_message_format_try_harder(u, t);
1245 DISABLE_WARNING_FORMAT_NONLITERAL;
1246 snprintf(buf, sizeof(buf), format, unit_description(u));
1250 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1251 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1252 SD_MESSAGE_UNIT_RELOADING;
1254 log_struct_unit(LOG_INFO,
1262 * -EBADR: This unit type does not support starting.
1263 * -EALREADY: Unit is already started.
1264 * -EAGAIN: An operation is already in progress. Retry later.
1265 * -ECANCELED: Too many requests for now.
1267 int unit_start(Unit *u) {
1268 UnitActiveState state;
1273 if (u->load_state != UNIT_LOADED)
1276 /* If this is already started, then this will succeed. Note
1277 * that this will even succeed if this unit is not startable
1278 * by the user. This is relied on to detect when we need to
1279 * wait for units and when waiting is finished. */
1280 state = unit_active_state(u);
1281 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1284 /* If the conditions failed, don't do anything at all. If we
1285 * already are activating this call might still be useful to
1286 * speed up activation in case there is some hold-off time,
1287 * but we don't want to recheck the condition in that case. */
1288 if (state != UNIT_ACTIVATING &&
1289 !unit_condition_test(u)) {
1290 log_debug_unit(u->id, "Starting of %s requested but condition failed. Ignoring.", u->id);
1294 /* Forward to the main object, if we aren't it. */
1295 following = unit_following(u);
1297 log_debug_unit(u->id, "Redirecting start request from %s to %s.",
1298 u->id, following->id);
1299 return unit_start(following);
1302 unit_status_log_starting_stopping_reloading(u, JOB_START);
1303 unit_status_print_starting_stopping(u, JOB_START);
1305 /* If it is stopped, but we cannot start it, then fail */
1306 if (!UNIT_VTABLE(u)->start)
1309 /* We don't suppress calls to ->start() here when we are
1310 * already starting, to allow this request to be used as a
1311 * "hurry up" call, for example when the unit is in some "auto
1312 * restart" state where it waits for a holdoff timer to elapse
1313 * before it will start again. */
1315 unit_add_to_dbus_queue(u);
1317 return UNIT_VTABLE(u)->start(u);
1320 bool unit_can_start(Unit *u) {
1323 return !!UNIT_VTABLE(u)->start;
1326 bool unit_can_isolate(Unit *u) {
1329 return unit_can_start(u) &&
1334 * -EBADR: This unit type does not support stopping.
1335 * -EALREADY: Unit is already stopped.
1336 * -EAGAIN: An operation is already in progress. Retry later.
1338 int unit_stop(Unit *u) {
1339 UnitActiveState state;
1344 state = unit_active_state(u);
1345 if (UNIT_IS_INACTIVE_OR_FAILED(state))
1348 if ((following = unit_following(u))) {
1349 log_debug_unit(u->id, "Redirecting stop request from %s to %s.",
1350 u->id, following->id);
1351 return unit_stop(following);
1354 unit_status_log_starting_stopping_reloading(u, JOB_STOP);
1355 unit_status_print_starting_stopping(u, JOB_STOP);
1357 if (!UNIT_VTABLE(u)->stop)
1360 unit_add_to_dbus_queue(u);
1362 return UNIT_VTABLE(u)->stop(u);
1366 * -EBADR: This unit type does not support reloading.
1367 * -ENOEXEC: Unit is not started.
1368 * -EAGAIN: An operation is already in progress. Retry later.
1370 int unit_reload(Unit *u) {
1371 UnitActiveState state;
1376 if (u->load_state != UNIT_LOADED)
1379 if (!unit_can_reload(u))
1382 state = unit_active_state(u);
1383 if (state == UNIT_RELOADING)
1386 if (state != UNIT_ACTIVE) {
1387 log_warning_unit(u->id, "Unit %s cannot be reloaded because it is inactive.",
1392 following = unit_following(u);
1394 log_debug_unit(u->id, "Redirecting reload request from %s to %s.",
1395 u->id, following->id);
1396 return unit_reload(following);
1399 unit_status_log_starting_stopping_reloading(u, JOB_RELOAD);
1401 unit_add_to_dbus_queue(u);
1402 return UNIT_VTABLE(u)->reload(u);
1405 bool unit_can_reload(Unit *u) {
1408 if (!UNIT_VTABLE(u)->reload)
1411 if (!UNIT_VTABLE(u)->can_reload)
1414 return UNIT_VTABLE(u)->can_reload(u);
1417 static void unit_check_unneeded(Unit *u) {
1423 /* If this service shall be shut down when unneeded then do
1426 if (!u->stop_when_unneeded)
1429 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1432 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
1433 if (unit_active_or_pending(other))
1436 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
1437 if (unit_active_or_pending(other))
1440 SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
1441 if (unit_active_or_pending(other))
1444 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1445 if (unit_active_or_pending(other))
1448 log_info_unit(u->id, "Service %s is not needed anymore. Stopping.", u->id);
1450 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1451 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1454 static void retroactively_start_dependencies(Unit *u) {
1459 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1461 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1462 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1463 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1464 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1466 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1467 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1468 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1469 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1471 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1472 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1473 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1474 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1476 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1477 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1478 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1479 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1481 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
1482 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1483 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1485 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
1486 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1487 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1490 static void retroactively_stop_dependencies(Unit *u) {
1495 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1497 /* Pull down units which are bound to us recursively if enabled */
1498 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1499 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1500 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1503 static void check_unneeded_dependencies(Unit *u) {
1508 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1510 /* Garbage collect services that might not be needed anymore, if enabled */
1511 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1512 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1513 unit_check_unneeded(other);
1514 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1515 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1516 unit_check_unneeded(other);
1517 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1518 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1519 unit_check_unneeded(other);
1520 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1521 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1522 unit_check_unneeded(other);
1523 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1524 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1525 unit_check_unneeded(other);
1526 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1527 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1528 unit_check_unneeded(other);
1531 void unit_start_on_failure(Unit *u) {
1537 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
1540 log_info_unit(u->id, "Triggering OnFailure= dependencies of %s.", u->id);
1542 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
1545 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, true, NULL, NULL);
1547 log_error_unit(u->id, "Failed to enqueue OnFailure= job: %s", strerror(-r));
1551 void unit_trigger_notify(Unit *u) {
1557 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1558 if (UNIT_VTABLE(other)->trigger_notify)
1559 UNIT_VTABLE(other)->trigger_notify(other, u);
1562 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
1567 assert(os < _UNIT_ACTIVE_STATE_MAX);
1568 assert(ns < _UNIT_ACTIVE_STATE_MAX);
1570 /* Note that this is called for all low-level state changes,
1571 * even if they might map to the same high-level
1572 * UnitActiveState! That means that ns == os is OK an expected
1573 * behavior here. For example: if a mount point is remounted
1574 * this function will be called too! */
1578 /* Update timestamps for state changes */
1579 if (m->n_reloading <= 0) {
1582 dual_timestamp_get(&ts);
1584 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
1585 u->inactive_exit_timestamp = ts;
1586 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
1587 u->inactive_enter_timestamp = ts;
1589 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
1590 u->active_enter_timestamp = ts;
1591 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
1592 u->active_exit_timestamp = ts;
1595 /* Keep track of failed of units */
1596 if (ns == UNIT_FAILED && os != UNIT_FAILED)
1597 set_put(u->manager->failed_units, u);
1598 else if (os == UNIT_FAILED && ns != UNIT_FAILED)
1599 set_remove(u->manager->failed_units, u);
1601 /* Make sure the cgroup is always removed when we become inactive */
1602 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1603 unit_destroy_cgroup(u);
1605 /* Note that this doesn't apply to RemainAfterExit services exiting
1606 * successfully, since there's no change of state in that case. Which is
1607 * why it is handled in service_set_state() */
1608 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1611 ec = unit_get_exec_context(u);
1612 if (ec && exec_context_may_touch_console(ec)) {
1613 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1616 if (m->n_on_console == 0)
1617 /* unset no_console_output flag, since the console is free */
1618 m->no_console_output = false;
1627 if (u->job->state == JOB_WAITING)
1629 /* So we reached a different state for this
1630 * job. Let's see if we can run it now if it
1631 * failed previously due to EAGAIN. */
1632 job_add_to_run_queue(u->job);
1634 /* Let's check whether this state change constitutes a
1635 * finished job, or maybe contradicts a running job and
1636 * hence needs to invalidate jobs. */
1638 switch (u->job->type) {
1641 case JOB_VERIFY_ACTIVE:
1643 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1644 job_finish_and_invalidate(u->job, JOB_DONE, true);
1645 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1648 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1649 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1655 case JOB_RELOAD_OR_START:
1657 if (u->job->state == JOB_RUNNING) {
1658 if (ns == UNIT_ACTIVE)
1659 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
1660 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1663 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1664 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1672 case JOB_TRY_RESTART:
1674 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1675 job_finish_and_invalidate(u->job, JOB_DONE, true);
1676 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1678 job_finish_and_invalidate(u->job, JOB_FAILED, true);
1684 assert_not_reached("Job type unknown");
1690 if (m->n_reloading <= 0) {
1692 /* If this state change happened without being
1693 * requested by a job, then let's retroactively start
1694 * or stop dependencies. We skip that step when
1695 * deserializing, since we don't want to create any
1696 * additional jobs just because something is already
1700 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1701 retroactively_start_dependencies(u);
1702 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1703 retroactively_stop_dependencies(u);
1706 /* stop unneeded units regardless if going down was expected or not */
1707 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1708 check_unneeded_dependencies(u);
1710 if (ns != os && ns == UNIT_FAILED) {
1711 log_notice_unit(u->id, "Unit %s entered failed state.", u->id);
1712 unit_start_on_failure(u);
1716 /* Some names are special */
1717 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1719 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1720 /* The bus just might have become available,
1721 * hence try to connect to it, if we aren't
1725 if (u->type == UNIT_SERVICE &&
1726 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1727 m->n_reloading <= 0) {
1728 /* Write audit record if we have just finished starting up */
1729 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
1733 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1734 manager_send_unit_plymouth(m, u);
1738 /* We don't care about D-Bus here, since we'll get an
1739 * asynchronous notification for it anyway. */
1741 if (u->type == UNIT_SERVICE &&
1742 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1743 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1744 m->n_reloading <= 0) {
1746 /* Hmm, if there was no start record written
1747 * write it now, so that we always have a nice
1750 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1752 if (ns == UNIT_INACTIVE)
1753 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
1755 /* Write audit record if we have just finished shutting down */
1756 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1758 u->in_audit = false;
1762 manager_recheck_journal(m);
1763 unit_trigger_notify(u);
1765 /* Maybe we finished startup and are now ready for being
1766 * stopped because unneeded? */
1767 if (u->manager->n_reloading <= 0)
1768 unit_check_unneeded(u);
1770 unit_add_to_dbus_queue(u);
1771 unit_add_to_gc_queue(u);
1774 int unit_watch_pid(Unit *u, pid_t pid) {
1780 /* Watch a specific PID. We only support one or two units
1781 * watching each PID for now, not more. */
1783 r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
1787 r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
1791 r = hashmap_put(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1793 r = hashmap_ensure_allocated(&u->manager->watch_pids2, trivial_hash_func, trivial_compare_func);
1797 r = hashmap_put(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1800 q = set_put(u->pids, LONG_TO_PTR(pid));
1807 void unit_unwatch_pid(Unit *u, pid_t pid) {
1811 hashmap_remove_value(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1812 hashmap_remove_value(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1813 set_remove(u->pids, LONG_TO_PTR(pid));
1816 void unit_unwatch_all_pids(Unit *u) {
1819 while (!set_isempty(u->pids))
1820 unit_unwatch_pid(u, PTR_TO_LONG(set_first(u->pids)));
1826 static int unit_watch_pids_in_path(Unit *u, const char *path) {
1827 _cleanup_closedir_ DIR *d = NULL;
1828 _cleanup_fclose_ FILE *f = NULL;
1834 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
1836 r = cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER, path, &f);
1840 while ((r = cg_read_pid(f, &pid)) > 0) {
1841 r = unit_watch_pid(u, pid);
1842 if (r < 0 && ret >= 0)
1845 if (r < 0 && ret >= 0)
1848 } else if (ret >= 0)
1851 r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, path, &d);
1855 while ((r = cg_read_subgroup(d, &fn)) > 0) {
1856 _cleanup_free_ char *p = NULL;
1858 p = strjoin(path, "/", fn, NULL);
1864 r = unit_watch_pids_in_path(u, p);
1865 if (r < 0 && ret >= 0)
1868 if (r < 0 && ret >= 0)
1871 } else if (ret >= 0)
1877 int unit_watch_all_pids(Unit *u) {
1880 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
1882 if (!u->cgroup_path)
1885 return unit_watch_pids_in_path(u, u->cgroup_path);
1888 void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
1894 /* Cleans dead PIDs from our list */
1896 SET_FOREACH(e, u->pids, i) {
1897 pid_t pid = PTR_TO_LONG(e);
1899 if (pid == except1 || pid == except2)
1902 if (!pid_is_unwaited(pid))
1903 unit_unwatch_pid(u, pid);
1907 bool unit_job_is_applicable(Unit *u, JobType j) {
1909 assert(j >= 0 && j < _JOB_TYPE_MAX);
1913 case JOB_VERIFY_ACTIVE:
1920 case JOB_TRY_RESTART:
1921 return unit_can_start(u);
1924 return unit_can_reload(u);
1926 case JOB_RELOAD_OR_START:
1927 return unit_can_reload(u) && unit_can_start(u);
1930 assert_not_reached("Invalid job type");
1934 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1936 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1937 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1938 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1939 [UNIT_WANTS] = UNIT_WANTED_BY,
1940 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1941 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1942 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
1943 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
1944 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1945 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1946 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1947 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
1948 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
1949 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
1950 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
1951 [UNIT_BEFORE] = UNIT_AFTER,
1952 [UNIT_AFTER] = UNIT_BEFORE,
1953 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
1954 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1955 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
1956 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
1957 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
1958 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
1959 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
1960 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
1962 int r, q = 0, v = 0, w = 0;
1965 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1968 u = unit_follow_merge(u);
1969 other = unit_follow_merge(other);
1971 /* We won't allow dependencies on ourselves. We will not
1972 * consider them an error however. */
1976 r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func);
1980 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID) {
1981 r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func);
1986 if (add_reference) {
1987 r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func);
1991 r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func);
1996 q = set_put(u->dependencies[d], other);
2000 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2001 v = set_put(other->dependencies[inverse_table[d]], u);
2008 if (add_reference) {
2009 w = set_put(u->dependencies[UNIT_REFERENCES], other);
2015 r = set_put(other->dependencies[UNIT_REFERENCED_BY], u);
2020 unit_add_to_dbus_queue(u);
2025 set_remove(u->dependencies[d], other);
2028 set_remove(other->dependencies[inverse_table[d]], u);
2031 set_remove(u->dependencies[UNIT_REFERENCES], other);
2036 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
2041 if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
2044 if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
2050 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
2054 assert(name || path);
2058 name = basename(path);
2060 if (!unit_name_is_template(name)) {
2066 s = unit_name_replace_instance(name, u->instance);
2068 _cleanup_free_ char *i = NULL;
2070 i = unit_name_to_prefix(u->id);
2074 s = unit_name_replace_instance(name, i);
2084 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
2087 _cleanup_free_ char *s = NULL;
2090 assert(name || path);
2092 name = resolve_template(u, name, path, &s);
2096 r = manager_load_unit(u->manager, name, path, NULL, &other);
2100 return unit_add_dependency(u, d, other, add_reference);
2103 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
2106 _cleanup_free_ char *s = NULL;
2109 assert(name || path);
2111 if (!(name = resolve_template(u, name, path, &s)))
2114 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
2117 r = unit_add_two_dependencies(u, d, e, other, add_reference);
2122 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
2125 _cleanup_free_ char *s = NULL;
2128 assert(name || path);
2130 if (!(name = resolve_template(u, name, path, &s)))
2133 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
2136 r = unit_add_dependency(other, d, u, add_reference);
2141 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
2144 _cleanup_free_ char *s = NULL;
2147 assert(name || path);
2149 if (!(name = resolve_template(u, name, path, &s)))
2152 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
2155 if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
2161 int set_unit_path(const char *p) {
2162 _cleanup_free_ char *c = NULL;
2164 /* This is mostly for debug purposes */
2165 c = path_make_absolute_cwd(p);
2166 if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0)
2172 char *unit_dbus_path(Unit *u) {
2178 return unit_dbus_path_from_name(u->id);
2181 char *unit_default_cgroup_path(Unit *u) {
2182 _cleanup_free_ char *escaped = NULL, *slice = NULL;
2187 if (unit_has_name(u, SPECIAL_ROOT_SLICE))
2188 return strdup(u->manager->cgroup_root);
2190 if (UNIT_ISSET(u->slice) && !unit_has_name(UNIT_DEREF(u->slice), SPECIAL_ROOT_SLICE)) {
2191 r = cg_slice_to_path(UNIT_DEREF(u->slice)->id, &slice);
2196 escaped = cg_escape(u->id);
2201 return strjoin(u->manager->cgroup_root, "/", slice, "/", escaped, NULL);
2203 return strjoin(u->manager->cgroup_root, "/", escaped, NULL);
2206 int unit_add_default_slice(Unit *u, CGroupContext *c) {
2207 _cleanup_free_ char *b = NULL;
2208 const char *slice_name;
2215 if (UNIT_ISSET(u->slice))
2219 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
2221 /* Implicitly place all instantiated units in their
2222 * own per-template slice */
2224 prefix = unit_name_to_prefix(u->id);
2228 /* The prefix is already escaped, but it might include
2229 * "-" which has a special meaning for slice units,
2230 * hence escape it here extra. */
2231 escaped = strreplace(prefix, "-", "\\x2d");
2235 if (u->manager->running_as == SYSTEMD_SYSTEM)
2236 b = strjoin("system-", escaped, ".slice", NULL);
2238 b = strappend(escaped, ".slice");
2245 u->manager->running_as == SYSTEMD_SYSTEM
2246 ? SPECIAL_SYSTEM_SLICE
2247 : SPECIAL_ROOT_SLICE;
2249 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
2253 unit_ref_set(&u->slice, slice);
2257 const char *unit_slice_name(Unit *u) {
2260 if (!UNIT_ISSET(u->slice))
2263 return UNIT_DEREF(u->slice)->id;
2266 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2267 _cleanup_free_ char *t = NULL;
2274 t = unit_name_change_suffix(u->id, type);
2278 assert(!unit_has_name(u, t));
2280 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2281 assert(r < 0 || *_found != u);
2285 int unit_watch_bus_name(Unit *u, const char *name) {
2289 /* Watch a specific name on the bus. We only support one unit
2290 * watching each name for now. */
2292 return hashmap_put(u->manager->watch_bus, name, u);
2295 void unit_unwatch_bus_name(Unit *u, const char *name) {
2299 hashmap_remove_value(u->manager->watch_bus, name, u);
2302 bool unit_can_serialize(Unit *u) {
2305 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2308 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2315 if (unit_can_serialize(u)) {
2318 r = UNIT_VTABLE(u)->serialize(u, f, fds);
2322 rt = unit_get_exec_runtime(u);
2324 r = exec_runtime_serialize(rt, u, f, fds);
2330 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2331 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2332 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2333 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2334 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2336 if (dual_timestamp_is_set(&u->condition_timestamp))
2337 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2339 unit_serialize_item(u, f, "transient", yes_no(u->transient));
2342 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
2344 if (serialize_jobs) {
2346 fprintf(f, "job\n");
2347 job_serialize(u->job, f, fds);
2351 fprintf(f, "job\n");
2352 job_serialize(u->nop_job, f, fds);
2361 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2372 va_start(ap, format);
2373 vfprintf(f, format, ap);
2379 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2385 fprintf(f, "%s=%s\n", key, value);
2388 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2389 ExecRuntime **rt = NULL;
2397 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2399 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2402 char line[LINE_MAX], *l, *v;
2405 if (!fgets(line, sizeof(line), f)) {
2418 k = strcspn(l, "=");
2426 if (streq(l, "job")) {
2428 /* new-style serialized job */
2429 Job *j = job_new_raw(u);
2433 r = job_deserialize(j, f, fds);
2439 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2445 r = job_install_deserialized(j);
2447 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2452 if (j->state == JOB_RUNNING)
2453 u->manager->n_running_jobs++;
2456 JobType type = job_type_from_string(v);
2458 log_debug("Failed to parse job type value %s", v);
2460 u->deserialized_job = type;
2463 } else if (streq(l, "inactive-exit-timestamp")) {
2464 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2466 } else if (streq(l, "active-enter-timestamp")) {
2467 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2469 } else if (streq(l, "active-exit-timestamp")) {
2470 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2472 } else if (streq(l, "inactive-enter-timestamp")) {
2473 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2475 } else if (streq(l, "condition-timestamp")) {
2476 dual_timestamp_deserialize(v, &u->condition_timestamp);
2478 } else if (streq(l, "condition-result")) {
2481 b = parse_boolean(v);
2483 log_debug("Failed to parse condition result value %s", v);
2485 u->condition_result = b;
2489 } else if (streq(l, "transient")) {
2492 b = parse_boolean(v);
2494 log_debug("Failed to parse transient bool %s", v);
2499 } else if (streq(l, "cgroup")) {
2506 if (u->cgroup_path) {
2509 p = hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
2510 log_info("Removing cgroup_path %s from hashmap (%p)",
2512 free(u->cgroup_path);
2516 assert(hashmap_put(u->manager->cgroup_unit, s, u) == 1);
2521 if (unit_can_serialize(u)) {
2523 r = exec_runtime_deserialize_item(rt, u, l, v, fds);
2530 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
2537 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2539 _cleanup_free_ char *e = NULL;
2547 /* Adds in links to the device node that this unit is based on */
2549 if (!is_device_path(what))
2552 e = unit_name_from_path(what, ".device");
2556 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2561 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2566 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2574 int unit_coldplug(Unit *u) {
2579 if (UNIT_VTABLE(u)->coldplug)
2580 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2584 r = job_coldplug(u->job);
2587 } else if (u->deserialized_job >= 0) {
2589 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2593 u->deserialized_job = _JOB_TYPE_INVALID;
2599 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
2600 DISABLE_WARNING_FORMAT_NONLITERAL;
2601 manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
2605 bool unit_need_daemon_reload(Unit *u) {
2606 _cleanup_strv_free_ char **t = NULL;
2609 unsigned loaded_cnt, current_cnt;
2613 if (u->fragment_path) {
2615 if (stat(u->fragment_path, &st) < 0)
2616 /* What, cannot access this anymore? */
2619 if (u->fragment_mtime > 0 &&
2620 timespec_load(&st.st_mtim) != u->fragment_mtime)
2624 if (u->source_path) {
2626 if (stat(u->source_path, &st) < 0)
2629 if (u->source_mtime > 0 &&
2630 timespec_load(&st.st_mtim) != u->source_mtime)
2634 t = unit_find_dropin_paths(u);
2635 loaded_cnt = strv_length(t);
2636 current_cnt = strv_length(u->dropin_paths);
2638 if (loaded_cnt == current_cnt) {
2639 if (loaded_cnt == 0)
2642 if (strv_overlap(u->dropin_paths, t)) {
2643 STRV_FOREACH(path, u->dropin_paths) {
2645 if (stat(*path, &st) < 0)
2648 if (u->dropin_mtime > 0 &&
2649 timespec_load(&st.st_mtim) > u->dropin_mtime)
2660 void unit_reset_failed(Unit *u) {
2663 if (UNIT_VTABLE(u)->reset_failed)
2664 UNIT_VTABLE(u)->reset_failed(u);
2667 Unit *unit_following(Unit *u) {
2670 if (UNIT_VTABLE(u)->following)
2671 return UNIT_VTABLE(u)->following(u);
2676 bool unit_stop_pending(Unit *u) {
2679 /* This call does check the current state of the unit. It's
2680 * hence useful to be called from state change calls of the
2681 * unit itself, where the state isn't updated yet. This is
2682 * different from unit_inactive_or_pending() which checks both
2683 * the current state and for a queued job. */
2685 return u->job && u->job->type == JOB_STOP;
2688 bool unit_inactive_or_pending(Unit *u) {
2691 /* Returns true if the unit is inactive or going down */
2693 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2696 if (unit_stop_pending(u))
2702 bool unit_active_or_pending(Unit *u) {
2705 /* Returns true if the unit is active or going up */
2707 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2711 (u->job->type == JOB_START ||
2712 u->job->type == JOB_RELOAD_OR_START ||
2713 u->job->type == JOB_RESTART))
2719 int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
2721 assert(w >= 0 && w < _KILL_WHO_MAX);
2723 assert(signo < _NSIG);
2725 if (!UNIT_VTABLE(u)->kill)
2728 return UNIT_VTABLE(u)->kill(u, w, signo, error);
2731 static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
2735 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2739 /* Exclude the main/control pids from being killed via the cgroup */
2741 r = set_put(pid_set, LONG_TO_PTR(main_pid));
2746 if (control_pid > 0) {
2747 r = set_put(pid_set, LONG_TO_PTR(control_pid));
2759 int unit_kill_common(
2765 sd_bus_error *error) {
2769 if (who == KILL_MAIN && main_pid <= 0) {
2771 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
2773 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
2777 if (who == KILL_CONTROL && control_pid <= 0) {
2778 if (control_pid < 0)
2779 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
2781 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
2785 if (who == KILL_CONTROL || who == KILL_ALL)
2786 if (control_pid > 0)
2787 if (kill(control_pid, signo) < 0)
2790 if (who == KILL_MAIN || who == KILL_ALL)
2792 if (kill(main_pid, signo) < 0)
2795 if (who == KILL_ALL && u->cgroup_path) {
2796 _cleanup_set_free_ Set *pid_set = NULL;
2799 /* Exclude the main/control pids from being killed via the cgroup */
2800 pid_set = unit_pid_set(main_pid, control_pid);
2804 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, true, false, pid_set);
2805 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2812 int unit_following_set(Unit *u, Set **s) {
2816 if (UNIT_VTABLE(u)->following_set)
2817 return UNIT_VTABLE(u)->following_set(u, s);
2823 UnitFileState unit_get_unit_file_state(Unit *u) {
2826 if (u->unit_file_state < 0 && u->fragment_path)
2827 u->unit_file_state = unit_file_get_state(
2828 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2829 NULL, basename(u->fragment_path));
2831 return u->unit_file_state;
2834 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2839 unit_ref_unset(ref);
2842 LIST_PREPEND(refs, u->refs, ref);
2846 void unit_ref_unset(UnitRef *ref) {
2852 LIST_REMOVE(refs, ref->unit->refs, ref);
2856 int unit_patch_contexts(Unit *u) {
2864 /* Patch in the manager defaults into the exec and cgroup
2865 * contexts, _after_ the rest of the settings have been
2868 ec = unit_get_exec_context(u);
2870 /* This only copies in the ones that need memory */
2871 for (i = 0; i < _RLIMIT_MAX; i++)
2872 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
2873 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2878 if (u->manager->running_as == SYSTEMD_USER &&
2879 !ec->working_directory) {
2881 r = get_home_dir(&ec->working_directory);
2886 if (u->manager->running_as == SYSTEMD_USER &&
2887 (ec->syscall_whitelist ||
2888 !set_isempty(ec->syscall_filter) ||
2889 !set_isempty(ec->syscall_archs) ||
2890 ec->address_families_whitelist ||
2891 !set_isempty(ec->address_families)))
2892 ec->no_new_privileges = true;
2894 if (ec->private_devices)
2895 ec->capability_bounding_set_drop |= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD;
2898 cc = unit_get_cgroup_context(u);
2902 ec->private_devices &&
2903 cc->device_policy == CGROUP_AUTO)
2904 cc->device_policy = CGROUP_CLOSED;
2910 ExecContext *unit_get_exec_context(Unit *u) {
2917 offset = UNIT_VTABLE(u)->exec_context_offset;
2921 return (ExecContext*) ((uint8_t*) u + offset);
2924 KillContext *unit_get_kill_context(Unit *u) {
2931 offset = UNIT_VTABLE(u)->kill_context_offset;
2935 return (KillContext*) ((uint8_t*) u + offset);
2938 CGroupContext *unit_get_cgroup_context(Unit *u) {
2944 offset = UNIT_VTABLE(u)->cgroup_context_offset;
2948 return (CGroupContext*) ((uint8_t*) u + offset);
2951 ExecRuntime *unit_get_exec_runtime(Unit *u) {
2957 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2961 return *(ExecRuntime**) ((uint8_t*) u + offset);
2964 static int drop_in_file(Unit *u, UnitSetPropertiesMode mode, const char *name, char **_p, char **_q) {
2965 _cleanup_free_ char *b = NULL;
2974 b = xescape(name, "/.");
2978 if (!filename_is_safe(b))
2981 if (u->manager->running_as == SYSTEMD_USER) {
2982 _cleanup_free_ char *c = NULL;
2984 r = user_config_home(&c);
2990 p = strjoin(c, "/", u->id, ".d", NULL);
2991 } else if (mode == UNIT_PERSISTENT && !u->transient)
2992 p = strjoin("/etc/systemd/system/", u->id, ".d", NULL);
2994 p = strjoin("/run/systemd/system/", u->id, ".d", NULL);
2998 q = strjoin(p, "/90-", b, ".conf", NULL);
3009 int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
3010 _cleanup_free_ char *p = NULL, *q = NULL;
3017 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3020 r = drop_in_file(u, mode, name, &p, &q);
3025 return write_string_file_atomic_label(q, data);
3028 int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3029 _cleanup_free_ char *p = NULL;
3037 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3040 va_start(ap, format);
3041 r = vasprintf(&p, format, ap);
3047 return unit_write_drop_in(u, mode, name, p);
3050 int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
3051 _cleanup_free_ char *ndata = NULL;
3057 if (!UNIT_VTABLE(u)->private_section)
3060 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3063 ndata = strjoin("[", UNIT_VTABLE(u)->private_section, "]\n", data, NULL);
3067 return unit_write_drop_in(u, mode, name, ndata);
3070 int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3071 _cleanup_free_ char *p = NULL;
3079 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3082 va_start(ap, format);
3083 r = vasprintf(&p, format, ap);
3089 return unit_write_drop_in_private(u, mode, name, p);
3092 int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name) {
3093 _cleanup_free_ char *p = NULL, *q = NULL;
3098 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3101 r = drop_in_file(u, mode, name, &p, &q);
3106 r = errno == ENOENT ? 0 : -errno;
3114 int unit_make_transient(Unit *u) {
3119 u->load_state = UNIT_STUB;
3121 u->transient = true;
3123 free(u->fragment_path);
3124 u->fragment_path = NULL;
3126 if (u->manager->running_as == SYSTEMD_USER) {
3127 _cleanup_free_ char *c = NULL;
3129 r = user_config_home(&c);
3135 u->fragment_path = strjoin(c, "/", u->id, NULL);
3136 if (!u->fragment_path)
3141 u->fragment_path = strappend("/run/systemd/system/", u->id);
3142 if (!u->fragment_path)
3145 mkdir_p("/run/systemd/system", 0755);
3148 return write_string_file_atomic_label(u->fragment_path, "# Transient stub");
3151 int unit_kill_context(
3157 bool main_pid_alien) {
3159 int sig, wait_for_exit = false, r;
3164 if (c->kill_mode == KILL_NONE)
3167 sig = sigkill ? SIGKILL : c->kill_signal;
3170 r = kill_and_sigcont(main_pid, sig);
3172 if (r < 0 && r != -ESRCH) {
3173 _cleanup_free_ char *comm = NULL;
3174 get_process_comm(main_pid, &comm);
3176 log_warning_unit(u->id, "Failed to kill main process " PID_FMT " (%s): %s", main_pid, strna(comm), strerror(-r));
3178 if (!main_pid_alien)
3179 wait_for_exit = true;
3181 if (c->send_sighup && !sigkill)
3182 kill(main_pid, SIGHUP);
3186 if (control_pid > 0) {
3187 r = kill_and_sigcont(control_pid, sig);
3189 if (r < 0 && r != -ESRCH) {
3190 _cleanup_free_ char *comm = NULL;
3191 get_process_comm(control_pid, &comm);
3193 log_warning_unit(u->id, "Failed to kill control process " PID_FMT " (%s): %s", control_pid, strna(comm), strerror(-r));
3195 wait_for_exit = true;
3197 if (c->send_sighup && !sigkill)
3198 kill(control_pid, SIGHUP);
3202 if ((c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && sigkill)) && u->cgroup_path) {
3203 _cleanup_set_free_ Set *pid_set = NULL;
3205 /* Exclude the main/control pids from being killed via the cgroup */
3206 pid_set = unit_pid_set(main_pid, control_pid);
3210 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, sig, true, true, false, pid_set);
3212 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
3213 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
3216 /* FIXME: For now, we will not wait for the
3217 * cgroup members to die, simply because
3218 * cgroup notification is unreliable. It
3219 * doesn't work at all in containers, and
3220 * outside of containers it can be confused
3221 * easily by leaving directories in the
3224 /* wait_for_exit = true; */
3226 if (c->send_sighup && !sigkill) {
3229 pid_set = unit_pid_set(main_pid, control_pid);
3233 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, SIGHUP, false, true, false, pid_set);
3238 return wait_for_exit;
3241 int unit_require_mounts_for(Unit *u, const char *path) {
3242 char prefix[strlen(path) + 1], *p;
3248 /* Registers a unit for requiring a certain path and all its
3249 * prefixes. We keep a simple array of these paths in the
3250 * unit, since its usually short. However, we build a prefix
3251 * table for all possible prefixes so that new appearing mount
3252 * units can easily determine which units to make themselves a
3255 if (!path_is_absolute(path))
3262 path_kill_slashes(p);
3264 if (!path_is_safe(p)) {
3269 if (strv_contains(u->requires_mounts_for, p)) {
3274 r = strv_consume(&u->requires_mounts_for, p);
3278 PATH_FOREACH_PREFIX_MORE(prefix, p) {
3281 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3285 if (!u->manager->units_requiring_mounts_for) {
3286 u->manager->units_requiring_mounts_for = hashmap_new(string_hash_func, string_compare_func);
3287 if (!u->manager->units_requiring_mounts_for)
3295 x = set_new(NULL, NULL);
3301 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3317 int unit_setup_exec_runtime(Unit *u) {
3323 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3326 /* Check if ther already is an ExecRuntime for this unit? */
3327 rt = (ExecRuntime**) ((uint8_t*) u + offset);
3331 /* Try to get it from somebody else */
3332 SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3334 *rt = unit_get_exec_runtime(other);
3336 exec_runtime_ref(*rt);
3341 return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3344 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3345 [UNIT_ACTIVE] = "active",
3346 [UNIT_RELOADING] = "reloading",
3347 [UNIT_INACTIVE] = "inactive",
3348 [UNIT_FAILED] = "failed",
3349 [UNIT_ACTIVATING] = "activating",
3350 [UNIT_DEACTIVATING] = "deactivating"
3353 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
3355 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
3356 [UNIT_REQUIRES] = "Requires",
3357 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
3358 [UNIT_REQUISITE] = "Requisite",
3359 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
3360 [UNIT_WANTS] = "Wants",
3361 [UNIT_BINDS_TO] = "BindsTo",
3362 [UNIT_PART_OF] = "PartOf",
3363 [UNIT_REQUIRED_BY] = "RequiredBy",
3364 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
3365 [UNIT_WANTED_BY] = "WantedBy",
3366 [UNIT_BOUND_BY] = "BoundBy",
3367 [UNIT_CONSISTS_OF] = "ConsistsOf",
3368 [UNIT_CONFLICTS] = "Conflicts",
3369 [UNIT_CONFLICTED_BY] = "ConflictedBy",
3370 [UNIT_BEFORE] = "Before",
3371 [UNIT_AFTER] = "After",
3372 [UNIT_ON_FAILURE] = "OnFailure",
3373 [UNIT_TRIGGERS] = "Triggers",
3374 [UNIT_TRIGGERED_BY] = "TriggeredBy",
3375 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
3376 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
3377 [UNIT_JOINS_NAMESPACE_OF] = "JoinsNamespaceOf",
3378 [UNIT_REFERENCES] = "References",
3379 [UNIT_REFERENCED_BY] = "ReferencedBy",
3382 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);