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"
56 const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
57 [UNIT_SERVICE] = &service_vtable,
58 [UNIT_SOCKET] = &socket_vtable,
59 [UNIT_BUSNAME] = &busname_vtable,
60 [UNIT_TARGET] = &target_vtable,
61 [UNIT_SNAPSHOT] = &snapshot_vtable,
62 [UNIT_DEVICE] = &device_vtable,
63 [UNIT_MOUNT] = &mount_vtable,
64 [UNIT_AUTOMOUNT] = &automount_vtable,
65 [UNIT_SWAP] = &swap_vtable,
66 [UNIT_TIMER] = &timer_vtable,
67 [UNIT_PATH] = &path_vtable,
68 [UNIT_SLICE] = &slice_vtable,
69 [UNIT_SCOPE] = &scope_vtable
72 Unit *unit_new(Manager *m, size_t size) {
76 assert(size >= sizeof(Unit));
82 u->names = set_new(string_hash_func, string_compare_func);
89 u->type = _UNIT_TYPE_INVALID;
90 u->deserialized_job = _JOB_TYPE_INVALID;
91 u->default_dependencies = true;
92 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
93 u->on_failure_job_mode = JOB_REPLACE;
98 bool unit_has_name(Unit *u, const char *name) {
102 return !!set_get(u->names, (char*) name);
105 static void unit_init(Unit *u) {
112 assert(u->type >= 0);
114 cc = unit_get_cgroup_context(u);
116 cgroup_context_init(cc);
118 /* Copy in the manager defaults into the cgroup
119 * context, _before_ the rest of the settings have
120 * been initialized */
122 cc->cpu_accounting = u->manager->default_cpu_accounting;
123 cc->blockio_accounting = u->manager->default_blockio_accounting;
124 cc->memory_accounting = u->manager->default_memory_accounting;
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);
512 set_remove(u->manager->startup_units, u);
514 free(u->description);
515 strv_free(u->documentation);
516 free(u->fragment_path);
517 free(u->source_path);
518 strv_free(u->dropin_paths);
521 set_free_free(u->names);
523 unit_unwatch_all_pids(u);
525 condition_free_list(u->conditions);
527 unit_ref_unset(&u->slice);
530 unit_ref_unset(u->refs);
535 UnitActiveState unit_active_state(Unit *u) {
538 if (u->load_state == UNIT_MERGED)
539 return unit_active_state(unit_follow_merge(u));
541 /* After a reload it might happen that a unit is not correctly
542 * loaded but still has a process around. That's why we won't
543 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
545 return UNIT_VTABLE(u)->active_state(u);
548 const char* unit_sub_state_to_string(Unit *u) {
551 return UNIT_VTABLE(u)->sub_state_to_string(u);
554 static void complete_move(Set **s, Set **other) {
562 set_move(*s, *other);
569 static void merge_names(Unit *u, Unit *other) {
576 complete_move(&u->names, &other->names);
578 set_free_free(other->names);
582 SET_FOREACH(t, u->names, i)
583 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
586 static void merge_dependencies(Unit *u, Unit *other, UnitDependency d) {
593 assert(d < _UNIT_DEPENDENCY_MAX);
595 /* Fix backwards pointers */
596 SET_FOREACH(back, other->dependencies[d], i) {
599 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
600 /* Do not add dependencies between u and itself */
602 set_remove(back->dependencies[k], other);
604 r = set_remove_and_put(back->dependencies[k], other, u);
606 set_remove(back->dependencies[k], other);
608 assert(r >= 0 || r == -ENOENT);
613 /* Also do not move dependencies on u to itself */
614 set_remove(other->dependencies[d], u);
616 complete_move(&u->dependencies[d], &other->dependencies[d]);
618 set_free(other->dependencies[d]);
619 other->dependencies[d] = NULL;
622 int unit_merge(Unit *u, Unit *other) {
627 assert(u->manager == other->manager);
628 assert(u->type != _UNIT_TYPE_INVALID);
630 other = unit_follow_merge(other);
635 if (u->type != other->type)
638 if (!u->instance != !other->instance)
641 if (other->load_state != UNIT_STUB &&
642 other->load_state != UNIT_NOT_FOUND)
651 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
655 merge_names(u, other);
657 /* Redirect all references */
659 unit_ref_set(other->refs, u);
661 /* Merge dependencies */
662 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
663 merge_dependencies(u, other, d);
665 other->load_state = UNIT_MERGED;
666 other->merged_into = u;
668 /* If there is still some data attached to the other node, we
669 * don't need it anymore, and can free it. */
670 if (other->load_state != UNIT_STUB)
671 if (UNIT_VTABLE(other)->done)
672 UNIT_VTABLE(other)->done(other);
674 unit_add_to_dbus_queue(u);
675 unit_add_to_cleanup_queue(other);
680 int unit_merge_by_name(Unit *u, const char *name) {
683 _cleanup_free_ char *s = NULL;
688 if (unit_name_is_template(name)) {
692 s = unit_name_replace_instance(name, u->instance);
699 other = manager_get_unit(u->manager, name);
701 r = unit_add_name(u, name);
703 r = unit_merge(u, other);
708 Unit* unit_follow_merge(Unit *u) {
711 while (u->load_state == UNIT_MERGED)
712 assert_se(u = u->merged_into);
717 int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
723 if (c->working_directory) {
724 r = unit_require_mounts_for(u, c->working_directory);
729 if (c->root_directory) {
730 r = unit_require_mounts_for(u, c->root_directory);
735 if (u->manager->running_as != SYSTEMD_SYSTEM)
738 if (c->private_tmp) {
739 r = unit_require_mounts_for(u, "/tmp");
743 r = unit_require_mounts_for(u, "/var/tmp");
748 if (c->std_output != EXEC_OUTPUT_KMSG &&
749 c->std_output != EXEC_OUTPUT_SYSLOG &&
750 c->std_output != EXEC_OUTPUT_JOURNAL &&
751 c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
752 c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
753 c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
754 c->std_error != EXEC_OUTPUT_KMSG &&
755 c->std_error != EXEC_OUTPUT_SYSLOG &&
756 c->std_error != EXEC_OUTPUT_JOURNAL &&
757 c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
758 c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
759 c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
762 /* If syslog or kernel logging is requested, make sure our own
763 * logging daemon is run first. */
765 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true);
772 const char *unit_description(Unit *u) {
776 return u->description;
781 void unit_dump(Unit *u, FILE *f, const char *prefix) {
785 _cleanup_free_ char *p2 = NULL;
788 timestamp1[FORMAT_TIMESTAMP_MAX],
789 timestamp2[FORMAT_TIMESTAMP_MAX],
790 timestamp3[FORMAT_TIMESTAMP_MAX],
791 timestamp4[FORMAT_TIMESTAMP_MAX],
792 timespan[FORMAT_TIMESPAN_MAX];
794 _cleanup_set_free_ Set *following_set = NULL;
798 assert(u->type >= 0);
802 p2 = strappend(prefix, "\t");
803 prefix2 = p2 ? p2 : prefix;
807 "%s\tDescription: %s\n"
809 "%s\tUnit Load State: %s\n"
810 "%s\tUnit Active State: %s\n"
811 "%s\tInactive Exit Timestamp: %s\n"
812 "%s\tActive Enter Timestamp: %s\n"
813 "%s\tActive Exit Timestamp: %s\n"
814 "%s\tInactive Enter Timestamp: %s\n"
815 "%s\tGC Check Good: %s\n"
816 "%s\tNeed Daemon Reload: %s\n"
817 "%s\tTransient: %s\n"
820 "%s\tCGroup realized: %s\n"
821 "%s\tCGroup mask: 0x%x\n"
822 "%s\tCGroup members mask: 0x%x\n",
824 prefix, unit_description(u),
825 prefix, strna(u->instance),
826 prefix, unit_load_state_to_string(u->load_state),
827 prefix, unit_active_state_to_string(unit_active_state(u)),
828 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
829 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
830 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
831 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
832 prefix, yes_no(unit_check_gc(u)),
833 prefix, yes_no(unit_need_daemon_reload(u)),
834 prefix, yes_no(u->transient),
835 prefix, strna(unit_slice_name(u)),
836 prefix, strna(u->cgroup_path),
837 prefix, yes_no(u->cgroup_realized),
838 prefix, u->cgroup_realized_mask,
839 prefix, u->cgroup_members_mask);
841 SET_FOREACH(t, u->names, i)
842 fprintf(f, "%s\tName: %s\n", prefix, t);
844 STRV_FOREACH(j, u->documentation)
845 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
847 following = unit_following(u);
849 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
851 r = unit_following_set(u, &following_set);
855 SET_FOREACH(other, following_set, i)
856 fprintf(f, "%s\tFollowing Set Member: %s\n", prefix, other->id);
859 if (u->fragment_path)
860 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
863 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
865 STRV_FOREACH(j, u->dropin_paths)
866 fprintf(f, "%s\tDropIn Path: %s\n", prefix, *j);
868 if (u->job_timeout > 0)
869 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
871 condition_dump_list(u->conditions, f, prefix);
873 if (dual_timestamp_is_set(&u->condition_timestamp))
875 "%s\tCondition Timestamp: %s\n"
876 "%s\tCondition Result: %s\n",
877 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
878 prefix, yes_no(u->condition_result));
880 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
883 SET_FOREACH(other, u->dependencies[d], i)
884 fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
887 if (!strv_isempty(u->requires_mounts_for)) {
889 "%s\tRequiresMountsFor:", prefix);
891 STRV_FOREACH(j, u->requires_mounts_for)
892 fprintf(f, " %s", *j);
897 if (u->load_state == UNIT_LOADED) {
900 "%s\tStopWhenUnneeded: %s\n"
901 "%s\tRefuseManualStart: %s\n"
902 "%s\tRefuseManualStop: %s\n"
903 "%s\tDefaultDependencies: %s\n"
904 "%s\tOnFailureJobMode: %s\n"
905 "%s\tIgnoreOnIsolate: %s\n"
906 "%s\tIgnoreOnSnapshot: %s\n",
907 prefix, yes_no(u->stop_when_unneeded),
908 prefix, yes_no(u->refuse_manual_start),
909 prefix, yes_no(u->refuse_manual_stop),
910 prefix, yes_no(u->default_dependencies),
911 prefix, job_mode_to_string(u->on_failure_job_mode),
912 prefix, yes_no(u->ignore_on_isolate),
913 prefix, yes_no(u->ignore_on_snapshot));
915 if (UNIT_VTABLE(u)->dump)
916 UNIT_VTABLE(u)->dump(u, f, prefix2);
918 } else if (u->load_state == UNIT_MERGED)
920 "%s\tMerged into: %s\n",
921 prefix, u->merged_into->id);
922 else if (u->load_state == UNIT_ERROR)
923 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
927 job_dump(u->job, f, prefix2);
930 job_dump(u->nop_job, f, prefix2);
934 /* Common implementation for multiple backends */
935 int unit_load_fragment_and_dropin(Unit *u) {
940 /* Load a .{service,socket,...} file */
941 r = unit_load_fragment(u);
945 if (u->load_state == UNIT_STUB)
948 /* Load drop-in directory data */
949 r = unit_load_dropin(unit_follow_merge(u));
956 /* Common implementation for multiple backends */
957 int unit_load_fragment_and_dropin_optional(Unit *u) {
962 /* Same as unit_load_fragment_and_dropin(), but whether
963 * something can be loaded or not doesn't matter. */
965 /* Load a .service file */
966 r = unit_load_fragment(u);
970 if (u->load_state == UNIT_STUB)
971 u->load_state = UNIT_LOADED;
973 /* Load drop-in directory data */
974 r = unit_load_dropin(unit_follow_merge(u));
981 int unit_add_default_target_dependency(Unit *u, Unit *target) {
985 if (target->type != UNIT_TARGET)
988 /* Only add the dependency if both units are loaded, so that
989 * that loop check below is reliable */
990 if (u->load_state != UNIT_LOADED ||
991 target->load_state != UNIT_LOADED)
994 /* If either side wants no automatic dependencies, then let's
996 if (!u->default_dependencies ||
997 !target->default_dependencies)
1000 /* Don't create loops */
1001 if (set_get(target->dependencies[UNIT_BEFORE], u))
1004 return unit_add_dependency(target, UNIT_AFTER, u, true);
1007 static int unit_add_target_dependencies(Unit *u) {
1009 static const UnitDependency deps[] = {
1011 UNIT_REQUIRED_BY_OVERRIDABLE,
1023 for (k = 0; k < ELEMENTSOF(deps); k++)
1024 SET_FOREACH(target, u->dependencies[deps[k]], i) {
1025 r = unit_add_default_target_dependency(u, target);
1033 static int unit_add_slice_dependencies(Unit *u) {
1036 if (!unit_get_cgroup_context(u))
1039 if (UNIT_ISSET(u->slice))
1040 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, UNIT_DEREF(u->slice), true);
1042 return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, SPECIAL_ROOT_SLICE, NULL, true);
1045 static int unit_add_mount_dependencies(Unit *u) {
1051 STRV_FOREACH(i, u->requires_mounts_for) {
1052 char prefix[strlen(*i) + 1];
1054 PATH_FOREACH_PREFIX_MORE(prefix, *i) {
1057 r = manager_get_unit_by_path(u->manager, prefix, ".mount", &m);
1065 if (m->load_state != UNIT_LOADED)
1068 r = unit_add_dependency(u, UNIT_AFTER, m, true);
1072 if (m->fragment_path) {
1073 r = unit_add_dependency(u, UNIT_REQUIRES, m, true);
1083 static int unit_add_startup_units(Unit *u) {
1087 c = unit_get_cgroup_context(u);
1091 if (c->startup_cpu_shares == (unsigned long) -1 &&
1092 c->startup_blockio_weight == (unsigned long) -1)
1095 r = set_put(u->manager->startup_units, u);
1102 int unit_load(Unit *u) {
1107 if (u->in_load_queue) {
1108 LIST_REMOVE(load_queue, u->manager->load_queue, u);
1109 u->in_load_queue = false;
1112 if (u->type == _UNIT_TYPE_INVALID)
1115 if (u->load_state != UNIT_STUB)
1118 if (UNIT_VTABLE(u)->load) {
1119 r = UNIT_VTABLE(u)->load(u);
1124 if (u->load_state == UNIT_STUB) {
1129 if (u->load_state == UNIT_LOADED) {
1131 r = unit_add_target_dependencies(u);
1135 r = unit_add_slice_dependencies(u);
1139 r = unit_add_mount_dependencies(u);
1143 r = unit_add_startup_units(u);
1147 if (u->on_failure_job_mode == JOB_ISOLATE && set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
1148 log_error_unit(u->id, "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u->id);
1153 unit_update_cgroup_members_masks(u);
1156 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
1158 unit_add_to_dbus_queue(unit_follow_merge(u));
1159 unit_add_to_gc_queue(u);
1164 u->load_state = u->load_state == UNIT_STUB ? UNIT_NOT_FOUND : UNIT_ERROR;
1166 unit_add_to_dbus_queue(u);
1167 unit_add_to_gc_queue(u);
1169 log_debug_unit(u->id, "Failed to load configuration for %s: %s",
1170 u->id, strerror(-r));
1175 static bool unit_condition_test(Unit *u) {
1178 dual_timestamp_get(&u->condition_timestamp);
1179 u->condition_result = condition_test_list(u->id, u->conditions);
1181 return u->condition_result;
1184 _pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
1185 const UnitStatusMessageFormats *format_table;
1189 assert(t < _JOB_TYPE_MAX);
1191 if (t != JOB_START && t != JOB_STOP)
1194 format_table = &UNIT_VTABLE(u)->status_message_formats;
1198 return format_table->starting_stopping[t == JOB_STOP];
1201 _pure_ static const char *unit_get_status_message_format_try_harder(Unit *u, JobType t) {
1206 assert(t < _JOB_TYPE_MAX);
1208 format = unit_get_status_message_format(u, t);
1212 /* Return generic strings */
1214 return "Starting %s.";
1215 else if (t == JOB_STOP)
1216 return "Stopping %s.";
1217 else if (t == JOB_RELOAD)
1218 return "Reloading %s.";
1223 static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1228 /* We only print status messages for selected units on
1229 * selected operations. */
1231 format = unit_get_status_message_format(u, t);
1235 DISABLE_WARNING_FORMAT_NONLITERAL;
1236 unit_status_printf(u, "", format);
1240 static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1247 if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1250 if (log_on_console())
1253 /* We log status messages for all units and all operations. */
1255 format = unit_get_status_message_format_try_harder(u, t);
1259 DISABLE_WARNING_FORMAT_NONLITERAL;
1260 snprintf(buf, sizeof(buf), format, unit_description(u));
1264 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1265 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1266 SD_MESSAGE_UNIT_RELOADING;
1268 log_struct_unit(LOG_INFO,
1276 * -EBADR: This unit type does not support starting.
1277 * -EALREADY: Unit is already started.
1278 * -EAGAIN: An operation is already in progress. Retry later.
1279 * -ECANCELED: Too many requests for now.
1281 int unit_start(Unit *u) {
1282 UnitActiveState state;
1287 if (u->load_state != UNIT_LOADED)
1290 /* If this is already started, then this will succeed. Note
1291 * that this will even succeed if this unit is not startable
1292 * by the user. This is relied on to detect when we need to
1293 * wait for units and when waiting is finished. */
1294 state = unit_active_state(u);
1295 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1298 /* If the conditions failed, don't do anything at all. If we
1299 * already are activating this call might still be useful to
1300 * speed up activation in case there is some hold-off time,
1301 * but we don't want to recheck the condition in that case. */
1302 if (state != UNIT_ACTIVATING &&
1303 !unit_condition_test(u)) {
1304 log_debug_unit(u->id, "Starting of %s requested but condition failed. Ignoring.", u->id);
1308 /* Forward to the main object, if we aren't it. */
1309 following = unit_following(u);
1311 log_debug_unit(u->id, "Redirecting start request from %s to %s.",
1312 u->id, following->id);
1313 return unit_start(following);
1316 unit_status_log_starting_stopping_reloading(u, JOB_START);
1317 unit_status_print_starting_stopping(u, JOB_START);
1319 /* If it is stopped, but we cannot start it, then fail */
1320 if (!UNIT_VTABLE(u)->start)
1323 /* We don't suppress calls to ->start() here when we are
1324 * already starting, to allow this request to be used as a
1325 * "hurry up" call, for example when the unit is in some "auto
1326 * restart" state where it waits for a holdoff timer to elapse
1327 * before it will start again. */
1329 unit_add_to_dbus_queue(u);
1331 return UNIT_VTABLE(u)->start(u);
1334 bool unit_can_start(Unit *u) {
1337 return !!UNIT_VTABLE(u)->start;
1340 bool unit_can_isolate(Unit *u) {
1343 return unit_can_start(u) &&
1348 * -EBADR: This unit type does not support stopping.
1349 * -EALREADY: Unit is already stopped.
1350 * -EAGAIN: An operation is already in progress. Retry later.
1352 int unit_stop(Unit *u) {
1353 UnitActiveState state;
1358 state = unit_active_state(u);
1359 if (UNIT_IS_INACTIVE_OR_FAILED(state))
1362 if ((following = unit_following(u))) {
1363 log_debug_unit(u->id, "Redirecting stop request from %s to %s.",
1364 u->id, following->id);
1365 return unit_stop(following);
1368 unit_status_log_starting_stopping_reloading(u, JOB_STOP);
1369 unit_status_print_starting_stopping(u, JOB_STOP);
1371 if (!UNIT_VTABLE(u)->stop)
1374 unit_add_to_dbus_queue(u);
1376 return UNIT_VTABLE(u)->stop(u);
1380 * -EBADR: This unit type does not support reloading.
1381 * -ENOEXEC: Unit is not started.
1382 * -EAGAIN: An operation is already in progress. Retry later.
1384 int unit_reload(Unit *u) {
1385 UnitActiveState state;
1390 if (u->load_state != UNIT_LOADED)
1393 if (!unit_can_reload(u))
1396 state = unit_active_state(u);
1397 if (state == UNIT_RELOADING)
1400 if (state != UNIT_ACTIVE) {
1401 log_warning_unit(u->id, "Unit %s cannot be reloaded because it is inactive.",
1406 following = unit_following(u);
1408 log_debug_unit(u->id, "Redirecting reload request from %s to %s.",
1409 u->id, following->id);
1410 return unit_reload(following);
1413 unit_status_log_starting_stopping_reloading(u, JOB_RELOAD);
1415 unit_add_to_dbus_queue(u);
1416 return UNIT_VTABLE(u)->reload(u);
1419 bool unit_can_reload(Unit *u) {
1422 if (!UNIT_VTABLE(u)->reload)
1425 if (!UNIT_VTABLE(u)->can_reload)
1428 return UNIT_VTABLE(u)->can_reload(u);
1431 static void unit_check_unneeded(Unit *u) {
1437 /* If this service shall be shut down when unneeded then do
1440 if (!u->stop_when_unneeded)
1443 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1446 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
1447 if (unit_active_or_pending(other))
1450 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
1451 if (unit_active_or_pending(other))
1454 SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
1455 if (unit_active_or_pending(other))
1458 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1459 if (unit_active_or_pending(other))
1462 log_info_unit(u->id, "Service %s is not needed anymore. Stopping.", u->id);
1464 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1465 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1468 static void retroactively_start_dependencies(Unit *u) {
1473 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1475 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1476 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1477 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1478 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1480 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1481 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1482 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1483 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1485 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1486 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1487 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1488 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1490 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1491 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1492 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1493 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1495 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
1496 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1497 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1499 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
1500 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1501 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1504 static void retroactively_stop_dependencies(Unit *u) {
1509 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1511 /* Pull down units which are bound to us recursively if enabled */
1512 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1513 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1514 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1517 static void check_unneeded_dependencies(Unit *u) {
1522 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1524 /* Garbage collect services that might not be needed anymore, if enabled */
1525 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1526 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1527 unit_check_unneeded(other);
1528 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1529 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1530 unit_check_unneeded(other);
1531 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1532 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1533 unit_check_unneeded(other);
1534 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1535 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1536 unit_check_unneeded(other);
1537 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1538 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1539 unit_check_unneeded(other);
1540 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1541 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1542 unit_check_unneeded(other);
1545 void unit_start_on_failure(Unit *u) {
1551 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
1554 log_info_unit(u->id, "Triggering OnFailure= dependencies of %s.", u->id);
1556 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
1559 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, true, NULL, NULL);
1561 log_error_unit(u->id, "Failed to enqueue OnFailure= job: %s", strerror(-r));
1565 void unit_trigger_notify(Unit *u) {
1571 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1572 if (UNIT_VTABLE(other)->trigger_notify)
1573 UNIT_VTABLE(other)->trigger_notify(other, u);
1576 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
1581 assert(os < _UNIT_ACTIVE_STATE_MAX);
1582 assert(ns < _UNIT_ACTIVE_STATE_MAX);
1584 /* Note that this is called for all low-level state changes,
1585 * even if they might map to the same high-level
1586 * UnitActiveState! That means that ns == os is an expected
1587 * behavior here. For example: if a mount point is remounted
1588 * this function will be called too! */
1592 /* Update timestamps for state changes */
1593 if (m->n_reloading <= 0) {
1596 dual_timestamp_get(&ts);
1598 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
1599 u->inactive_exit_timestamp = ts;
1600 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
1601 u->inactive_enter_timestamp = ts;
1603 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
1604 u->active_enter_timestamp = ts;
1605 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
1606 u->active_exit_timestamp = ts;
1609 /* Keep track of failed units */
1610 if (ns == UNIT_FAILED && os != UNIT_FAILED)
1611 set_put(u->manager->failed_units, u);
1612 else if (os == UNIT_FAILED && ns != UNIT_FAILED)
1613 set_remove(u->manager->failed_units, u);
1615 /* Make sure the cgroup is always removed when we become inactive */
1616 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1617 unit_destroy_cgroup(u);
1619 /* Note that this doesn't apply to RemainAfterExit services exiting
1620 * successfully, since there's no change of state in that case. Which is
1621 * why it is handled in service_set_state() */
1622 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1625 ec = unit_get_exec_context(u);
1626 if (ec && exec_context_may_touch_console(ec)) {
1627 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1630 if (m->n_on_console == 0)
1631 /* unset no_console_output flag, since the console is free */
1632 m->no_console_output = false;
1641 if (u->job->state == JOB_WAITING)
1643 /* So we reached a different state for this
1644 * job. Let's see if we can run it now if it
1645 * failed previously due to EAGAIN. */
1646 job_add_to_run_queue(u->job);
1648 /* Let's check whether this state change constitutes a
1649 * finished job, or maybe contradicts a running job and
1650 * hence needs to invalidate jobs. */
1652 switch (u->job->type) {
1655 case JOB_VERIFY_ACTIVE:
1657 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1658 job_finish_and_invalidate(u->job, JOB_DONE, true);
1659 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1662 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1663 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1669 case JOB_RELOAD_OR_START:
1671 if (u->job->state == JOB_RUNNING) {
1672 if (ns == UNIT_ACTIVE)
1673 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
1674 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1677 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1678 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1686 case JOB_TRY_RESTART:
1688 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1689 job_finish_and_invalidate(u->job, JOB_DONE, true);
1690 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1692 job_finish_and_invalidate(u->job, JOB_FAILED, true);
1698 assert_not_reached("Job type unknown");
1704 if (m->n_reloading <= 0) {
1706 /* If this state change happened without being
1707 * requested by a job, then let's retroactively start
1708 * or stop dependencies. We skip that step when
1709 * deserializing, since we don't want to create any
1710 * additional jobs just because something is already
1714 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1715 retroactively_start_dependencies(u);
1716 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1717 retroactively_stop_dependencies(u);
1720 /* stop unneeded units regardless if going down was expected or not */
1721 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1722 check_unneeded_dependencies(u);
1724 if (ns != os && ns == UNIT_FAILED) {
1725 log_notice_unit(u->id, "Unit %s entered failed state.", u->id);
1726 unit_start_on_failure(u);
1730 /* Some names are special */
1731 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1733 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1734 /* The bus might have just become available,
1735 * hence try to connect to it, if we aren't
1739 if (u->type == UNIT_SERVICE &&
1740 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1741 m->n_reloading <= 0) {
1742 /* Write audit record if we have just finished starting up */
1743 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
1747 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1748 manager_send_unit_plymouth(m, u);
1752 /* We don't care about D-Bus here, since we'll get an
1753 * asynchronous notification for it anyway. */
1755 if (u->type == UNIT_SERVICE &&
1756 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1757 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1758 m->n_reloading <= 0) {
1760 /* Hmm, if there was no start record written
1761 * write it now, so that we always have a nice
1764 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1766 if (ns == UNIT_INACTIVE)
1767 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
1769 /* Write audit record if we have just finished shutting down */
1770 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1772 u->in_audit = false;
1776 manager_recheck_journal(m);
1777 unit_trigger_notify(u);
1779 /* Maybe we finished startup and are now ready for being
1780 * stopped because unneeded? */
1781 if (u->manager->n_reloading <= 0)
1782 unit_check_unneeded(u);
1784 unit_add_to_dbus_queue(u);
1785 unit_add_to_gc_queue(u);
1788 int unit_watch_pid(Unit *u, pid_t pid) {
1794 /* Watch a specific PID. We only support one or two units
1795 * watching each PID for now, not more. */
1797 r = set_ensure_allocated(&u->pids, trivial_hash_func, trivial_compare_func);
1801 r = hashmap_ensure_allocated(&u->manager->watch_pids1, trivial_hash_func, trivial_compare_func);
1805 r = hashmap_put(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1807 r = hashmap_ensure_allocated(&u->manager->watch_pids2, trivial_hash_func, trivial_compare_func);
1811 r = hashmap_put(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1814 q = set_put(u->pids, LONG_TO_PTR(pid));
1821 void unit_unwatch_pid(Unit *u, pid_t pid) {
1825 hashmap_remove_value(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1826 hashmap_remove_value(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1827 set_remove(u->pids, LONG_TO_PTR(pid));
1830 void unit_unwatch_all_pids(Unit *u) {
1833 while (!set_isempty(u->pids))
1834 unit_unwatch_pid(u, PTR_TO_LONG(set_first(u->pids)));
1840 static int unit_watch_pids_in_path(Unit *u, const char *path) {
1841 _cleanup_closedir_ DIR *d = NULL;
1842 _cleanup_fclose_ FILE *f = NULL;
1848 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
1850 r = cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER, path, &f);
1854 while ((r = cg_read_pid(f, &pid)) > 0) {
1855 r = unit_watch_pid(u, pid);
1856 if (r < 0 && ret >= 0)
1859 if (r < 0 && ret >= 0)
1862 } else if (ret >= 0)
1865 r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, path, &d);
1869 while ((r = cg_read_subgroup(d, &fn)) > 0) {
1870 _cleanup_free_ char *p = NULL;
1872 p = strjoin(path, "/", fn, NULL);
1878 r = unit_watch_pids_in_path(u, p);
1879 if (r < 0 && ret >= 0)
1882 if (r < 0 && ret >= 0)
1885 } else if (ret >= 0)
1891 int unit_watch_all_pids(Unit *u) {
1894 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
1896 if (!u->cgroup_path)
1899 return unit_watch_pids_in_path(u, u->cgroup_path);
1902 void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
1908 /* Cleans dead PIDs from our list */
1910 SET_FOREACH(e, u->pids, i) {
1911 pid_t pid = PTR_TO_LONG(e);
1913 if (pid == except1 || pid == except2)
1916 if (!pid_is_unwaited(pid))
1917 unit_unwatch_pid(u, pid);
1921 bool unit_job_is_applicable(Unit *u, JobType j) {
1923 assert(j >= 0 && j < _JOB_TYPE_MAX);
1927 case JOB_VERIFY_ACTIVE:
1934 case JOB_TRY_RESTART:
1935 return unit_can_start(u);
1938 return unit_can_reload(u);
1940 case JOB_RELOAD_OR_START:
1941 return unit_can_reload(u) && unit_can_start(u);
1944 assert_not_reached("Invalid job type");
1948 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1950 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1951 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1952 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1953 [UNIT_WANTS] = UNIT_WANTED_BY,
1954 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1955 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1956 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
1957 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
1958 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1959 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1960 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1961 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
1962 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
1963 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
1964 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
1965 [UNIT_BEFORE] = UNIT_AFTER,
1966 [UNIT_AFTER] = UNIT_BEFORE,
1967 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
1968 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1969 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
1970 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
1971 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
1972 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
1973 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
1974 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
1976 int r, q = 0, v = 0, w = 0;
1979 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1982 u = unit_follow_merge(u);
1983 other = unit_follow_merge(other);
1985 /* We won't allow dependencies on ourselves. We will not
1986 * consider them an error however. */
1990 r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func);
1994 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID) {
1995 r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func);
2000 if (add_reference) {
2001 r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func);
2005 r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func);
2010 q = set_put(u->dependencies[d], other);
2014 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2015 v = set_put(other->dependencies[inverse_table[d]], u);
2022 if (add_reference) {
2023 w = set_put(u->dependencies[UNIT_REFERENCES], other);
2029 r = set_put(other->dependencies[UNIT_REFERENCED_BY], u);
2034 unit_add_to_dbus_queue(u);
2039 set_remove(u->dependencies[d], other);
2042 set_remove(other->dependencies[inverse_table[d]], u);
2045 set_remove(u->dependencies[UNIT_REFERENCES], other);
2050 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
2055 if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
2058 if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
2064 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
2068 assert(name || path);
2072 name = basename(path);
2074 if (!unit_name_is_template(name)) {
2080 s = unit_name_replace_instance(name, u->instance);
2082 _cleanup_free_ char *i = NULL;
2084 i = unit_name_to_prefix(u->id);
2088 s = unit_name_replace_instance(name, i);
2098 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
2101 _cleanup_free_ char *s = NULL;
2104 assert(name || path);
2106 name = resolve_template(u, name, path, &s);
2110 r = manager_load_unit(u->manager, name, path, NULL, &other);
2114 return unit_add_dependency(u, d, other, add_reference);
2117 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
2120 _cleanup_free_ char *s = NULL;
2123 assert(name || path);
2125 if (!(name = resolve_template(u, name, path, &s)))
2128 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
2131 r = unit_add_two_dependencies(u, d, e, other, add_reference);
2136 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
2139 _cleanup_free_ char *s = NULL;
2142 assert(name || path);
2144 if (!(name = resolve_template(u, name, path, &s)))
2147 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
2150 r = unit_add_dependency(other, d, u, add_reference);
2155 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
2158 _cleanup_free_ char *s = NULL;
2161 assert(name || path);
2163 if (!(name = resolve_template(u, name, path, &s)))
2166 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
2169 if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
2175 int set_unit_path(const char *p) {
2176 /* This is mostly for debug purposes */
2177 if (setenv("SYSTEMD_UNIT_PATH", p, 0) < 0)
2183 char *unit_dbus_path(Unit *u) {
2189 return unit_dbus_path_from_name(u->id);
2192 char *unit_default_cgroup_path(Unit *u) {
2193 _cleanup_free_ char *escaped = NULL, *slice = NULL;
2198 if (unit_has_name(u, SPECIAL_ROOT_SLICE))
2199 return strdup(u->manager->cgroup_root);
2201 if (UNIT_ISSET(u->slice) && !unit_has_name(UNIT_DEREF(u->slice), SPECIAL_ROOT_SLICE)) {
2202 r = cg_slice_to_path(UNIT_DEREF(u->slice)->id, &slice);
2207 escaped = cg_escape(u->id);
2212 return strjoin(u->manager->cgroup_root, "/", slice, "/", escaped, NULL);
2214 return strjoin(u->manager->cgroup_root, "/", escaped, NULL);
2217 int unit_add_default_slice(Unit *u, CGroupContext *c) {
2218 _cleanup_free_ char *b = NULL;
2219 const char *slice_name;
2226 if (UNIT_ISSET(u->slice))
2230 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
2232 /* Implicitly place all instantiated units in their
2233 * own per-template slice */
2235 prefix = unit_name_to_prefix(u->id);
2239 /* The prefix is already escaped, but it might include
2240 * "-" which has a special meaning for slice units,
2241 * hence escape it here extra. */
2242 escaped = strreplace(prefix, "-", "\\x2d");
2246 if (u->manager->running_as == SYSTEMD_SYSTEM)
2247 b = strjoin("system-", escaped, ".slice", NULL);
2249 b = strappend(escaped, ".slice");
2256 u->manager->running_as == SYSTEMD_SYSTEM
2257 ? SPECIAL_SYSTEM_SLICE
2258 : SPECIAL_ROOT_SLICE;
2260 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
2264 unit_ref_set(&u->slice, slice);
2268 const char *unit_slice_name(Unit *u) {
2271 if (!UNIT_ISSET(u->slice))
2274 return UNIT_DEREF(u->slice)->id;
2277 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2278 _cleanup_free_ char *t = NULL;
2285 t = unit_name_change_suffix(u->id, type);
2289 assert(!unit_has_name(u, t));
2291 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2292 assert(r < 0 || *_found != u);
2296 int unit_watch_bus_name(Unit *u, const char *name) {
2300 /* Watch a specific name on the bus. We only support one unit
2301 * watching each name for now. */
2303 return hashmap_put(u->manager->watch_bus, name, u);
2306 void unit_unwatch_bus_name(Unit *u, const char *name) {
2310 hashmap_remove_value(u->manager->watch_bus, name, u);
2313 bool unit_can_serialize(Unit *u) {
2316 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2319 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2326 if (unit_can_serialize(u)) {
2329 r = UNIT_VTABLE(u)->serialize(u, f, fds);
2333 rt = unit_get_exec_runtime(u);
2335 r = exec_runtime_serialize(rt, u, f, fds);
2341 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2342 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2343 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2344 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2345 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2347 if (dual_timestamp_is_set(&u->condition_timestamp))
2348 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2350 unit_serialize_item(u, f, "transient", yes_no(u->transient));
2353 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
2355 if (serialize_jobs) {
2357 fprintf(f, "job\n");
2358 job_serialize(u->job, f, fds);
2362 fprintf(f, "job\n");
2363 job_serialize(u->nop_job, f, fds);
2372 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2383 va_start(ap, format);
2384 vfprintf(f, format, ap);
2390 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2396 fprintf(f, "%s=%s\n", key, value);
2399 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2400 ExecRuntime **rt = NULL;
2408 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2410 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2413 char line[LINE_MAX], *l, *v;
2416 if (!fgets(line, sizeof(line), f)) {
2429 k = strcspn(l, "=");
2437 if (streq(l, "job")) {
2439 /* new-style serialized job */
2440 Job *j = job_new_raw(u);
2444 r = job_deserialize(j, f, fds);
2450 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2456 r = job_install_deserialized(j);
2458 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2463 if (j->state == JOB_RUNNING)
2464 u->manager->n_running_jobs++;
2467 JobType type = job_type_from_string(v);
2469 log_debug("Failed to parse job type value %s", v);
2471 u->deserialized_job = type;
2474 } else if (streq(l, "inactive-exit-timestamp")) {
2475 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2477 } else if (streq(l, "active-enter-timestamp")) {
2478 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2480 } else if (streq(l, "active-exit-timestamp")) {
2481 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2483 } else if (streq(l, "inactive-enter-timestamp")) {
2484 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2486 } else if (streq(l, "condition-timestamp")) {
2487 dual_timestamp_deserialize(v, &u->condition_timestamp);
2489 } else if (streq(l, "condition-result")) {
2492 b = parse_boolean(v);
2494 log_debug("Failed to parse condition result value %s", v);
2496 u->condition_result = b;
2500 } else if (streq(l, "transient")) {
2503 b = parse_boolean(v);
2505 log_debug("Failed to parse transient bool %s", v);
2510 } else if (streq(l, "cgroup")) {
2517 if (u->cgroup_path) {
2520 p = hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
2521 log_info("Removing cgroup_path %s from hashmap (%p)",
2523 free(u->cgroup_path);
2527 assert(hashmap_put(u->manager->cgroup_unit, s, u) == 1);
2532 if (unit_can_serialize(u)) {
2534 r = exec_runtime_deserialize_item(rt, u, l, v, fds);
2541 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
2548 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2550 _cleanup_free_ char *e = NULL;
2558 /* Adds in links to the device node that this unit is based on */
2560 if (!is_device_path(what))
2563 e = unit_name_from_path(what, ".device");
2567 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2572 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2577 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2585 int unit_coldplug(Unit *u) {
2590 if (UNIT_VTABLE(u)->coldplug)
2591 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2595 r = job_coldplug(u->job);
2598 } else if (u->deserialized_job >= 0) {
2600 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2604 u->deserialized_job = _JOB_TYPE_INVALID;
2610 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
2611 DISABLE_WARNING_FORMAT_NONLITERAL;
2612 manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
2616 bool unit_need_daemon_reload(Unit *u) {
2617 _cleanup_strv_free_ char **t = NULL;
2620 unsigned loaded_cnt, current_cnt;
2624 if (u->fragment_path) {
2626 if (stat(u->fragment_path, &st) < 0)
2627 /* What, cannot access this anymore? */
2630 if (u->fragment_mtime > 0 &&
2631 timespec_load(&st.st_mtim) != u->fragment_mtime)
2635 if (u->source_path) {
2637 if (stat(u->source_path, &st) < 0)
2640 if (u->source_mtime > 0 &&
2641 timespec_load(&st.st_mtim) != u->source_mtime)
2645 t = unit_find_dropin_paths(u);
2646 loaded_cnt = strv_length(t);
2647 current_cnt = strv_length(u->dropin_paths);
2649 if (loaded_cnt == current_cnt) {
2650 if (loaded_cnt == 0)
2653 if (strv_overlap(u->dropin_paths, t)) {
2654 STRV_FOREACH(path, u->dropin_paths) {
2656 if (stat(*path, &st) < 0)
2659 if (u->dropin_mtime > 0 &&
2660 timespec_load(&st.st_mtim) > u->dropin_mtime)
2671 void unit_reset_failed(Unit *u) {
2674 if (UNIT_VTABLE(u)->reset_failed)
2675 UNIT_VTABLE(u)->reset_failed(u);
2678 Unit *unit_following(Unit *u) {
2681 if (UNIT_VTABLE(u)->following)
2682 return UNIT_VTABLE(u)->following(u);
2687 bool unit_stop_pending(Unit *u) {
2690 /* This call does check the current state of the unit. It's
2691 * hence useful to be called from state change calls of the
2692 * unit itself, where the state isn't updated yet. This is
2693 * different from unit_inactive_or_pending() which checks both
2694 * the current state and for a queued job. */
2696 return u->job && u->job->type == JOB_STOP;
2699 bool unit_inactive_or_pending(Unit *u) {
2702 /* Returns true if the unit is inactive or going down */
2704 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2707 if (unit_stop_pending(u))
2713 bool unit_active_or_pending(Unit *u) {
2716 /* Returns true if the unit is active or going up */
2718 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2722 (u->job->type == JOB_START ||
2723 u->job->type == JOB_RELOAD_OR_START ||
2724 u->job->type == JOB_RESTART))
2730 int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
2732 assert(w >= 0 && w < _KILL_WHO_MAX);
2734 assert(signo < _NSIG);
2736 if (!UNIT_VTABLE(u)->kill)
2739 return UNIT_VTABLE(u)->kill(u, w, signo, error);
2742 static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
2746 pid_set = set_new(trivial_hash_func, trivial_compare_func);
2750 /* Exclude the main/control pids from being killed via the cgroup */
2752 r = set_put(pid_set, LONG_TO_PTR(main_pid));
2757 if (control_pid > 0) {
2758 r = set_put(pid_set, LONG_TO_PTR(control_pid));
2770 int unit_kill_common(
2776 sd_bus_error *error) {
2780 if (who == KILL_MAIN && main_pid <= 0) {
2782 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
2784 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
2788 if (who == KILL_CONTROL && control_pid <= 0) {
2789 if (control_pid < 0)
2790 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
2792 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
2796 if (who == KILL_CONTROL || who == KILL_ALL)
2797 if (control_pid > 0)
2798 if (kill(control_pid, signo) < 0)
2801 if (who == KILL_MAIN || who == KILL_ALL)
2803 if (kill(main_pid, signo) < 0)
2806 if (who == KILL_ALL && u->cgroup_path) {
2807 _cleanup_set_free_ Set *pid_set = NULL;
2810 /* Exclude the main/control pids from being killed via the cgroup */
2811 pid_set = unit_pid_set(main_pid, control_pid);
2815 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, true, false, pid_set);
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, basename(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(refs, u->refs, ref);
2857 void unit_ref_unset(UnitRef *ref) {
2863 LIST_REMOVE(refs, ref->unit->refs, ref);
2867 int unit_patch_contexts(Unit *u) {
2875 /* Patch in the manager defaults into the exec and cgroup
2876 * contexts, _after_ the rest of the settings have been
2879 ec = unit_get_exec_context(u);
2881 /* This only copies in the ones that need memory */
2882 for (i = 0; i < _RLIMIT_MAX; i++)
2883 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
2884 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2889 if (u->manager->running_as == SYSTEMD_USER &&
2890 !ec->working_directory) {
2892 r = get_home_dir(&ec->working_directory);
2897 if (u->manager->running_as == SYSTEMD_USER &&
2898 (ec->syscall_whitelist ||
2899 !set_isempty(ec->syscall_filter) ||
2900 !set_isempty(ec->syscall_archs) ||
2901 ec->address_families_whitelist ||
2902 !set_isempty(ec->address_families)))
2903 ec->no_new_privileges = true;
2905 if (ec->private_devices)
2906 ec->capability_bounding_set_drop |= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD;
2909 cc = unit_get_cgroup_context(u);
2913 ec->private_devices &&
2914 cc->device_policy == CGROUP_AUTO)
2915 cc->device_policy = CGROUP_CLOSED;
2921 ExecContext *unit_get_exec_context(Unit *u) {
2928 offset = UNIT_VTABLE(u)->exec_context_offset;
2932 return (ExecContext*) ((uint8_t*) u + offset);
2935 KillContext *unit_get_kill_context(Unit *u) {
2942 offset = UNIT_VTABLE(u)->kill_context_offset;
2946 return (KillContext*) ((uint8_t*) u + offset);
2949 CGroupContext *unit_get_cgroup_context(Unit *u) {
2955 offset = UNIT_VTABLE(u)->cgroup_context_offset;
2959 return (CGroupContext*) ((uint8_t*) u + offset);
2962 ExecRuntime *unit_get_exec_runtime(Unit *u) {
2968 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2972 return *(ExecRuntime**) ((uint8_t*) u + offset);
2975 static int unit_drop_in_dir(Unit *u, UnitSetPropertiesMode mode, bool transient, char **dir) {
2976 if (u->manager->running_as == SYSTEMD_USER) {
2979 r = user_config_home(dir);
2985 if (mode == UNIT_PERSISTENT && !transient)
2986 *dir = strdup("/etc/systemd/system");
2988 *dir = strdup("/run/systemd/system");
2995 static int unit_drop_in_file(Unit *u,
2996 UnitSetPropertiesMode mode, const char *name, char **p, char **q) {
2997 _cleanup_free_ char *dir = NULL;
3002 r = unit_drop_in_dir(u, mode, u->transient, &dir);
3006 return drop_in_file(dir, u->id, 50, name, p, q);
3009 int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
3011 _cleanup_free_ char *dir = NULL;
3016 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3019 r = unit_drop_in_dir(u, mode, u->transient, &dir);
3023 return write_drop_in(dir, u->id, 50, name, data);
3026 int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3027 _cleanup_free_ char *p = NULL;
3035 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3038 va_start(ap, format);
3039 r = vasprintf(&p, format, ap);
3045 return unit_write_drop_in(u, mode, name, p);
3048 int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
3049 _cleanup_free_ char *ndata = NULL;
3055 if (!UNIT_VTABLE(u)->private_section)
3058 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3061 ndata = strjoin("[", UNIT_VTABLE(u)->private_section, "]\n", data, NULL);
3065 return unit_write_drop_in(u, mode, name, ndata);
3068 int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3069 _cleanup_free_ char *p = NULL;
3077 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3080 va_start(ap, format);
3081 r = vasprintf(&p, format, ap);
3087 return unit_write_drop_in_private(u, mode, name, p);
3090 int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name) {
3091 _cleanup_free_ char *p = NULL, *q = NULL;
3096 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3099 r = unit_drop_in_file(u, mode, name, &p, &q);
3104 r = errno == ENOENT ? 0 : -errno;
3112 int unit_make_transient(Unit *u) {
3117 u->load_state = UNIT_STUB;
3119 u->transient = true;
3121 free(u->fragment_path);
3122 u->fragment_path = NULL;
3124 if (u->manager->running_as == SYSTEMD_USER) {
3125 _cleanup_free_ char *c = NULL;
3127 r = user_config_home(&c);
3133 u->fragment_path = strjoin(c, "/", u->id, NULL);
3134 if (!u->fragment_path)
3139 u->fragment_path = strappend("/run/systemd/system/", u->id);
3140 if (!u->fragment_path)
3143 mkdir_p("/run/systemd/system", 0755);
3146 return write_string_file_atomic_label(u->fragment_path, "# Transient stub");
3149 int unit_kill_context(
3155 bool main_pid_alien) {
3157 int sig, wait_for_exit = false, r;
3162 if (c->kill_mode == KILL_NONE)
3165 sig = sigkill ? SIGKILL : c->kill_signal;
3168 r = kill_and_sigcont(main_pid, sig);
3170 if (r < 0 && r != -ESRCH) {
3171 _cleanup_free_ char *comm = NULL;
3172 get_process_comm(main_pid, &comm);
3174 log_warning_unit(u->id, "Failed to kill main process " PID_FMT " (%s): %s", main_pid, strna(comm), strerror(-r));
3176 if (!main_pid_alien)
3177 wait_for_exit = true;
3179 if (c->send_sighup && !sigkill)
3180 kill(main_pid, SIGHUP);
3184 if (control_pid > 0) {
3185 r = kill_and_sigcont(control_pid, sig);
3187 if (r < 0 && r != -ESRCH) {
3188 _cleanup_free_ char *comm = NULL;
3189 get_process_comm(control_pid, &comm);
3191 log_warning_unit(u->id, "Failed to kill control process " PID_FMT " (%s): %s", control_pid, strna(comm), strerror(-r));
3193 wait_for_exit = true;
3195 if (c->send_sighup && !sigkill)
3196 kill(control_pid, SIGHUP);
3200 if ((c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && sigkill)) && u->cgroup_path) {
3201 _cleanup_set_free_ Set *pid_set = NULL;
3203 /* Exclude the main/control pids from being killed via the cgroup */
3204 pid_set = unit_pid_set(main_pid, control_pid);
3208 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, sig, true, true, false, pid_set);
3210 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
3211 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
3214 /* FIXME: For now, we will not wait for the
3215 * cgroup members to die, simply because
3216 * cgroup notification is unreliable. It
3217 * doesn't work at all in containers, and
3218 * outside of containers it can be confused
3219 * easily by leaving directories in the
3222 /* wait_for_exit = true; */
3224 if (c->send_sighup && !sigkill) {
3227 pid_set = unit_pid_set(main_pid, control_pid);
3231 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, SIGHUP, false, true, false, pid_set);
3236 return wait_for_exit;
3239 int unit_require_mounts_for(Unit *u, const char *path) {
3240 char prefix[strlen(path) + 1], *p;
3246 /* Registers a unit for requiring a certain path and all its
3247 * prefixes. We keep a simple array of these paths in the
3248 * unit, since its usually short. However, we build a prefix
3249 * table for all possible prefixes so that new appearing mount
3250 * units can easily determine which units to make themselves a
3253 if (!path_is_absolute(path))
3260 path_kill_slashes(p);
3262 if (!path_is_safe(p)) {
3267 if (strv_contains(u->requires_mounts_for, p)) {
3272 r = strv_consume(&u->requires_mounts_for, p);
3276 PATH_FOREACH_PREFIX_MORE(prefix, p) {
3279 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3283 if (!u->manager->units_requiring_mounts_for) {
3284 u->manager->units_requiring_mounts_for = hashmap_new(string_hash_func, string_compare_func);
3285 if (!u->manager->units_requiring_mounts_for)
3293 x = set_new(NULL, NULL);
3299 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3315 int unit_setup_exec_runtime(Unit *u) {
3321 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3324 /* Check if ther already is an ExecRuntime for this unit? */
3325 rt = (ExecRuntime**) ((uint8_t*) u + offset);
3329 /* Try to get it from somebody else */
3330 SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3332 *rt = unit_get_exec_runtime(other);
3334 exec_runtime_ref(*rt);
3339 return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3342 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3343 [UNIT_ACTIVE] = "active",
3344 [UNIT_RELOADING] = "reloading",
3345 [UNIT_INACTIVE] = "inactive",
3346 [UNIT_FAILED] = "failed",
3347 [UNIT_ACTIVATING] = "activating",
3348 [UNIT_DEACTIVATING] = "deactivating"
3351 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
3353 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
3354 [UNIT_REQUIRES] = "Requires",
3355 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
3356 [UNIT_REQUISITE] = "Requisite",
3357 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
3358 [UNIT_WANTS] = "Wants",
3359 [UNIT_BINDS_TO] = "BindsTo",
3360 [UNIT_PART_OF] = "PartOf",
3361 [UNIT_REQUIRED_BY] = "RequiredBy",
3362 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
3363 [UNIT_WANTED_BY] = "WantedBy",
3364 [UNIT_BOUND_BY] = "BoundBy",
3365 [UNIT_CONSISTS_OF] = "ConsistsOf",
3366 [UNIT_CONFLICTS] = "Conflicts",
3367 [UNIT_CONFLICTED_BY] = "ConflictedBy",
3368 [UNIT_BEFORE] = "Before",
3369 [UNIT_AFTER] = "After",
3370 [UNIT_ON_FAILURE] = "OnFailure",
3371 [UNIT_TRIGGERS] = "Triggers",
3372 [UNIT_TRIGGERED_BY] = "TriggeredBy",
3373 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
3374 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
3375 [UNIT_JOINS_NAMESPACE_OF] = "JoinsNamespaceOf",
3376 [UNIT_REFERENCES] = "References",
3377 [UNIT_REFERENCED_BY] = "ReferencedBy",
3380 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);