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 static int maybe_warn_about_dependency(const char *id, const char *other, UnitDependency dependency);
74 Unit *unit_new(Manager *m, size_t size) {
78 assert(size >= sizeof(Unit));
84 u->names = set_new(&string_hash_ops);
91 u->type = _UNIT_TYPE_INVALID;
92 u->deserialized_job = _JOB_TYPE_INVALID;
93 u->default_dependencies = true;
94 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
95 u->on_failure_job_mode = JOB_REPLACE;
100 bool unit_has_name(Unit *u, const char *name) {
104 return !!set_get(u->names, (char*) name);
107 static void unit_init(Unit *u) {
114 assert(u->type >= 0);
116 cc = unit_get_cgroup_context(u);
118 cgroup_context_init(cc);
120 /* Copy in the manager defaults into the cgroup
121 * context, _before_ the rest of the settings have
122 * been initialized */
124 cc->cpu_accounting = u->manager->default_cpu_accounting;
125 cc->blockio_accounting = u->manager->default_blockio_accounting;
126 cc->memory_accounting = u->manager->default_memory_accounting;
129 ec = unit_get_exec_context(u);
131 exec_context_init(ec);
133 kc = unit_get_kill_context(u);
135 kill_context_init(kc);
137 if (UNIT_VTABLE(u)->init)
138 UNIT_VTABLE(u)->init(u);
141 int unit_add_name(Unit *u, const char *text) {
142 _cleanup_free_ char *s = NULL, *i = NULL;
149 if (unit_name_is_template(text)) {
154 s = unit_name_replace_instance(text, u->instance);
160 if (!unit_name_is_valid(s, TEMPLATE_INVALID))
163 assert_se((t = unit_name_to_type(s)) >= 0);
165 if (u->type != _UNIT_TYPE_INVALID && t != u->type)
168 r = unit_name_to_instance(s, &i);
172 if (i && unit_vtable[t]->no_instances)
175 /* Ensure that this unit is either instanced or not instanced,
177 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i)
180 if (unit_vtable[t]->no_alias &&
181 !set_isempty(u->names) &&
182 !set_get(u->names, s))
185 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES)
188 r = set_put(u->names, s);
196 r = hashmap_put(u->manager->units, s, u);
198 set_remove(u->names, s);
202 if (u->type == _UNIT_TYPE_INVALID) {
207 LIST_PREPEND(units_by_type, u->manager->units_by_type[t], u);
216 unit_add_to_dbus_queue(u);
220 int unit_choose_id(Unit *u, const char *name) {
221 _cleanup_free_ char *t = NULL;
228 if (unit_name_is_template(name)) {
233 t = unit_name_replace_instance(name, u->instance);
240 /* Selects one of the names of this unit as the id */
241 s = set_get(u->names, (char*) name);
245 r = unit_name_to_instance(s, &i);
254 unit_add_to_dbus_queue(u);
259 int unit_set_description(Unit *u, const char *description) {
264 if (isempty(description))
267 s = strdup(description);
272 free(u->description);
275 unit_add_to_dbus_queue(u);
279 bool unit_check_gc(Unit *u) {
282 if (UNIT_VTABLE(u)->no_gc)
294 if (unit_active_state(u) != UNIT_INACTIVE)
300 if (UNIT_VTABLE(u)->check_gc)
301 if (UNIT_VTABLE(u)->check_gc(u))
307 void unit_add_to_load_queue(Unit *u) {
309 assert(u->type != _UNIT_TYPE_INVALID);
311 if (u->load_state != UNIT_STUB || u->in_load_queue)
314 LIST_PREPEND(load_queue, u->manager->load_queue, u);
315 u->in_load_queue = true;
318 void unit_add_to_cleanup_queue(Unit *u) {
321 if (u->in_cleanup_queue)
324 LIST_PREPEND(cleanup_queue, u->manager->cleanup_queue, u);
325 u->in_cleanup_queue = true;
328 void unit_add_to_gc_queue(Unit *u) {
331 if (u->in_gc_queue || u->in_cleanup_queue)
334 if (unit_check_gc(u))
337 LIST_PREPEND(gc_queue, u->manager->gc_queue, u);
338 u->in_gc_queue = true;
340 u->manager->n_in_gc_queue ++;
343 void unit_add_to_dbus_queue(Unit *u) {
345 assert(u->type != _UNIT_TYPE_INVALID);
347 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
350 /* Shortcut things if nobody cares */
351 if (sd_bus_track_count(u->manager->subscribed) <= 0 &&
352 set_isempty(u->manager->private_buses)) {
353 u->sent_dbus_new_signal = true;
357 LIST_PREPEND(dbus_queue, u->manager->dbus_unit_queue, u);
358 u->in_dbus_queue = true;
361 static void bidi_set_free(Unit *u, Set *s) {
367 /* Frees the set and makes sure we are dropped from the
368 * inverse pointers */
370 SET_FOREACH(other, s, i) {
373 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
374 set_remove(other->dependencies[d], u);
376 unit_add_to_gc_queue(other);
382 static void unit_remove_transient(Unit *u) {
390 if (u->fragment_path)
391 unlink(u->fragment_path);
393 STRV_FOREACH(i, u->dropin_paths) {
394 _cleanup_free_ char *p = NULL;
399 r = path_get_parent(*i, &p);
405 static void unit_free_requires_mounts_for(Unit *u) {
408 STRV_FOREACH(j, u->requires_mounts_for) {
409 char s[strlen(*j) + 1];
411 PATH_FOREACH_PREFIX_MORE(s, *j) {
415 x = hashmap_get2(u->manager->units_requiring_mounts_for, s, (void**) &y);
421 if (set_isempty(x)) {
422 hashmap_remove(u->manager->units_requiring_mounts_for, y);
429 strv_free(u->requires_mounts_for);
430 u->requires_mounts_for = NULL;
433 static void unit_done(Unit *u) {
442 if (UNIT_VTABLE(u)->done)
443 UNIT_VTABLE(u)->done(u);
445 ec = unit_get_exec_context(u);
447 exec_context_done(ec);
449 cc = unit_get_cgroup_context(u);
451 cgroup_context_done(cc);
454 void unit_free(Unit *u) {
461 if (u->manager->n_reloading <= 0)
462 unit_remove_transient(u);
464 bus_unit_send_removed_signal(u);
468 unit_free_requires_mounts_for(u);
470 SET_FOREACH(t, u->names, i)
471 hashmap_remove_value(u->manager->units, t, u);
485 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
486 bidi_set_free(u, u->dependencies[d]);
488 if (u->type != _UNIT_TYPE_INVALID)
489 LIST_REMOVE(units_by_type, u->manager->units_by_type[u->type], u);
491 if (u->in_load_queue)
492 LIST_REMOVE(load_queue, u->manager->load_queue, u);
494 if (u->in_dbus_queue)
495 LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u);
497 if (u->in_cleanup_queue)
498 LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
500 if (u->in_gc_queue) {
501 LIST_REMOVE(gc_queue, u->manager->gc_queue, u);
502 u->manager->n_in_gc_queue--;
505 if (u->in_cgroup_queue)
506 LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u);
508 if (u->cgroup_path) {
509 hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
510 free(u->cgroup_path);
513 set_remove(u->manager->failed_units, u);
514 set_remove(u->manager->startup_units, u);
516 free(u->description);
517 strv_free(u->documentation);
518 free(u->fragment_path);
519 free(u->source_path);
520 strv_free(u->dropin_paths);
523 set_free_free(u->names);
525 unit_unwatch_all_pids(u);
527 condition_free_list(u->conditions);
529 unit_ref_unset(&u->slice);
532 unit_ref_unset(u->refs);
537 UnitActiveState unit_active_state(Unit *u) {
540 if (u->load_state == UNIT_MERGED)
541 return unit_active_state(unit_follow_merge(u));
543 /* After a reload it might happen that a unit is not correctly
544 * loaded but still has a process around. That's why we won't
545 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
547 return UNIT_VTABLE(u)->active_state(u);
550 const char* unit_sub_state_to_string(Unit *u) {
553 return UNIT_VTABLE(u)->sub_state_to_string(u);
556 static void complete_move(Set **s, Set **other) {
564 set_move(*s, *other);
571 static void merge_names(Unit *u, Unit *other) {
578 complete_move(&u->names, &other->names);
580 set_free_free(other->names);
584 SET_FOREACH(t, u->names, i)
585 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
588 static int reserve_dependencies(Unit *u, Unit *other, UnitDependency d) {
593 assert(d < _UNIT_DEPENDENCY_MAX);
596 * If u does not have this dependency set allocated, there is no need
597 * to reserve anything. In that case other's set will be transfered
598 * as a whole to u by complete_move().
600 if (!u->dependencies[d])
603 /* merge_dependencies() will skip a u-on-u dependency */
604 n_reserve = set_size(other->dependencies[d]) - !!set_get(other->dependencies[d], u);
606 return set_reserve(u->dependencies[d], n_reserve);
609 static void merge_dependencies(Unit *u, Unit *other, const char *other_id, UnitDependency d) {
616 assert(d < _UNIT_DEPENDENCY_MAX);
618 /* Fix backwards pointers */
619 SET_FOREACH(back, other->dependencies[d], i) {
622 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
623 /* Do not add dependencies between u and itself */
625 if (set_remove(back->dependencies[k], other))
626 maybe_warn_about_dependency(u->id, other_id, k);
628 r = set_remove_and_put(back->dependencies[k], other, u);
630 set_remove(back->dependencies[k], other);
632 assert(r >= 0 || r == -ENOENT);
637 /* Also do not move dependencies on u to itself */
638 back = set_remove(other->dependencies[d], u);
640 maybe_warn_about_dependency(u->id, other_id, d);
642 complete_move(&u->dependencies[d], &other->dependencies[d]);
644 set_free(other->dependencies[d]);
645 other->dependencies[d] = NULL;
648 int unit_merge(Unit *u, Unit *other) {
650 const char *other_id = NULL;
655 assert(u->manager == other->manager);
656 assert(u->type != _UNIT_TYPE_INVALID);
658 other = unit_follow_merge(other);
663 if (u->type != other->type)
666 if (!u->instance != !other->instance)
669 if (other->load_state != UNIT_STUB &&
670 other->load_state != UNIT_NOT_FOUND)
679 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
683 other_id = strdupa(other->id);
685 /* Make reservations to ensure merge_dependencies() won't fail */
686 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
687 r = reserve_dependencies(u, other, d);
689 * We don't rollback reservations if we fail. We don't have
690 * a way to undo reservations. A reservation is not a leak.
697 merge_names(u, other);
699 /* Redirect all references */
701 unit_ref_set(other->refs, u);
703 /* Merge dependencies */
704 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
705 merge_dependencies(u, other, other_id, d);
707 other->load_state = UNIT_MERGED;
708 other->merged_into = u;
710 /* If there is still some data attached to the other node, we
711 * don't need it anymore, and can free it. */
712 if (other->load_state != UNIT_STUB)
713 if (UNIT_VTABLE(other)->done)
714 UNIT_VTABLE(other)->done(other);
716 unit_add_to_dbus_queue(u);
717 unit_add_to_cleanup_queue(other);
722 int unit_merge_by_name(Unit *u, const char *name) {
725 _cleanup_free_ char *s = NULL;
730 if (unit_name_is_template(name)) {
734 s = unit_name_replace_instance(name, u->instance);
741 other = manager_get_unit(u->manager, name);
743 r = unit_add_name(u, name);
745 r = unit_merge(u, other);
750 Unit* unit_follow_merge(Unit *u) {
753 while (u->load_state == UNIT_MERGED)
754 assert_se(u = u->merged_into);
759 int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
765 if (c->working_directory) {
766 r = unit_require_mounts_for(u, c->working_directory);
771 if (c->root_directory) {
772 r = unit_require_mounts_for(u, c->root_directory);
777 if (u->manager->running_as != SYSTEMD_SYSTEM)
780 if (c->private_tmp) {
781 r = unit_require_mounts_for(u, "/tmp");
785 r = unit_require_mounts_for(u, "/var/tmp");
790 if (c->std_output != EXEC_OUTPUT_KMSG &&
791 c->std_output != EXEC_OUTPUT_SYSLOG &&
792 c->std_output != EXEC_OUTPUT_JOURNAL &&
793 c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
794 c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
795 c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
796 c->std_error != EXEC_OUTPUT_KMSG &&
797 c->std_error != EXEC_OUTPUT_SYSLOG &&
798 c->std_error != EXEC_OUTPUT_JOURNAL &&
799 c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
800 c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
801 c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
804 /* If syslog or kernel logging is requested, make sure our own
805 * logging daemon is run first. */
807 r = unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true);
814 const char *unit_description(Unit *u) {
818 return u->description;
823 void unit_dump(Unit *u, FILE *f, const char *prefix) {
829 timestamp1[FORMAT_TIMESTAMP_MAX],
830 timestamp2[FORMAT_TIMESTAMP_MAX],
831 timestamp3[FORMAT_TIMESTAMP_MAX],
832 timestamp4[FORMAT_TIMESTAMP_MAX],
833 timespan[FORMAT_TIMESPAN_MAX];
835 _cleanup_set_free_ Set *following_set = NULL;
839 assert(u->type >= 0);
841 prefix = strempty(prefix);
842 prefix2 = strappenda(prefix, "\t");
846 "%s\tDescription: %s\n"
848 "%s\tUnit Load State: %s\n"
849 "%s\tUnit Active State: %s\n"
850 "%s\tInactive Exit Timestamp: %s\n"
851 "%s\tActive Enter Timestamp: %s\n"
852 "%s\tActive Exit Timestamp: %s\n"
853 "%s\tInactive Enter Timestamp: %s\n"
854 "%s\tGC Check Good: %s\n"
855 "%s\tNeed Daemon Reload: %s\n"
856 "%s\tTransient: %s\n"
859 "%s\tCGroup realized: %s\n"
860 "%s\tCGroup mask: 0x%x\n"
861 "%s\tCGroup members mask: 0x%x\n",
863 prefix, unit_description(u),
864 prefix, strna(u->instance),
865 prefix, unit_load_state_to_string(u->load_state),
866 prefix, unit_active_state_to_string(unit_active_state(u)),
867 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
868 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
869 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
870 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
871 prefix, yes_no(unit_check_gc(u)),
872 prefix, yes_no(unit_need_daemon_reload(u)),
873 prefix, yes_no(u->transient),
874 prefix, strna(unit_slice_name(u)),
875 prefix, strna(u->cgroup_path),
876 prefix, yes_no(u->cgroup_realized),
877 prefix, u->cgroup_realized_mask,
878 prefix, u->cgroup_members_mask);
880 SET_FOREACH(t, u->names, i)
881 fprintf(f, "%s\tName: %s\n", prefix, t);
883 STRV_FOREACH(j, u->documentation)
884 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
886 following = unit_following(u);
888 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
890 r = unit_following_set(u, &following_set);
894 SET_FOREACH(other, following_set, i)
895 fprintf(f, "%s\tFollowing Set Member: %s\n", prefix, other->id);
898 if (u->fragment_path)
899 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
902 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
904 STRV_FOREACH(j, u->dropin_paths)
905 fprintf(f, "%s\tDropIn Path: %s\n", prefix, *j);
907 if (u->job_timeout > 0)
908 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout, 0));
910 condition_dump_list(u->conditions, f, prefix);
912 if (dual_timestamp_is_set(&u->condition_timestamp))
914 "%s\tCondition Timestamp: %s\n"
915 "%s\tCondition Result: %s\n",
916 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
917 prefix, yes_no(u->condition_result));
919 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
922 SET_FOREACH(other, u->dependencies[d], i)
923 fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
926 if (!strv_isempty(u->requires_mounts_for)) {
928 "%s\tRequiresMountsFor:", prefix);
930 STRV_FOREACH(j, u->requires_mounts_for)
931 fprintf(f, " %s", *j);
936 if (u->load_state == UNIT_LOADED) {
939 "%s\tStopWhenUnneeded: %s\n"
940 "%s\tRefuseManualStart: %s\n"
941 "%s\tRefuseManualStop: %s\n"
942 "%s\tDefaultDependencies: %s\n"
943 "%s\tOnFailureJobMode: %s\n"
944 "%s\tIgnoreOnIsolate: %s\n"
945 "%s\tIgnoreOnSnapshot: %s\n",
946 prefix, yes_no(u->stop_when_unneeded),
947 prefix, yes_no(u->refuse_manual_start),
948 prefix, yes_no(u->refuse_manual_stop),
949 prefix, yes_no(u->default_dependencies),
950 prefix, job_mode_to_string(u->on_failure_job_mode),
951 prefix, yes_no(u->ignore_on_isolate),
952 prefix, yes_no(u->ignore_on_snapshot));
954 if (UNIT_VTABLE(u)->dump)
955 UNIT_VTABLE(u)->dump(u, f, prefix2);
957 } else if (u->load_state == UNIT_MERGED)
959 "%s\tMerged into: %s\n",
960 prefix, u->merged_into->id);
961 else if (u->load_state == UNIT_ERROR)
962 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
966 job_dump(u->job, f, prefix2);
969 job_dump(u->nop_job, f, prefix2);
973 /* Common implementation for multiple backends */
974 int unit_load_fragment_and_dropin(Unit *u) {
979 /* Load a .{service,socket,...} file */
980 r = unit_load_fragment(u);
984 if (u->load_state == UNIT_STUB)
987 /* Load drop-in directory data */
988 r = unit_load_dropin(unit_follow_merge(u));
995 /* Common implementation for multiple backends */
996 int unit_load_fragment_and_dropin_optional(Unit *u) {
1001 /* Same as unit_load_fragment_and_dropin(), but whether
1002 * something can be loaded or not doesn't matter. */
1004 /* Load a .service file */
1005 r = unit_load_fragment(u);
1009 if (u->load_state == UNIT_STUB)
1010 u->load_state = UNIT_LOADED;
1012 /* Load drop-in directory data */
1013 r = unit_load_dropin(unit_follow_merge(u));
1020 int unit_add_default_target_dependency(Unit *u, Unit *target) {
1024 if (target->type != UNIT_TARGET)
1027 /* Only add the dependency if both units are loaded, so that
1028 * that loop check below is reliable */
1029 if (u->load_state != UNIT_LOADED ||
1030 target->load_state != UNIT_LOADED)
1033 /* If either side wants no automatic dependencies, then let's
1035 if (!u->default_dependencies ||
1036 !target->default_dependencies)
1039 /* Don't create loops */
1040 if (set_get(target->dependencies[UNIT_BEFORE], u))
1043 return unit_add_dependency(target, UNIT_AFTER, u, true);
1046 static int unit_add_target_dependencies(Unit *u) {
1048 static const UnitDependency deps[] = {
1050 UNIT_REQUIRED_BY_OVERRIDABLE,
1062 for (k = 0; k < ELEMENTSOF(deps); k++)
1063 SET_FOREACH(target, u->dependencies[deps[k]], i) {
1064 r = unit_add_default_target_dependency(u, target);
1072 static int unit_add_slice_dependencies(Unit *u) {
1075 if (!unit_get_cgroup_context(u))
1078 if (UNIT_ISSET(u->slice))
1079 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, UNIT_DEREF(u->slice), true);
1081 if (streq(u->id, SPECIAL_ROOT_SLICE))
1084 return unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, SPECIAL_ROOT_SLICE, NULL, true);
1087 static int unit_add_mount_dependencies(Unit *u) {
1093 STRV_FOREACH(i, u->requires_mounts_for) {
1094 char prefix[strlen(*i) + 1];
1096 PATH_FOREACH_PREFIX_MORE(prefix, *i) {
1099 r = manager_get_unit_by_path(u->manager, prefix, ".mount", &m);
1107 if (m->load_state != UNIT_LOADED)
1110 r = unit_add_dependency(u, UNIT_AFTER, m, true);
1114 if (m->fragment_path) {
1115 r = unit_add_dependency(u, UNIT_REQUIRES, m, true);
1125 static int unit_add_startup_units(Unit *u) {
1129 c = unit_get_cgroup_context(u);
1133 if (c->startup_cpu_shares == (unsigned long) -1 &&
1134 c->startup_blockio_weight == (unsigned long) -1)
1137 r = set_put(u->manager->startup_units, u);
1144 int unit_load(Unit *u) {
1149 if (u->in_load_queue) {
1150 LIST_REMOVE(load_queue, u->manager->load_queue, u);
1151 u->in_load_queue = false;
1154 if (u->type == _UNIT_TYPE_INVALID)
1157 if (u->load_state != UNIT_STUB)
1160 if (UNIT_VTABLE(u)->load) {
1161 r = UNIT_VTABLE(u)->load(u);
1166 if (u->load_state == UNIT_STUB) {
1171 if (u->load_state == UNIT_LOADED) {
1173 r = unit_add_target_dependencies(u);
1177 r = unit_add_slice_dependencies(u);
1181 r = unit_add_mount_dependencies(u);
1185 r = unit_add_startup_units(u);
1189 if (u->on_failure_job_mode == JOB_ISOLATE && set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
1190 log_error_unit(u->id, "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u->id);
1195 unit_update_cgroup_members_masks(u);
1198 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
1200 unit_add_to_dbus_queue(unit_follow_merge(u));
1201 unit_add_to_gc_queue(u);
1206 u->load_state = u->load_state == UNIT_STUB ? UNIT_NOT_FOUND : UNIT_ERROR;
1208 unit_add_to_dbus_queue(u);
1209 unit_add_to_gc_queue(u);
1211 log_debug_unit(u->id, "Failed to load configuration for %s: %s",
1212 u->id, strerror(-r));
1217 static bool unit_condition_test(Unit *u) {
1220 dual_timestamp_get(&u->condition_timestamp);
1221 u->condition_result = condition_test_list(u->id, u->conditions);
1223 return u->condition_result;
1226 _pure_ static const char* unit_get_status_message_format(Unit *u, JobType t) {
1227 const UnitStatusMessageFormats *format_table;
1231 assert(t < _JOB_TYPE_MAX);
1233 if (t != JOB_START && t != JOB_STOP)
1236 format_table = &UNIT_VTABLE(u)->status_message_formats;
1240 return format_table->starting_stopping[t == JOB_STOP];
1243 _pure_ static const char *unit_get_status_message_format_try_harder(Unit *u, JobType t) {
1248 assert(t < _JOB_TYPE_MAX);
1250 format = unit_get_status_message_format(u, t);
1254 /* Return generic strings */
1256 return "Starting %s.";
1257 else if (t == JOB_STOP)
1258 return "Stopping %s.";
1259 else if (t == JOB_RELOAD)
1260 return "Reloading %s.";
1265 static void unit_status_print_starting_stopping(Unit *u, JobType t) {
1270 /* We only print status messages for selected units on
1271 * selected operations. */
1273 format = unit_get_status_message_format(u, t);
1277 DISABLE_WARNING_FORMAT_NONLITERAL;
1278 unit_status_printf(u, "", format);
1282 static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1289 if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1292 if (log_on_console())
1295 /* We log status messages for all units and all operations. */
1297 format = unit_get_status_message_format_try_harder(u, t);
1301 DISABLE_WARNING_FORMAT_NONLITERAL;
1302 snprintf(buf, sizeof(buf), format, unit_description(u));
1306 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1307 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1308 SD_MESSAGE_UNIT_RELOADING;
1310 log_struct_unit(LOG_INFO,
1318 * -EBADR: This unit type does not support starting.
1319 * -EALREADY: Unit is already started.
1320 * -EAGAIN: An operation is already in progress. Retry later.
1321 * -ECANCELED: Too many requests for now.
1323 int unit_start(Unit *u) {
1324 UnitActiveState state;
1329 if (u->load_state != UNIT_LOADED)
1332 /* If this is already started, then this will succeed. Note
1333 * that this will even succeed if this unit is not startable
1334 * by the user. This is relied on to detect when we need to
1335 * wait for units and when waiting is finished. */
1336 state = unit_active_state(u);
1337 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1340 /* If the conditions failed, don't do anything at all. If we
1341 * already are activating this call might still be useful to
1342 * speed up activation in case there is some hold-off time,
1343 * but we don't want to recheck the condition in that case. */
1344 if (state != UNIT_ACTIVATING &&
1345 !unit_condition_test(u)) {
1346 log_debug_unit(u->id, "Starting of %s requested but condition failed. Ignoring.", u->id);
1350 /* Forward to the main object, if we aren't it. */
1351 following = unit_following(u);
1353 log_debug_unit(u->id, "Redirecting start request from %s to %s.",
1354 u->id, following->id);
1355 return unit_start(following);
1358 unit_status_log_starting_stopping_reloading(u, JOB_START);
1359 unit_status_print_starting_stopping(u, JOB_START);
1361 /* If it is stopped, but we cannot start it, then fail */
1362 if (!UNIT_VTABLE(u)->start)
1365 /* We don't suppress calls to ->start() here when we are
1366 * already starting, to allow this request to be used as a
1367 * "hurry up" call, for example when the unit is in some "auto
1368 * restart" state where it waits for a holdoff timer to elapse
1369 * before it will start again. */
1371 unit_add_to_dbus_queue(u);
1373 return UNIT_VTABLE(u)->start(u);
1376 bool unit_can_start(Unit *u) {
1379 return !!UNIT_VTABLE(u)->start;
1382 bool unit_can_isolate(Unit *u) {
1385 return unit_can_start(u) &&
1390 * -EBADR: This unit type does not support stopping.
1391 * -EALREADY: Unit is already stopped.
1392 * -EAGAIN: An operation is already in progress. Retry later.
1394 int unit_stop(Unit *u) {
1395 UnitActiveState state;
1400 state = unit_active_state(u);
1401 if (UNIT_IS_INACTIVE_OR_FAILED(state))
1404 if ((following = unit_following(u))) {
1405 log_debug_unit(u->id, "Redirecting stop request from %s to %s.",
1406 u->id, following->id);
1407 return unit_stop(following);
1410 unit_status_log_starting_stopping_reloading(u, JOB_STOP);
1411 unit_status_print_starting_stopping(u, JOB_STOP);
1413 if (!UNIT_VTABLE(u)->stop)
1416 unit_add_to_dbus_queue(u);
1418 return UNIT_VTABLE(u)->stop(u);
1422 * -EBADR: This unit type does not support reloading.
1423 * -ENOEXEC: Unit is not started.
1424 * -EAGAIN: An operation is already in progress. Retry later.
1426 int unit_reload(Unit *u) {
1427 UnitActiveState state;
1432 if (u->load_state != UNIT_LOADED)
1435 if (!unit_can_reload(u))
1438 state = unit_active_state(u);
1439 if (state == UNIT_RELOADING)
1442 if (state != UNIT_ACTIVE) {
1443 log_warning_unit(u->id, "Unit %s cannot be reloaded because it is inactive.",
1448 following = unit_following(u);
1450 log_debug_unit(u->id, "Redirecting reload request from %s to %s.",
1451 u->id, following->id);
1452 return unit_reload(following);
1455 unit_status_log_starting_stopping_reloading(u, JOB_RELOAD);
1457 unit_add_to_dbus_queue(u);
1458 return UNIT_VTABLE(u)->reload(u);
1461 bool unit_can_reload(Unit *u) {
1464 if (!UNIT_VTABLE(u)->reload)
1467 if (!UNIT_VTABLE(u)->can_reload)
1470 return UNIT_VTABLE(u)->can_reload(u);
1473 static void unit_check_unneeded(Unit *u) {
1479 /* If this service shall be shut down when unneeded then do
1482 if (!u->stop_when_unneeded)
1485 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1488 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
1489 if (unit_active_or_pending(other))
1492 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
1493 if (unit_active_or_pending(other))
1496 SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
1497 if (unit_active_or_pending(other))
1500 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1501 if (unit_active_or_pending(other))
1504 log_info_unit(u->id, "Unit %s is not needed anymore. Stopping.", u->id);
1506 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1507 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1510 static void unit_check_binds_to(Unit *u) {
1520 if (unit_active_state(u) != UNIT_ACTIVE)
1523 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i) {
1527 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
1536 log_info_unit(u->id, "Unit %s is bound to inactive service. Stopping, too.", u->id);
1538 /* A unit we need to run is gone. Sniff. Let's stop this. */
1539 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1542 static void retroactively_start_dependencies(Unit *u) {
1547 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1549 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1550 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1551 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1552 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1554 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1555 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1556 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1557 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1559 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1560 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1561 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1562 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1564 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1565 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1566 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1567 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1569 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
1570 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1571 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1573 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
1574 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1575 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1578 static void retroactively_stop_dependencies(Unit *u) {
1583 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1585 /* Pull down units which are bound to us recursively if enabled */
1586 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1587 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1588 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1591 static void check_unneeded_dependencies(Unit *u) {
1596 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1598 /* Garbage collect services that might not be needed anymore, if enabled */
1599 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1600 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1601 unit_check_unneeded(other);
1602 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1603 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1604 unit_check_unneeded(other);
1605 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1606 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1607 unit_check_unneeded(other);
1608 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1609 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1610 unit_check_unneeded(other);
1611 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1612 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1613 unit_check_unneeded(other);
1614 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1615 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1616 unit_check_unneeded(other);
1619 void unit_start_on_failure(Unit *u) {
1625 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
1628 log_info_unit(u->id, "Triggering OnFailure= dependencies of %s.", u->id);
1630 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
1633 r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, true, NULL, NULL);
1635 log_error_unit(u->id, "Failed to enqueue OnFailure= job: %s", strerror(-r));
1639 void unit_trigger_notify(Unit *u) {
1645 SET_FOREACH(other, u->dependencies[UNIT_TRIGGERED_BY], i)
1646 if (UNIT_VTABLE(other)->trigger_notify)
1647 UNIT_VTABLE(other)->trigger_notify(other, u);
1650 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
1655 assert(os < _UNIT_ACTIVE_STATE_MAX);
1656 assert(ns < _UNIT_ACTIVE_STATE_MAX);
1658 /* Note that this is called for all low-level state changes,
1659 * even if they might map to the same high-level
1660 * UnitActiveState! That means that ns == os is an expected
1661 * behavior here. For example: if a mount point is remounted
1662 * this function will be called too! */
1666 /* Update timestamps for state changes */
1667 if (m->n_reloading <= 0) {
1670 dual_timestamp_get(&ts);
1672 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
1673 u->inactive_exit_timestamp = ts;
1674 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
1675 u->inactive_enter_timestamp = ts;
1677 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
1678 u->active_enter_timestamp = ts;
1679 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
1680 u->active_exit_timestamp = ts;
1683 /* Keep track of failed units */
1684 if (ns == UNIT_FAILED)
1685 set_put(u->manager->failed_units, u);
1687 set_remove(u->manager->failed_units, u);
1689 /* Make sure the cgroup is always removed when we become inactive */
1690 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1691 unit_destroy_cgroup(u);
1693 /* Note that this doesn't apply to RemainAfterExit services exiting
1694 * successfully, since there's no change of state in that case. Which is
1695 * why it is handled in service_set_state() */
1696 if (UNIT_IS_INACTIVE_OR_FAILED(os) != UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1699 ec = unit_get_exec_context(u);
1700 if (ec && exec_context_may_touch_console(ec)) {
1701 if (UNIT_IS_INACTIVE_OR_FAILED(ns)) {
1704 if (m->n_on_console == 0)
1705 /* unset no_console_output flag, since the console is free */
1706 m->no_console_output = false;
1715 if (u->job->state == JOB_WAITING)
1717 /* So we reached a different state for this
1718 * job. Let's see if we can run it now if it
1719 * failed previously due to EAGAIN. */
1720 job_add_to_run_queue(u->job);
1722 /* Let's check whether this state change constitutes a
1723 * finished job, or maybe contradicts a running job and
1724 * hence needs to invalidate jobs. */
1726 switch (u->job->type) {
1729 case JOB_VERIFY_ACTIVE:
1731 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1732 job_finish_and_invalidate(u->job, JOB_DONE, true);
1733 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1736 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1737 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1743 case JOB_RELOAD_OR_START:
1745 if (u->job->state == JOB_RUNNING) {
1746 if (ns == UNIT_ACTIVE)
1747 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
1748 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1751 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1752 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1760 case JOB_TRY_RESTART:
1762 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1763 job_finish_and_invalidate(u->job, JOB_DONE, true);
1764 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1766 job_finish_and_invalidate(u->job, JOB_FAILED, true);
1772 assert_not_reached("Job type unknown");
1778 if (m->n_reloading <= 0) {
1780 /* If this state change happened without being
1781 * requested by a job, then let's retroactively start
1782 * or stop dependencies. We skip that step when
1783 * deserializing, since we don't want to create any
1784 * additional jobs just because something is already
1788 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1789 retroactively_start_dependencies(u);
1790 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1791 retroactively_stop_dependencies(u);
1794 /* stop unneeded units regardless if going down was expected or not */
1795 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1796 check_unneeded_dependencies(u);
1798 if (ns != os && ns == UNIT_FAILED) {
1799 log_notice_unit(u->id, "Unit %s entered failed state.", u->id);
1800 unit_start_on_failure(u);
1804 /* Some names are special */
1805 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1807 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1808 /* The bus might have just become available,
1809 * hence try to connect to it, if we aren't
1813 if (u->type == UNIT_SERVICE &&
1814 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1815 m->n_reloading <= 0) {
1816 /* Write audit record if we have just finished starting up */
1817 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, true);
1821 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1822 manager_send_unit_plymouth(m, u);
1826 /* We don't care about D-Bus here, since we'll get an
1827 * asynchronous notification for it anyway. */
1829 if (u->type == UNIT_SERVICE &&
1830 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1831 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1832 m->n_reloading <= 0) {
1834 /* Hmm, if there was no start record written
1835 * write it now, so that we always have a nice
1838 manager_send_unit_audit(m, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1840 if (ns == UNIT_INACTIVE)
1841 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, true);
1843 /* Write audit record if we have just finished shutting down */
1844 manager_send_unit_audit(m, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1846 u->in_audit = false;
1850 manager_recheck_journal(m);
1851 unit_trigger_notify(u);
1853 if (u->manager->n_reloading <= 0) {
1854 /* Maybe we finished startup and are now ready for
1855 * being stopped because unneeded? */
1856 unit_check_unneeded(u);
1858 /* Maybe we finished startup, but something we needed
1859 * has vanished? Let's die then. (This happens when
1860 * something BindsTo= to a Type=oneshot unit, as these
1861 * units go directly from starting to inactive,
1862 * without ever entering started.) */
1863 unit_check_binds_to(u);
1866 unit_add_to_dbus_queue(u);
1867 unit_add_to_gc_queue(u);
1870 int unit_watch_pid(Unit *u, pid_t pid) {
1876 /* Watch a specific PID. We only support one or two units
1877 * watching each PID for now, not more. */
1879 r = set_ensure_allocated(&u->pids, NULL);
1883 r = hashmap_ensure_allocated(&u->manager->watch_pids1, NULL);
1887 r = hashmap_put(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1889 r = hashmap_ensure_allocated(&u->manager->watch_pids2, NULL);
1893 r = hashmap_put(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1896 q = set_put(u->pids, LONG_TO_PTR(pid));
1903 void unit_unwatch_pid(Unit *u, pid_t pid) {
1907 hashmap_remove_value(u->manager->watch_pids1, LONG_TO_PTR(pid), u);
1908 hashmap_remove_value(u->manager->watch_pids2, LONG_TO_PTR(pid), u);
1909 set_remove(u->pids, LONG_TO_PTR(pid));
1912 void unit_unwatch_all_pids(Unit *u) {
1915 while (!set_isempty(u->pids))
1916 unit_unwatch_pid(u, PTR_TO_LONG(set_first(u->pids)));
1922 static int unit_watch_pids_in_path(Unit *u, const char *path) {
1923 _cleanup_closedir_ DIR *d = NULL;
1924 _cleanup_fclose_ FILE *f = NULL;
1930 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
1932 r = cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER, path, &f);
1936 while ((r = cg_read_pid(f, &pid)) > 0) {
1937 r = unit_watch_pid(u, pid);
1938 if (r < 0 && ret >= 0)
1941 if (r < 0 && ret >= 0)
1944 } else if (ret >= 0)
1947 r = cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER, path, &d);
1951 while ((r = cg_read_subgroup(d, &fn)) > 0) {
1952 _cleanup_free_ char *p = NULL;
1954 p = strjoin(path, "/", fn, NULL);
1960 r = unit_watch_pids_in_path(u, p);
1961 if (r < 0 && ret >= 0)
1964 if (r < 0 && ret >= 0)
1967 } else if (ret >= 0)
1973 int unit_watch_all_pids(Unit *u) {
1976 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
1978 if (!u->cgroup_path)
1981 return unit_watch_pids_in_path(u, u->cgroup_path);
1984 void unit_tidy_watch_pids(Unit *u, pid_t except1, pid_t except2) {
1990 /* Cleans dead PIDs from our list */
1992 SET_FOREACH(e, u->pids, i) {
1993 pid_t pid = PTR_TO_LONG(e);
1995 if (pid == except1 || pid == except2)
1998 if (!pid_is_unwaited(pid))
1999 unit_unwatch_pid(u, pid);
2003 bool unit_job_is_applicable(Unit *u, JobType j) {
2005 assert(j >= 0 && j < _JOB_TYPE_MAX);
2009 case JOB_VERIFY_ACTIVE:
2016 case JOB_TRY_RESTART:
2017 return unit_can_start(u);
2020 return unit_can_reload(u);
2022 case JOB_RELOAD_OR_START:
2023 return unit_can_reload(u) && unit_can_start(u);
2026 assert_not_reached("Invalid job type");
2030 static int maybe_warn_about_dependency(const char *id, const char *other, UnitDependency dependency) {
2033 switch (dependency) {
2035 case UNIT_REQUIRES_OVERRIDABLE:
2037 case UNIT_REQUISITE:
2038 case UNIT_REQUISITE_OVERRIDABLE:
2041 case UNIT_REQUIRED_BY:
2042 case UNIT_REQUIRED_BY_OVERRIDABLE:
2043 case UNIT_WANTED_BY:
2045 case UNIT_CONSISTS_OF:
2046 case UNIT_REFERENCES:
2047 case UNIT_REFERENCED_BY:
2048 case UNIT_PROPAGATES_RELOAD_TO:
2049 case UNIT_RELOAD_PROPAGATED_FROM:
2050 case UNIT_JOINS_NAMESPACE_OF:
2053 case UNIT_CONFLICTS:
2054 case UNIT_CONFLICTED_BY:
2057 case UNIT_ON_FAILURE:
2059 case UNIT_TRIGGERED_BY:
2060 if (streq_ptr(id, other))
2061 log_warning_unit(id, "Dependency %s=%s dropped from unit %s",
2062 unit_dependency_to_string(dependency), id, other);
2064 log_warning_unit(id, "Dependency %s=%s dropped from unit %s merged into %s",
2065 unit_dependency_to_string(dependency), id,
2069 case _UNIT_DEPENDENCY_MAX:
2070 case _UNIT_DEPENDENCY_INVALID:
2074 assert_not_reached("Invalid dependency type");
2077 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
2079 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
2080 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
2081 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
2082 [UNIT_WANTS] = UNIT_WANTED_BY,
2083 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
2084 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
2085 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
2086 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
2087 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
2088 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
2089 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
2090 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
2091 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
2092 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
2093 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
2094 [UNIT_BEFORE] = UNIT_AFTER,
2095 [UNIT_AFTER] = UNIT_BEFORE,
2096 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
2097 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
2098 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
2099 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
2100 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
2101 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
2102 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
2103 [UNIT_JOINS_NAMESPACE_OF] = UNIT_JOINS_NAMESPACE_OF,
2105 int r, q = 0, v = 0, w = 0;
2106 Unit *orig_u = u, *orig_other = other;
2109 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
2112 u = unit_follow_merge(u);
2113 other = unit_follow_merge(other);
2115 /* We won't allow dependencies on ourselves. We will not
2116 * consider them an error however. */
2118 maybe_warn_about_dependency(orig_u->id, orig_other->id, d);
2122 r = set_ensure_allocated(&u->dependencies[d], NULL);
2126 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID) {
2127 r = set_ensure_allocated(&other->dependencies[inverse_table[d]], NULL);
2132 if (add_reference) {
2133 r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], NULL);
2137 r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], NULL);
2142 q = set_put(u->dependencies[d], other);
2146 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID && inverse_table[d] != d) {
2147 v = set_put(other->dependencies[inverse_table[d]], u);
2154 if (add_reference) {
2155 w = set_put(u->dependencies[UNIT_REFERENCES], other);
2161 r = set_put(other->dependencies[UNIT_REFERENCED_BY], u);
2166 unit_add_to_dbus_queue(u);
2171 set_remove(u->dependencies[d], other);
2174 set_remove(other->dependencies[inverse_table[d]], u);
2177 set_remove(u->dependencies[UNIT_REFERENCES], other);
2182 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
2187 r = unit_add_dependency(u, d, other, add_reference);
2191 r = unit_add_dependency(u, e, other, add_reference);
2198 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
2202 assert(name || path);
2206 name = basename(path);
2208 if (!unit_name_is_template(name)) {
2214 s = unit_name_replace_instance(name, u->instance);
2216 _cleanup_free_ char *i = NULL;
2218 i = unit_name_to_prefix(u->id);
2222 s = unit_name_replace_instance(name, i);
2232 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
2235 _cleanup_free_ char *s = NULL;
2238 assert(name || path);
2240 name = resolve_template(u, name, path, &s);
2244 r = manager_load_unit(u->manager, name, path, NULL, &other);
2248 return unit_add_dependency(u, d, other, add_reference);
2251 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
2252 _cleanup_free_ char *s = NULL;
2257 assert(name || path);
2259 name = resolve_template(u, name, path, &s);
2263 r = manager_load_unit(u->manager, name, path, NULL, &other);
2267 return unit_add_two_dependencies(u, d, e, other, add_reference);
2270 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
2273 _cleanup_free_ char *s = NULL;
2276 assert(name || path);
2278 name = resolve_template(u, name, path, &s);
2282 r = manager_load_unit(u->manager, name, path, NULL, &other);
2286 return unit_add_dependency(other, d, u, add_reference);
2289 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
2292 _cleanup_free_ char *s = NULL;
2295 assert(name || path);
2297 name = resolve_template(u, name, path, &s);
2301 r = manager_load_unit(u->manager, name, path, NULL, &other);
2305 r = unit_add_two_dependencies(other, d, e, u, add_reference);
2312 int set_unit_path(const char *p) {
2313 /* This is mostly for debug purposes */
2314 if (setenv("SYSTEMD_UNIT_PATH", p, 0) < 0)
2320 char *unit_dbus_path(Unit *u) {
2326 return unit_dbus_path_from_name(u->id);
2329 char *unit_default_cgroup_path(Unit *u) {
2330 _cleanup_free_ char *escaped = NULL, *slice = NULL;
2335 if (unit_has_name(u, SPECIAL_ROOT_SLICE))
2336 return strdup(u->manager->cgroup_root);
2338 if (UNIT_ISSET(u->slice) && !unit_has_name(UNIT_DEREF(u->slice), SPECIAL_ROOT_SLICE)) {
2339 r = cg_slice_to_path(UNIT_DEREF(u->slice)->id, &slice);
2344 escaped = cg_escape(u->id);
2349 return strjoin(u->manager->cgroup_root, "/", slice, "/", escaped, NULL);
2351 return strjoin(u->manager->cgroup_root, "/", escaped, NULL);
2354 int unit_add_default_slice(Unit *u, CGroupContext *c) {
2355 _cleanup_free_ char *b = NULL;
2356 const char *slice_name;
2363 if (UNIT_ISSET(u->slice))
2367 _cleanup_free_ char *prefix = NULL, *escaped = NULL;
2369 /* Implicitly place all instantiated units in their
2370 * own per-template slice */
2372 prefix = unit_name_to_prefix(u->id);
2376 /* The prefix is already escaped, but it might include
2377 * "-" which has a special meaning for slice units,
2378 * hence escape it here extra. */
2379 escaped = strreplace(prefix, "-", "\\x2d");
2383 if (u->manager->running_as == SYSTEMD_SYSTEM)
2384 b = strjoin("system-", escaped, ".slice", NULL);
2386 b = strappend(escaped, ".slice");
2393 u->manager->running_as == SYSTEMD_SYSTEM
2394 ? SPECIAL_SYSTEM_SLICE
2395 : SPECIAL_ROOT_SLICE;
2397 r = manager_load_unit(u->manager, slice_name, NULL, NULL, &slice);
2401 unit_ref_set(&u->slice, slice);
2405 const char *unit_slice_name(Unit *u) {
2408 if (!UNIT_ISSET(u->slice))
2411 return UNIT_DEREF(u->slice)->id;
2414 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2415 _cleanup_free_ char *t = NULL;
2422 t = unit_name_change_suffix(u->id, type);
2426 assert(!unit_has_name(u, t));
2428 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2429 assert(r < 0 || *_found != u);
2433 int unit_watch_bus_name(Unit *u, const char *name) {
2437 /* Watch a specific name on the bus. We only support one unit
2438 * watching each name for now. */
2440 return hashmap_put(u->manager->watch_bus, name, u);
2443 void unit_unwatch_bus_name(Unit *u, const char *name) {
2447 hashmap_remove_value(u->manager->watch_bus, name, u);
2450 bool unit_can_serialize(Unit *u) {
2453 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2456 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2463 if (unit_can_serialize(u)) {
2466 r = UNIT_VTABLE(u)->serialize(u, f, fds);
2470 rt = unit_get_exec_runtime(u);
2472 r = exec_runtime_serialize(rt, u, f, fds);
2478 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2479 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2480 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2481 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2482 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2484 if (dual_timestamp_is_set(&u->condition_timestamp))
2485 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2487 unit_serialize_item(u, f, "transient", yes_no(u->transient));
2490 unit_serialize_item(u, f, "cgroup", u->cgroup_path);
2492 if (serialize_jobs) {
2494 fprintf(f, "job\n");
2495 job_serialize(u->job, f, fds);
2499 fprintf(f, "job\n");
2500 job_serialize(u->nop_job, f, fds);
2509 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2520 va_start(ap, format);
2521 vfprintf(f, format, ap);
2527 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2533 fprintf(f, "%s=%s\n", key, value);
2536 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2537 ExecRuntime **rt = NULL;
2545 offset = UNIT_VTABLE(u)->exec_runtime_offset;
2547 rt = (ExecRuntime**) ((uint8_t*) u + offset);
2550 char line[LINE_MAX], *l, *v;
2553 if (!fgets(line, sizeof(line), f)) {
2566 k = strcspn(l, "=");
2574 if (streq(l, "job")) {
2576 /* new-style serialized job */
2577 Job *j = job_new_raw(u);
2581 r = job_deserialize(j, f, fds);
2587 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2593 r = job_install_deserialized(j);
2595 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2600 if (j->state == JOB_RUNNING)
2601 u->manager->n_running_jobs++;
2604 JobType type = job_type_from_string(v);
2606 log_debug("Failed to parse job type value %s", v);
2608 u->deserialized_job = type;
2611 } else if (streq(l, "inactive-exit-timestamp")) {
2612 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2614 } else if (streq(l, "active-enter-timestamp")) {
2615 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2617 } else if (streq(l, "active-exit-timestamp")) {
2618 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2620 } else if (streq(l, "inactive-enter-timestamp")) {
2621 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2623 } else if (streq(l, "condition-timestamp")) {
2624 dual_timestamp_deserialize(v, &u->condition_timestamp);
2626 } else if (streq(l, "condition-result")) {
2629 b = parse_boolean(v);
2631 log_debug("Failed to parse condition result value %s", v);
2633 u->condition_result = b;
2637 } else if (streq(l, "transient")) {
2640 b = parse_boolean(v);
2642 log_debug("Failed to parse transient bool %s", v);
2647 } else if (streq(l, "cgroup")) {
2654 if (u->cgroup_path) {
2657 p = hashmap_remove(u->manager->cgroup_unit, u->cgroup_path);
2658 log_info("Removing cgroup_path %s from hashmap (%p)",
2660 free(u->cgroup_path);
2664 assert(hashmap_put(u->manager->cgroup_unit, s, u) == 1);
2669 if (unit_can_serialize(u)) {
2671 r = exec_runtime_deserialize_item(rt, u, l, v, fds);
2678 r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds);
2685 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2687 _cleanup_free_ char *e = NULL;
2695 /* Adds in links to the device node that this unit is based on */
2697 if (!is_device_path(what))
2700 e = unit_name_from_path(what, ".device");
2704 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2709 r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true);
2714 r = unit_add_dependency(device, UNIT_WANTS, u, false);
2722 int unit_coldplug(Unit *u) {
2727 if (UNIT_VTABLE(u)->coldplug)
2728 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2732 r = job_coldplug(u->job);
2735 } else if (u->deserialized_job >= 0) {
2737 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2741 u->deserialized_job = _JOB_TYPE_INVALID;
2747 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) {
2748 DISABLE_WARNING_FORMAT_NONLITERAL;
2749 manager_status_printf(u->manager, false, status, unit_status_msg_format, unit_description(u));
2753 bool unit_need_daemon_reload(Unit *u) {
2754 _cleanup_strv_free_ char **t = NULL;
2757 unsigned loaded_cnt, current_cnt;
2761 if (u->fragment_path) {
2763 if (stat(u->fragment_path, &st) < 0)
2764 /* What, cannot access this anymore? */
2767 if (u->fragment_mtime > 0 &&
2768 timespec_load(&st.st_mtim) != u->fragment_mtime)
2772 if (u->source_path) {
2774 if (stat(u->source_path, &st) < 0)
2777 if (u->source_mtime > 0 &&
2778 timespec_load(&st.st_mtim) != u->source_mtime)
2782 t = unit_find_dropin_paths(u);
2783 loaded_cnt = strv_length(t);
2784 current_cnt = strv_length(u->dropin_paths);
2786 if (loaded_cnt == current_cnt) {
2787 if (loaded_cnt == 0)
2790 if (strv_overlap(u->dropin_paths, t)) {
2791 STRV_FOREACH(path, u->dropin_paths) {
2793 if (stat(*path, &st) < 0)
2796 if (u->dropin_mtime > 0 &&
2797 timespec_load(&st.st_mtim) > u->dropin_mtime)
2808 void unit_reset_failed(Unit *u) {
2811 if (UNIT_VTABLE(u)->reset_failed)
2812 UNIT_VTABLE(u)->reset_failed(u);
2815 Unit *unit_following(Unit *u) {
2818 if (UNIT_VTABLE(u)->following)
2819 return UNIT_VTABLE(u)->following(u);
2824 bool unit_stop_pending(Unit *u) {
2827 /* This call does check the current state of the unit. It's
2828 * hence useful to be called from state change calls of the
2829 * unit itself, where the state isn't updated yet. This is
2830 * different from unit_inactive_or_pending() which checks both
2831 * the current state and for a queued job. */
2833 return u->job && u->job->type == JOB_STOP;
2836 bool unit_inactive_or_pending(Unit *u) {
2839 /* Returns true if the unit is inactive or going down */
2841 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2844 if (unit_stop_pending(u))
2850 bool unit_active_or_pending(Unit *u) {
2853 /* Returns true if the unit is active or going up */
2855 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2859 (u->job->type == JOB_START ||
2860 u->job->type == JOB_RELOAD_OR_START ||
2861 u->job->type == JOB_RESTART))
2867 int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error) {
2869 assert(w >= 0 && w < _KILL_WHO_MAX);
2871 assert(signo < _NSIG);
2873 if (!UNIT_VTABLE(u)->kill)
2876 return UNIT_VTABLE(u)->kill(u, w, signo, error);
2879 static Set *unit_pid_set(pid_t main_pid, pid_t control_pid) {
2883 pid_set = set_new(NULL);
2887 /* Exclude the main/control pids from being killed via the cgroup */
2889 r = set_put(pid_set, LONG_TO_PTR(main_pid));
2894 if (control_pid > 0) {
2895 r = set_put(pid_set, LONG_TO_PTR(control_pid));
2907 int unit_kill_common(
2913 sd_bus_error *error) {
2917 if (who == KILL_MAIN && main_pid <= 0) {
2919 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no main processes", unit_type_to_string(u->type));
2921 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No main process to kill");
2925 if (who == KILL_CONTROL && control_pid <= 0) {
2926 if (control_pid < 0)
2927 sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_PROCESS, "%s units have no control processes", unit_type_to_string(u->type));
2929 sd_bus_error_set_const(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill");
2933 if (who == KILL_CONTROL || who == KILL_ALL)
2934 if (control_pid > 0)
2935 if (kill(control_pid, signo) < 0)
2938 if (who == KILL_MAIN || who == KILL_ALL)
2940 if (kill(main_pid, signo) < 0)
2943 if (who == KILL_ALL && u->cgroup_path) {
2944 _cleanup_set_free_ Set *pid_set = NULL;
2947 /* Exclude the main/control pids from being killed via the cgroup */
2948 pid_set = unit_pid_set(main_pid, control_pid);
2952 q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, signo, false, true, false, pid_set);
2953 if (q < 0 && q != -EAGAIN && q != -ESRCH && q != -ENOENT)
2960 int unit_following_set(Unit *u, Set **s) {
2964 if (UNIT_VTABLE(u)->following_set)
2965 return UNIT_VTABLE(u)->following_set(u, s);
2971 UnitFileState unit_get_unit_file_state(Unit *u) {
2974 if (u->unit_file_state < 0 && u->fragment_path)
2975 u->unit_file_state = unit_file_get_state(
2976 u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2977 NULL, basename(u->fragment_path));
2979 return u->unit_file_state;
2982 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2987 unit_ref_unset(ref);
2990 LIST_PREPEND(refs, u->refs, ref);
2994 void unit_ref_unset(UnitRef *ref) {
3000 LIST_REMOVE(refs, ref->unit->refs, ref);
3004 int unit_patch_contexts(Unit *u) {
3012 /* Patch in the manager defaults into the exec and cgroup
3013 * contexts, _after_ the rest of the settings have been
3016 ec = unit_get_exec_context(u);
3018 /* This only copies in the ones that need memory */
3019 for (i = 0; i < _RLIMIT_MAX; i++)
3020 if (u->manager->rlimit[i] && !ec->rlimit[i]) {
3021 ec->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
3026 if (u->manager->running_as == SYSTEMD_USER &&
3027 !ec->working_directory) {
3029 r = get_home_dir(&ec->working_directory);
3034 if (u->manager->running_as == SYSTEMD_USER &&
3035 (ec->syscall_whitelist ||
3036 !set_isempty(ec->syscall_filter) ||
3037 !set_isempty(ec->syscall_archs) ||
3038 ec->address_families_whitelist ||
3039 !set_isempty(ec->address_families)))
3040 ec->no_new_privileges = true;
3042 if (ec->private_devices)
3043 ec->capability_bounding_set_drop |= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD;
3046 cc = unit_get_cgroup_context(u);
3050 ec->private_devices &&
3051 cc->device_policy == CGROUP_AUTO)
3052 cc->device_policy = CGROUP_CLOSED;
3058 ExecContext *unit_get_exec_context(Unit *u) {
3065 offset = UNIT_VTABLE(u)->exec_context_offset;
3069 return (ExecContext*) ((uint8_t*) u + offset);
3072 KillContext *unit_get_kill_context(Unit *u) {
3079 offset = UNIT_VTABLE(u)->kill_context_offset;
3083 return (KillContext*) ((uint8_t*) u + offset);
3086 CGroupContext *unit_get_cgroup_context(Unit *u) {
3092 offset = UNIT_VTABLE(u)->cgroup_context_offset;
3096 return (CGroupContext*) ((uint8_t*) u + offset);
3099 ExecRuntime *unit_get_exec_runtime(Unit *u) {
3105 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3109 return *(ExecRuntime**) ((uint8_t*) u + offset);
3112 static int unit_drop_in_dir(Unit *u, UnitSetPropertiesMode mode, bool transient, char **dir) {
3113 if (u->manager->running_as == SYSTEMD_USER) {
3116 if (mode == UNIT_PERSISTENT && !transient)
3117 r = user_config_home(dir);
3119 r = user_runtime_dir(dir);
3126 if (mode == UNIT_PERSISTENT && !transient)
3127 *dir = strdup("/etc/systemd/system");
3129 *dir = strdup("/run/systemd/system");
3136 static int unit_drop_in_file(Unit *u,
3137 UnitSetPropertiesMode mode, const char *name, char **p, char **q) {
3138 _cleanup_free_ char *dir = NULL;
3143 r = unit_drop_in_dir(u, mode, u->transient, &dir);
3147 return drop_in_file(dir, u->id, 50, name, p, q);
3150 int unit_write_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
3152 _cleanup_free_ char *dir = NULL;
3157 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3160 r = unit_drop_in_dir(u, mode, u->transient, &dir);
3164 return write_drop_in(dir, u->id, 50, name, data);
3167 int unit_write_drop_in_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3168 _cleanup_free_ char *p = NULL;
3176 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3179 va_start(ap, format);
3180 r = vasprintf(&p, format, ap);
3186 return unit_write_drop_in(u, mode, name, p);
3189 int unit_write_drop_in_private(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *data) {
3190 _cleanup_free_ char *ndata = NULL;
3196 if (!UNIT_VTABLE(u)->private_section)
3199 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3202 ndata = strjoin("[", UNIT_VTABLE(u)->private_section, "]\n", data, NULL);
3206 return unit_write_drop_in(u, mode, name, ndata);
3209 int unit_write_drop_in_private_format(Unit *u, UnitSetPropertiesMode mode, const char *name, const char *format, ...) {
3210 _cleanup_free_ char *p = NULL;
3218 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3221 va_start(ap, format);
3222 r = vasprintf(&p, format, ap);
3228 return unit_write_drop_in_private(u, mode, name, p);
3231 int unit_remove_drop_in(Unit *u, UnitSetPropertiesMode mode, const char *name) {
3232 _cleanup_free_ char *p = NULL, *q = NULL;
3237 if (!IN_SET(mode, UNIT_PERSISTENT, UNIT_RUNTIME))
3240 r = unit_drop_in_file(u, mode, name, &p, &q);
3245 r = errno == ENOENT ? 0 : -errno;
3253 int unit_make_transient(Unit *u) {
3258 u->load_state = UNIT_STUB;
3260 u->transient = true;
3262 free(u->fragment_path);
3263 u->fragment_path = NULL;
3265 if (u->manager->running_as == SYSTEMD_USER) {
3266 _cleanup_free_ char *c = NULL;
3268 r = user_runtime_dir(&c);
3274 u->fragment_path = strjoin(c, "/", u->id, NULL);
3275 if (!u->fragment_path)
3280 u->fragment_path = strappend("/run/systemd/system/", u->id);
3281 if (!u->fragment_path)
3284 mkdir_p("/run/systemd/system", 0755);
3287 return write_string_file_atomic_label(u->fragment_path, "# Transient stub");
3290 int unit_kill_context(
3296 bool main_pid_alien) {
3298 int sig, wait_for_exit = false, r;
3303 if (c->kill_mode == KILL_NONE)
3306 sig = sigkill ? SIGKILL : c->kill_signal;
3309 r = kill_and_sigcont(main_pid, sig);
3311 if (r < 0 && r != -ESRCH) {
3312 _cleanup_free_ char *comm = NULL;
3313 get_process_comm(main_pid, &comm);
3315 log_warning_unit(u->id, "Failed to kill main process " PID_FMT " (%s): %s", main_pid, strna(comm), strerror(-r));
3317 if (!main_pid_alien)
3318 wait_for_exit = true;
3320 if (c->send_sighup && !sigkill)
3321 kill(main_pid, SIGHUP);
3325 if (control_pid > 0) {
3326 r = kill_and_sigcont(control_pid, sig);
3328 if (r < 0 && r != -ESRCH) {
3329 _cleanup_free_ char *comm = NULL;
3330 get_process_comm(control_pid, &comm);
3332 log_warning_unit(u->id, "Failed to kill control process " PID_FMT " (%s): %s", control_pid, strna(comm), strerror(-r));
3334 wait_for_exit = true;
3336 if (c->send_sighup && !sigkill)
3337 kill(control_pid, SIGHUP);
3341 if ((c->kill_mode == KILL_CONTROL_GROUP || (c->kill_mode == KILL_MIXED && sigkill)) && u->cgroup_path) {
3342 _cleanup_set_free_ Set *pid_set = NULL;
3344 /* Exclude the main/control pids from being killed via the cgroup */
3345 pid_set = unit_pid_set(main_pid, control_pid);
3349 r = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, sig, true, true, false, pid_set);
3351 if (r != -EAGAIN && r != -ESRCH && r != -ENOENT)
3352 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
3355 /* FIXME: For now, we will not wait for the
3356 * cgroup members to die, simply because
3357 * cgroup notification is unreliable. It
3358 * doesn't work at all in containers, and
3359 * outside of containers it can be confused
3360 * easily by leaving directories in the
3363 /* wait_for_exit = true; */
3365 if (c->send_sighup && !sigkill) {
3368 pid_set = unit_pid_set(main_pid, control_pid);
3372 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, SIGHUP, false, true, false, pid_set);
3377 return wait_for_exit;
3380 int unit_require_mounts_for(Unit *u, const char *path) {
3381 char prefix[strlen(path) + 1], *p;
3387 /* Registers a unit for requiring a certain path and all its
3388 * prefixes. We keep a simple array of these paths in the
3389 * unit, since its usually short. However, we build a prefix
3390 * table for all possible prefixes so that new appearing mount
3391 * units can easily determine which units to make themselves a
3394 if (!path_is_absolute(path))
3401 path_kill_slashes(p);
3403 if (!path_is_safe(p)) {
3408 if (strv_contains(u->requires_mounts_for, p)) {
3413 r = strv_consume(&u->requires_mounts_for, p);
3417 PATH_FOREACH_PREFIX_MORE(prefix, p) {
3420 x = hashmap_get(u->manager->units_requiring_mounts_for, prefix);
3424 if (!u->manager->units_requiring_mounts_for) {
3425 u->manager->units_requiring_mounts_for = hashmap_new(&string_hash_ops);
3426 if (!u->manager->units_requiring_mounts_for)
3440 r = hashmap_put(u->manager->units_requiring_mounts_for, q, x);
3456 int unit_setup_exec_runtime(Unit *u) {
3462 offset = UNIT_VTABLE(u)->exec_runtime_offset;
3465 /* Check if there already is an ExecRuntime for this unit? */
3466 rt = (ExecRuntime**) ((uint8_t*) u + offset);
3470 /* Try to get it from somebody else */
3471 SET_FOREACH(other, u->dependencies[UNIT_JOINS_NAMESPACE_OF], i) {
3473 *rt = unit_get_exec_runtime(other);
3475 exec_runtime_ref(*rt);
3480 return exec_runtime_make(rt, unit_get_exec_context(u), u->id);
3483 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
3484 [UNIT_ACTIVE] = "active",
3485 [UNIT_RELOADING] = "reloading",
3486 [UNIT_INACTIVE] = "inactive",
3487 [UNIT_FAILED] = "failed",
3488 [UNIT_ACTIVATING] = "activating",
3489 [UNIT_DEACTIVATING] = "deactivating"
3492 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);