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/>.
29 #include "sd-messages.h"
34 #include "path-util.h"
35 #include "load-fragment.h"
36 #include "load-dropin.h"
38 #include "unit-name.h"
39 #include "dbus-unit.h"
41 #include "cgroup-util.h"
44 #include "fileio-label.h"
45 #include "bus-common-errors.h"
49 #include "formats-util.h"
50 #include "process-util.h"
52 const UnitVTable
* const unit_vtable
[_UNIT_TYPE_MAX
] = {
53 [UNIT_SERVICE
] = &service_vtable
,
54 [UNIT_SOCKET
] = &socket_vtable
,
55 [UNIT_BUSNAME
] = &busname_vtable
,
56 [UNIT_TARGET
] = &target_vtable
,
57 [UNIT_SNAPSHOT
] = &snapshot_vtable
,
58 [UNIT_DEVICE
] = &device_vtable
,
59 [UNIT_MOUNT
] = &mount_vtable
,
60 [UNIT_AUTOMOUNT
] = &automount_vtable
,
61 [UNIT_SWAP
] = &swap_vtable
,
62 [UNIT_TIMER
] = &timer_vtable
,
63 [UNIT_PATH
] = &path_vtable
,
64 [UNIT_SLICE
] = &slice_vtable
,
65 [UNIT_SCOPE
] = &scope_vtable
68 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
);
70 Unit
*unit_new(Manager
*m
, size_t size
) {
74 assert(size
>= sizeof(Unit
));
80 u
->names
= set_new(&string_hash_ops
);
87 u
->type
= _UNIT_TYPE_INVALID
;
88 u
->deserialized_job
= _JOB_TYPE_INVALID
;
89 u
->default_dependencies
= true;
90 u
->unit_file_state
= _UNIT_FILE_STATE_INVALID
;
91 u
->unit_file_preset
= -1;
92 u
->on_failure_job_mode
= JOB_REPLACE
;
94 RATELIMIT_INIT(u
->check_unneeded_ratelimit
, 10 * USEC_PER_SEC
, 16);
99 bool unit_has_name(Unit
*u
, const char *name
) {
103 return !!set_get(u
->names
, (char*) name
);
106 static void unit_init(Unit
*u
) {
113 assert(u
->type
>= 0);
115 cc
= unit_get_cgroup_context(u
);
117 cgroup_context_init(cc
);
119 /* Copy in the manager defaults into the cgroup
120 * context, _before_ the rest of the settings have
121 * been initialized */
123 cc
->cpu_accounting
= u
->manager
->default_cpu_accounting
;
124 cc
->blockio_accounting
= u
->manager
->default_blockio_accounting
;
125 cc
->memory_accounting
= u
->manager
->default_memory_accounting
;
128 ec
= unit_get_exec_context(u
);
130 exec_context_init(ec
);
132 kc
= unit_get_kill_context(u
);
134 kill_context_init(kc
);
136 if (UNIT_VTABLE(u
)->init
)
137 UNIT_VTABLE(u
)->init(u
);
140 int unit_add_name(Unit
*u
, const char *text
) {
141 _cleanup_free_
char *s
= NULL
, *i
= NULL
;
148 if (unit_name_is_valid(text
, UNIT_NAME_TEMPLATE
)) {
153 r
= unit_name_replace_instance(text
, u
->instance
, &s
);
162 if (set_contains(u
->names
, s
))
164 if (hashmap_contains(u
->manager
->units
, s
))
167 if (!unit_name_is_valid(s
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
170 t
= unit_name_to_type(s
);
174 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
)
177 r
= unit_name_to_instance(s
, &i
);
181 if (i
&& unit_vtable
[t
]->no_instances
)
184 /* Ensure that this unit is either instanced or not instanced,
185 * but not both. Note that we do allow names with different
186 * instance names however! */
187 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
)
190 if (unit_vtable
[t
]->no_alias
&& !set_isempty(u
->names
))
193 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
)
196 r
= set_put(u
->names
, s
);
201 r
= hashmap_put(u
->manager
->units
, s
, u
);
203 (void) set_remove(u
->names
, s
);
207 if (u
->type
== _UNIT_TYPE_INVALID
) {
212 LIST_PREPEND(units_by_type
, u
->manager
->units_by_type
[t
], u
);
221 unit_add_to_dbus_queue(u
);
225 int unit_choose_id(Unit
*u
, const char *name
) {
226 _cleanup_free_
char *t
= NULL
;
233 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
238 r
= unit_name_replace_instance(name
, u
->instance
, &t
);
245 /* Selects one of the names of this unit as the id */
246 s
= set_get(u
->names
, (char*) name
);
250 /* Determine the new instance from the new id */
251 r
= unit_name_to_instance(s
, &i
);
260 unit_add_to_dbus_queue(u
);
265 int unit_set_description(Unit
*u
, const char *description
) {
270 if (isempty(description
))
273 s
= strdup(description
);
278 free(u
->description
);
281 unit_add_to_dbus_queue(u
);
285 bool unit_check_gc(Unit
*u
) {
286 UnitActiveState state
;
295 state
= unit_active_state(u
);
297 /* If the unit is inactive and failed and no job is queued for
298 * it, then release its runtime resources */
299 if (UNIT_IS_INACTIVE_OR_FAILED(state
) &&
300 UNIT_VTABLE(u
)->release_resources
)
301 UNIT_VTABLE(u
)->release_resources(u
);
303 /* But we keep the unit object around for longer when it is
304 * referenced or configured to not be gc'ed */
305 if (state
!= UNIT_INACTIVE
)
308 if (UNIT_VTABLE(u
)->no_gc
)
317 if (UNIT_VTABLE(u
)->check_gc
)
318 if (UNIT_VTABLE(u
)->check_gc(u
))
324 void unit_add_to_load_queue(Unit
*u
) {
326 assert(u
->type
!= _UNIT_TYPE_INVALID
);
328 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
331 LIST_PREPEND(load_queue
, u
->manager
->load_queue
, u
);
332 u
->in_load_queue
= true;
335 void unit_add_to_cleanup_queue(Unit
*u
) {
338 if (u
->in_cleanup_queue
)
341 LIST_PREPEND(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
342 u
->in_cleanup_queue
= true;
345 void unit_add_to_gc_queue(Unit
*u
) {
348 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
351 if (unit_check_gc(u
))
354 LIST_PREPEND(gc_queue
, u
->manager
->gc_queue
, u
);
355 u
->in_gc_queue
= true;
357 u
->manager
->n_in_gc_queue
++;
360 void unit_add_to_dbus_queue(Unit
*u
) {
362 assert(u
->type
!= _UNIT_TYPE_INVALID
);
364 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
367 /* Shortcut things if nobody cares */
368 if (sd_bus_track_count(u
->manager
->subscribed
) <= 0 &&
369 set_isempty(u
->manager
->private_buses
)) {
370 u
->sent_dbus_new_signal
= true;
374 LIST_PREPEND(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
375 u
->in_dbus_queue
= true;
378 static void bidi_set_free(Unit
*u
, Set
*s
) {
384 /* Frees the set and makes sure we are dropped from the
385 * inverse pointers */
387 SET_FOREACH(other
, s
, i
) {
390 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
391 set_remove(other
->dependencies
[d
], u
);
393 unit_add_to_gc_queue(other
);
399 static void unit_remove_transient(Unit
*u
) {
407 if (u
->fragment_path
)
408 unlink(u
->fragment_path
);
410 STRV_FOREACH(i
, u
->dropin_paths
) {
411 _cleanup_free_
char *p
= NULL
;
416 r
= path_get_parent(*i
, &p
);
422 static void unit_free_requires_mounts_for(Unit
*u
) {
425 STRV_FOREACH(j
, u
->requires_mounts_for
) {
426 char s
[strlen(*j
) + 1];
428 PATH_FOREACH_PREFIX_MORE(s
, *j
) {
432 x
= hashmap_get2(u
->manager
->units_requiring_mounts_for
, s
, (void**) &y
);
438 if (set_isempty(x
)) {
439 hashmap_remove(u
->manager
->units_requiring_mounts_for
, y
);
446 strv_free(u
->requires_mounts_for
);
447 u
->requires_mounts_for
= NULL
;
450 static void unit_done(Unit
*u
) {
459 if (UNIT_VTABLE(u
)->done
)
460 UNIT_VTABLE(u
)->done(u
);
462 ec
= unit_get_exec_context(u
);
464 exec_context_done(ec
);
466 cc
= unit_get_cgroup_context(u
);
468 cgroup_context_done(cc
);
471 void unit_free(Unit
*u
) {
478 if (u
->manager
->n_reloading
<= 0)
479 unit_remove_transient(u
);
481 bus_unit_send_removed_signal(u
);
485 unit_free_requires_mounts_for(u
);
487 SET_FOREACH(t
, u
->names
, i
)
488 hashmap_remove_value(u
->manager
->units
, t
, u
);
502 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
503 bidi_set_free(u
, u
->dependencies
[d
]);
505 if (u
->type
!= _UNIT_TYPE_INVALID
)
506 LIST_REMOVE(units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
508 if (u
->in_load_queue
)
509 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
511 if (u
->in_dbus_queue
)
512 LIST_REMOVE(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
514 if (u
->in_cleanup_queue
)
515 LIST_REMOVE(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
517 if (u
->in_gc_queue
) {
518 LIST_REMOVE(gc_queue
, u
->manager
->gc_queue
, u
);
519 u
->manager
->n_in_gc_queue
--;
522 if (u
->in_cgroup_queue
)
523 LIST_REMOVE(cgroup_queue
, u
->manager
->cgroup_queue
, u
);
525 if (u
->cgroup_path
) {
526 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
527 free(u
->cgroup_path
);
530 manager_update_failed_units(u
->manager
, u
, false);
531 set_remove(u
->manager
->startup_units
, u
);
533 free(u
->description
);
534 strv_free(u
->documentation
);
535 free(u
->fragment_path
);
536 free(u
->source_path
);
537 strv_free(u
->dropin_paths
);
540 free(u
->job_timeout_reboot_arg
);
542 set_free_free(u
->names
);
544 unit_unwatch_all_pids(u
);
546 condition_free_list(u
->conditions
);
547 condition_free_list(u
->asserts
);
549 unit_ref_unset(&u
->slice
);
552 unit_ref_unset(u
->refs
);
557 UnitActiveState
unit_active_state(Unit
*u
) {
560 if (u
->load_state
== UNIT_MERGED
)
561 return unit_active_state(unit_follow_merge(u
));
563 /* After a reload it might happen that a unit is not correctly
564 * loaded but still has a process around. That's why we won't
565 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
567 return UNIT_VTABLE(u
)->active_state(u
);
570 const char* unit_sub_state_to_string(Unit
*u
) {
573 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
576 static int complete_move(Set
**s
, Set
**other
) {
586 r
= set_move(*s
, *other
);
597 static int merge_names(Unit
*u
, Unit
*other
) {
605 r
= complete_move(&u
->names
, &other
->names
);
609 set_free_free(other
->names
);
613 SET_FOREACH(t
, u
->names
, i
)
614 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
619 static int reserve_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
624 assert(d
< _UNIT_DEPENDENCY_MAX
);
627 * If u does not have this dependency set allocated, there is no need
628 * to reserve anything. In that case other's set will be transferred
629 * as a whole to u by complete_move().
631 if (!u
->dependencies
[d
])
634 /* merge_dependencies() will skip a u-on-u dependency */
635 n_reserve
= set_size(other
->dependencies
[d
]) - !!set_get(other
->dependencies
[d
], u
);
637 return set_reserve(u
->dependencies
[d
], n_reserve
);
640 static void merge_dependencies(Unit
*u
, Unit
*other
, const char *other_id
, UnitDependency d
) {
647 assert(d
< _UNIT_DEPENDENCY_MAX
);
649 /* Fix backwards pointers */
650 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
653 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++) {
654 /* Do not add dependencies between u and itself */
656 if (set_remove(back
->dependencies
[k
], other
))
657 maybe_warn_about_dependency(u
, other_id
, k
);
659 r
= set_remove_and_put(back
->dependencies
[k
], other
, u
);
661 set_remove(back
->dependencies
[k
], other
);
663 assert(r
>= 0 || r
== -ENOENT
);
668 /* Also do not move dependencies on u to itself */
669 back
= set_remove(other
->dependencies
[d
], u
);
671 maybe_warn_about_dependency(u
, other_id
, d
);
673 /* The move cannot fail. The caller must have performed a reservation. */
674 assert_se(complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]) == 0);
676 set_free(other
->dependencies
[d
]);
677 other
->dependencies
[d
] = NULL
;
680 int unit_merge(Unit
*u
, Unit
*other
) {
682 const char *other_id
= NULL
;
687 assert(u
->manager
== other
->manager
);
688 assert(u
->type
!= _UNIT_TYPE_INVALID
);
690 other
= unit_follow_merge(other
);
695 if (u
->type
!= other
->type
)
698 if (!u
->instance
!= !other
->instance
)
701 if (other
->load_state
!= UNIT_STUB
&&
702 other
->load_state
!= UNIT_NOT_FOUND
)
711 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
715 other_id
= strdupa(other
->id
);
717 /* Make reservations to ensure merge_dependencies() won't fail */
718 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
719 r
= reserve_dependencies(u
, other
, d
);
721 * We don't rollback reservations if we fail. We don't have
722 * a way to undo reservations. A reservation is not a leak.
729 r
= merge_names(u
, other
);
733 /* Redirect all references */
735 unit_ref_set(other
->refs
, u
);
737 /* Merge dependencies */
738 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
739 merge_dependencies(u
, other
, other_id
, d
);
741 other
->load_state
= UNIT_MERGED
;
742 other
->merged_into
= u
;
744 /* If there is still some data attached to the other node, we
745 * don't need it anymore, and can free it. */
746 if (other
->load_state
!= UNIT_STUB
)
747 if (UNIT_VTABLE(other
)->done
)
748 UNIT_VTABLE(other
)->done(other
);
750 unit_add_to_dbus_queue(u
);
751 unit_add_to_cleanup_queue(other
);
756 int unit_merge_by_name(Unit
*u
, const char *name
) {
759 _cleanup_free_
char *s
= NULL
;
764 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
768 r
= unit_name_replace_instance(name
, u
->instance
, &s
);
775 other
= manager_get_unit(u
->manager
, name
);
777 return unit_merge(u
, other
);
779 return unit_add_name(u
, name
);
782 Unit
* unit_follow_merge(Unit
*u
) {
785 while (u
->load_state
== UNIT_MERGED
)
786 assert_se(u
= u
->merged_into
);
791 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
797 if (c
->working_directory
) {
798 r
= unit_require_mounts_for(u
, c
->working_directory
);
803 if (c
->root_directory
) {
804 r
= unit_require_mounts_for(u
, c
->root_directory
);
809 if (u
->manager
->running_as
!= MANAGER_SYSTEM
)
812 if (c
->private_tmp
) {
813 r
= unit_require_mounts_for(u
, "/tmp");
817 r
= unit_require_mounts_for(u
, "/var/tmp");
822 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
823 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
824 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
825 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
826 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
827 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
828 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
829 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
830 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
831 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
832 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
833 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
836 /* If syslog or kernel logging is requested, make sure our own
837 * logging daemon is run first. */
839 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
846 const char *unit_description(Unit
*u
) {
850 return u
->description
;
855 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
861 timestamp1
[FORMAT_TIMESTAMP_MAX
],
862 timestamp2
[FORMAT_TIMESTAMP_MAX
],
863 timestamp3
[FORMAT_TIMESTAMP_MAX
],
864 timestamp4
[FORMAT_TIMESTAMP_MAX
],
865 timespan
[FORMAT_TIMESPAN_MAX
];
867 _cleanup_set_free_ Set
*following_set
= NULL
;
871 assert(u
->type
>= 0);
873 prefix
= strempty(prefix
);
874 prefix2
= strjoina(prefix
, "\t");
878 "%s\tDescription: %s\n"
880 "%s\tUnit Load State: %s\n"
881 "%s\tUnit Active State: %s\n"
882 "%s\tInactive Exit Timestamp: %s\n"
883 "%s\tActive Enter Timestamp: %s\n"
884 "%s\tActive Exit Timestamp: %s\n"
885 "%s\tInactive Enter Timestamp: %s\n"
886 "%s\tGC Check Good: %s\n"
887 "%s\tNeed Daemon Reload: %s\n"
888 "%s\tTransient: %s\n"
891 "%s\tCGroup realized: %s\n"
892 "%s\tCGroup mask: 0x%x\n"
893 "%s\tCGroup members mask: 0x%x\n",
895 prefix
, unit_description(u
),
896 prefix
, strna(u
->instance
),
897 prefix
, unit_load_state_to_string(u
->load_state
),
898 prefix
, unit_active_state_to_string(unit_active_state(u
)),
899 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
900 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
901 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
902 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
903 prefix
, yes_no(unit_check_gc(u
)),
904 prefix
, yes_no(unit_need_daemon_reload(u
)),
905 prefix
, yes_no(u
->transient
),
906 prefix
, strna(unit_slice_name(u
)),
907 prefix
, strna(u
->cgroup_path
),
908 prefix
, yes_no(u
->cgroup_realized
),
909 prefix
, u
->cgroup_realized_mask
,
910 prefix
, u
->cgroup_members_mask
);
912 SET_FOREACH(t
, u
->names
, i
)
913 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
915 STRV_FOREACH(j
, u
->documentation
)
916 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
918 following
= unit_following(u
);
920 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
922 r
= unit_following_set(u
, &following_set
);
926 SET_FOREACH(other
, following_set
, i
)
927 fprintf(f
, "%s\tFollowing Set Member: %s\n", prefix
, other
->id
);
930 if (u
->fragment_path
)
931 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
934 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
936 STRV_FOREACH(j
, u
->dropin_paths
)
937 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
939 if (u
->job_timeout
> 0)
940 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
942 if (u
->job_timeout_action
!= FAILURE_ACTION_NONE
)
943 fprintf(f
, "%s\tJob Timeout Action: %s\n", prefix
, failure_action_to_string(u
->job_timeout_action
));
945 if (u
->job_timeout_reboot_arg
)
946 fprintf(f
, "%s\tJob Timeout Reboot Argument: %s\n", prefix
, u
->job_timeout_reboot_arg
);
948 condition_dump_list(u
->conditions
, f
, prefix
, condition_type_to_string
);
949 condition_dump_list(u
->asserts
, f
, prefix
, assert_type_to_string
);
951 if (dual_timestamp_is_set(&u
->condition_timestamp
))
953 "%s\tCondition Timestamp: %s\n"
954 "%s\tCondition Result: %s\n",
955 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
956 prefix
, yes_no(u
->condition_result
));
958 if (dual_timestamp_is_set(&u
->assert_timestamp
))
960 "%s\tAssert Timestamp: %s\n"
961 "%s\tAssert Result: %s\n",
962 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->assert_timestamp
.realtime
)),
963 prefix
, yes_no(u
->assert_result
));
965 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
968 SET_FOREACH(other
, u
->dependencies
[d
], i
)
969 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
972 if (!strv_isempty(u
->requires_mounts_for
)) {
974 "%s\tRequiresMountsFor:", prefix
);
976 STRV_FOREACH(j
, u
->requires_mounts_for
)
977 fprintf(f
, " %s", *j
);
982 if (u
->load_state
== UNIT_LOADED
) {
985 "%s\tStopWhenUnneeded: %s\n"
986 "%s\tRefuseManualStart: %s\n"
987 "%s\tRefuseManualStop: %s\n"
988 "%s\tDefaultDependencies: %s\n"
989 "%s\tOnFailureJobMode: %s\n"
990 "%s\tIgnoreOnIsolate: %s\n"
991 "%s\tIgnoreOnSnapshot: %s\n",
992 prefix
, yes_no(u
->stop_when_unneeded
),
993 prefix
, yes_no(u
->refuse_manual_start
),
994 prefix
, yes_no(u
->refuse_manual_stop
),
995 prefix
, yes_no(u
->default_dependencies
),
996 prefix
, job_mode_to_string(u
->on_failure_job_mode
),
997 prefix
, yes_no(u
->ignore_on_isolate
),
998 prefix
, yes_no(u
->ignore_on_snapshot
));
1000 if (UNIT_VTABLE(u
)->dump
)
1001 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
1003 } else if (u
->load_state
== UNIT_MERGED
)
1005 "%s\tMerged into: %s\n",
1006 prefix
, u
->merged_into
->id
);
1007 else if (u
->load_state
== UNIT_ERROR
)
1008 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
1012 job_dump(u
->job
, f
, prefix2
);
1015 job_dump(u
->nop_job
, f
, prefix2
);
1019 /* Common implementation for multiple backends */
1020 int unit_load_fragment_and_dropin(Unit
*u
) {
1025 /* Load a .{service,socket,...} file */
1026 r
= unit_load_fragment(u
);
1030 if (u
->load_state
== UNIT_STUB
)
1033 /* Load drop-in directory data */
1034 r
= unit_load_dropin(unit_follow_merge(u
));
1041 /* Common implementation for multiple backends */
1042 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
1047 /* Same as unit_load_fragment_and_dropin(), but whether
1048 * something can be loaded or not doesn't matter. */
1050 /* Load a .service file */
1051 r
= unit_load_fragment(u
);
1055 if (u
->load_state
== UNIT_STUB
)
1056 u
->load_state
= UNIT_LOADED
;
1058 /* Load drop-in directory data */
1059 r
= unit_load_dropin(unit_follow_merge(u
));
1066 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
1070 if (target
->type
!= UNIT_TARGET
)
1073 /* Only add the dependency if both units are loaded, so that
1074 * that loop check below is reliable */
1075 if (u
->load_state
!= UNIT_LOADED
||
1076 target
->load_state
!= UNIT_LOADED
)
1079 /* If either side wants no automatic dependencies, then let's
1081 if (!u
->default_dependencies
||
1082 !target
->default_dependencies
)
1085 /* Don't create loops */
1086 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
1089 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
1092 static int unit_add_target_dependencies(Unit
*u
) {
1094 static const UnitDependency deps
[] = {
1096 UNIT_REQUIRED_BY_OVERRIDABLE
,
1098 UNIT_REQUISITE_OF_OVERRIDABLE
,
1110 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
1111 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
1112 r
= unit_add_default_target_dependency(u
, target
);
1120 static int unit_add_slice_dependencies(Unit
*u
) {
1123 if (!unit_get_cgroup_context(u
))
1126 if (UNIT_ISSET(u
->slice
))
1127 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_WANTS
, UNIT_DEREF(u
->slice
), true);
1129 if (streq(u
->id
, SPECIAL_ROOT_SLICE
))
1132 return unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_WANTS
, SPECIAL_ROOT_SLICE
, NULL
, true);
1135 static int unit_add_mount_dependencies(Unit
*u
) {
1141 STRV_FOREACH(i
, u
->requires_mounts_for
) {
1142 char prefix
[strlen(*i
) + 1];
1144 PATH_FOREACH_PREFIX_MORE(prefix
, *i
) {
1147 r
= manager_get_unit_by_path(u
->manager
, prefix
, ".mount", &m
);
1155 if (m
->load_state
!= UNIT_LOADED
)
1158 r
= unit_add_dependency(u
, UNIT_AFTER
, m
, true);
1162 if (m
->fragment_path
) {
1163 r
= unit_add_dependency(u
, UNIT_REQUIRES
, m
, true);
1173 static int unit_add_startup_units(Unit
*u
) {
1176 c
= unit_get_cgroup_context(u
);
1180 if (c
->startup_cpu_shares
== (unsigned long) -1 &&
1181 c
->startup_blockio_weight
== (unsigned long) -1)
1184 return set_put(u
->manager
->startup_units
, u
);
1187 int unit_load(Unit
*u
) {
1192 if (u
->in_load_queue
) {
1193 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
1194 u
->in_load_queue
= false;
1197 if (u
->type
== _UNIT_TYPE_INVALID
)
1200 if (u
->load_state
!= UNIT_STUB
)
1203 if (UNIT_VTABLE(u
)->load
) {
1204 r
= UNIT_VTABLE(u
)->load(u
);
1209 if (u
->load_state
== UNIT_STUB
) {
1214 if (u
->load_state
== UNIT_LOADED
) {
1216 r
= unit_add_target_dependencies(u
);
1220 r
= unit_add_slice_dependencies(u
);
1224 r
= unit_add_mount_dependencies(u
);
1228 r
= unit_add_startup_units(u
);
1232 if (u
->on_failure_job_mode
== JOB_ISOLATE
&& set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
1233 log_unit_error(u
, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
1238 unit_update_cgroup_members_masks(u
);
1241 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
1243 unit_add_to_dbus_queue(unit_follow_merge(u
));
1244 unit_add_to_gc_queue(u
);
1249 u
->load_state
= u
->load_state
== UNIT_STUB
? UNIT_NOT_FOUND
: UNIT_ERROR
;
1251 unit_add_to_dbus_queue(u
);
1252 unit_add_to_gc_queue(u
);
1254 log_unit_debug_errno(u
, r
, "Failed to load configuration: %m");
1259 static bool unit_condition_test_list(Unit
*u
, Condition
*first
, const char *(*to_string
)(ConditionType t
)) {
1266 /* If the condition list is empty, then it is true */
1270 /* Otherwise, if all of the non-trigger conditions apply and
1271 * if any of the trigger conditions apply (unless there are
1272 * none) we return true */
1273 LIST_FOREACH(conditions
, c
, first
) {
1276 r
= condition_test(c
);
1279 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
1281 c
->trigger
? "|" : "",
1282 c
->negate
? "!" : "",
1288 c
->trigger
? "|" : "",
1289 c
->negate
? "!" : "",
1291 condition_result_to_string(c
->result
));
1293 if (!c
->trigger
&& r
<= 0)
1296 if (c
->trigger
&& triggered
<= 0)
1300 return triggered
!= 0;
1303 static bool unit_condition_test(Unit
*u
) {
1306 dual_timestamp_get(&u
->condition_timestamp
);
1307 u
->condition_result
= unit_condition_test_list(u
, u
->conditions
, condition_type_to_string
);
1309 return u
->condition_result
;
1312 static bool unit_assert_test(Unit
*u
) {
1315 dual_timestamp_get(&u
->assert_timestamp
);
1316 u
->assert_result
= unit_condition_test_list(u
, u
->asserts
, assert_type_to_string
);
1318 return u
->assert_result
;
1321 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1322 const UnitStatusMessageFormats
*format_table
;
1326 assert(t
< _JOB_TYPE_MAX
);
1328 if (t
!= JOB_START
&& t
!= JOB_STOP
)
1331 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1335 return format_table
->starting_stopping
[t
== JOB_STOP
];
1338 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
1343 assert(t
< _JOB_TYPE_MAX
);
1345 format
= unit_get_status_message_format(u
, t
);
1349 /* Return generic strings */
1351 return "Starting %s.";
1352 else if (t
== JOB_STOP
)
1353 return "Stopping %s.";
1354 else if (t
== JOB_RELOAD
)
1355 return "Reloading %s.";
1360 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1365 /* We only print status messages for selected units on
1366 * selected operations. */
1368 format
= unit_get_status_message_format(u
, t
);
1372 DISABLE_WARNING_FORMAT_NONLITERAL
;
1373 unit_status_printf(u
, "", format
);
1377 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1384 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1387 if (log_on_console())
1390 /* We log status messages for all units and all operations. */
1392 format
= unit_get_status_message_format_try_harder(u
, t
);
1396 DISABLE_WARNING_FORMAT_NONLITERAL
;
1397 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1400 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1401 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1402 SD_MESSAGE_UNIT_RELOADING
;
1404 /* Note that we deliberately use LOG_MESSAGE() instead of
1405 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1406 * closely what is written to screen using the status output,
1407 * which is supposed the highest level, friendliest output
1408 * possible, which means we should avoid the low-level unit
1410 log_struct(LOG_INFO
,
1411 LOG_MESSAGE_ID(mid
),
1413 LOG_MESSAGE("%s", buf
),
1418 * -EBADR: This unit type does not support starting.
1419 * -EALREADY: Unit is already started.
1420 * -EAGAIN: An operation is already in progress. Retry later.
1421 * -ECANCELED: Too many requests for now.
1422 * -EPROTO: Assert failed
1424 int unit_start(Unit
*u
) {
1425 UnitActiveState state
;
1431 if (u
->load_state
!= UNIT_LOADED
)
1434 /* If this is already started, then this will succeed. Note
1435 * that this will even succeed if this unit is not startable
1436 * by the user. This is relied on to detect when we need to
1437 * wait for units and when waiting is finished. */
1438 state
= unit_active_state(u
);
1439 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1442 /* If the conditions failed, don't do anything at all. If we
1443 * already are activating this call might still be useful to
1444 * speed up activation in case there is some hold-off time,
1445 * but we don't want to recheck the condition in that case. */
1446 if (state
!= UNIT_ACTIVATING
&&
1447 !unit_condition_test(u
)) {
1448 log_unit_debug(u
, "Starting requested but condition failed. Not starting unit.");
1452 /* If the asserts failed, fail the entire job */
1453 if (state
!= UNIT_ACTIVATING
&&
1454 !unit_assert_test(u
)) {
1455 log_unit_notice(u
, "Starting requested but asserts failed.");
1459 /* Forward to the main object, if we aren't it. */
1460 following
= unit_following(u
);
1462 log_unit_debug(u
, "Redirecting start request from %s to %s.", u
->id
, following
->id
);
1463 return unit_start(following
);
1466 if (!unit_supported(u
))
1469 /* If it is stopped, but we cannot start it, then fail */
1470 if (!UNIT_VTABLE(u
)->start
)
1473 /* We don't suppress calls to ->start() here when we are
1474 * already starting, to allow this request to be used as a
1475 * "hurry up" call, for example when the unit is in some "auto
1476 * restart" state where it waits for a holdoff timer to elapse
1477 * before it will start again. */
1479 unit_add_to_dbus_queue(u
);
1481 r
= UNIT_VTABLE(u
)->start(u
);
1485 /* Log if the start function actually did something */
1486 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1487 unit_status_print_starting_stopping(u
, JOB_START
);
1491 bool unit_can_start(Unit
*u
) {
1494 return !!UNIT_VTABLE(u
)->start
;
1497 bool unit_can_isolate(Unit
*u
) {
1500 return unit_can_start(u
) &&
1505 * -EBADR: This unit type does not support stopping.
1506 * -EALREADY: Unit is already stopped.
1507 * -EAGAIN: An operation is already in progress. Retry later.
1509 int unit_stop(Unit
*u
) {
1510 UnitActiveState state
;
1516 state
= unit_active_state(u
);
1517 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1520 following
= unit_following(u
);
1522 log_unit_debug(u
, "Redirecting stop request from %s to %s.", u
->id
, following
->id
);
1523 return unit_stop(following
);
1526 if (!UNIT_VTABLE(u
)->stop
)
1529 unit_add_to_dbus_queue(u
);
1531 r
= UNIT_VTABLE(u
)->stop(u
);
1535 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1536 unit_status_print_starting_stopping(u
, JOB_STOP
);
1541 * -EBADR: This unit type does not support reloading.
1542 * -ENOEXEC: Unit is not started.
1543 * -EAGAIN: An operation is already in progress. Retry later.
1545 int unit_reload(Unit
*u
) {
1546 UnitActiveState state
;
1552 if (u
->load_state
!= UNIT_LOADED
)
1555 if (!unit_can_reload(u
))
1558 state
= unit_active_state(u
);
1559 if (state
== UNIT_RELOADING
)
1562 if (state
!= UNIT_ACTIVE
) {
1563 log_unit_warning(u
, "Unit cannot be reloaded because it is inactive.");
1567 following
= unit_following(u
);
1569 log_unit_debug(u
, "Redirecting reload request from %s to %s.", u
->id
, following
->id
);
1570 return unit_reload(following
);
1573 unit_add_to_dbus_queue(u
);
1575 r
= UNIT_VTABLE(u
)->reload(u
);
1579 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1583 bool unit_can_reload(Unit
*u
) {
1586 if (!UNIT_VTABLE(u
)->reload
)
1589 if (!UNIT_VTABLE(u
)->can_reload
)
1592 return UNIT_VTABLE(u
)->can_reload(u
);
1595 static void unit_check_unneeded(Unit
*u
) {
1597 static const UnitDependency needed_dependencies
[] = {
1599 UNIT_REQUIRED_BY_OVERRIDABLE
,
1601 UNIT_REQUISITE_OF_OVERRIDABLE
,
1613 /* If this service shall be shut down when unneeded then do
1616 if (!u
->stop_when_unneeded
)
1619 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1622 for (j
= 0; j
< ELEMENTSOF(needed_dependencies
); j
++)
1623 SET_FOREACH(other
, u
->dependencies
[needed_dependencies
[j
]], i
)
1624 if (unit_active_or_pending(other
))
1627 /* If stopping a unit fails continously we might enter a stop
1628 * loop here, hence stop acting on the service being
1629 * unnecessary after a while. */
1630 if (!ratelimit_test(&u
->check_unneeded_ratelimit
)) {
1631 log_unit_warning(u
, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1635 log_unit_info(u
, "Unit not needed anymore. Stopping.");
1637 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1638 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1640 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1643 static void unit_check_binds_to(Unit
*u
) {
1653 if (unit_active_state(u
) != UNIT_ACTIVE
)
1656 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
) {
1660 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
1671 log_unit_info(u
, "Unit is bound to inactive unit %s. Stopping, too.", other
->id
);
1673 /* A unit we need to run is gone. Sniff. Let's stop this. */
1674 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1677 static void retroactively_start_dependencies(Unit
*u
) {
1682 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1684 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1685 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1686 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1687 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1689 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1690 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1691 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1692 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1694 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1695 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1696 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1697 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1699 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1700 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1701 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1702 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1704 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1705 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1706 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1708 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1709 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1710 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1713 static void retroactively_stop_dependencies(Unit
*u
) {
1718 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1720 /* Pull down units which are bound to us recursively if enabled */
1721 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1722 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1723 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1726 static void check_unneeded_dependencies(Unit
*u
) {
1731 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1733 /* Garbage collect services that might not be needed anymore, if enabled */
1734 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1735 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1736 unit_check_unneeded(other
);
1737 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1738 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1739 unit_check_unneeded(other
);
1740 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1741 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1742 unit_check_unneeded(other
);
1743 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1744 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1745 unit_check_unneeded(other
);
1746 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1747 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1748 unit_check_unneeded(other
);
1749 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1750 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1751 unit_check_unneeded(other
);
1754 void unit_start_on_failure(Unit
*u
) {
1760 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1763 log_unit_info(u
, "Triggering OnFailure= dependencies.");
1765 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1768 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1770 log_unit_error_errno(u
, r
, "Failed to enqueue OnFailure= job: %m");
1774 void unit_trigger_notify(Unit
*u
) {
1780 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1781 if (UNIT_VTABLE(other
)->trigger_notify
)
1782 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1785 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1790 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1791 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1793 /* Note that this is called for all low-level state changes,
1794 * even if they might map to the same high-level
1795 * UnitActiveState! That means that ns == os is an expected
1796 * behavior here. For example: if a mount point is remounted
1797 * this function will be called too! */
1801 /* Update timestamps for state changes */
1802 if (m
->n_reloading
<= 0) {
1805 dual_timestamp_get(&ts
);
1807 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1808 u
->inactive_exit_timestamp
= ts
;
1809 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1810 u
->inactive_enter_timestamp
= ts
;
1812 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1813 u
->active_enter_timestamp
= ts
;
1814 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1815 u
->active_exit_timestamp
= ts
;
1818 /* Keep track of failed units */
1819 manager_update_failed_units(u
->manager
, u
, ns
== UNIT_FAILED
);
1821 /* Make sure the cgroup is always removed when we become inactive */
1822 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1823 unit_destroy_cgroup_if_empty(u
);
1825 /* Note that this doesn't apply to RemainAfterExit services exiting
1826 * successfully, since there's no change of state in that case. Which is
1827 * why it is handled in service_set_state() */
1828 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1831 ec
= unit_get_exec_context(u
);
1832 if (ec
&& exec_context_may_touch_console(ec
)) {
1833 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1836 if (m
->n_on_console
== 0)
1837 /* unset no_console_output flag, since the console is free */
1838 m
->no_console_output
= false;
1847 if (u
->job
->state
== JOB_WAITING
)
1849 /* So we reached a different state for this
1850 * job. Let's see if we can run it now if it
1851 * failed previously due to EAGAIN. */
1852 job_add_to_run_queue(u
->job
);
1854 /* Let's check whether this state change constitutes a
1855 * finished job, or maybe contradicts a running job and
1856 * hence needs to invalidate jobs. */
1858 switch (u
->job
->type
) {
1861 case JOB_VERIFY_ACTIVE
:
1863 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1864 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1865 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1868 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1869 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1875 case JOB_RELOAD_OR_START
:
1877 if (u
->job
->state
== JOB_RUNNING
) {
1878 if (ns
== UNIT_ACTIVE
)
1879 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1880 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1883 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1884 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1892 case JOB_TRY_RESTART
:
1894 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1895 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1896 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1898 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1904 assert_not_reached("Job type unknown");
1910 if (m
->n_reloading
<= 0) {
1912 /* If this state change happened without being
1913 * requested by a job, then let's retroactively start
1914 * or stop dependencies. We skip that step when
1915 * deserializing, since we don't want to create any
1916 * additional jobs just because something is already
1920 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1921 retroactively_start_dependencies(u
);
1922 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1923 retroactively_stop_dependencies(u
);
1926 /* stop unneeded units regardless if going down was expected or not */
1927 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1928 check_unneeded_dependencies(u
);
1930 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1931 log_unit_notice(u
, "Unit entered failed state.");
1932 unit_start_on_failure(u
);
1936 /* Some names are special */
1937 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1939 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1940 /* The bus might have just become available,
1941 * hence try to connect to it, if we aren't
1945 if (u
->type
== UNIT_SERVICE
&&
1946 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1947 m
->n_reloading
<= 0) {
1948 /* Write audit record if we have just finished starting up */
1949 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1953 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1954 manager_send_unit_plymouth(m
, u
);
1958 /* We don't care about D-Bus here, since we'll get an
1959 * asynchronous notification for it anyway. */
1961 if (u
->type
== UNIT_SERVICE
&&
1962 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1963 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1964 m
->n_reloading
<= 0) {
1966 /* Hmm, if there was no start record written
1967 * write it now, so that we always have a nice
1970 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1972 if (ns
== UNIT_INACTIVE
)
1973 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1975 /* Write audit record if we have just finished shutting down */
1976 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1978 u
->in_audit
= false;
1982 manager_recheck_journal(m
);
1983 unit_trigger_notify(u
);
1985 if (u
->manager
->n_reloading
<= 0) {
1986 /* Maybe we finished startup and are now ready for
1987 * being stopped because unneeded? */
1988 unit_check_unneeded(u
);
1990 /* Maybe we finished startup, but something we needed
1991 * has vanished? Let's die then. (This happens when
1992 * something BindsTo= to a Type=oneshot unit, as these
1993 * units go directly from starting to inactive,
1994 * without ever entering started.) */
1995 unit_check_binds_to(u
);
1998 unit_add_to_dbus_queue(u
);
1999 unit_add_to_gc_queue(u
);
2002 int unit_watch_pid(Unit
*u
, pid_t pid
) {
2008 /* Watch a specific PID. We only support one or two units
2009 * watching each PID for now, not more. */
2011 r
= set_ensure_allocated(&u
->pids
, NULL
);
2015 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
2019 r
= hashmap_put(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2021 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
2025 r
= hashmap_put(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2028 q
= set_put(u
->pids
, LONG_TO_PTR(pid
));
2035 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
2039 hashmap_remove_value(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2040 hashmap_remove_value(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2041 set_remove(u
->pids
, LONG_TO_PTR(pid
));
2044 void unit_unwatch_all_pids(Unit
*u
) {
2047 while (!set_isempty(u
->pids
))
2048 unit_unwatch_pid(u
, PTR_TO_LONG(set_first(u
->pids
)));
2054 static int unit_watch_pids_in_path(Unit
*u
, const char *path
) {
2055 _cleanup_closedir_
DIR *d
= NULL
;
2056 _cleanup_fclose_
FILE *f
= NULL
;
2062 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
2064 r
= cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER
, path
, &f
);
2068 while ((r
= cg_read_pid(f
, &pid
)) > 0) {
2069 r
= unit_watch_pid(u
, pid
);
2070 if (r
< 0 && ret
>= 0)
2073 if (r
< 0 && ret
>= 0)
2076 } else if (ret
>= 0)
2079 r
= cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER
, path
, &d
);
2083 while ((r
= cg_read_subgroup(d
, &fn
)) > 0) {
2084 _cleanup_free_
char *p
= NULL
;
2086 p
= strjoin(path
, "/", fn
, NULL
);
2092 r
= unit_watch_pids_in_path(u
, p
);
2093 if (r
< 0 && ret
>= 0)
2096 if (r
< 0 && ret
>= 0)
2099 } else if (ret
>= 0)
2105 int unit_watch_all_pids(Unit
*u
) {
2108 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
2110 if (!u
->cgroup_path
)
2113 return unit_watch_pids_in_path(u
, u
->cgroup_path
);
2116 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2122 /* Cleans dead PIDs from our list */
2124 SET_FOREACH(e
, u
->pids
, i
) {
2125 pid_t pid
= PTR_TO_LONG(e
);
2127 if (pid
== except1
|| pid
== except2
)
2130 if (!pid_is_unwaited(pid
))
2131 unit_unwatch_pid(u
, pid
);
2135 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2137 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2141 case JOB_VERIFY_ACTIVE
:
2148 case JOB_TRY_RESTART
:
2149 return unit_can_start(u
);
2152 return unit_can_reload(u
);
2154 case JOB_RELOAD_OR_START
:
2155 return unit_can_reload(u
) && unit_can_start(u
);
2158 assert_not_reached("Invalid job type");
2162 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
) {
2165 /* Only warn about some unit types */
2166 if (!IN_SET(dependency
, UNIT_CONFLICTS
, UNIT_CONFLICTED_BY
, UNIT_BEFORE
, UNIT_AFTER
, UNIT_ON_FAILURE
, UNIT_TRIGGERS
, UNIT_TRIGGERED_BY
))
2169 if (streq_ptr(u
->id
, other
))
2170 log_unit_warning(u
, "Dependency %s=%s dropped", unit_dependency_to_string(dependency
), u
->id
);
2172 log_unit_warning(u
, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency
), strna(other
), u
->id
);
2175 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2177 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2178 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2179 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2180 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2181 [UNIT_REQUISITE
] = UNIT_REQUISITE_OF
,
2182 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUISITE_OF_OVERRIDABLE
,
2183 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2184 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2185 [UNIT_REQUIRED_BY
] = UNIT_REQUIRES
,
2186 [UNIT_REQUIRED_BY_OVERRIDABLE
] = UNIT_REQUIRES_OVERRIDABLE
,
2187 [UNIT_REQUISITE_OF
] = UNIT_REQUISITE
,
2188 [UNIT_REQUISITE_OF_OVERRIDABLE
] = UNIT_REQUISITE_OVERRIDABLE
,
2189 [UNIT_WANTED_BY
] = UNIT_WANTS
,
2190 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2191 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2192 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2193 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2194 [UNIT_BEFORE
] = UNIT_AFTER
,
2195 [UNIT_AFTER
] = UNIT_BEFORE
,
2196 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2197 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2198 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2199 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2200 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2201 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2202 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2203 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2205 int r
, q
= 0, v
= 0, w
= 0;
2206 Unit
*orig_u
= u
, *orig_other
= other
;
2209 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2212 u
= unit_follow_merge(u
);
2213 other
= unit_follow_merge(other
);
2215 /* We won't allow dependencies on ourselves. We will not
2216 * consider them an error however. */
2218 maybe_warn_about_dependency(orig_u
, orig_other
->id
, d
);
2222 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2226 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2227 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2232 if (add_reference
) {
2233 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2237 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2242 q
= set_put(u
->dependencies
[d
], other
);
2246 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2247 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2254 if (add_reference
) {
2255 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2261 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2266 unit_add_to_dbus_queue(u
);
2271 set_remove(u
->dependencies
[d
], other
);
2274 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2277 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2282 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2287 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2291 return unit_add_dependency(u
, e
, other
, add_reference
);
2294 static int resolve_template(Unit
*u
, const char *name
, const char*path
, char **buf
, const char **ret
) {
2298 assert(name
|| path
);
2303 name
= basename(path
);
2305 if (!unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
2312 r
= unit_name_replace_instance(name
, u
->instance
, buf
);
2314 _cleanup_free_
char *i
= NULL
;
2316 r
= unit_name_to_prefix(u
->id
, &i
);
2320 r
= unit_name_replace_instance(name
, i
, buf
);
2329 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2330 _cleanup_free_
char *buf
= NULL
;
2335 assert(name
|| path
);
2337 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2341 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2345 return unit_add_dependency(u
, d
, other
, add_reference
);
2348 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2349 _cleanup_free_
char *buf
= NULL
;
2354 assert(name
|| path
);
2356 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2360 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2364 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2367 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2368 _cleanup_free_
char *buf
= NULL
;
2373 assert(name
|| path
);
2375 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2379 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2383 return unit_add_dependency(other
, d
, u
, add_reference
);
2386 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2387 _cleanup_free_
char *buf
= NULL
;
2392 assert(name
|| path
);
2394 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2398 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2402 return unit_add_two_dependencies(other
, d
, e
, u
, add_reference
);
2405 int set_unit_path(const char *p
) {
2406 /* This is mostly for debug purposes */
2407 if (setenv("SYSTEMD_UNIT_PATH", p
, 0) < 0)
2413 char *unit_dbus_path(Unit
*u
) {
2419 return unit_dbus_path_from_name(u
->id
);
2422 char *unit_default_cgroup_path(Unit
*u
) {
2423 _cleanup_free_
char *escaped
= NULL
, *slice
= NULL
;
2428 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
2429 return strdup(u
->manager
->cgroup_root
);
2431 if (UNIT_ISSET(u
->slice
) && !unit_has_name(UNIT_DEREF(u
->slice
), SPECIAL_ROOT_SLICE
)) {
2432 r
= cg_slice_to_path(UNIT_DEREF(u
->slice
)->id
, &slice
);
2437 escaped
= cg_escape(u
->id
);
2442 return strjoin(u
->manager
->cgroup_root
, "/", slice
, "/", escaped
, NULL
);
2444 return strjoin(u
->manager
->cgroup_root
, "/", escaped
, NULL
);
2447 int unit_add_default_slice(Unit
*u
, CGroupContext
*c
) {
2448 _cleanup_free_
char *b
= NULL
;
2449 const char *slice_name
;
2456 if (UNIT_ISSET(u
->slice
))
2460 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2462 /* Implicitly place all instantiated units in their
2463 * own per-template slice */
2465 r
= unit_name_to_prefix(u
->id
, &prefix
);
2469 /* The prefix is already escaped, but it might include
2470 * "-" which has a special meaning for slice units,
2471 * hence escape it here extra. */
2472 escaped
= unit_name_escape(prefix
);
2476 if (u
->manager
->running_as
== MANAGER_SYSTEM
)
2477 b
= strjoin("system-", escaped
, ".slice", NULL
);
2479 b
= strappend(escaped
, ".slice");
2486 u
->manager
->running_as
== MANAGER_SYSTEM
2487 ? SPECIAL_SYSTEM_SLICE
2488 : SPECIAL_ROOT_SLICE
;
2490 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2494 unit_ref_set(&u
->slice
, slice
);
2498 const char *unit_slice_name(Unit
*u
) {
2501 if (!UNIT_ISSET(u
->slice
))
2504 return UNIT_DEREF(u
->slice
)->id
;
2507 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2508 _cleanup_free_
char *t
= NULL
;
2515 r
= unit_name_change_suffix(u
->id
, type
, &t
);
2518 if (unit_has_name(u
, t
))
2521 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2522 assert(r
< 0 || *_found
!= u
);
2526 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2530 /* Watch a specific name on the bus. We only support one unit
2531 * watching each name for now. */
2533 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2536 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2540 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2543 bool unit_can_serialize(Unit
*u
) {
2546 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2549 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2556 if (unit_can_serialize(u
)) {
2559 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2563 rt
= unit_get_exec_runtime(u
);
2565 r
= exec_runtime_serialize(u
, rt
, f
, fds
);
2571 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2572 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2573 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2574 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2575 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2576 dual_timestamp_serialize(f
, "assert-timestamp", &u
->assert_timestamp
);
2578 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2579 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2581 if (dual_timestamp_is_set(&u
->assert_timestamp
))
2582 unit_serialize_item(u
, f
, "assert-result", yes_no(u
->assert_result
));
2584 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2585 unit_serialize_item_format(u
, f
, "cpuacct-usage-base", "%" PRIu64
, u
->cpuacct_usage_base
);
2588 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2590 if (serialize_jobs
) {
2592 fprintf(f
, "job\n");
2593 job_serialize(u
->job
, f
, fds
);
2597 fprintf(f
, "job\n");
2598 job_serialize(u
->nop_job
, f
, fds
);
2607 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2618 va_start(ap
, format
);
2619 vfprintf(f
, format
, ap
);
2625 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2631 fprintf(f
, "%s=%s\n", key
, value
);
2634 static int unit_set_cgroup_path(Unit
*u
, const char *path
) {
2635 _cleanup_free_
char *p
= NULL
;
2647 if (streq_ptr(u
->cgroup_path
, p
))
2651 r
= hashmap_put(u
->manager
->cgroup_unit
, p
, u
);
2656 if (u
->cgroup_path
) {
2657 log_unit_debug(u
, "Changing cgroup path from %s to %s.", u
->cgroup_path
, strna(p
));
2658 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
2659 free(u
->cgroup_path
);
2668 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2669 ExecRuntime
**rt
= NULL
;
2677 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2679 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2682 char line
[LINE_MAX
], *l
, *v
;
2685 if (!fgets(line
, sizeof(line
), f
)) {
2698 k
= strcspn(l
, "=");
2706 if (streq(l
, "job")) {
2708 /* new-style serialized job */
2715 r
= job_deserialize(j
, f
, fds
);
2721 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2727 r
= job_install_deserialized(j
);
2729 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2737 type
= job_type_from_string(v
);
2739 log_unit_debug(u
, "Failed to parse job type value: %s", v
);
2741 u
->deserialized_job
= type
;
2744 } else if (streq(l
, "inactive-exit-timestamp")) {
2745 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2747 } else if (streq(l
, "active-enter-timestamp")) {
2748 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2750 } else if (streq(l
, "active-exit-timestamp")) {
2751 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2753 } else if (streq(l
, "inactive-enter-timestamp")) {
2754 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2756 } else if (streq(l
, "condition-timestamp")) {
2757 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2759 } else if (streq(l
, "assert-timestamp")) {
2760 dual_timestamp_deserialize(v
, &u
->assert_timestamp
);
2762 } else if (streq(l
, "condition-result")) {
2764 r
= parse_boolean(v
);
2766 log_unit_debug(u
, "Failed to parse condition result value %s, ignoring.", v
);
2768 u
->condition_result
= r
;
2772 } else if (streq(l
, "assert-result")) {
2774 r
= parse_boolean(v
);
2776 log_unit_debug(u
, "Failed to parse assert result value %s, ignoring.", v
);
2778 u
->assert_result
= r
;
2782 } else if (streq(l
, "transient")) {
2784 r
= parse_boolean(v
);
2786 log_unit_debug(u
, "Failed to parse transient bool %s, ignoring.", v
);
2792 } else if (streq(l
, "cpuacct-usage-base")) {
2794 r
= safe_atou64(v
, &u
->cpuacct_usage_base
);
2796 log_unit_debug(u
, "Failed to parse CPU usage %s, ignoring.", v
);
2800 } else if (streq(l
, "cgroup")) {
2802 r
= unit_set_cgroup_path(u
, v
);
2804 log_unit_debug_errno(u
, r
, "Failed to set cgroup path %s, ignoring: %m", v
);
2809 if (unit_can_serialize(u
)) {
2811 r
= exec_runtime_deserialize_item(u
, rt
, l
, v
, fds
);
2813 log_unit_warning(u
, "Failed to deserialize runtime parameter '%s', ignoring.", l
);
2817 /* Returns positive if key was handled by the call */
2822 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2824 log_unit_warning(u
, "Failed to deserialize unit parameter '%s', ignoring.", l
);
2829 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2831 _cleanup_free_
char *e
= NULL
;
2836 /* Adds in links to the device node that this unit is based on */
2840 if (!is_device_path(what
))
2843 /* When device units aren't supported (such as in a
2844 * container), don't create dependencies on them. */
2845 if (!unit_type_supported(UNIT_DEVICE
))
2848 r
= unit_name_from_path(what
, ".device", &e
);
2852 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2856 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_BINDS_TO
: UNIT_WANTS
, device
, true);
2861 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2869 int unit_coldplug(Unit
*u
) {
2874 /* Make sure we don't enter a loop, when coldplugging
2879 u
->coldplugged
= true;
2881 if (UNIT_VTABLE(u
)->coldplug
) {
2882 r
= UNIT_VTABLE(u
)->coldplug(u
);
2888 r
= job_coldplug(u
->job
);
2891 } else if (u
->deserialized_job
>= 0) {
2893 r
= manager_add_job(u
->manager
, u
->deserialized_job
, u
, JOB_IGNORE_REQUIREMENTS
, false, NULL
, NULL
);
2897 u
->deserialized_job
= _JOB_TYPE_INVALID
;
2903 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2904 DISABLE_WARNING_FORMAT_NONLITERAL
;
2905 manager_status_printf(u
->manager
, STATUS_TYPE_NORMAL
,
2906 status
, unit_status_msg_format
, unit_description(u
));
2910 bool unit_need_daemon_reload(Unit
*u
) {
2911 _cleanup_strv_free_
char **t
= NULL
;
2914 unsigned loaded_cnt
, current_cnt
;
2918 if (u
->fragment_path
) {
2920 if (stat(u
->fragment_path
, &st
) < 0)
2921 /* What, cannot access this anymore? */
2924 if (u
->fragment_mtime
> 0 &&
2925 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2929 if (u
->source_path
) {
2931 if (stat(u
->source_path
, &st
) < 0)
2934 if (u
->source_mtime
> 0 &&
2935 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2939 (void) unit_find_dropin_paths(u
, &t
);
2940 loaded_cnt
= strv_length(t
);
2941 current_cnt
= strv_length(u
->dropin_paths
);
2943 if (loaded_cnt
== current_cnt
) {
2944 if (loaded_cnt
== 0)
2947 if (strv_overlap(u
->dropin_paths
, t
)) {
2948 STRV_FOREACH(path
, u
->dropin_paths
) {
2950 if (stat(*path
, &st
) < 0)
2953 if (u
->dropin_mtime
> 0 &&
2954 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2965 void unit_reset_failed(Unit
*u
) {
2968 if (UNIT_VTABLE(u
)->reset_failed
)
2969 UNIT_VTABLE(u
)->reset_failed(u
);
2972 Unit
*unit_following(Unit
*u
) {
2975 if (UNIT_VTABLE(u
)->following
)
2976 return UNIT_VTABLE(u
)->following(u
);
2981 bool unit_stop_pending(Unit
*u
) {
2984 /* This call does check the current state of the unit. It's
2985 * hence useful to be called from state change calls of the
2986 * unit itself, where the state isn't updated yet. This is
2987 * different from unit_inactive_or_pending() which checks both
2988 * the current state and for a queued job. */
2990 return u
->job
&& u
->job
->type
== JOB_STOP
;
2993 bool unit_inactive_or_pending(Unit
*u
) {
2996 /* Returns true if the unit is inactive or going down */
2998 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
3001 if (unit_stop_pending(u
))
3007 bool unit_active_or_pending(Unit
*u
) {
3010 /* Returns true if the unit is active or going up */
3012 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
3016 (u
->job
->type
== JOB_START
||
3017 u
->job
->type
== JOB_RELOAD_OR_START
||
3018 u
->job
->type
== JOB_RESTART
))
3024 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
3026 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
3028 assert(signo
< _NSIG
);
3030 if (!UNIT_VTABLE(u
)->kill
)
3033 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
3036 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
3040 pid_set
= set_new(NULL
);
3044 /* Exclude the main/control pids from being killed via the cgroup */
3046 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
3051 if (control_pid
> 0) {
3052 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
3064 int unit_kill_common(
3070 sd_bus_error
*error
) {
3074 if (who
== KILL_MAIN
&& main_pid
<= 0) {
3076 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
3078 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
3081 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
3082 if (control_pid
< 0)
3083 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
3085 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
3088 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
3089 if (control_pid
> 0)
3090 if (kill(control_pid
, signo
) < 0)
3093 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
3095 if (kill(main_pid
, signo
) < 0)
3098 if (who
== KILL_ALL
&& u
->cgroup_path
) {
3099 _cleanup_set_free_ Set
*pid_set
= NULL
;
3102 /* Exclude the main/control pids from being killed via the cgroup */
3103 pid_set
= unit_pid_set(main_pid
, control_pid
);
3107 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, true, false, pid_set
);
3108 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
3115 int unit_following_set(Unit
*u
, Set
**s
) {
3119 if (UNIT_VTABLE(u
)->following_set
)
3120 return UNIT_VTABLE(u
)->following_set(u
, s
);
3126 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
3129 if (u
->unit_file_state
< 0 && u
->fragment_path
)
3130 u
->unit_file_state
= unit_file_get_state(
3131 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3132 NULL
, basename(u
->fragment_path
));
3134 return u
->unit_file_state
;
3137 int unit_get_unit_file_preset(Unit
*u
) {
3140 if (u
->unit_file_preset
< 0 && u
->fragment_path
)
3141 u
->unit_file_preset
= unit_file_query_preset(
3142 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3143 NULL
, basename(u
->fragment_path
));
3145 return u
->unit_file_preset
;
3148 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3153 unit_ref_unset(ref
);
3156 LIST_PREPEND(refs
, u
->refs
, ref
);
3160 void unit_ref_unset(UnitRef
*ref
) {
3166 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3170 int unit_patch_contexts(Unit
*u
) {
3178 /* Patch in the manager defaults into the exec and cgroup
3179 * contexts, _after_ the rest of the settings have been
3182 ec
= unit_get_exec_context(u
);
3184 /* This only copies in the ones that need memory */
3185 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3186 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3187 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3192 if (u
->manager
->running_as
== MANAGER_USER
&&
3193 !ec
->working_directory
) {
3195 r
= get_home_dir(&ec
->working_directory
);
3199 /* Allow user services to run, even if the
3200 * home directory is missing */
3201 ec
->working_directory_missing_ok
= true;
3204 if (u
->manager
->running_as
== MANAGER_USER
&&
3205 (ec
->syscall_whitelist
||
3206 !set_isempty(ec
->syscall_filter
) ||
3207 !set_isempty(ec
->syscall_archs
) ||
3208 ec
->address_families_whitelist
||
3209 !set_isempty(ec
->address_families
)))
3210 ec
->no_new_privileges
= true;
3212 if (ec
->private_devices
)
3213 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3216 cc
= unit_get_cgroup_context(u
);
3220 ec
->private_devices
&&
3221 cc
->device_policy
== CGROUP_AUTO
)
3222 cc
->device_policy
= CGROUP_CLOSED
;
3228 ExecContext
*unit_get_exec_context(Unit
*u
) {
3235 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3239 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3242 KillContext
*unit_get_kill_context(Unit
*u
) {
3249 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3253 return (KillContext
*) ((uint8_t*) u
+ offset
);
3256 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3262 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3266 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3269 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3275 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3279 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3282 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3283 if (u
->manager
->running_as
== MANAGER_USER
) {
3286 if (mode
== UNIT_PERSISTENT
&& !transient
)
3287 r
= user_config_home(dir
);
3289 r
= user_runtime_dir(dir
);
3296 if (mode
== UNIT_PERSISTENT
&& !transient
)
3297 *dir
= strdup("/etc/systemd/system");
3299 *dir
= strdup("/run/systemd/system");
3306 static int unit_drop_in_file(Unit
*u
,
3307 UnitSetPropertiesMode mode
, const char *name
, char **p
, char **q
) {
3308 _cleanup_free_
char *dir
= NULL
;
3313 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3317 return drop_in_file(dir
, u
->id
, 50, name
, p
, q
);
3320 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3322 _cleanup_free_
char *dir
= NULL
, *p
= NULL
, *q
= NULL
;
3327 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3330 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3334 r
= write_drop_in(dir
, u
->id
, 50, name
, data
);
3338 r
= drop_in_file(dir
, u
->id
, 50, name
, &p
, &q
);
3342 r
= strv_extend(&u
->dropin_paths
, q
);
3346 strv_sort(u
->dropin_paths
);
3347 strv_uniq(u
->dropin_paths
);
3349 u
->dropin_mtime
= now(CLOCK_REALTIME
);
3354 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3355 _cleanup_free_
char *p
= NULL
;
3363 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3366 va_start(ap
, format
);
3367 r
= vasprintf(&p
, format
, ap
);
3373 return unit_write_drop_in(u
, mode
, name
, p
);
3376 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3377 _cleanup_free_
char *ndata
= NULL
;
3383 if (!UNIT_VTABLE(u
)->private_section
)
3386 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3389 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3393 return unit_write_drop_in(u
, mode
, name
, ndata
);
3396 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3397 _cleanup_free_
char *p
= NULL
;
3405 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3408 va_start(ap
, format
);
3409 r
= vasprintf(&p
, format
, ap
);
3415 return unit_write_drop_in_private(u
, mode
, name
, p
);
3418 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
3419 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
3424 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3427 r
= unit_drop_in_file(u
, mode
, name
, &p
, &q
);
3432 r
= errno
== ENOENT
? 0 : -errno
;
3440 int unit_make_transient(Unit
*u
) {
3445 u
->load_state
= UNIT_STUB
;
3447 u
->transient
= true;
3449 free(u
->fragment_path
);
3450 u
->fragment_path
= NULL
;
3452 if (u
->manager
->running_as
== MANAGER_USER
) {
3453 _cleanup_free_
char *c
= NULL
;
3455 r
= user_runtime_dir(&c
);
3461 u
->fragment_path
= strjoin(c
, "/", u
->id
, NULL
);
3462 if (!u
->fragment_path
)
3467 u
->fragment_path
= strappend("/run/systemd/system/", u
->id
);
3468 if (!u
->fragment_path
)
3471 mkdir_p("/run/systemd/system", 0755);
3474 return write_string_file_atomic_label(u
->fragment_path
, "# Transient stub");
3477 int unit_kill_context(
3483 bool main_pid_alien
) {
3485 int sig
, wait_for_exit
= false, r
;
3490 if (c
->kill_mode
== KILL_NONE
)
3500 case KILL_TERMINATE
:
3501 sig
= c
->kill_signal
;
3504 assert_not_reached("KillOperation unknown");
3508 r
= kill_and_sigcont(main_pid
, sig
);
3510 if (r
< 0 && r
!= -ESRCH
) {
3511 _cleanup_free_
char *comm
= NULL
;
3512 get_process_comm(main_pid
, &comm
);
3514 log_unit_warning_errno(u
, r
, "Failed to kill main process " PID_FMT
" (%s): %m", main_pid
, strna(comm
));
3516 if (!main_pid_alien
)
3517 wait_for_exit
= true;
3519 if (c
->send_sighup
&& k
!= KILL_KILL
)
3520 kill(main_pid
, SIGHUP
);
3524 if (control_pid
> 0) {
3525 r
= kill_and_sigcont(control_pid
, sig
);
3527 if (r
< 0 && r
!= -ESRCH
) {
3528 _cleanup_free_
char *comm
= NULL
;
3529 get_process_comm(control_pid
, &comm
);
3531 log_unit_warning_errno(u
, r
, "Failed to kill control process " PID_FMT
" (%s): %m", control_pid
, strna(comm
));
3533 wait_for_exit
= true;
3535 if (c
->send_sighup
&& k
!= KILL_KILL
)
3536 kill(control_pid
, SIGHUP
);
3540 if ((c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& k
== KILL_KILL
)) && u
->cgroup_path
) {
3541 _cleanup_set_free_ Set
*pid_set
= NULL
;
3543 /* Exclude the main/control pids from being killed via the cgroup */
3544 pid_set
= unit_pid_set(main_pid
, control_pid
);
3548 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, true, false, pid_set
);
3550 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3551 log_unit_warning_errno(u
, r
, "Failed to kill control group: %m");
3554 /* FIXME: For now, we will not wait for the
3555 * cgroup members to die, simply because
3556 * cgroup notification is unreliable. It
3557 * doesn't work at all in containers, and
3558 * outside of containers it can be confused
3559 * easily by leaving directories in the
3562 /* wait_for_exit = true; */
3564 if (c
->send_sighup
&& k
!= KILL_KILL
) {
3567 pid_set
= unit_pid_set(main_pid
, control_pid
);
3571 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3576 return wait_for_exit
;
3579 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3580 char prefix
[strlen(path
) + 1], *p
;
3586 /* Registers a unit for requiring a certain path and all its
3587 * prefixes. We keep a simple array of these paths in the
3588 * unit, since its usually short. However, we build a prefix
3589 * table for all possible prefixes so that new appearing mount
3590 * units can easily determine which units to make themselves a
3593 if (!path_is_absolute(path
))
3600 path_kill_slashes(p
);
3602 if (!path_is_safe(p
)) {
3607 if (strv_contains(u
->requires_mounts_for
, p
)) {
3612 r
= strv_consume(&u
->requires_mounts_for
, p
);
3616 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3619 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3623 r
= hashmap_ensure_allocated(&u
->manager
->units_requiring_mounts_for
, &string_hash_ops
);
3637 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3653 int unit_setup_exec_runtime(Unit
*u
) {
3659 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3662 /* Check if there already is an ExecRuntime for this unit? */
3663 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3667 /* Try to get it from somebody else */
3668 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3670 *rt
= unit_get_exec_runtime(other
);
3672 exec_runtime_ref(*rt
);
3677 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3680 bool unit_type_supported(UnitType t
) {
3681 if (_unlikely_(t
< 0))
3683 if (_unlikely_(t
>= _UNIT_TYPE_MAX
))
3686 if (!unit_vtable
[t
]->supported
)
3689 return unit_vtable
[t
]->supported();
3692 void unit_warn_if_dir_nonempty(Unit
*u
, const char* where
) {
3698 r
= dir_is_empty(where
);
3702 log_unit_warning_errno(u
, r
, "Failed to check directory %s: %m", where
);
3706 log_struct(LOG_NOTICE
,
3707 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3709 LOG_UNIT_MESSAGE(u
, "Directory %s to mount over is not empty, mounting anyway.", where
),
3714 int unit_fail_if_symlink(Unit
*u
, const char* where
) {
3720 r
= is_symlink(where
);
3722 log_unit_debug_errno(u
, r
, "Failed to check symlink %s, ignoring: %m", where
);
3729 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3731 LOG_UNIT_MESSAGE(u
, "Mount on symlink %s not allowed.", where
),
3738 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3739 [UNIT_ACTIVE
] = "active",
3740 [UNIT_RELOADING
] = "reloading",
3741 [UNIT_INACTIVE
] = "inactive",
3742 [UNIT_FAILED
] = "failed",
3743 [UNIT_ACTIVATING
] = "activating",
3744 [UNIT_DEACTIVATING
] = "deactivating"
3747 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);