1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include <sys/epoll.h>
26 #include <sys/timerfd.h>
32 #include "systemd/sd-id128.h"
33 #include "systemd/sd-messages.h"
38 #include "path-util.h"
39 #include "load-fragment.h"
40 #include "load-dropin.h"
42 #include "unit-name.h"
43 #include "specifier.h"
44 #include "dbus-unit.h"
46 #include "cgroup-util.h"
48 #include "cgroup-attr.h"
50 const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
51 [UNIT_SERVICE] = &service_vtable,
52 [UNIT_TIMER] = &timer_vtable,
53 [UNIT_SOCKET] = &socket_vtable,
54 [UNIT_TARGET] = &target_vtable,
55 [UNIT_DEVICE] = &device_vtable,
56 [UNIT_MOUNT] = &mount_vtable,
57 [UNIT_AUTOMOUNT] = &automount_vtable,
58 [UNIT_SNAPSHOT] = &snapshot_vtable,
59 [UNIT_SWAP] = &swap_vtable,
60 [UNIT_PATH] = &path_vtable
63 Unit *unit_new(Manager *m, size_t size) {
67 assert(size >= sizeof(Unit));
73 u->names = set_new(string_hash_func, string_compare_func);
80 u->type = _UNIT_TYPE_INVALID;
81 u->deserialized_job = _JOB_TYPE_INVALID;
82 u->default_dependencies = true;
83 u->unit_file_state = _UNIT_FILE_STATE_INVALID;
88 bool unit_has_name(Unit *u, const char *name) {
92 return !!set_get(u->names, (char*) name);
95 int unit_add_name(Unit *u, const char *text) {
103 if (unit_name_is_template(text)) {
107 s = unit_name_replace_instance(text, u->instance);
114 if (!unit_name_is_valid(s, false)) {
119 assert_se((t = unit_name_to_type(s)) >= 0);
121 if (u->type != _UNIT_TYPE_INVALID && t != u->type) {
126 if ((r = unit_name_to_instance(s, &i)) < 0)
129 if (i && unit_vtable[t]->no_instances) {
134 /* Ensure that this unit is either instanced or not instanced,
136 if (u->type != _UNIT_TYPE_INVALID && !u->instance != !i) {
141 if (unit_vtable[t]->no_alias &&
142 !set_isempty(u->names) &&
143 !set_get(u->names, s)) {
148 if (hashmap_size(u->manager->units) >= MANAGER_MAX_NAMES) {
153 if ((r = set_put(u->names, s)) < 0) {
159 if ((r = hashmap_put(u->manager->units, s, u)) < 0) {
160 set_remove(u->names, s);
164 if (u->type == _UNIT_TYPE_INVALID) {
170 LIST_PREPEND(Unit, units_by_type, u->manager->units_by_type[t], u);
172 if (UNIT_VTABLE(u)->init)
173 UNIT_VTABLE(u)->init(u);
177 unit_add_to_dbus_queue(u);
187 int unit_choose_id(Unit *u, const char *name) {
188 char *s, *t = NULL, *i;
194 if (unit_name_is_template(name)) {
199 if (!(t = unit_name_replace_instance(name, u->instance)))
205 /* Selects one of the names of this unit as the id */
206 s = set_get(u->names, (char*) name);
212 if ((r = unit_name_to_instance(s, &i)) < 0)
220 unit_add_to_dbus_queue(u);
225 int unit_set_description(Unit *u, const char *description) {
230 if (!(s = strdup(description)))
233 free(u->description);
236 unit_add_to_dbus_queue(u);
240 bool unit_check_gc(Unit *u) {
243 if (u->load_state == UNIT_STUB)
246 if (UNIT_VTABLE(u)->no_gc)
258 if (unit_active_state(u) != UNIT_INACTIVE)
261 if (UNIT_VTABLE(u)->check_gc)
262 if (UNIT_VTABLE(u)->check_gc(u))
268 void unit_add_to_load_queue(Unit *u) {
270 assert(u->type != _UNIT_TYPE_INVALID);
272 if (u->load_state != UNIT_STUB || u->in_load_queue)
275 LIST_PREPEND(Unit, load_queue, u->manager->load_queue, u);
276 u->in_load_queue = true;
279 void unit_add_to_cleanup_queue(Unit *u) {
282 if (u->in_cleanup_queue)
285 LIST_PREPEND(Unit, cleanup_queue, u->manager->cleanup_queue, u);
286 u->in_cleanup_queue = true;
289 void unit_add_to_gc_queue(Unit *u) {
292 if (u->in_gc_queue || u->in_cleanup_queue)
295 if (unit_check_gc(u))
298 LIST_PREPEND(Unit, gc_queue, u->manager->gc_queue, u);
299 u->in_gc_queue = true;
301 u->manager->n_in_gc_queue ++;
303 if (u->manager->gc_queue_timestamp <= 0)
304 u->manager->gc_queue_timestamp = now(CLOCK_MONOTONIC);
307 void unit_add_to_dbus_queue(Unit *u) {
309 assert(u->type != _UNIT_TYPE_INVALID);
311 if (u->load_state == UNIT_STUB || u->in_dbus_queue)
314 /* Shortcut things if nobody cares */
315 if (!bus_has_subscriber(u->manager)) {
316 u->sent_dbus_new_signal = true;
320 LIST_PREPEND(Unit, dbus_queue, u->manager->dbus_unit_queue, u);
321 u->in_dbus_queue = true;
324 static void bidi_set_free(Unit *u, Set *s) {
330 /* Frees the set and makes sure we are dropped from the
331 * inverse pointers */
333 SET_FOREACH(other, s, i) {
336 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
337 set_remove(other->dependencies[d], u);
339 unit_add_to_gc_queue(other);
345 void unit_free(Unit *u) {
352 bus_unit_send_removed_signal(u);
354 if (u->load_state != UNIT_STUB)
355 if (UNIT_VTABLE(u)->done)
356 UNIT_VTABLE(u)->done(u);
358 SET_FOREACH(t, u->names, i)
359 hashmap_remove_value(u->manager->units, t, u);
373 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
374 bidi_set_free(u, u->dependencies[d]);
376 if (u->requires_mounts_for) {
377 LIST_REMOVE(Unit, has_requires_mounts_for, u->manager->has_requires_mounts_for, u);
378 strv_free(u->requires_mounts_for);
381 if (u->type != _UNIT_TYPE_INVALID)
382 LIST_REMOVE(Unit, units_by_type, u->manager->units_by_type[u->type], u);
384 if (u->in_load_queue)
385 LIST_REMOVE(Unit, load_queue, u->manager->load_queue, u);
387 if (u->in_dbus_queue)
388 LIST_REMOVE(Unit, dbus_queue, u->manager->dbus_unit_queue, u);
390 if (u->in_cleanup_queue)
391 LIST_REMOVE(Unit, cleanup_queue, u->manager->cleanup_queue, u);
393 if (u->in_gc_queue) {
394 LIST_REMOVE(Unit, gc_queue, u->manager->gc_queue, u);
395 u->manager->n_in_gc_queue--;
398 cgroup_bonding_free_list(u->cgroup_bondings, u->manager->n_reloading <= 0);
399 cgroup_attribute_free_list(u->cgroup_attributes);
401 free(u->description);
402 strv_free(u->documentation);
403 free(u->fragment_path);
404 free(u->source_path);
407 set_free_free(u->names);
409 condition_free_list(u->conditions);
412 unit_ref_unset(u->refs);
417 UnitActiveState unit_active_state(Unit *u) {
420 if (u->load_state == UNIT_MERGED)
421 return unit_active_state(unit_follow_merge(u));
423 /* After a reload it might happen that a unit is not correctly
424 * loaded but still has a process around. That's why we won't
425 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
427 return UNIT_VTABLE(u)->active_state(u);
430 const char* unit_sub_state_to_string(Unit *u) {
433 return UNIT_VTABLE(u)->sub_state_to_string(u);
436 static void complete_move(Set **s, Set **other) {
444 set_move(*s, *other);
451 static void merge_names(Unit *u, Unit *other) {
458 complete_move(&u->names, &other->names);
460 set_free_free(other->names);
464 SET_FOREACH(t, u->names, i)
465 assert_se(hashmap_replace(u->manager->units, t, u) == 0);
468 static void merge_dependencies(Unit *u, Unit *other, UnitDependency d) {
475 assert(d < _UNIT_DEPENDENCY_MAX);
477 /* Fix backwards pointers */
478 SET_FOREACH(back, other->dependencies[d], i) {
481 for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++)
482 if ((r = set_remove_and_put(back->dependencies[k], other, u)) < 0) {
485 set_remove(back->dependencies[k], other);
487 assert(r == -ENOENT);
491 complete_move(&u->dependencies[d], &other->dependencies[d]);
493 set_free(other->dependencies[d]);
494 other->dependencies[d] = NULL;
497 int unit_merge(Unit *u, Unit *other) {
502 assert(u->manager == other->manager);
503 assert(u->type != _UNIT_TYPE_INVALID);
505 other = unit_follow_merge(other);
510 if (u->type != other->type)
513 if (!u->instance != !other->instance)
516 if (other->load_state != UNIT_STUB &&
517 other->load_state != UNIT_ERROR)
526 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
530 merge_names(u, other);
532 /* Redirect all references */
534 unit_ref_set(other->refs, u);
536 /* Merge dependencies */
537 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
538 merge_dependencies(u, other, d);
540 other->load_state = UNIT_MERGED;
541 other->merged_into = u;
543 /* If there is still some data attached to the other node, we
544 * don't need it anymore, and can free it. */
545 if (other->load_state != UNIT_STUB)
546 if (UNIT_VTABLE(other)->done)
547 UNIT_VTABLE(other)->done(other);
549 unit_add_to_dbus_queue(u);
550 unit_add_to_cleanup_queue(other);
555 int unit_merge_by_name(Unit *u, const char *name) {
563 if (unit_name_is_template(name)) {
567 if (!(s = unit_name_replace_instance(name, u->instance)))
573 if (!(other = manager_get_unit(u->manager, name)))
574 r = unit_add_name(u, name);
576 r = unit_merge(u, other);
582 Unit* unit_follow_merge(Unit *u) {
585 while (u->load_state == UNIT_MERGED)
586 assert_se(u = u->merged_into);
591 int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
597 if (c->std_output != EXEC_OUTPUT_KMSG &&
598 c->std_output != EXEC_OUTPUT_SYSLOG &&
599 c->std_output != EXEC_OUTPUT_JOURNAL &&
600 c->std_output != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
601 c->std_output != EXEC_OUTPUT_SYSLOG_AND_CONSOLE &&
602 c->std_output != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
603 c->std_error != EXEC_OUTPUT_KMSG &&
604 c->std_error != EXEC_OUTPUT_SYSLOG &&
605 c->std_error != EXEC_OUTPUT_JOURNAL &&
606 c->std_error != EXEC_OUTPUT_KMSG_AND_CONSOLE &&
607 c->std_error != EXEC_OUTPUT_JOURNAL_AND_CONSOLE &&
608 c->std_error != EXEC_OUTPUT_SYSLOG_AND_CONSOLE)
611 /* If syslog or kernel logging is requested, make sure our own
612 * logging daemon is run first. */
614 if (u->manager->running_as == MANAGER_SYSTEM)
615 if ((r = unit_add_two_dependencies_by_name(u, UNIT_REQUIRES, UNIT_AFTER, SPECIAL_JOURNALD_SOCKET, NULL, true)) < 0)
621 const char *unit_description(Unit *u) {
625 return u->description;
630 void unit_dump(Unit *u, FILE *f, const char *prefix) {
637 timestamp1[FORMAT_TIMESTAMP_MAX],
638 timestamp2[FORMAT_TIMESTAMP_MAX],
639 timestamp3[FORMAT_TIMESTAMP_MAX],
640 timestamp4[FORMAT_TIMESTAMP_MAX],
641 timespan[FORMAT_TIMESPAN_MAX];
645 assert(u->type >= 0);
649 p2 = strappend(prefix, "\t");
650 prefix2 = p2 ? p2 : prefix;
654 "%s\tDescription: %s\n"
656 "%s\tUnit Load State: %s\n"
657 "%s\tUnit Active State: %s\n"
658 "%s\tInactive Exit Timestamp: %s\n"
659 "%s\tActive Enter Timestamp: %s\n"
660 "%s\tActive Exit Timestamp: %s\n"
661 "%s\tInactive Enter Timestamp: %s\n"
662 "%s\tGC Check Good: %s\n"
663 "%s\tNeed Daemon Reload: %s\n",
665 prefix, unit_description(u),
666 prefix, strna(u->instance),
667 prefix, unit_load_state_to_string(u->load_state),
668 prefix, unit_active_state_to_string(unit_active_state(u)),
669 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->inactive_exit_timestamp.realtime)),
670 prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->active_enter_timestamp.realtime)),
671 prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->active_exit_timestamp.realtime)),
672 prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->inactive_enter_timestamp.realtime)),
673 prefix, yes_no(unit_check_gc(u)),
674 prefix, yes_no(unit_need_daemon_reload(u)));
676 SET_FOREACH(t, u->names, i)
677 fprintf(f, "%s\tName: %s\n", prefix, t);
679 STRV_FOREACH(j, u->documentation)
680 fprintf(f, "%s\tDocumentation: %s\n", prefix, *j);
682 if ((following = unit_following(u)))
683 fprintf(f, "%s\tFollowing: %s\n", prefix, following->id);
685 if (u->fragment_path)
686 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
689 fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
691 if (u->job_timeout > 0)
692 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout));
694 condition_dump_list(u->conditions, f, prefix);
696 if (dual_timestamp_is_set(&u->condition_timestamp))
698 "%s\tCondition Timestamp: %s\n"
699 "%s\tCondition Result: %s\n",
700 prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->condition_timestamp.realtime)),
701 prefix, yes_no(u->condition_result));
703 for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) {
706 SET_FOREACH(other, u->dependencies[d], i)
707 fprintf(f, "%s\t%s: %s\n", prefix, unit_dependency_to_string(d), other->id);
710 if (!strv_isempty(u->requires_mounts_for)) {
712 "%s\tRequiresMountsFor:", prefix);
714 STRV_FOREACH(j, u->requires_mounts_for)
715 fprintf(f, " %s", *j);
720 if (u->load_state == UNIT_LOADED) {
725 "%s\tStopWhenUnneeded: %s\n"
726 "%s\tRefuseManualStart: %s\n"
727 "%s\tRefuseManualStop: %s\n"
728 "%s\tDefaultDependencies: %s\n"
729 "%s\tOnFailureIsolate: %s\n"
730 "%s\tIgnoreOnIsolate: %s\n"
731 "%s\tIgnoreOnSnapshot: %s\n",
732 prefix, yes_no(u->stop_when_unneeded),
733 prefix, yes_no(u->refuse_manual_start),
734 prefix, yes_no(u->refuse_manual_stop),
735 prefix, yes_no(u->default_dependencies),
736 prefix, yes_no(u->on_failure_isolate),
737 prefix, yes_no(u->ignore_on_isolate),
738 prefix, yes_no(u->ignore_on_snapshot));
740 LIST_FOREACH(by_unit, b, u->cgroup_bondings)
741 fprintf(f, "%s\tControlGroup: %s:%s\n",
742 prefix, b->controller, b->path);
744 LIST_FOREACH(by_unit, a, u->cgroup_attributes) {
748 a->map_callback(a->controller, a->name, a->value, &v);
750 fprintf(f, "%s\tControlGroupAttribute: %s %s \"%s\"\n",
751 prefix, a->controller, a->name, v ? v : a->value);
756 if (UNIT_VTABLE(u)->dump)
757 UNIT_VTABLE(u)->dump(u, f, prefix2);
759 } else if (u->load_state == UNIT_MERGED)
761 "%s\tMerged into: %s\n",
762 prefix, u->merged_into->id);
763 else if (u->load_state == UNIT_ERROR)
764 fprintf(f, "%s\tLoad Error Code: %s\n", prefix, strerror(-u->load_error));
768 job_dump(u->job, f, prefix2);
771 job_dump(u->nop_job, f, prefix2);
776 /* Common implementation for multiple backends */
777 int unit_load_fragment_and_dropin(Unit *u) {
782 /* Load a .service file */
783 if ((r = unit_load_fragment(u)) < 0)
786 if (u->load_state == UNIT_STUB)
789 /* Load drop-in directory data */
790 if ((r = unit_load_dropin(unit_follow_merge(u))) < 0)
796 /* Common implementation for multiple backends */
797 int unit_load_fragment_and_dropin_optional(Unit *u) {
802 /* Same as unit_load_fragment_and_dropin(), but whether
803 * something can be loaded or not doesn't matter. */
805 /* Load a .service file */
806 if ((r = unit_load_fragment(u)) < 0)
809 if (u->load_state == UNIT_STUB)
810 u->load_state = UNIT_LOADED;
812 /* Load drop-in directory data */
813 if ((r = unit_load_dropin(unit_follow_merge(u))) < 0)
819 int unit_add_default_target_dependency(Unit *u, Unit *target) {
823 if (target->type != UNIT_TARGET)
826 /* Only add the dependency if both units are loaded, so that
827 * that loop check below is reliable */
828 if (u->load_state != UNIT_LOADED ||
829 target->load_state != UNIT_LOADED)
832 /* If either side wants no automatic dependencies, then let's
834 if (!u->default_dependencies ||
835 !target->default_dependencies)
838 /* Don't create loops */
839 if (set_get(target->dependencies[UNIT_BEFORE], u))
842 return unit_add_dependency(target, UNIT_AFTER, u, true);
845 static int unit_add_default_dependencies(Unit *u) {
846 static const UnitDependency deps[] = {
848 UNIT_REQUIRED_BY_OVERRIDABLE,
860 for (k = 0; k < ELEMENTSOF(deps); k++)
861 SET_FOREACH(target, u->dependencies[deps[k]], i)
862 if ((r = unit_add_default_target_dependency(u, target)) < 0)
868 int unit_load(Unit *u) {
873 if (u->in_load_queue) {
874 LIST_REMOVE(Unit, load_queue, u->manager->load_queue, u);
875 u->in_load_queue = false;
878 if (u->type == _UNIT_TYPE_INVALID)
881 if (u->load_state != UNIT_STUB)
884 if (UNIT_VTABLE(u)->load)
885 if ((r = UNIT_VTABLE(u)->load(u)) < 0)
888 if (u->load_state == UNIT_STUB) {
893 if (u->load_state == UNIT_LOADED &&
894 u->default_dependencies)
895 if ((r = unit_add_default_dependencies(u)) < 0)
898 if (u->load_state == UNIT_LOADED) {
899 r = unit_add_mount_links(u);
904 if (u->on_failure_isolate &&
905 set_size(u->dependencies[UNIT_ON_FAILURE]) > 1) {
907 log_error("More than one OnFailure= dependencies specified for %s but OnFailureIsolate= enabled. Refusing.",
914 assert((u->load_state != UNIT_MERGED) == !u->merged_into);
916 unit_add_to_dbus_queue(unit_follow_merge(u));
917 unit_add_to_gc_queue(u);
922 u->load_state = UNIT_ERROR;
924 unit_add_to_dbus_queue(u);
925 unit_add_to_gc_queue(u);
927 log_debug("Failed to load configuration for %s: %s", u->id, strerror(-r));
932 bool unit_condition_test(Unit *u) {
935 dual_timestamp_get(&u->condition_timestamp);
936 u->condition_result = condition_test_list(u->conditions);
938 return u->condition_result;
941 static const char* unit_get_status_message_format(Unit *u, JobType t) {
942 const UnitStatusMessageFormats *format_table;
946 assert(t < _JOB_TYPE_MAX);
948 if (t != JOB_START && t != JOB_STOP)
951 format_table = &UNIT_VTABLE(u)->status_message_formats;
955 return format_table->starting_stopping[t == JOB_STOP];
958 static const char *unit_get_status_message_format_try_harder(Unit *u, JobType t) {
963 assert(t < _JOB_TYPE_MAX);
965 format = unit_get_status_message_format(u, t);
969 /* Return generic strings */
971 return "Starting %s.";
972 else if (t == JOB_STOP)
973 return "Stopping %s.";
974 else if (t == JOB_RELOAD)
975 return "Reloading %s.";
980 static void unit_status_print_starting_stopping(Unit *u, JobType t) {
985 /* We only print status messages for selected units on
986 * selected operations. */
988 format = unit_get_status_message_format(u, t);
992 unit_status_printf(u, "", format, unit_description(u));
995 #pragma GCC diagnostic push
996 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
997 static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
1004 if (t != JOB_START && t != JOB_STOP && t != JOB_RELOAD)
1007 /* We log status messages for all units and all operations. */
1009 format = unit_get_status_message_format_try_harder(u, t);
1013 snprintf(buf, sizeof(buf), format, unit_description(u));
1016 mid = t == JOB_START ? SD_MESSAGE_UNIT_STARTING :
1017 t == JOB_STOP ? SD_MESSAGE_UNIT_STOPPING :
1018 SD_MESSAGE_UNIT_RELOADING;
1020 log_struct(LOG_INFO,
1021 "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(mid),
1026 #pragma GCC diagnostic pop
1029 * -EBADR: This unit type does not support starting.
1030 * -EALREADY: Unit is already started.
1031 * -EAGAIN: An operation is already in progress. Retry later.
1032 * -ECANCELED: Too many requests for now.
1034 int unit_start(Unit *u) {
1035 UnitActiveState state;
1040 if (u->load_state != UNIT_LOADED)
1043 /* If this is already started, then this will succeed. Note
1044 * that this will even succeed if this unit is not startable
1045 * by the user. This is relied on to detect when we need to
1046 * wait for units and when waiting is finished. */
1047 state = unit_active_state(u);
1048 if (UNIT_IS_ACTIVE_OR_RELOADING(state))
1051 /* If the conditions failed, don't do anything at all. If we
1052 * already are activating this call might still be useful to
1053 * speed up activation in case there is some hold-off time,
1054 * but we don't want to recheck the condition in that case. */
1055 if (state != UNIT_ACTIVATING &&
1056 !unit_condition_test(u)) {
1057 log_debug("Starting of %s requested but condition failed. Ignoring.", u->id);
1061 /* Forward to the main object, if we aren't it. */
1062 if ((following = unit_following(u))) {
1063 log_debug("Redirecting start request from %s to %s.", u->id, following->id);
1064 return unit_start(following);
1067 unit_status_log_starting_stopping_reloading(u, JOB_START);
1068 unit_status_print_starting_stopping(u, JOB_START);
1070 /* If it is stopped, but we cannot start it, then fail */
1071 if (!UNIT_VTABLE(u)->start)
1074 /* We don't suppress calls to ->start() here when we are
1075 * already starting, to allow this request to be used as a
1076 * "hurry up" call, for example when the unit is in some "auto
1077 * restart" state where it waits for a holdoff timer to elapse
1078 * before it will start again. */
1080 unit_add_to_dbus_queue(u);
1082 return UNIT_VTABLE(u)->start(u);
1085 bool unit_can_start(Unit *u) {
1088 return !!UNIT_VTABLE(u)->start;
1091 bool unit_can_isolate(Unit *u) {
1094 return unit_can_start(u) &&
1099 * -EBADR: This unit type does not support stopping.
1100 * -EALREADY: Unit is already stopped.
1101 * -EAGAIN: An operation is already in progress. Retry later.
1103 int unit_stop(Unit *u) {
1104 UnitActiveState state;
1109 state = unit_active_state(u);
1110 if (UNIT_IS_INACTIVE_OR_FAILED(state))
1113 if ((following = unit_following(u))) {
1114 log_debug("Redirecting stop request from %s to %s.", u->id, following->id);
1115 return unit_stop(following);
1118 unit_status_log_starting_stopping_reloading(u, JOB_STOP);
1119 unit_status_print_starting_stopping(u, JOB_STOP);
1121 if (!UNIT_VTABLE(u)->stop)
1124 unit_add_to_dbus_queue(u);
1126 return UNIT_VTABLE(u)->stop(u);
1130 * -EBADR: This unit type does not support reloading.
1131 * -ENOEXEC: Unit is not started.
1132 * -EAGAIN: An operation is already in progress. Retry later.
1134 int unit_reload(Unit *u) {
1135 UnitActiveState state;
1140 if (u->load_state != UNIT_LOADED)
1143 if (!unit_can_reload(u))
1146 state = unit_active_state(u);
1147 if (state == UNIT_RELOADING)
1150 if (state != UNIT_ACTIVE)
1153 if ((following = unit_following(u))) {
1154 log_debug("Redirecting reload request from %s to %s.", u->id, following->id);
1155 return unit_reload(following);
1158 unit_status_log_starting_stopping_reloading(u, JOB_RELOAD);
1160 unit_add_to_dbus_queue(u);
1161 return UNIT_VTABLE(u)->reload(u);
1164 bool unit_can_reload(Unit *u) {
1167 if (!UNIT_VTABLE(u)->reload)
1170 if (!UNIT_VTABLE(u)->can_reload)
1173 return UNIT_VTABLE(u)->can_reload(u);
1176 static void unit_check_unneeded(Unit *u) {
1182 /* If this service shall be shut down when unneeded then do
1185 if (!u->stop_when_unneeded)
1188 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
1191 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
1192 if (unit_pending_active(other))
1195 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
1196 if (unit_pending_active(other))
1199 SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i)
1200 if (unit_pending_active(other))
1203 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1204 if (unit_pending_active(other))
1207 log_info("Service %s is not needed anymore. Stopping.", u->id);
1209 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1210 manager_add_job(u->manager, JOB_STOP, u, JOB_FAIL, true, NULL, NULL);
1213 static void retroactively_start_dependencies(Unit *u) {
1218 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)));
1220 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1221 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1222 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1223 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1225 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1226 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1227 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1228 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1230 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1231 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1232 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1233 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1235 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1236 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1237 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1238 manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
1240 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1241 if (!set_get(u->dependencies[UNIT_AFTER], other) &&
1242 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
1243 manager_add_job(u->manager, JOB_START, other, JOB_FAIL, false, NULL, NULL);
1245 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTS], i)
1246 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1247 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1249 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
1250 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1251 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1254 static void retroactively_stop_dependencies(Unit *u) {
1259 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1261 /* Pull down units which are bound to us recursively if enabled */
1262 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
1263 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1264 manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, true, NULL, NULL);
1267 static void check_unneeded_dependencies(Unit *u) {
1272 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)));
1274 /* Garbage collect services that might not be needed anymore, if enabled */
1275 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES], i)
1276 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1277 unit_check_unneeded(other);
1278 SET_FOREACH(other, u->dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
1279 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1280 unit_check_unneeded(other);
1281 SET_FOREACH(other, u->dependencies[UNIT_WANTS], i)
1282 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1283 unit_check_unneeded(other);
1284 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE], i)
1285 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1286 unit_check_unneeded(other);
1287 SET_FOREACH(other, u->dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
1288 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1289 unit_check_unneeded(other);
1290 SET_FOREACH(other, u->dependencies[UNIT_BINDS_TO], i)
1291 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other)))
1292 unit_check_unneeded(other);
1295 void unit_trigger_on_failure(Unit *u) {
1301 if (set_size(u->dependencies[UNIT_ON_FAILURE]) <= 0)
1304 log_info("Triggering OnFailure= dependencies of %s.", u->id);
1306 SET_FOREACH(other, u->dependencies[UNIT_ON_FAILURE], i) {
1309 if ((r = manager_add_job(u->manager, JOB_START, other, u->on_failure_isolate ? JOB_ISOLATE : JOB_REPLACE, true, NULL, NULL)) < 0)
1310 log_error("Failed to enqueue OnFailure= job: %s", strerror(-r));
1314 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
1318 assert(os < _UNIT_ACTIVE_STATE_MAX);
1319 assert(ns < _UNIT_ACTIVE_STATE_MAX);
1321 /* Note that this is called for all low-level state changes,
1322 * even if they might map to the same high-level
1323 * UnitActiveState! That means that ns == os is OK an expected
1324 * behaviour here. For example: if a mount point is remounted
1325 * this function will be called too! */
1327 if (u->manager->n_reloading <= 0) {
1330 dual_timestamp_get(&ts);
1332 if (UNIT_IS_INACTIVE_OR_FAILED(os) && !UNIT_IS_INACTIVE_OR_FAILED(ns))
1333 u->inactive_exit_timestamp = ts;
1334 else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_INACTIVE_OR_FAILED(ns))
1335 u->inactive_enter_timestamp = ts;
1337 if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
1338 u->active_enter_timestamp = ts;
1339 else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
1340 u->active_exit_timestamp = ts;
1342 timer_unit_notify(u, ns);
1343 path_unit_notify(u, ns);
1346 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1347 cgroup_bonding_trim_list(u->cgroup_bondings, true);
1352 if (u->job->state == JOB_WAITING)
1354 /* So we reached a different state for this
1355 * job. Let's see if we can run it now if it
1356 * failed previously due to EAGAIN. */
1357 job_add_to_run_queue(u->job);
1359 /* Let's check whether this state change constitutes a
1360 * finished job, or maybe contradicts a running job and
1361 * hence needs to invalidate jobs. */
1363 switch (u->job->type) {
1366 case JOB_VERIFY_ACTIVE:
1368 if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
1369 job_finish_and_invalidate(u->job, JOB_DONE, true);
1370 else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
1373 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1374 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1380 case JOB_RELOAD_OR_START:
1382 if (u->job->state == JOB_RUNNING) {
1383 if (ns == UNIT_ACTIVE)
1384 job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true);
1385 else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) {
1388 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1389 job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true);
1397 case JOB_TRY_RESTART:
1399 if (UNIT_IS_INACTIVE_OR_FAILED(ns))
1400 job_finish_and_invalidate(u->job, JOB_DONE, true);
1401 else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
1403 job_finish_and_invalidate(u->job, JOB_FAILED, true);
1409 assert_not_reached("Job type unknown");
1415 if (u->manager->n_reloading <= 0) {
1417 /* If this state change happened without being
1418 * requested by a job, then let's retroactively start
1419 * or stop dependencies. We skip that step when
1420 * deserializing, since we don't want to create any
1421 * additional jobs just because something is already
1425 if (UNIT_IS_INACTIVE_OR_FAILED(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
1426 retroactively_start_dependencies(u);
1427 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1428 retroactively_stop_dependencies(u);
1431 /* stop unneeded units regardless if going down was expected or not */
1432 if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
1433 check_unneeded_dependencies(u);
1435 if (ns != os && ns == UNIT_FAILED) {
1436 log_notice("Unit %s entered failed state.", u->id);
1437 unit_trigger_on_failure(u);
1441 /* Some names are special */
1442 if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
1444 if (unit_has_name(u, SPECIAL_DBUS_SERVICE))
1445 /* The bus just might have become available,
1446 * hence try to connect to it, if we aren't
1448 bus_init(u->manager, true);
1450 if (u->type == UNIT_SERVICE &&
1451 !UNIT_IS_ACTIVE_OR_RELOADING(os) &&
1452 u->manager->n_reloading <= 0) {
1453 /* Write audit record if we have just finished starting up */
1454 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, true);
1458 if (!UNIT_IS_ACTIVE_OR_RELOADING(os))
1459 manager_send_unit_plymouth(u->manager, u);
1463 /* We don't care about D-Bus here, since we'll get an
1464 * asynchronous notification for it anyway. */
1466 if (u->type == UNIT_SERVICE &&
1467 UNIT_IS_INACTIVE_OR_FAILED(ns) &&
1468 !UNIT_IS_INACTIVE_OR_FAILED(os) &&
1469 u->manager->n_reloading <= 0) {
1471 /* Hmm, if there was no start record written
1472 * write it now, so that we always have a nice
1475 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_START, ns == UNIT_INACTIVE);
1477 if (ns == UNIT_INACTIVE)
1478 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, true);
1480 /* Write audit record if we have just finished shutting down */
1481 manager_send_unit_audit(u->manager, u, AUDIT_SERVICE_STOP, ns == UNIT_INACTIVE);
1483 u->in_audit = false;
1487 manager_recheck_journal(u->manager);
1489 /* Maybe we finished startup and are now ready for being
1490 * stopped because unneeded? */
1491 unit_check_unneeded(u);
1493 unit_add_to_dbus_queue(u);
1494 unit_add_to_gc_queue(u);
1497 int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) {
1498 struct epoll_event ev;
1503 assert(w->type == WATCH_INVALID || (w->type == WATCH_FD && w->fd == fd && w->data.unit == u));
1509 if (epoll_ctl(u->manager->epoll_fd,
1510 w->type == WATCH_INVALID ? EPOLL_CTL_ADD : EPOLL_CTL_MOD,
1522 void unit_unwatch_fd(Unit *u, Watch *w) {
1526 if (w->type == WATCH_INVALID)
1529 assert(w->type == WATCH_FD);
1530 assert(w->data.unit == u);
1531 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1534 w->type = WATCH_INVALID;
1535 w->data.unit = NULL;
1538 int unit_watch_pid(Unit *u, pid_t pid) {
1542 /* Watch a specific PID. We only support one unit watching
1543 * each PID for now. */
1545 return hashmap_put(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1548 void unit_unwatch_pid(Unit *u, pid_t pid) {
1552 hashmap_remove_value(u->manager->watch_pids, LONG_TO_PTR(pid), u);
1555 int unit_watch_timer(Unit *u, usec_t delay, Watch *w) {
1556 struct itimerspec its;
1562 assert(w->type == WATCH_INVALID || (w->type == WATCH_UNIT_TIMER && w->data.unit == u));
1564 /* This will try to reuse the old timer if there is one */
1566 if (w->type == WATCH_UNIT_TIMER) {
1567 assert(w->data.unit == u);
1572 } else if (w->type == WATCH_INVALID) {
1575 if ((fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC)) < 0)
1578 assert_not_reached("Invalid watch type");
1583 /* Set absolute time in the past, but not 0, since we
1584 * don't want to disarm the timer */
1585 its.it_value.tv_sec = 0;
1586 its.it_value.tv_nsec = 1;
1588 flags = TFD_TIMER_ABSTIME;
1590 timespec_store(&its.it_value, delay);
1594 /* This will also flush the elapse counter */
1595 if (timerfd_settime(fd, flags, &its, NULL) < 0)
1598 if (w->type == WATCH_INVALID) {
1599 struct epoll_event ev;
1603 ev.events = EPOLLIN;
1605 if (epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
1609 w->type = WATCH_UNIT_TIMER;
1617 close_nointr_nofail(fd);
1622 void unit_unwatch_timer(Unit *u, Watch *w) {
1626 if (w->type == WATCH_INVALID)
1629 assert(w->type == WATCH_UNIT_TIMER);
1630 assert(w->data.unit == u);
1633 assert_se(epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);
1634 close_nointr_nofail(w->fd);
1637 w->type = WATCH_INVALID;
1638 w->data.unit = NULL;
1641 bool unit_job_is_applicable(Unit *u, JobType j) {
1643 assert(j >= 0 && j < _JOB_TYPE_MAX);
1647 case JOB_VERIFY_ACTIVE:
1654 case JOB_TRY_RESTART:
1655 return unit_can_start(u);
1658 return unit_can_reload(u);
1660 case JOB_RELOAD_OR_START:
1661 return unit_can_reload(u) && unit_can_start(u);
1664 assert_not_reached("Invalid job type");
1668 int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_reference) {
1670 static const UnitDependency inverse_table[_UNIT_DEPENDENCY_MAX] = {
1671 [UNIT_REQUIRES] = UNIT_REQUIRED_BY,
1672 [UNIT_REQUIRES_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1673 [UNIT_WANTS] = UNIT_WANTED_BY,
1674 [UNIT_REQUISITE] = UNIT_REQUIRED_BY,
1675 [UNIT_REQUISITE_OVERRIDABLE] = UNIT_REQUIRED_BY_OVERRIDABLE,
1676 [UNIT_BINDS_TO] = UNIT_BOUND_BY,
1677 [UNIT_PART_OF] = UNIT_CONSISTS_OF,
1678 [UNIT_REQUIRED_BY] = _UNIT_DEPENDENCY_INVALID,
1679 [UNIT_REQUIRED_BY_OVERRIDABLE] = _UNIT_DEPENDENCY_INVALID,
1680 [UNIT_WANTED_BY] = _UNIT_DEPENDENCY_INVALID,
1681 [UNIT_BOUND_BY] = UNIT_BINDS_TO,
1682 [UNIT_CONSISTS_OF] = UNIT_PART_OF,
1683 [UNIT_CONFLICTS] = UNIT_CONFLICTED_BY,
1684 [UNIT_CONFLICTED_BY] = UNIT_CONFLICTS,
1685 [UNIT_BEFORE] = UNIT_AFTER,
1686 [UNIT_AFTER] = UNIT_BEFORE,
1687 [UNIT_ON_FAILURE] = _UNIT_DEPENDENCY_INVALID,
1688 [UNIT_REFERENCES] = UNIT_REFERENCED_BY,
1689 [UNIT_REFERENCED_BY] = UNIT_REFERENCES,
1690 [UNIT_TRIGGERS] = UNIT_TRIGGERED_BY,
1691 [UNIT_TRIGGERED_BY] = UNIT_TRIGGERS,
1692 [UNIT_PROPAGATES_RELOAD_TO] = UNIT_RELOAD_PROPAGATED_FROM,
1693 [UNIT_RELOAD_PROPAGATED_FROM] = UNIT_PROPAGATES_RELOAD_TO,
1695 int r, q = 0, v = 0, w = 0;
1698 assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
1701 u = unit_follow_merge(u);
1702 other = unit_follow_merge(other);
1704 /* We won't allow dependencies on ourselves. We will not
1705 * consider them an error however. */
1709 if ((r = set_ensure_allocated(&u->dependencies[d], trivial_hash_func, trivial_compare_func)) < 0)
1712 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1713 if ((r = set_ensure_allocated(&other->dependencies[inverse_table[d]], trivial_hash_func, trivial_compare_func)) < 0)
1717 if ((r = set_ensure_allocated(&u->dependencies[UNIT_REFERENCES], trivial_hash_func, trivial_compare_func)) < 0 ||
1718 (r = set_ensure_allocated(&other->dependencies[UNIT_REFERENCED_BY], trivial_hash_func, trivial_compare_func)) < 0)
1721 if ((q = set_put(u->dependencies[d], other)) < 0)
1724 if (inverse_table[d] != _UNIT_DEPENDENCY_INVALID)
1725 if ((v = set_put(other->dependencies[inverse_table[d]], u)) < 0) {
1730 if (add_reference) {
1731 if ((w = set_put(u->dependencies[UNIT_REFERENCES], other)) < 0) {
1736 if ((r = set_put(other->dependencies[UNIT_REFERENCED_BY], u)) < 0)
1740 unit_add_to_dbus_queue(u);
1745 set_remove(u->dependencies[d], other);
1748 set_remove(other->dependencies[inverse_table[d]], u);
1751 set_remove(u->dependencies[UNIT_REFERENCES], other);
1756 int unit_add_two_dependencies(Unit *u, UnitDependency d, UnitDependency e, Unit *other, bool add_reference) {
1761 if ((r = unit_add_dependency(u, d, other, add_reference)) < 0)
1764 if ((r = unit_add_dependency(u, e, other, add_reference)) < 0)
1770 static const char *resolve_template(Unit *u, const char *name, const char*path, char **p) {
1774 assert(name || path);
1777 name = path_get_file_name(path);
1779 if (!unit_name_is_template(name)) {
1785 s = unit_name_replace_instance(name, u->instance);
1789 if (!(i = unit_name_to_prefix(u->id)))
1792 s = unit_name_replace_instance(name, i);
1803 int unit_add_dependency_by_name(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1809 assert(name || path);
1811 if (!(name = resolve_template(u, name, path, &s)))
1814 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1817 r = unit_add_dependency(u, d, other, add_reference);
1824 int unit_add_two_dependencies_by_name(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1830 assert(name || path);
1832 if (!(name = resolve_template(u, name, path, &s)))
1835 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1838 r = unit_add_two_dependencies(u, d, e, other, add_reference);
1845 int unit_add_dependency_by_name_inverse(Unit *u, UnitDependency d, const char *name, const char *path, bool add_reference) {
1851 assert(name || path);
1853 if (!(name = resolve_template(u, name, path, &s)))
1856 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1859 r = unit_add_dependency(other, d, u, add_reference);
1866 int unit_add_two_dependencies_by_name_inverse(Unit *u, UnitDependency d, UnitDependency e, const char *name, const char *path, bool add_reference) {
1872 assert(name || path);
1874 if (!(name = resolve_template(u, name, path, &s)))
1877 if ((r = manager_load_unit(u->manager, name, path, NULL, &other)) < 0)
1880 if ((r = unit_add_two_dependencies(other, d, e, u, add_reference)) < 0)
1888 int set_unit_path(const char *p) {
1892 /* This is mostly for debug purposes */
1894 if (path_is_absolute(p)) {
1895 if (!(c = strdup(p)))
1898 if (!(cwd = get_current_dir_name()))
1901 r = asprintf(&c, "%s/%s", cwd, p);
1908 if (setenv("SYSTEMD_UNIT_PATH", c, 0) < 0) {
1917 char *unit_dbus_path(Unit *u) {
1923 return unit_dbus_path_from_name(u->id);
1926 int unit_add_cgroup(Unit *u, CGroupBonding *b) {
1934 if (!b->controller) {
1935 if (!(b->controller = strdup(SYSTEMD_CGROUP_CONTROLLER)))
1941 /* Ensure this hasn't been added yet */
1944 if (streq(b->controller, SYSTEMD_CGROUP_CONTROLLER)) {
1947 l = hashmap_get(u->manager->cgroup_bondings, b->path);
1948 LIST_PREPEND(CGroupBonding, by_path, l, b);
1950 if ((r = hashmap_replace(u->manager->cgroup_bondings, b->path, l)) < 0) {
1951 LIST_REMOVE(CGroupBonding, by_path, l, b);
1956 LIST_PREPEND(CGroupBonding, by_unit, u->cgroup_bondings, b);
1962 static char *default_cgroup_path(Unit *u) {
1970 t = unit_name_template(u->id);
1974 p = strjoin(u->manager->cgroup_hierarchy, "/", t, "/", u->instance, NULL);
1977 p = strjoin(u->manager->cgroup_hierarchy, "/", u->id, NULL);
1982 int unit_add_cgroup_from_text(Unit *u, const char *name) {
1983 char *controller = NULL, *path = NULL;
1984 CGroupBonding *b = NULL;
1991 if ((r = cg_split_spec(name, &controller, &path)) < 0)
1995 path = default_cgroup_path(u);
2000 controller = strdup(SYSTEMD_CGROUP_CONTROLLER);
2004 if (!path || !controller) {
2011 if (cgroup_bonding_find_list(u->cgroup_bondings, controller)) {
2016 if (!(b = new0(CGroupBonding, 1))) {
2021 b->controller = controller;
2024 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2026 if ((r = unit_add_cgroup(u, b)) < 0)
2039 static int unit_add_one_default_cgroup(Unit *u, const char *controller) {
2040 CGroupBonding *b = NULL;
2046 controller = SYSTEMD_CGROUP_CONTROLLER;
2048 if (cgroup_bonding_find_list(u->cgroup_bondings, controller))
2051 if (!(b = new0(CGroupBonding, 1)))
2054 if (!(b->controller = strdup(controller)))
2057 if (!(b->path = default_cgroup_path(u)))
2061 b->essential = streq(controller, SYSTEMD_CGROUP_CONTROLLER);
2063 if ((r = unit_add_cgroup(u, b)) < 0)
2070 free(b->controller);
2076 int unit_add_default_cgroups(Unit *u) {
2083 /* Adds in the default cgroups, if they weren't specified
2086 if (!u->manager->cgroup_hierarchy)
2089 if ((r = unit_add_one_default_cgroup(u, NULL)) < 0)
2092 STRV_FOREACH(c, u->manager->default_controllers)
2093 unit_add_one_default_cgroup(u, *c);
2095 LIST_FOREACH(by_unit, a, u->cgroup_attributes)
2096 unit_add_one_default_cgroup(u, a->controller);
2101 CGroupBonding* unit_get_default_cgroup(Unit *u) {
2104 return cgroup_bonding_find_list(u->cgroup_bondings, SYSTEMD_CGROUP_CONTROLLER);
2107 int unit_add_cgroup_attribute(Unit *u, const char *controller, const char *name, const char *value, CGroupAttributeMapCallback map_callback) {
2119 dot = strchr(name, '.');
2123 c = strndup(name, dot - name);
2130 if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) {
2135 a = new0(CGroupAttribute, 1);
2145 a->controller = strdup(controller);
2147 a->name = strdup(name);
2148 a->value = strdup(value);
2150 if (!a->controller || !a->name || !a->value) {
2151 free(a->controller);
2159 a->map_callback = map_callback;
2161 LIST_PREPEND(CGroupAttribute, by_unit, u->cgroup_attributes, a);
2170 int unit_load_related_unit(Unit *u, const char *type, Unit **_found) {
2178 if (!(t = unit_name_change_suffix(u->id, type)))
2181 assert(!unit_has_name(u, t));
2183 r = manager_load_unit(u->manager, t, NULL, NULL, _found);
2186 assert(r < 0 || *_found != u);
2191 int unit_get_related_unit(Unit *u, const char *type, Unit **_found) {
2199 if (!(t = unit_name_change_suffix(u->id, type)))
2202 assert(!unit_has_name(u, t));
2204 found = manager_get_unit(u->manager, t);
2214 static char *specifier_prefix_and_instance(char specifier, void *data, void *userdata) {
2218 return unit_name_to_prefix_and_instance(u->id);
2221 static char *specifier_prefix(char specifier, void *data, void *userdata) {
2225 return unit_name_to_prefix(u->id);
2228 static char *specifier_prefix_unescaped(char specifier, void *data, void *userdata) {
2234 if (!(p = unit_name_to_prefix(u->id)))
2237 r = unit_name_unescape(p);
2243 static char *specifier_instance_unescaped(char specifier, void *data, void *userdata) {
2248 return unit_name_unescape(u->instance);
2253 static char *specifier_filename(char specifier, void *data, void *userdata) {
2258 return unit_name_path_unescape(u->instance);
2260 return unit_name_to_path(u->instance);
2263 static char *specifier_cgroup(char specifier, void *data, void *userdata) {
2267 return default_cgroup_path(u);
2270 static char *specifier_cgroup_root(char specifier, void *data, void *userdata) {
2275 if (specifier == 'r')
2276 return strdup(u->manager->cgroup_hierarchy);
2278 if (path_get_parent(u->manager->cgroup_hierarchy, &p) < 0)
2281 if (streq(p, "/")) {
2289 static char *specifier_runtime(char specifier, void *data, void *userdata) {
2293 if (u->manager->running_as == MANAGER_USER) {
2296 e = getenv("XDG_RUNTIME_DIR");
2301 return strdup("/run");
2304 static char *specifier_user_name(char specifier, void *data, void *userdata) {
2305 Service *s = userdata;
2307 const char *username;
2309 /* get USER env from our own env if set */
2310 if (!s->exec_context.user)
2311 return getusername_malloc();
2313 /* fish username from passwd */
2314 username = s->exec_context.user;
2315 r = get_user_creds(&username, NULL, NULL, NULL, NULL);
2319 return strdup(username);
2322 static char *specifier_user_home(char specifier, void *data, void *userdata) {
2323 Service *s = userdata;
2325 const char *username, *home;
2327 /* return HOME if set, otherwise from passwd */
2328 if (!s->exec_context.user) {
2331 r = get_home_dir(&h);
2338 username = s->exec_context.user;
2339 r = get_user_creds(&username, NULL, NULL, &home, NULL);
2343 return strdup(home);
2346 static char *specifier_user_shell(char specifier, void *data, void *userdata) {
2347 Service *s = userdata;
2349 const char *username, *shell;
2351 /* return HOME if set, otherwise from passwd */
2352 if (!s->exec_context.user) {
2357 return strdup("/bin/sh");
2362 username = s->exec_context.user;
2363 r = get_user_creds(&username, NULL, NULL, NULL, &shell);
2365 return strdup("/bin/sh");
2367 return strdup(shell);
2370 char *unit_name_printf(Unit *u, const char* format) {
2373 * This will use the passed string as format string and
2374 * replace the following specifiers:
2376 * %n: the full id of the unit (foo@bar.waldo)
2377 * %N: the id of the unit without the suffix (foo@bar)
2378 * %p: the prefix (foo)
2379 * %i: the instance (bar)
2382 const Specifier table[] = {
2383 { 'n', specifier_string, u->id },
2384 { 'N', specifier_prefix_and_instance, NULL },
2385 { 'p', specifier_prefix, NULL },
2386 { 'i', specifier_string, u->instance },
2393 return specifier_printf(format, table, u);
2396 char *unit_full_printf(Unit *u, const char *format) {
2398 /* This is similar to unit_name_printf() but also supports
2399 * unescaping. Also, adds a couple of additional codes:
2401 * %c cgroup path of unit
2402 * %r root cgroup path of this systemd instance (e.g. "/user/lennart/shared/systemd-4711")
2403 * %R parent of root cgroup path (e.g. "/usr/lennart/shared")
2404 * %t the runtime directory to place sockets in (e.g. "/run" or $XDG_RUNTIME_DIR)
2405 * %u the username of the configured User or running user
2406 * %h the homedir of the configured User or running user
2409 const Specifier table[] = {
2410 { 'n', specifier_string, u->id },
2411 { 'N', specifier_prefix_and_instance, NULL },
2412 { 'p', specifier_prefix, NULL },
2413 { 'P', specifier_prefix_unescaped, NULL },
2414 { 'i', specifier_string, u->instance },
2415 { 'I', specifier_instance_unescaped, NULL },
2416 { 'f', specifier_filename, NULL },
2417 { 'c', specifier_cgroup, NULL },
2418 { 'r', specifier_cgroup_root, NULL },
2419 { 'R', specifier_cgroup_root, NULL },
2420 { 't', specifier_runtime, NULL },
2421 { 'u', specifier_user_name, NULL },
2422 { 'h', specifier_user_home, NULL },
2423 { 's', specifier_user_shell, NULL },
2430 return specifier_printf(format, table, u);
2433 char **unit_full_printf_strv(Unit *u, char **l) {
2437 /* Applies unit_full_printf to every entry in l */
2442 if (!(r = new(char*, n+1)))
2445 for (i = l, j = r; *i; i++, j++)
2446 if (!(*j = unit_full_printf(u, *i)))
2453 for (j--; j >= r; j--)
2461 int unit_watch_bus_name(Unit *u, const char *name) {
2465 /* Watch a specific name on the bus. We only support one unit
2466 * watching each name for now. */
2468 return hashmap_put(u->manager->watch_bus, name, u);
2471 void unit_unwatch_bus_name(Unit *u, const char *name) {
2475 hashmap_remove_value(u->manager->watch_bus, name, u);
2478 bool unit_can_serialize(Unit *u) {
2481 return UNIT_VTABLE(u)->serialize && UNIT_VTABLE(u)->deserialize_item;
2484 int unit_serialize(Unit *u, FILE *f, FDSet *fds, bool serialize_jobs) {
2491 if (!unit_can_serialize(u))
2494 if ((r = UNIT_VTABLE(u)->serialize(u, f, fds)) < 0)
2498 if (serialize_jobs) {
2500 fprintf(f, "job\n");
2501 job_serialize(u->job, f, fds);
2505 fprintf(f, "job\n");
2506 job_serialize(u->nop_job, f, fds);
2510 dual_timestamp_serialize(f, "inactive-exit-timestamp", &u->inactive_exit_timestamp);
2511 dual_timestamp_serialize(f, "active-enter-timestamp", &u->active_enter_timestamp);
2512 dual_timestamp_serialize(f, "active-exit-timestamp", &u->active_exit_timestamp);
2513 dual_timestamp_serialize(f, "inactive-enter-timestamp", &u->inactive_enter_timestamp);
2514 dual_timestamp_serialize(f, "condition-timestamp", &u->condition_timestamp);
2516 if (dual_timestamp_is_set(&u->condition_timestamp))
2517 unit_serialize_item(u, f, "condition-result", yes_no(u->condition_result));
2524 void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *format, ...) {
2535 va_start(ap, format);
2536 vfprintf(f, format, ap);
2542 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value) {
2548 fprintf(f, "%s=%s\n", key, value);
2551 int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
2558 if (!unit_can_serialize(u))
2562 char line[LINE_MAX], *l, *v;
2565 if (!fgets(line, sizeof(line), f)) {
2578 k = strcspn(l, "=");
2586 if (streq(l, "job")) {
2588 /* new-style serialized job */
2589 Job *j = job_new_raw(u);
2593 r = job_deserialize(j, f, fds);
2599 r = hashmap_put(u->manager->jobs, UINT32_TO_PTR(j->id), j);
2605 r = job_install_deserialized(j);
2607 hashmap_remove(u->manager->jobs, UINT32_TO_PTR(j->id));
2613 JobType type = job_type_from_string(v);
2615 log_debug("Failed to parse job type value %s", v);
2617 u->deserialized_job = type;
2620 } else if (streq(l, "inactive-exit-timestamp")) {
2621 dual_timestamp_deserialize(v, &u->inactive_exit_timestamp);
2623 } else if (streq(l, "active-enter-timestamp")) {
2624 dual_timestamp_deserialize(v, &u->active_enter_timestamp);
2626 } else if (streq(l, "active-exit-timestamp")) {
2627 dual_timestamp_deserialize(v, &u->active_exit_timestamp);
2629 } else if (streq(l, "inactive-enter-timestamp")) {
2630 dual_timestamp_deserialize(v, &u->inactive_enter_timestamp);
2632 } else if (streq(l, "condition-timestamp")) {
2633 dual_timestamp_deserialize(v, &u->condition_timestamp);
2635 } else if (streq(l, "condition-result")) {
2638 if ((b = parse_boolean(v)) < 0)
2639 log_debug("Failed to parse condition result value %s", v);
2641 u->condition_result = b;
2646 if ((r = UNIT_VTABLE(u)->deserialize_item(u, l, v, fds)) < 0)
2651 int unit_add_node_link(Unit *u, const char *what, bool wants) {
2661 /* Adds in links to the device node that this unit is based on */
2663 if (!is_device_path(what))
2666 e = unit_name_from_path(what, ".device");
2670 r = manager_load_unit(u->manager, e, NULL, NULL, &device);
2676 if ((r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_BINDS_TO, device, true)) < 0)
2680 if ((r = unit_add_dependency(device, UNIT_WANTS, u, false)) < 0)
2686 int unit_coldplug(Unit *u) {
2691 if (UNIT_VTABLE(u)->coldplug)
2692 if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
2696 r = job_coldplug(u->job);
2699 } else if (u->deserialized_job >= 0) {
2701 r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
2705 u->deserialized_job = _JOB_TYPE_INVALID;
2711 void unit_status_printf(Unit *u, const char *status, const char *format, ...) {
2717 if (!manager_get_show_status(u->manager))
2720 if (!manager_is_booting_or_shutting_down(u->manager))
2723 va_start(ap, format);
2724 status_vprintf(status, true, format, ap);
2728 bool unit_need_daemon_reload(Unit *u) {
2733 if (u->fragment_path) {
2735 if (stat(u->fragment_path, &st) < 0)
2736 /* What, cannot access this anymore? */
2739 if (u->fragment_mtime > 0 &&
2740 timespec_load(&st.st_mtim) != u->fragment_mtime)
2744 if (u->source_path) {
2746 if (stat(u->source_path, &st) < 0)
2749 if (u->source_mtime > 0 &&
2750 timespec_load(&st.st_mtim) != u->source_mtime)
2757 void unit_reset_failed(Unit *u) {
2760 if (UNIT_VTABLE(u)->reset_failed)
2761 UNIT_VTABLE(u)->reset_failed(u);
2764 Unit *unit_following(Unit *u) {
2767 if (UNIT_VTABLE(u)->following)
2768 return UNIT_VTABLE(u)->following(u);
2773 bool unit_pending_inactive(Unit *u) {
2776 /* Returns true if the unit is inactive or going down */
2778 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
2781 if (u->job && u->job->type == JOB_STOP)
2787 bool unit_pending_active(Unit *u) {
2790 /* Returns true if the unit is active or going up */
2792 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u)))
2796 (u->job->type == JOB_START ||
2797 u->job->type == JOB_RELOAD_OR_START ||
2798 u->job->type == JOB_RESTART))
2804 int unit_kill(Unit *u, KillWho w, int signo, DBusError *error) {
2806 assert(w >= 0 && w < _KILL_WHO_MAX);
2808 assert(signo < _NSIG);
2810 if (!UNIT_VTABLE(u)->kill)
2813 return UNIT_VTABLE(u)->kill(u, w, signo, error);
2816 int unit_following_set(Unit *u, Set **s) {
2820 if (UNIT_VTABLE(u)->following_set)
2821 return UNIT_VTABLE(u)->following_set(u, s);
2827 UnitFileState unit_get_unit_file_state(Unit *u) {
2830 if (u->unit_file_state < 0 && u->fragment_path)
2831 u->unit_file_state = unit_file_get_state(
2832 u->manager->running_as == MANAGER_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER,
2833 NULL, path_get_file_name(u->fragment_path));
2835 return u->unit_file_state;
2838 Unit* unit_ref_set(UnitRef *ref, Unit *u) {
2843 unit_ref_unset(ref);
2846 LIST_PREPEND(UnitRef, refs, u->refs, ref);
2850 void unit_ref_unset(UnitRef *ref) {
2856 LIST_REMOVE(UnitRef, refs, ref->unit->refs, ref);
2860 int unit_add_one_mount_link(Unit *u, Mount *m) {
2866 if (u->load_state != UNIT_LOADED ||
2867 UNIT(m)->load_state != UNIT_LOADED)
2870 STRV_FOREACH(i, u->requires_mounts_for) {
2875 if (!path_startswith(*i, m->where))
2878 return unit_add_two_dependencies(u, UNIT_AFTER, UNIT_REQUIRES, UNIT(m), true);
2884 int unit_add_mount_links(Unit *u) {
2890 LIST_FOREACH(units_by_type, other, u->manager->units_by_type[UNIT_MOUNT]) {
2891 r = unit_add_one_mount_link(u, MOUNT(other));
2899 int unit_exec_context_defaults(Unit *u, ExecContext *c) {
2906 /* This only copies in the ones that need memory */
2908 for (i = 0; i < RLIMIT_NLIMITS; i++)
2909 if (u->manager->rlimit[i] && !c->rlimit[i]) {
2910 c->rlimit[i] = newdup(struct rlimit, u->manager->rlimit[i], 1);
2915 if (u->manager->running_as == MANAGER_USER &&
2916 !c->working_directory) {
2918 r = get_home_dir(&c->working_directory);
2926 static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
2927 [UNIT_ACTIVE] = "active",
2928 [UNIT_RELOADING] = "reloading",
2929 [UNIT_INACTIVE] = "inactive",
2930 [UNIT_FAILED] = "failed",
2931 [UNIT_ACTIVATING] = "activating",
2932 [UNIT_DEACTIVATING] = "deactivating"
2935 DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
2937 static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
2938 [UNIT_REQUIRES] = "Requires",
2939 [UNIT_REQUIRES_OVERRIDABLE] = "RequiresOverridable",
2940 [UNIT_REQUISITE] = "Requisite",
2941 [UNIT_REQUISITE_OVERRIDABLE] = "RequisiteOverridable",
2942 [UNIT_WANTS] = "Wants",
2943 [UNIT_BINDS_TO] = "BindsTo",
2944 [UNIT_PART_OF] = "PartOf",
2945 [UNIT_REQUIRED_BY] = "RequiredBy",
2946 [UNIT_REQUIRED_BY_OVERRIDABLE] = "RequiredByOverridable",
2947 [UNIT_WANTED_BY] = "WantedBy",
2948 [UNIT_BOUND_BY] = "BoundBy",
2949 [UNIT_CONSISTS_OF] = "ConsistsOf",
2950 [UNIT_CONFLICTS] = "Conflicts",
2951 [UNIT_CONFLICTED_BY] = "ConflictedBy",
2952 [UNIT_BEFORE] = "Before",
2953 [UNIT_AFTER] = "After",
2954 [UNIT_ON_FAILURE] = "OnFailure",
2955 [UNIT_TRIGGERS] = "Triggers",
2956 [UNIT_TRIGGERED_BY] = "TriggeredBy",
2957 [UNIT_PROPAGATES_RELOAD_TO] = "PropagatesReloadTo",
2958 [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
2959 [UNIT_REFERENCES] = "References",
2960 [UNIT_REFERENCED_BY] = "ReferencedBy",
2963 DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);