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
->default_dependencies
= true;
89 u
->unit_file_state
= _UNIT_FILE_STATE_INVALID
;
90 u
->unit_file_preset
= -1;
91 u
->on_failure_job_mode
= JOB_REPLACE
;
93 RATELIMIT_INIT(u
->auto_stop_ratelimit
, 10 * USEC_PER_SEC
, 16);
98 bool unit_has_name(Unit
*u
, const char *name
) {
102 return !!set_get(u
->names
, (char*) name
);
105 static void unit_init(Unit
*u
) {
112 assert(u
->type
>= 0);
114 cc
= unit_get_cgroup_context(u
);
116 cgroup_context_init(cc
);
118 /* Copy in the manager defaults into the cgroup
119 * context, _before_ the rest of the settings have
120 * been initialized */
122 cc
->cpu_accounting
= u
->manager
->default_cpu_accounting
;
123 cc
->blockio_accounting
= u
->manager
->default_blockio_accounting
;
124 cc
->memory_accounting
= u
->manager
->default_memory_accounting
;
127 ec
= unit_get_exec_context(u
);
129 exec_context_init(ec
);
131 kc
= unit_get_kill_context(u
);
133 kill_context_init(kc
);
135 if (UNIT_VTABLE(u
)->init
)
136 UNIT_VTABLE(u
)->init(u
);
139 int unit_add_name(Unit
*u
, const char *text
) {
140 _cleanup_free_
char *s
= NULL
, *i
= NULL
;
147 if (unit_name_is_valid(text
, UNIT_NAME_TEMPLATE
)) {
152 r
= unit_name_replace_instance(text
, u
->instance
, &s
);
161 if (set_contains(u
->names
, s
))
163 if (hashmap_contains(u
->manager
->units
, s
))
166 if (!unit_name_is_valid(s
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
169 t
= unit_name_to_type(s
);
173 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
)
176 r
= unit_name_to_instance(s
, &i
);
180 if (i
&& unit_vtable
[t
]->no_instances
)
183 /* Ensure that this unit is either instanced or not instanced,
184 * but not both. Note that we do allow names with different
185 * instance names however! */
186 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
)
189 if (unit_vtable
[t
]->no_alias
&& !set_isempty(u
->names
))
192 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
)
195 r
= set_put(u
->names
, s
);
200 r
= hashmap_put(u
->manager
->units
, s
, u
);
202 (void) set_remove(u
->names
, s
);
206 if (u
->type
== _UNIT_TYPE_INVALID
) {
211 LIST_PREPEND(units_by_type
, u
->manager
->units_by_type
[t
], u
);
220 unit_add_to_dbus_queue(u
);
224 int unit_choose_id(Unit
*u
, const char *name
) {
225 _cleanup_free_
char *t
= NULL
;
232 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
237 r
= unit_name_replace_instance(name
, u
->instance
, &t
);
244 /* Selects one of the names of this unit as the id */
245 s
= set_get(u
->names
, (char*) name
);
249 /* Determine the new instance from the new id */
250 r
= unit_name_to_instance(s
, &i
);
259 unit_add_to_dbus_queue(u
);
264 int unit_set_description(Unit
*u
, const char *description
) {
269 if (isempty(description
))
272 s
= strdup(description
);
277 free(u
->description
);
280 unit_add_to_dbus_queue(u
);
284 bool unit_check_gc(Unit
*u
) {
285 UnitActiveState state
;
294 state
= unit_active_state(u
);
296 /* If the unit is inactive and failed and no job is queued for
297 * it, then release its runtime resources */
298 if (UNIT_IS_INACTIVE_OR_FAILED(state
) &&
299 UNIT_VTABLE(u
)->release_resources
)
300 UNIT_VTABLE(u
)->release_resources(u
);
302 /* But we keep the unit object around for longer when it is
303 * referenced or configured to not be gc'ed */
304 if (state
!= UNIT_INACTIVE
)
307 if (UNIT_VTABLE(u
)->no_gc
)
316 if (UNIT_VTABLE(u
)->check_gc
)
317 if (UNIT_VTABLE(u
)->check_gc(u
))
323 void unit_add_to_load_queue(Unit
*u
) {
325 assert(u
->type
!= _UNIT_TYPE_INVALID
);
327 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
330 LIST_PREPEND(load_queue
, u
->manager
->load_queue
, u
);
331 u
->in_load_queue
= true;
334 void unit_add_to_cleanup_queue(Unit
*u
) {
337 if (u
->in_cleanup_queue
)
340 LIST_PREPEND(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
341 u
->in_cleanup_queue
= true;
344 void unit_add_to_gc_queue(Unit
*u
) {
347 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
350 if (unit_check_gc(u
))
353 LIST_PREPEND(gc_queue
, u
->manager
->gc_queue
, u
);
354 u
->in_gc_queue
= true;
356 u
->manager
->n_in_gc_queue
++;
359 void unit_add_to_dbus_queue(Unit
*u
) {
361 assert(u
->type
!= _UNIT_TYPE_INVALID
);
363 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
366 /* Shortcut things if nobody cares */
367 if (sd_bus_track_count(u
->manager
->subscribed
) <= 0 &&
368 set_isempty(u
->manager
->private_buses
)) {
369 u
->sent_dbus_new_signal
= true;
373 LIST_PREPEND(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
374 u
->in_dbus_queue
= true;
377 static void bidi_set_free(Unit
*u
, Set
*s
) {
383 /* Frees the set and makes sure we are dropped from the
384 * inverse pointers */
386 SET_FOREACH(other
, s
, i
) {
389 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
390 set_remove(other
->dependencies
[d
], u
);
392 unit_add_to_gc_queue(other
);
398 static void unit_remove_transient(Unit
*u
) {
406 if (u
->fragment_path
)
407 unlink(u
->fragment_path
);
409 STRV_FOREACH(i
, u
->dropin_paths
) {
410 _cleanup_free_
char *p
= NULL
;
415 r
= path_get_parent(*i
, &p
);
421 static void unit_free_requires_mounts_for(Unit
*u
) {
424 STRV_FOREACH(j
, u
->requires_mounts_for
) {
425 char s
[strlen(*j
) + 1];
427 PATH_FOREACH_PREFIX_MORE(s
, *j
) {
431 x
= hashmap_get2(u
->manager
->units_requiring_mounts_for
, s
, (void**) &y
);
437 if (set_isempty(x
)) {
438 hashmap_remove(u
->manager
->units_requiring_mounts_for
, y
);
445 strv_free(u
->requires_mounts_for
);
446 u
->requires_mounts_for
= NULL
;
449 static void unit_done(Unit
*u
) {
458 if (UNIT_VTABLE(u
)->done
)
459 UNIT_VTABLE(u
)->done(u
);
461 ec
= unit_get_exec_context(u
);
463 exec_context_done(ec
);
465 cc
= unit_get_cgroup_context(u
);
467 cgroup_context_done(cc
);
470 void unit_free(Unit
*u
) {
477 if (u
->manager
->n_reloading
<= 0)
478 unit_remove_transient(u
);
480 bus_unit_send_removed_signal(u
);
484 unit_free_requires_mounts_for(u
);
486 SET_FOREACH(t
, u
->names
, i
)
487 hashmap_remove_value(u
->manager
->units
, t
, u
);
501 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
502 bidi_set_free(u
, u
->dependencies
[d
]);
504 if (u
->type
!= _UNIT_TYPE_INVALID
)
505 LIST_REMOVE(units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
507 if (u
->in_load_queue
)
508 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
510 if (u
->in_dbus_queue
)
511 LIST_REMOVE(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
513 if (u
->in_cleanup_queue
)
514 LIST_REMOVE(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
516 if (u
->in_gc_queue
) {
517 LIST_REMOVE(gc_queue
, u
->manager
->gc_queue
, u
);
518 u
->manager
->n_in_gc_queue
--;
521 if (u
->in_cgroup_queue
)
522 LIST_REMOVE(cgroup_queue
, u
->manager
->cgroup_queue
, u
);
524 if (u
->cgroup_path
) {
525 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
526 free(u
->cgroup_path
);
529 manager_update_failed_units(u
->manager
, u
, false);
530 set_remove(u
->manager
->startup_units
, u
);
532 free(u
->description
);
533 strv_free(u
->documentation
);
534 free(u
->fragment_path
);
535 free(u
->source_path
);
536 strv_free(u
->dropin_paths
);
539 free(u
->job_timeout_reboot_arg
);
541 set_free_free(u
->names
);
543 unit_unwatch_all_pids(u
);
545 condition_free_list(u
->conditions
);
546 condition_free_list(u
->asserts
);
548 unit_ref_unset(&u
->slice
);
551 unit_ref_unset(u
->refs
);
556 UnitActiveState
unit_active_state(Unit
*u
) {
559 if (u
->load_state
== UNIT_MERGED
)
560 return unit_active_state(unit_follow_merge(u
));
562 /* After a reload it might happen that a unit is not correctly
563 * loaded but still has a process around. That's why we won't
564 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
566 return UNIT_VTABLE(u
)->active_state(u
);
569 const char* unit_sub_state_to_string(Unit
*u
) {
572 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
575 static int complete_move(Set
**s
, Set
**other
) {
585 r
= set_move(*s
, *other
);
596 static int merge_names(Unit
*u
, Unit
*other
) {
604 r
= complete_move(&u
->names
, &other
->names
);
608 set_free_free(other
->names
);
612 SET_FOREACH(t
, u
->names
, i
)
613 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
618 static int reserve_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
623 assert(d
< _UNIT_DEPENDENCY_MAX
);
626 * If u does not have this dependency set allocated, there is no need
627 * to reserve anything. In that case other's set will be transferred
628 * as a whole to u by complete_move().
630 if (!u
->dependencies
[d
])
633 /* merge_dependencies() will skip a u-on-u dependency */
634 n_reserve
= set_size(other
->dependencies
[d
]) - !!set_get(other
->dependencies
[d
], u
);
636 return set_reserve(u
->dependencies
[d
], n_reserve
);
639 static void merge_dependencies(Unit
*u
, Unit
*other
, const char *other_id
, UnitDependency d
) {
646 assert(d
< _UNIT_DEPENDENCY_MAX
);
648 /* Fix backwards pointers */
649 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
652 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++) {
653 /* Do not add dependencies between u and itself */
655 if (set_remove(back
->dependencies
[k
], other
))
656 maybe_warn_about_dependency(u
, other_id
, k
);
658 r
= set_remove_and_put(back
->dependencies
[k
], other
, u
);
660 set_remove(back
->dependencies
[k
], other
);
662 assert(r
>= 0 || r
== -ENOENT
);
667 /* Also do not move dependencies on u to itself */
668 back
= set_remove(other
->dependencies
[d
], u
);
670 maybe_warn_about_dependency(u
, other_id
, d
);
672 /* The move cannot fail. The caller must have performed a reservation. */
673 assert_se(complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]) == 0);
675 set_free(other
->dependencies
[d
]);
676 other
->dependencies
[d
] = NULL
;
679 int unit_merge(Unit
*u
, Unit
*other
) {
681 const char *other_id
= NULL
;
686 assert(u
->manager
== other
->manager
);
687 assert(u
->type
!= _UNIT_TYPE_INVALID
);
689 other
= unit_follow_merge(other
);
694 if (u
->type
!= other
->type
)
697 if (!u
->instance
!= !other
->instance
)
700 if (other
->load_state
!= UNIT_STUB
&&
701 other
->load_state
!= UNIT_NOT_FOUND
)
710 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
714 other_id
= strdupa(other
->id
);
716 /* Make reservations to ensure merge_dependencies() won't fail */
717 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
718 r
= reserve_dependencies(u
, other
, d
);
720 * We don't rollback reservations if we fail. We don't have
721 * a way to undo reservations. A reservation is not a leak.
728 r
= merge_names(u
, other
);
732 /* Redirect all references */
734 unit_ref_set(other
->refs
, u
);
736 /* Merge dependencies */
737 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
738 merge_dependencies(u
, other
, other_id
, d
);
740 other
->load_state
= UNIT_MERGED
;
741 other
->merged_into
= u
;
743 /* If there is still some data attached to the other node, we
744 * don't need it anymore, and can free it. */
745 if (other
->load_state
!= UNIT_STUB
)
746 if (UNIT_VTABLE(other
)->done
)
747 UNIT_VTABLE(other
)->done(other
);
749 unit_add_to_dbus_queue(u
);
750 unit_add_to_cleanup_queue(other
);
755 int unit_merge_by_name(Unit
*u
, const char *name
) {
758 _cleanup_free_
char *s
= NULL
;
763 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
767 r
= unit_name_replace_instance(name
, u
->instance
, &s
);
774 other
= manager_get_unit(u
->manager
, name
);
776 return unit_merge(u
, other
);
778 return unit_add_name(u
, name
);
781 Unit
* unit_follow_merge(Unit
*u
) {
784 while (u
->load_state
== UNIT_MERGED
)
785 assert_se(u
= u
->merged_into
);
790 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
796 if (c
->working_directory
) {
797 r
= unit_require_mounts_for(u
, c
->working_directory
);
802 if (c
->root_directory
) {
803 r
= unit_require_mounts_for(u
, c
->root_directory
);
808 if (u
->manager
->running_as
!= MANAGER_SYSTEM
)
811 if (c
->private_tmp
) {
812 r
= unit_require_mounts_for(u
, "/tmp");
816 r
= unit_require_mounts_for(u
, "/var/tmp");
821 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
822 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
823 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
824 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
825 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
826 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
827 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
828 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
829 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
830 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
831 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
832 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
835 /* If syslog or kernel logging is requested, make sure our own
836 * logging daemon is run first. */
838 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
845 const char *unit_description(Unit
*u
) {
849 return u
->description
;
854 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
860 timestamp1
[FORMAT_TIMESTAMP_MAX
],
861 timestamp2
[FORMAT_TIMESTAMP_MAX
],
862 timestamp3
[FORMAT_TIMESTAMP_MAX
],
863 timestamp4
[FORMAT_TIMESTAMP_MAX
],
864 timespan
[FORMAT_TIMESPAN_MAX
];
866 _cleanup_set_free_ Set
*following_set
= NULL
;
870 assert(u
->type
>= 0);
872 prefix
= strempty(prefix
);
873 prefix2
= strjoina(prefix
, "\t");
877 "%s\tDescription: %s\n"
879 "%s\tUnit Load State: %s\n"
880 "%s\tUnit Active State: %s\n"
881 "%s\tInactive Exit Timestamp: %s\n"
882 "%s\tActive Enter Timestamp: %s\n"
883 "%s\tActive Exit Timestamp: %s\n"
884 "%s\tInactive Enter Timestamp: %s\n"
885 "%s\tGC Check Good: %s\n"
886 "%s\tNeed Daemon Reload: %s\n"
887 "%s\tTransient: %s\n"
890 "%s\tCGroup realized: %s\n"
891 "%s\tCGroup mask: 0x%x\n"
892 "%s\tCGroup members mask: 0x%x\n",
894 prefix
, unit_description(u
),
895 prefix
, strna(u
->instance
),
896 prefix
, unit_load_state_to_string(u
->load_state
),
897 prefix
, unit_active_state_to_string(unit_active_state(u
)),
898 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
899 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
900 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
901 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
902 prefix
, yes_no(unit_check_gc(u
)),
903 prefix
, yes_no(unit_need_daemon_reload(u
)),
904 prefix
, yes_no(u
->transient
),
905 prefix
, strna(unit_slice_name(u
)),
906 prefix
, strna(u
->cgroup_path
),
907 prefix
, yes_no(u
->cgroup_realized
),
908 prefix
, u
->cgroup_realized_mask
,
909 prefix
, u
->cgroup_members_mask
);
911 SET_FOREACH(t
, u
->names
, i
)
912 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
914 STRV_FOREACH(j
, u
->documentation
)
915 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
917 following
= unit_following(u
);
919 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
921 r
= unit_following_set(u
, &following_set
);
925 SET_FOREACH(other
, following_set
, i
)
926 fprintf(f
, "%s\tFollowing Set Member: %s\n", prefix
, other
->id
);
929 if (u
->fragment_path
)
930 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
933 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
935 STRV_FOREACH(j
, u
->dropin_paths
)
936 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
938 if (u
->job_timeout
> 0)
939 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
941 if (u
->job_timeout_action
!= FAILURE_ACTION_NONE
)
942 fprintf(f
, "%s\tJob Timeout Action: %s\n", prefix
, failure_action_to_string(u
->job_timeout_action
));
944 if (u
->job_timeout_reboot_arg
)
945 fprintf(f
, "%s\tJob Timeout Reboot Argument: %s\n", prefix
, u
->job_timeout_reboot_arg
);
947 condition_dump_list(u
->conditions
, f
, prefix
, condition_type_to_string
);
948 condition_dump_list(u
->asserts
, f
, prefix
, assert_type_to_string
);
950 if (dual_timestamp_is_set(&u
->condition_timestamp
))
952 "%s\tCondition Timestamp: %s\n"
953 "%s\tCondition Result: %s\n",
954 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
955 prefix
, yes_no(u
->condition_result
));
957 if (dual_timestamp_is_set(&u
->assert_timestamp
))
959 "%s\tAssert Timestamp: %s\n"
960 "%s\tAssert Result: %s\n",
961 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->assert_timestamp
.realtime
)),
962 prefix
, yes_no(u
->assert_result
));
964 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
967 SET_FOREACH(other
, u
->dependencies
[d
], i
)
968 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
971 if (!strv_isempty(u
->requires_mounts_for
)) {
973 "%s\tRequiresMountsFor:", prefix
);
975 STRV_FOREACH(j
, u
->requires_mounts_for
)
976 fprintf(f
, " %s", *j
);
981 if (u
->load_state
== UNIT_LOADED
) {
984 "%s\tStopWhenUnneeded: %s\n"
985 "%s\tRefuseManualStart: %s\n"
986 "%s\tRefuseManualStop: %s\n"
987 "%s\tDefaultDependencies: %s\n"
988 "%s\tOnFailureJobMode: %s\n"
989 "%s\tIgnoreOnIsolate: %s\n"
990 "%s\tIgnoreOnSnapshot: %s\n",
991 prefix
, yes_no(u
->stop_when_unneeded
),
992 prefix
, yes_no(u
->refuse_manual_start
),
993 prefix
, yes_no(u
->refuse_manual_stop
),
994 prefix
, yes_no(u
->default_dependencies
),
995 prefix
, job_mode_to_string(u
->on_failure_job_mode
),
996 prefix
, yes_no(u
->ignore_on_isolate
),
997 prefix
, yes_no(u
->ignore_on_snapshot
));
999 if (UNIT_VTABLE(u
)->dump
)
1000 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
1002 } else if (u
->load_state
== UNIT_MERGED
)
1004 "%s\tMerged into: %s\n",
1005 prefix
, u
->merged_into
->id
);
1006 else if (u
->load_state
== UNIT_ERROR
)
1007 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
1011 job_dump(u
->job
, f
, prefix2
);
1014 job_dump(u
->nop_job
, f
, prefix2
);
1018 /* Common implementation for multiple backends */
1019 int unit_load_fragment_and_dropin(Unit
*u
) {
1024 /* Load a .{service,socket,...} file */
1025 r
= unit_load_fragment(u
);
1029 if (u
->load_state
== UNIT_STUB
)
1032 /* Load drop-in directory data */
1033 r
= unit_load_dropin(unit_follow_merge(u
));
1040 /* Common implementation for multiple backends */
1041 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
1046 /* Same as unit_load_fragment_and_dropin(), but whether
1047 * something can be loaded or not doesn't matter. */
1049 /* Load a .service file */
1050 r
= unit_load_fragment(u
);
1054 if (u
->load_state
== UNIT_STUB
)
1055 u
->load_state
= UNIT_LOADED
;
1057 /* Load drop-in directory data */
1058 r
= unit_load_dropin(unit_follow_merge(u
));
1065 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
1069 if (target
->type
!= UNIT_TARGET
)
1072 /* Only add the dependency if both units are loaded, so that
1073 * that loop check below is reliable */
1074 if (u
->load_state
!= UNIT_LOADED
||
1075 target
->load_state
!= UNIT_LOADED
)
1078 /* If either side wants no automatic dependencies, then let's
1080 if (!u
->default_dependencies
||
1081 !target
->default_dependencies
)
1084 /* Don't create loops */
1085 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
1088 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
1091 static int unit_add_target_dependencies(Unit
*u
) {
1093 static const UnitDependency deps
[] = {
1095 UNIT_REQUIRED_BY_OVERRIDABLE
,
1097 UNIT_REQUISITE_OF_OVERRIDABLE
,
1109 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
1110 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
1111 r
= unit_add_default_target_dependency(u
, target
);
1119 static int unit_add_slice_dependencies(Unit
*u
) {
1122 if (!unit_get_cgroup_context(u
))
1125 if (UNIT_ISSET(u
->slice
))
1126 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_WANTS
, UNIT_DEREF(u
->slice
), true);
1128 if (streq(u
->id
, SPECIAL_ROOT_SLICE
))
1131 return unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_WANTS
, SPECIAL_ROOT_SLICE
, NULL
, true);
1134 static int unit_add_mount_dependencies(Unit
*u
) {
1140 STRV_FOREACH(i
, u
->requires_mounts_for
) {
1141 char prefix
[strlen(*i
) + 1];
1143 PATH_FOREACH_PREFIX_MORE(prefix
, *i
) {
1146 r
= manager_get_unit_by_path(u
->manager
, prefix
, ".mount", &m
);
1154 if (m
->load_state
!= UNIT_LOADED
)
1157 r
= unit_add_dependency(u
, UNIT_AFTER
, m
, true);
1161 if (m
->fragment_path
) {
1162 r
= unit_add_dependency(u
, UNIT_REQUIRES
, m
, true);
1172 static int unit_add_startup_units(Unit
*u
) {
1175 c
= unit_get_cgroup_context(u
);
1179 if (c
->startup_cpu_shares
== (unsigned long) -1 &&
1180 c
->startup_blockio_weight
== (unsigned long) -1)
1183 return set_put(u
->manager
->startup_units
, u
);
1186 int unit_load(Unit
*u
) {
1191 if (u
->in_load_queue
) {
1192 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
1193 u
->in_load_queue
= false;
1196 if (u
->type
== _UNIT_TYPE_INVALID
)
1199 if (u
->load_state
!= UNIT_STUB
)
1202 if (UNIT_VTABLE(u
)->load
) {
1203 r
= UNIT_VTABLE(u
)->load(u
);
1208 if (u
->load_state
== UNIT_STUB
) {
1213 if (u
->load_state
== UNIT_LOADED
) {
1215 r
= unit_add_target_dependencies(u
);
1219 r
= unit_add_slice_dependencies(u
);
1223 r
= unit_add_mount_dependencies(u
);
1227 r
= unit_add_startup_units(u
);
1231 if (u
->on_failure_job_mode
== JOB_ISOLATE
&& set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
1232 log_unit_error(u
, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
1237 unit_update_cgroup_members_masks(u
);
1240 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
1242 unit_add_to_dbus_queue(unit_follow_merge(u
));
1243 unit_add_to_gc_queue(u
);
1248 u
->load_state
= u
->load_state
== UNIT_STUB
? UNIT_NOT_FOUND
: UNIT_ERROR
;
1250 unit_add_to_dbus_queue(u
);
1251 unit_add_to_gc_queue(u
);
1253 log_unit_debug_errno(u
, r
, "Failed to load configuration: %m");
1258 static bool unit_condition_test_list(Unit
*u
, Condition
*first
, const char *(*to_string
)(ConditionType t
)) {
1265 /* If the condition list is empty, then it is true */
1269 /* Otherwise, if all of the non-trigger conditions apply and
1270 * if any of the trigger conditions apply (unless there are
1271 * none) we return true */
1272 LIST_FOREACH(conditions
, c
, first
) {
1275 r
= condition_test(c
);
1278 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
1280 c
->trigger
? "|" : "",
1281 c
->negate
? "!" : "",
1287 c
->trigger
? "|" : "",
1288 c
->negate
? "!" : "",
1290 condition_result_to_string(c
->result
));
1292 if (!c
->trigger
&& r
<= 0)
1295 if (c
->trigger
&& triggered
<= 0)
1299 return triggered
!= 0;
1302 static bool unit_condition_test(Unit
*u
) {
1305 dual_timestamp_get(&u
->condition_timestamp
);
1306 u
->condition_result
= unit_condition_test_list(u
, u
->conditions
, condition_type_to_string
);
1308 return u
->condition_result
;
1311 static bool unit_assert_test(Unit
*u
) {
1314 dual_timestamp_get(&u
->assert_timestamp
);
1315 u
->assert_result
= unit_condition_test_list(u
, u
->asserts
, assert_type_to_string
);
1317 return u
->assert_result
;
1320 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1321 const UnitStatusMessageFormats
*format_table
;
1325 assert(t
< _JOB_TYPE_MAX
);
1327 if (t
!= JOB_START
&& t
!= JOB_STOP
)
1330 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1334 return format_table
->starting_stopping
[t
== JOB_STOP
];
1337 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
1342 assert(t
< _JOB_TYPE_MAX
);
1344 format
= unit_get_status_message_format(u
, t
);
1348 /* Return generic strings */
1350 return "Starting %s.";
1351 else if (t
== JOB_STOP
)
1352 return "Stopping %s.";
1353 else if (t
== JOB_RELOAD
)
1354 return "Reloading %s.";
1359 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1364 /* We only print status messages for selected units on
1365 * selected operations. */
1367 format
= unit_get_status_message_format(u
, t
);
1371 DISABLE_WARNING_FORMAT_NONLITERAL
;
1372 unit_status_printf(u
, "", format
);
1376 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1383 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1386 if (log_on_console())
1389 /* We log status messages for all units and all operations. */
1391 format
= unit_get_status_message_format_try_harder(u
, t
);
1395 DISABLE_WARNING_FORMAT_NONLITERAL
;
1396 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1399 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1400 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1401 SD_MESSAGE_UNIT_RELOADING
;
1403 /* Note that we deliberately use LOG_MESSAGE() instead of
1404 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1405 * closely what is written to screen using the status output,
1406 * which is supposed the highest level, friendliest output
1407 * possible, which means we should avoid the low-level unit
1409 log_struct(LOG_INFO
,
1410 LOG_MESSAGE_ID(mid
),
1412 LOG_MESSAGE("%s", buf
),
1417 * -EBADR: This unit type does not support starting.
1418 * -EALREADY: Unit is already started.
1419 * -EAGAIN: An operation is already in progress. Retry later.
1420 * -ECANCELED: Too many requests for now.
1421 * -EPROTO: Assert failed
1423 int unit_start(Unit
*u
) {
1424 UnitActiveState state
;
1430 if (u
->load_state
!= UNIT_LOADED
)
1433 /* If this is already started, then this will succeed. Note
1434 * that this will even succeed if this unit is not startable
1435 * by the user. This is relied on to detect when we need to
1436 * wait for units and when waiting is finished. */
1437 state
= unit_active_state(u
);
1438 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1441 /* If the conditions failed, don't do anything at all. If we
1442 * already are activating this call might still be useful to
1443 * speed up activation in case there is some hold-off time,
1444 * but we don't want to recheck the condition in that case. */
1445 if (state
!= UNIT_ACTIVATING
&&
1446 !unit_condition_test(u
)) {
1447 log_unit_debug(u
, "Starting requested but condition failed. Not starting unit.");
1451 /* If the asserts failed, fail the entire job */
1452 if (state
!= UNIT_ACTIVATING
&&
1453 !unit_assert_test(u
)) {
1454 log_unit_notice(u
, "Starting requested but asserts failed.");
1458 /* Forward to the main object, if we aren't it. */
1459 following
= unit_following(u
);
1461 log_unit_debug(u
, "Redirecting start request from %s to %s.", u
->id
, following
->id
);
1462 return unit_start(following
);
1465 if (!unit_supported(u
))
1468 /* If it is stopped, but we cannot start it, then fail */
1469 if (!UNIT_VTABLE(u
)->start
)
1472 /* We don't suppress calls to ->start() here when we are
1473 * already starting, to allow this request to be used as a
1474 * "hurry up" call, for example when the unit is in some "auto
1475 * restart" state where it waits for a holdoff timer to elapse
1476 * before it will start again. */
1478 unit_add_to_dbus_queue(u
);
1480 r
= UNIT_VTABLE(u
)->start(u
);
1484 /* Log if the start function actually did something */
1485 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1486 unit_status_print_starting_stopping(u
, JOB_START
);
1490 bool unit_can_start(Unit
*u
) {
1493 return !!UNIT_VTABLE(u
)->start
;
1496 bool unit_can_isolate(Unit
*u
) {
1499 return unit_can_start(u
) &&
1504 * -EBADR: This unit type does not support stopping.
1505 * -EALREADY: Unit is already stopped.
1506 * -EAGAIN: An operation is already in progress. Retry later.
1508 int unit_stop(Unit
*u
) {
1509 UnitActiveState state
;
1515 state
= unit_active_state(u
);
1516 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1519 following
= unit_following(u
);
1521 log_unit_debug(u
, "Redirecting stop request from %s to %s.", u
->id
, following
->id
);
1522 return unit_stop(following
);
1525 if (!UNIT_VTABLE(u
)->stop
)
1528 unit_add_to_dbus_queue(u
);
1530 r
= UNIT_VTABLE(u
)->stop(u
);
1534 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1535 unit_status_print_starting_stopping(u
, JOB_STOP
);
1540 * -EBADR: This unit type does not support reloading.
1541 * -ENOEXEC: Unit is not started.
1542 * -EAGAIN: An operation is already in progress. Retry later.
1544 int unit_reload(Unit
*u
) {
1545 UnitActiveState state
;
1551 if (u
->load_state
!= UNIT_LOADED
)
1554 if (!unit_can_reload(u
))
1557 state
= unit_active_state(u
);
1558 if (state
== UNIT_RELOADING
)
1561 if (state
!= UNIT_ACTIVE
) {
1562 log_unit_warning(u
, "Unit cannot be reloaded because it is inactive.");
1566 following
= unit_following(u
);
1568 log_unit_debug(u
, "Redirecting reload request from %s to %s.", u
->id
, following
->id
);
1569 return unit_reload(following
);
1572 unit_add_to_dbus_queue(u
);
1574 r
= UNIT_VTABLE(u
)->reload(u
);
1578 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1582 bool unit_can_reload(Unit
*u
) {
1585 if (!UNIT_VTABLE(u
)->reload
)
1588 if (!UNIT_VTABLE(u
)->can_reload
)
1591 return UNIT_VTABLE(u
)->can_reload(u
);
1594 static void unit_check_unneeded(Unit
*u
) {
1596 static const UnitDependency needed_dependencies
[] = {
1598 UNIT_REQUIRED_BY_OVERRIDABLE
,
1600 UNIT_REQUISITE_OF_OVERRIDABLE
,
1612 /* If this service shall be shut down when unneeded then do
1615 if (!u
->stop_when_unneeded
)
1618 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1621 for (j
= 0; j
< ELEMENTSOF(needed_dependencies
); j
++)
1622 SET_FOREACH(other
, u
->dependencies
[needed_dependencies
[j
]], i
)
1623 if (unit_active_or_pending(other
))
1626 /* If stopping a unit fails continously we might enter a stop
1627 * loop here, hence stop acting on the service being
1628 * unnecessary after a while. */
1629 if (!ratelimit_test(&u
->auto_stop_ratelimit
)) {
1630 log_unit_warning(u
, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1634 log_unit_info(u
, "Unit not needed anymore. Stopping.");
1636 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1637 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1639 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1642 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
)))
1670 /* If stopping a unit fails continously we might enter a stop
1671 * loop here, hence stop acting on the service being
1672 * unnecessary after a while. */
1673 if (!ratelimit_test(&u
->auto_stop_ratelimit
)) {
1674 log_unit_warning(u
, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other
->id
);
1679 log_unit_info(u
, "Unit is bound to inactive unit %s. Stopping, too.", other
->id
);
1681 /* A unit we need to run is gone. Sniff. Let's stop this. */
1682 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1684 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1687 static void retroactively_start_dependencies(Unit
*u
) {
1692 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1694 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], 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_REPLACE
, true, NULL
, NULL
);
1699 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], 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_REPLACE
, true, NULL
, NULL
);
1704 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1705 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1706 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1707 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1709 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1710 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1711 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1712 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1714 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1715 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1716 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1718 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1719 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1720 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1723 static void retroactively_stop_dependencies(Unit
*u
) {
1728 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1730 /* Pull down units which are bound to us recursively if enabled */
1731 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1732 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1733 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1736 static void check_unneeded_dependencies(Unit
*u
) {
1741 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1743 /* Garbage collect services that might not be needed anymore, if enabled */
1744 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1745 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1746 unit_check_unneeded(other
);
1747 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1748 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1749 unit_check_unneeded(other
);
1750 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1751 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1752 unit_check_unneeded(other
);
1753 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1754 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1755 unit_check_unneeded(other
);
1756 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1757 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1758 unit_check_unneeded(other
);
1759 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1760 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1761 unit_check_unneeded(other
);
1764 void unit_start_on_failure(Unit
*u
) {
1770 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1773 log_unit_info(u
, "Triggering OnFailure= dependencies.");
1775 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1778 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1780 log_unit_error_errno(u
, r
, "Failed to enqueue OnFailure= job: %m");
1784 void unit_trigger_notify(Unit
*u
) {
1790 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1791 if (UNIT_VTABLE(other
)->trigger_notify
)
1792 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1795 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1800 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1801 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1803 /* Note that this is called for all low-level state changes,
1804 * even if they might map to the same high-level
1805 * UnitActiveState! That means that ns == os is an expected
1806 * behavior here. For example: if a mount point is remounted
1807 * this function will be called too! */
1811 /* Update timestamps for state changes */
1812 if (m
->n_reloading
<= 0) {
1815 dual_timestamp_get(&ts
);
1817 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1818 u
->inactive_exit_timestamp
= ts
;
1819 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1820 u
->inactive_enter_timestamp
= ts
;
1822 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1823 u
->active_enter_timestamp
= ts
;
1824 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1825 u
->active_exit_timestamp
= ts
;
1828 /* Keep track of failed units */
1829 manager_update_failed_units(u
->manager
, u
, ns
== UNIT_FAILED
);
1831 /* Make sure the cgroup is always removed when we become inactive */
1832 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1833 unit_destroy_cgroup_if_empty(u
);
1835 /* Note that this doesn't apply to RemainAfterExit services exiting
1836 * successfully, since there's no change of state in that case. Which is
1837 * why it is handled in service_set_state() */
1838 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1841 ec
= unit_get_exec_context(u
);
1842 if (ec
&& exec_context_may_touch_console(ec
)) {
1843 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1846 if (m
->n_on_console
== 0)
1847 /* unset no_console_output flag, since the console is free */
1848 m
->no_console_output
= false;
1857 if (u
->job
->state
== JOB_WAITING
)
1859 /* So we reached a different state for this
1860 * job. Let's see if we can run it now if it
1861 * failed previously due to EAGAIN. */
1862 job_add_to_run_queue(u
->job
);
1864 /* Let's check whether this state change constitutes a
1865 * finished job, or maybe contradicts a running job and
1866 * hence needs to invalidate jobs. */
1868 switch (u
->job
->type
) {
1871 case JOB_VERIFY_ACTIVE
:
1873 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1874 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1875 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1878 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1879 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1885 case JOB_RELOAD_OR_START
:
1887 if (u
->job
->state
== JOB_RUNNING
) {
1888 if (ns
== UNIT_ACTIVE
)
1889 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1890 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1893 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1894 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1902 case JOB_TRY_RESTART
:
1904 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1905 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1906 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1908 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1914 assert_not_reached("Job type unknown");
1920 if (m
->n_reloading
<= 0) {
1922 /* If this state change happened without being
1923 * requested by a job, then let's retroactively start
1924 * or stop dependencies. We skip that step when
1925 * deserializing, since we don't want to create any
1926 * additional jobs just because something is already
1930 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1931 retroactively_start_dependencies(u
);
1932 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1933 retroactively_stop_dependencies(u
);
1936 /* stop unneeded units regardless if going down was expected or not */
1937 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1938 check_unneeded_dependencies(u
);
1940 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1941 log_unit_notice(u
, "Unit entered failed state.");
1942 unit_start_on_failure(u
);
1946 /* Some names are special */
1947 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1949 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1950 /* The bus might have just become available,
1951 * hence try to connect to it, if we aren't
1955 if (u
->type
== UNIT_SERVICE
&&
1956 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1957 m
->n_reloading
<= 0) {
1958 /* Write audit record if we have just finished starting up */
1959 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1963 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1964 manager_send_unit_plymouth(m
, u
);
1968 /* We don't care about D-Bus here, since we'll get an
1969 * asynchronous notification for it anyway. */
1971 if (u
->type
== UNIT_SERVICE
&&
1972 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1973 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1974 m
->n_reloading
<= 0) {
1976 /* Hmm, if there was no start record written
1977 * write it now, so that we always have a nice
1980 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1982 if (ns
== UNIT_INACTIVE
)
1983 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1985 /* Write audit record if we have just finished shutting down */
1986 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1988 u
->in_audit
= false;
1992 manager_recheck_journal(m
);
1993 unit_trigger_notify(u
);
1995 if (u
->manager
->n_reloading
<= 0) {
1996 /* Maybe we finished startup and are now ready for
1997 * being stopped because unneeded? */
1998 unit_check_unneeded(u
);
2000 /* Maybe we finished startup, but something we needed
2001 * has vanished? Let's die then. (This happens when
2002 * something BindsTo= to a Type=oneshot unit, as these
2003 * units go directly from starting to inactive,
2004 * without ever entering started.) */
2005 unit_check_binds_to(u
);
2008 unit_add_to_dbus_queue(u
);
2009 unit_add_to_gc_queue(u
);
2012 int unit_watch_pid(Unit
*u
, pid_t pid
) {
2018 /* Watch a specific PID. We only support one or two units
2019 * watching each PID for now, not more. */
2021 r
= set_ensure_allocated(&u
->pids
, NULL
);
2025 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
2029 r
= hashmap_put(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2031 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
2035 r
= hashmap_put(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2038 q
= set_put(u
->pids
, LONG_TO_PTR(pid
));
2045 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
2049 hashmap_remove_value(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2050 hashmap_remove_value(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2051 set_remove(u
->pids
, LONG_TO_PTR(pid
));
2054 void unit_unwatch_all_pids(Unit
*u
) {
2057 while (!set_isempty(u
->pids
))
2058 unit_unwatch_pid(u
, PTR_TO_LONG(set_first(u
->pids
)));
2064 static int unit_watch_pids_in_path(Unit
*u
, const char *path
) {
2065 _cleanup_closedir_
DIR *d
= NULL
;
2066 _cleanup_fclose_
FILE *f
= NULL
;
2072 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
2074 r
= cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER
, path
, &f
);
2078 while ((r
= cg_read_pid(f
, &pid
)) > 0) {
2079 r
= unit_watch_pid(u
, pid
);
2080 if (r
< 0 && ret
>= 0)
2083 if (r
< 0 && ret
>= 0)
2086 } else if (ret
>= 0)
2089 r
= cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER
, path
, &d
);
2093 while ((r
= cg_read_subgroup(d
, &fn
)) > 0) {
2094 _cleanup_free_
char *p
= NULL
;
2096 p
= strjoin(path
, "/", fn
, NULL
);
2102 r
= unit_watch_pids_in_path(u
, p
);
2103 if (r
< 0 && ret
>= 0)
2106 if (r
< 0 && ret
>= 0)
2109 } else if (ret
>= 0)
2115 int unit_watch_all_pids(Unit
*u
) {
2118 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
2120 if (!u
->cgroup_path
)
2123 return unit_watch_pids_in_path(u
, u
->cgroup_path
);
2126 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2132 /* Cleans dead PIDs from our list */
2134 SET_FOREACH(e
, u
->pids
, i
) {
2135 pid_t pid
= PTR_TO_LONG(e
);
2137 if (pid
== except1
|| pid
== except2
)
2140 if (!pid_is_unwaited(pid
))
2141 unit_unwatch_pid(u
, pid
);
2145 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2147 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2151 case JOB_VERIFY_ACTIVE
:
2158 case JOB_TRY_RESTART
:
2159 return unit_can_start(u
);
2162 return unit_can_reload(u
);
2164 case JOB_RELOAD_OR_START
:
2165 return unit_can_reload(u
) && unit_can_start(u
);
2168 assert_not_reached("Invalid job type");
2172 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
) {
2175 /* Only warn about some unit types */
2176 if (!IN_SET(dependency
, UNIT_CONFLICTS
, UNIT_CONFLICTED_BY
, UNIT_BEFORE
, UNIT_AFTER
, UNIT_ON_FAILURE
, UNIT_TRIGGERS
, UNIT_TRIGGERED_BY
))
2179 if (streq_ptr(u
->id
, other
))
2180 log_unit_warning(u
, "Dependency %s=%s dropped", unit_dependency_to_string(dependency
), u
->id
);
2182 log_unit_warning(u
, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency
), strna(other
), u
->id
);
2185 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2187 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2188 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2189 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2190 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2191 [UNIT_REQUISITE
] = UNIT_REQUISITE_OF
,
2192 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUISITE_OF_OVERRIDABLE
,
2193 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2194 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2195 [UNIT_REQUIRED_BY
] = UNIT_REQUIRES
,
2196 [UNIT_REQUIRED_BY_OVERRIDABLE
] = UNIT_REQUIRES_OVERRIDABLE
,
2197 [UNIT_REQUISITE_OF
] = UNIT_REQUISITE
,
2198 [UNIT_REQUISITE_OF_OVERRIDABLE
] = UNIT_REQUISITE_OVERRIDABLE
,
2199 [UNIT_WANTED_BY
] = UNIT_WANTS
,
2200 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2201 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2202 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2203 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2204 [UNIT_BEFORE
] = UNIT_AFTER
,
2205 [UNIT_AFTER
] = UNIT_BEFORE
,
2206 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2207 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2208 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2209 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2210 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2211 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2212 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2213 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2215 int r
, q
= 0, v
= 0, w
= 0;
2216 Unit
*orig_u
= u
, *orig_other
= other
;
2219 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2222 u
= unit_follow_merge(u
);
2223 other
= unit_follow_merge(other
);
2225 /* We won't allow dependencies on ourselves. We will not
2226 * consider them an error however. */
2228 maybe_warn_about_dependency(orig_u
, orig_other
->id
, d
);
2232 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2236 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2237 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2242 if (add_reference
) {
2243 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2247 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2252 q
= set_put(u
->dependencies
[d
], other
);
2256 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2257 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2264 if (add_reference
) {
2265 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2271 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2276 unit_add_to_dbus_queue(u
);
2281 set_remove(u
->dependencies
[d
], other
);
2284 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2287 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2292 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2297 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2301 return unit_add_dependency(u
, e
, other
, add_reference
);
2304 static int resolve_template(Unit
*u
, const char *name
, const char*path
, char **buf
, const char **ret
) {
2308 assert(name
|| path
);
2313 name
= basename(path
);
2315 if (!unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
2322 r
= unit_name_replace_instance(name
, u
->instance
, buf
);
2324 _cleanup_free_
char *i
= NULL
;
2326 r
= unit_name_to_prefix(u
->id
, &i
);
2330 r
= unit_name_replace_instance(name
, i
, buf
);
2339 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2340 _cleanup_free_
char *buf
= NULL
;
2345 assert(name
|| path
);
2347 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2351 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2355 return unit_add_dependency(u
, d
, other
, add_reference
);
2358 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2359 _cleanup_free_
char *buf
= NULL
;
2364 assert(name
|| path
);
2366 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2370 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2374 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2377 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2378 _cleanup_free_
char *buf
= NULL
;
2383 assert(name
|| path
);
2385 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2389 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2393 return unit_add_dependency(other
, d
, u
, add_reference
);
2396 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2397 _cleanup_free_
char *buf
= NULL
;
2402 assert(name
|| path
);
2404 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2408 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2412 return unit_add_two_dependencies(other
, d
, e
, u
, add_reference
);
2415 int set_unit_path(const char *p
) {
2416 /* This is mostly for debug purposes */
2417 if (setenv("SYSTEMD_UNIT_PATH", p
, 0) < 0)
2423 char *unit_dbus_path(Unit
*u
) {
2429 return unit_dbus_path_from_name(u
->id
);
2432 char *unit_default_cgroup_path(Unit
*u
) {
2433 _cleanup_free_
char *escaped
= NULL
, *slice
= NULL
;
2438 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
2439 return strdup(u
->manager
->cgroup_root
);
2441 if (UNIT_ISSET(u
->slice
) && !unit_has_name(UNIT_DEREF(u
->slice
), SPECIAL_ROOT_SLICE
)) {
2442 r
= cg_slice_to_path(UNIT_DEREF(u
->slice
)->id
, &slice
);
2447 escaped
= cg_escape(u
->id
);
2452 return strjoin(u
->manager
->cgroup_root
, "/", slice
, "/", escaped
, NULL
);
2454 return strjoin(u
->manager
->cgroup_root
, "/", escaped
, NULL
);
2457 int unit_add_default_slice(Unit
*u
, CGroupContext
*c
) {
2458 _cleanup_free_
char *b
= NULL
;
2459 const char *slice_name
;
2466 if (UNIT_ISSET(u
->slice
))
2470 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2472 /* Implicitly place all instantiated units in their
2473 * own per-template slice */
2475 r
= unit_name_to_prefix(u
->id
, &prefix
);
2479 /* The prefix is already escaped, but it might include
2480 * "-" which has a special meaning for slice units,
2481 * hence escape it here extra. */
2482 escaped
= unit_name_escape(prefix
);
2486 if (u
->manager
->running_as
== MANAGER_SYSTEM
)
2487 b
= strjoin("system-", escaped
, ".slice", NULL
);
2489 b
= strappend(escaped
, ".slice");
2496 u
->manager
->running_as
== MANAGER_SYSTEM
2497 ? SPECIAL_SYSTEM_SLICE
2498 : SPECIAL_ROOT_SLICE
;
2500 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2504 unit_ref_set(&u
->slice
, slice
);
2508 const char *unit_slice_name(Unit
*u
) {
2511 if (!UNIT_ISSET(u
->slice
))
2514 return UNIT_DEREF(u
->slice
)->id
;
2517 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2518 _cleanup_free_
char *t
= NULL
;
2525 r
= unit_name_change_suffix(u
->id
, type
, &t
);
2528 if (unit_has_name(u
, t
))
2531 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2532 assert(r
< 0 || *_found
!= u
);
2536 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2540 /* Watch a specific name on the bus. We only support one unit
2541 * watching each name for now. */
2543 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2546 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2550 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2553 bool unit_can_serialize(Unit
*u
) {
2556 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2559 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2566 if (unit_can_serialize(u
)) {
2569 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2573 rt
= unit_get_exec_runtime(u
);
2575 r
= exec_runtime_serialize(u
, rt
, f
, fds
);
2581 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2582 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2583 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2584 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2585 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2586 dual_timestamp_serialize(f
, "assert-timestamp", &u
->assert_timestamp
);
2588 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2589 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2591 if (dual_timestamp_is_set(&u
->assert_timestamp
))
2592 unit_serialize_item(u
, f
, "assert-result", yes_no(u
->assert_result
));
2594 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2595 unit_serialize_item_format(u
, f
, "cpuacct-usage-base", "%" PRIu64
, u
->cpuacct_usage_base
);
2598 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2600 if (serialize_jobs
) {
2602 fprintf(f
, "job\n");
2603 job_serialize(u
->job
, f
, fds
);
2607 fprintf(f
, "job\n");
2608 job_serialize(u
->nop_job
, f
, fds
);
2617 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2628 va_start(ap
, format
);
2629 vfprintf(f
, format
, ap
);
2635 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2641 fprintf(f
, "%s=%s\n", key
, value
);
2644 static int unit_set_cgroup_path(Unit
*u
, const char *path
) {
2645 _cleanup_free_
char *p
= NULL
;
2657 if (streq_ptr(u
->cgroup_path
, p
))
2661 r
= hashmap_put(u
->manager
->cgroup_unit
, p
, u
);
2666 if (u
->cgroup_path
) {
2667 log_unit_debug(u
, "Changing cgroup path from %s to %s.", u
->cgroup_path
, strna(p
));
2668 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
2669 free(u
->cgroup_path
);
2678 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2679 ExecRuntime
**rt
= NULL
;
2687 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2689 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2692 char line
[LINE_MAX
], *l
, *v
;
2695 if (!fgets(line
, sizeof(line
), f
)) {
2708 k
= strcspn(l
, "=");
2716 if (streq(l
, "job")) {
2718 /* new-style serialized job */
2725 r
= job_deserialize(j
, f
, fds
);
2731 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2737 r
= job_install_deserialized(j
);
2739 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2743 } else /* legacy for pre-44 */
2744 log_unit_warning(u
, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v
);
2746 } else if (streq(l
, "inactive-exit-timestamp")) {
2747 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2749 } else if (streq(l
, "active-enter-timestamp")) {
2750 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2752 } else if (streq(l
, "active-exit-timestamp")) {
2753 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2755 } else if (streq(l
, "inactive-enter-timestamp")) {
2756 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2758 } else if (streq(l
, "condition-timestamp")) {
2759 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2761 } else if (streq(l
, "assert-timestamp")) {
2762 dual_timestamp_deserialize(v
, &u
->assert_timestamp
);
2764 } else if (streq(l
, "condition-result")) {
2766 r
= parse_boolean(v
);
2768 log_unit_debug(u
, "Failed to parse condition result value %s, ignoring.", v
);
2770 u
->condition_result
= r
;
2774 } else if (streq(l
, "assert-result")) {
2776 r
= parse_boolean(v
);
2778 log_unit_debug(u
, "Failed to parse assert result value %s, ignoring.", v
);
2780 u
->assert_result
= r
;
2784 } else if (streq(l
, "transient")) {
2786 r
= parse_boolean(v
);
2788 log_unit_debug(u
, "Failed to parse transient bool %s, ignoring.", v
);
2794 } else if (streq(l
, "cpuacct-usage-base")) {
2796 r
= safe_atou64(v
, &u
->cpuacct_usage_base
);
2798 log_unit_debug(u
, "Failed to parse CPU usage %s, ignoring.", v
);
2802 } else if (streq(l
, "cgroup")) {
2804 r
= unit_set_cgroup_path(u
, v
);
2806 log_unit_debug_errno(u
, r
, "Failed to set cgroup path %s, ignoring: %m", v
);
2811 if (unit_can_serialize(u
)) {
2813 r
= exec_runtime_deserialize_item(u
, rt
, l
, v
, fds
);
2815 log_unit_warning(u
, "Failed to deserialize runtime parameter '%s', ignoring.", l
);
2819 /* Returns positive if key was handled by the call */
2824 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2826 log_unit_warning(u
, "Failed to deserialize unit parameter '%s', ignoring.", l
);
2831 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2833 _cleanup_free_
char *e
= NULL
;
2838 /* Adds in links to the device node that this unit is based on */
2842 if (!is_device_path(what
))
2845 /* When device units aren't supported (such as in a
2846 * container), don't create dependencies on them. */
2847 if (!unit_type_supported(UNIT_DEVICE
))
2850 r
= unit_name_from_path(what
, ".device", &e
);
2854 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2858 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_BINDS_TO
: UNIT_WANTS
, device
, true);
2863 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2871 int unit_coldplug(Unit
*u
) {
2876 /* Make sure we don't enter a loop, when coldplugging
2881 u
->coldplugged
= true;
2883 if (UNIT_VTABLE(u
)->coldplug
) {
2884 r
= UNIT_VTABLE(u
)->coldplug(u
);
2890 r
= job_coldplug(u
->job
);
2898 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2899 DISABLE_WARNING_FORMAT_NONLITERAL
;
2900 manager_status_printf(u
->manager
, STATUS_TYPE_NORMAL
,
2901 status
, unit_status_msg_format
, unit_description(u
));
2905 bool unit_need_daemon_reload(Unit
*u
) {
2906 _cleanup_strv_free_
char **t
= NULL
;
2909 unsigned loaded_cnt
, current_cnt
;
2913 if (u
->fragment_path
) {
2915 if (stat(u
->fragment_path
, &st
) < 0)
2916 /* What, cannot access this anymore? */
2919 if (u
->fragment_mtime
> 0 &&
2920 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2924 if (u
->source_path
) {
2926 if (stat(u
->source_path
, &st
) < 0)
2929 if (u
->source_mtime
> 0 &&
2930 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2934 (void) unit_find_dropin_paths(u
, &t
);
2935 loaded_cnt
= strv_length(t
);
2936 current_cnt
= strv_length(u
->dropin_paths
);
2938 if (loaded_cnt
== current_cnt
) {
2939 if (loaded_cnt
== 0)
2942 if (strv_overlap(u
->dropin_paths
, t
)) {
2943 STRV_FOREACH(path
, u
->dropin_paths
) {
2945 if (stat(*path
, &st
) < 0)
2948 if (u
->dropin_mtime
> 0 &&
2949 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2960 void unit_reset_failed(Unit
*u
) {
2963 if (UNIT_VTABLE(u
)->reset_failed
)
2964 UNIT_VTABLE(u
)->reset_failed(u
);
2967 Unit
*unit_following(Unit
*u
) {
2970 if (UNIT_VTABLE(u
)->following
)
2971 return UNIT_VTABLE(u
)->following(u
);
2976 bool unit_stop_pending(Unit
*u
) {
2979 /* This call does check the current state of the unit. It's
2980 * hence useful to be called from state change calls of the
2981 * unit itself, where the state isn't updated yet. This is
2982 * different from unit_inactive_or_pending() which checks both
2983 * the current state and for a queued job. */
2985 return u
->job
&& u
->job
->type
== JOB_STOP
;
2988 bool unit_inactive_or_pending(Unit
*u
) {
2991 /* Returns true if the unit is inactive or going down */
2993 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
2996 if (unit_stop_pending(u
))
3002 bool unit_active_or_pending(Unit
*u
) {
3005 /* Returns true if the unit is active or going up */
3007 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
3011 (u
->job
->type
== JOB_START
||
3012 u
->job
->type
== JOB_RELOAD_OR_START
||
3013 u
->job
->type
== JOB_RESTART
))
3019 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
3021 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
3023 assert(signo
< _NSIG
);
3025 if (!UNIT_VTABLE(u
)->kill
)
3028 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
3031 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
3035 pid_set
= set_new(NULL
);
3039 /* Exclude the main/control pids from being killed via the cgroup */
3041 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
3046 if (control_pid
> 0) {
3047 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
3059 int unit_kill_common(
3065 sd_bus_error
*error
) {
3069 if (who
== KILL_MAIN
&& main_pid
<= 0) {
3071 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
3073 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
3076 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
3077 if (control_pid
< 0)
3078 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
3080 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
3083 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
3084 if (control_pid
> 0)
3085 if (kill(control_pid
, signo
) < 0)
3088 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
3090 if (kill(main_pid
, signo
) < 0)
3093 if (who
== KILL_ALL
&& u
->cgroup_path
) {
3094 _cleanup_set_free_ Set
*pid_set
= NULL
;
3097 /* Exclude the main/control pids from being killed via the cgroup */
3098 pid_set
= unit_pid_set(main_pid
, control_pid
);
3102 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, true, false, pid_set
);
3103 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
3110 int unit_following_set(Unit
*u
, Set
**s
) {
3114 if (UNIT_VTABLE(u
)->following_set
)
3115 return UNIT_VTABLE(u
)->following_set(u
, s
);
3121 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
3124 if (u
->unit_file_state
< 0 && u
->fragment_path
)
3125 u
->unit_file_state
= unit_file_get_state(
3126 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3127 NULL
, basename(u
->fragment_path
));
3129 return u
->unit_file_state
;
3132 int unit_get_unit_file_preset(Unit
*u
) {
3135 if (u
->unit_file_preset
< 0 && u
->fragment_path
)
3136 u
->unit_file_preset
= unit_file_query_preset(
3137 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3138 NULL
, basename(u
->fragment_path
));
3140 return u
->unit_file_preset
;
3143 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3148 unit_ref_unset(ref
);
3151 LIST_PREPEND(refs
, u
->refs
, ref
);
3155 void unit_ref_unset(UnitRef
*ref
) {
3161 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3165 int unit_patch_contexts(Unit
*u
) {
3173 /* Patch in the manager defaults into the exec and cgroup
3174 * contexts, _after_ the rest of the settings have been
3177 ec
= unit_get_exec_context(u
);
3179 /* This only copies in the ones that need memory */
3180 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3181 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3182 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3187 if (u
->manager
->running_as
== MANAGER_USER
&&
3188 !ec
->working_directory
) {
3190 r
= get_home_dir(&ec
->working_directory
);
3194 /* Allow user services to run, even if the
3195 * home directory is missing */
3196 ec
->working_directory_missing_ok
= true;
3199 if (u
->manager
->running_as
== MANAGER_USER
&&
3200 (ec
->syscall_whitelist
||
3201 !set_isempty(ec
->syscall_filter
) ||
3202 !set_isempty(ec
->syscall_archs
) ||
3203 ec
->address_families_whitelist
||
3204 !set_isempty(ec
->address_families
)))
3205 ec
->no_new_privileges
= true;
3207 if (ec
->private_devices
)
3208 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3211 cc
= unit_get_cgroup_context(u
);
3215 ec
->private_devices
&&
3216 cc
->device_policy
== CGROUP_AUTO
)
3217 cc
->device_policy
= CGROUP_CLOSED
;
3223 ExecContext
*unit_get_exec_context(Unit
*u
) {
3230 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3234 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3237 KillContext
*unit_get_kill_context(Unit
*u
) {
3244 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3248 return (KillContext
*) ((uint8_t*) u
+ offset
);
3251 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3257 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3261 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3264 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3270 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3274 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3277 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3278 if (u
->manager
->running_as
== MANAGER_USER
) {
3281 if (mode
== UNIT_PERSISTENT
&& !transient
)
3282 r
= user_config_home(dir
);
3284 r
= user_runtime_dir(dir
);
3291 if (mode
== UNIT_PERSISTENT
&& !transient
)
3292 *dir
= strdup("/etc/systemd/system");
3294 *dir
= strdup("/run/systemd/system");
3301 static int unit_drop_in_file(Unit
*u
,
3302 UnitSetPropertiesMode mode
, const char *name
, char **p
, char **q
) {
3303 _cleanup_free_
char *dir
= NULL
;
3308 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3312 return drop_in_file(dir
, u
->id
, 50, name
, p
, q
);
3315 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3317 _cleanup_free_
char *dir
= NULL
, *p
= NULL
, *q
= NULL
;
3322 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3325 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3329 r
= write_drop_in(dir
, u
->id
, 50, name
, data
);
3333 r
= drop_in_file(dir
, u
->id
, 50, name
, &p
, &q
);
3337 r
= strv_extend(&u
->dropin_paths
, q
);
3341 strv_sort(u
->dropin_paths
);
3342 strv_uniq(u
->dropin_paths
);
3344 u
->dropin_mtime
= now(CLOCK_REALTIME
);
3349 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3350 _cleanup_free_
char *p
= NULL
;
3358 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3361 va_start(ap
, format
);
3362 r
= vasprintf(&p
, format
, ap
);
3368 return unit_write_drop_in(u
, mode
, name
, p
);
3371 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3372 _cleanup_free_
char *ndata
= NULL
;
3378 if (!UNIT_VTABLE(u
)->private_section
)
3381 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3384 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3388 return unit_write_drop_in(u
, mode
, name
, ndata
);
3391 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3392 _cleanup_free_
char *p
= NULL
;
3400 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3403 va_start(ap
, format
);
3404 r
= vasprintf(&p
, format
, ap
);
3410 return unit_write_drop_in_private(u
, mode
, name
, p
);
3413 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
3414 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
3419 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3422 r
= unit_drop_in_file(u
, mode
, name
, &p
, &q
);
3427 r
= errno
== ENOENT
? 0 : -errno
;
3435 int unit_make_transient(Unit
*u
) {
3440 u
->load_state
= UNIT_STUB
;
3442 u
->transient
= true;
3444 free(u
->fragment_path
);
3445 u
->fragment_path
= NULL
;
3447 if (u
->manager
->running_as
== MANAGER_USER
) {
3448 _cleanup_free_
char *c
= NULL
;
3450 r
= user_runtime_dir(&c
);
3456 u
->fragment_path
= strjoin(c
, "/", u
->id
, NULL
);
3457 if (!u
->fragment_path
)
3462 u
->fragment_path
= strappend("/run/systemd/system/", u
->id
);
3463 if (!u
->fragment_path
)
3466 mkdir_p("/run/systemd/system", 0755);
3469 return write_string_file_atomic_label(u
->fragment_path
, "# Transient stub");
3472 int unit_kill_context(
3478 bool main_pid_alien
) {
3480 int sig
, wait_for_exit
= false, r
;
3485 if (c
->kill_mode
== KILL_NONE
)
3495 case KILL_TERMINATE
:
3496 sig
= c
->kill_signal
;
3499 assert_not_reached("KillOperation unknown");
3503 r
= kill_and_sigcont(main_pid
, sig
);
3505 if (r
< 0 && r
!= -ESRCH
) {
3506 _cleanup_free_
char *comm
= NULL
;
3507 get_process_comm(main_pid
, &comm
);
3509 log_unit_warning_errno(u
, r
, "Failed to kill main process " PID_FMT
" (%s): %m", main_pid
, strna(comm
));
3511 if (!main_pid_alien
)
3512 wait_for_exit
= true;
3514 if (c
->send_sighup
&& k
!= KILL_KILL
)
3515 kill(main_pid
, SIGHUP
);
3519 if (control_pid
> 0) {
3520 r
= kill_and_sigcont(control_pid
, sig
);
3522 if (r
< 0 && r
!= -ESRCH
) {
3523 _cleanup_free_
char *comm
= NULL
;
3524 get_process_comm(control_pid
, &comm
);
3526 log_unit_warning_errno(u
, r
, "Failed to kill control process " PID_FMT
" (%s): %m", control_pid
, strna(comm
));
3528 wait_for_exit
= true;
3530 if (c
->send_sighup
&& k
!= KILL_KILL
)
3531 kill(control_pid
, SIGHUP
);
3535 if ((c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& k
== KILL_KILL
)) && u
->cgroup_path
) {
3536 _cleanup_set_free_ Set
*pid_set
= NULL
;
3538 /* Exclude the main/control pids from being killed via the cgroup */
3539 pid_set
= unit_pid_set(main_pid
, control_pid
);
3543 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, true, false, pid_set
);
3545 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3546 log_unit_warning_errno(u
, r
, "Failed to kill control group: %m");
3549 /* FIXME: For now, we will not wait for the
3550 * cgroup members to die, simply because
3551 * cgroup notification is unreliable. It
3552 * doesn't work at all in containers, and
3553 * outside of containers it can be confused
3554 * easily by leaving directories in the
3557 /* wait_for_exit = true; */
3559 if (c
->send_sighup
&& k
!= KILL_KILL
) {
3562 pid_set
= unit_pid_set(main_pid
, control_pid
);
3566 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3571 return wait_for_exit
;
3574 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3575 char prefix
[strlen(path
) + 1], *p
;
3581 /* Registers a unit for requiring a certain path and all its
3582 * prefixes. We keep a simple array of these paths in the
3583 * unit, since its usually short. However, we build a prefix
3584 * table for all possible prefixes so that new appearing mount
3585 * units can easily determine which units to make themselves a
3588 if (!path_is_absolute(path
))
3595 path_kill_slashes(p
);
3597 if (!path_is_safe(p
)) {
3602 if (strv_contains(u
->requires_mounts_for
, p
)) {
3607 r
= strv_consume(&u
->requires_mounts_for
, p
);
3611 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3614 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3618 r
= hashmap_ensure_allocated(&u
->manager
->units_requiring_mounts_for
, &string_hash_ops
);
3632 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3648 int unit_setup_exec_runtime(Unit
*u
) {
3654 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3657 /* Check if there already is an ExecRuntime for this unit? */
3658 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3662 /* Try to get it from somebody else */
3663 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3665 *rt
= unit_get_exec_runtime(other
);
3667 exec_runtime_ref(*rt
);
3672 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3675 bool unit_type_supported(UnitType t
) {
3676 if (_unlikely_(t
< 0))
3678 if (_unlikely_(t
>= _UNIT_TYPE_MAX
))
3681 if (!unit_vtable
[t
]->supported
)
3684 return unit_vtable
[t
]->supported();
3687 void unit_warn_if_dir_nonempty(Unit
*u
, const char* where
) {
3693 r
= dir_is_empty(where
);
3697 log_unit_warning_errno(u
, r
, "Failed to check directory %s: %m", where
);
3701 log_struct(LOG_NOTICE
,
3702 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3704 LOG_UNIT_MESSAGE(u
, "Directory %s to mount over is not empty, mounting anyway.", where
),
3709 int unit_fail_if_symlink(Unit
*u
, const char* where
) {
3715 r
= is_symlink(where
);
3717 log_unit_debug_errno(u
, r
, "Failed to check symlink %s, ignoring: %m", where
);
3724 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3726 LOG_UNIT_MESSAGE(u
, "Mount on symlink %s not allowed.", where
),
3733 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3734 [UNIT_ACTIVE
] = "active",
3735 [UNIT_RELOADING
] = "reloading",
3736 [UNIT_INACTIVE
] = "inactive",
3737 [UNIT_FAILED
] = "failed",
3738 [UNIT_ACTIVATING
] = "activating",
3739 [UNIT_DEACTIVATING
] = "deactivating"
3742 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);