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"
33 #include "path-util.h"
35 #include "cgroup-util.h"
38 #include "fileio-label.h"
39 #include "formats-util.h"
40 #include "process-util.h"
42 #include "bus-common-errors.h"
45 #include "unit-name.h"
48 #include "load-fragment.h"
49 #include "load-dropin.h"
51 #include "dbus-unit.h"
54 const UnitVTable
* const unit_vtable
[_UNIT_TYPE_MAX
] = {
55 [UNIT_SERVICE
] = &service_vtable
,
56 [UNIT_SOCKET
] = &socket_vtable
,
57 [UNIT_BUSNAME
] = &busname_vtable
,
58 [UNIT_TARGET
] = &target_vtable
,
59 [UNIT_SNAPSHOT
] = &snapshot_vtable
,
60 [UNIT_DEVICE
] = &device_vtable
,
61 [UNIT_MOUNT
] = &mount_vtable
,
62 [UNIT_AUTOMOUNT
] = &automount_vtable
,
63 [UNIT_SWAP
] = &swap_vtable
,
64 [UNIT_TIMER
] = &timer_vtable
,
65 [UNIT_PATH
] = &path_vtable
,
66 [UNIT_SLICE
] = &slice_vtable
,
67 [UNIT_SCOPE
] = &scope_vtable
70 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
);
72 Unit
*unit_new(Manager
*m
, size_t size
) {
76 assert(size
>= sizeof(Unit
));
82 u
->names
= set_new(&string_hash_ops
);
89 u
->type
= _UNIT_TYPE_INVALID
;
90 u
->default_dependencies
= true;
91 u
->unit_file_state
= _UNIT_FILE_STATE_INVALID
;
92 u
->unit_file_preset
= -1;
93 u
->on_failure_job_mode
= JOB_REPLACE
;
94 u
->cgroup_inotify_wd
= -1;
96 RATELIMIT_INIT(u
->auto_stop_ratelimit
, 10 * USEC_PER_SEC
, 16);
101 bool unit_has_name(Unit
*u
, const char *name
) {
105 return !!set_get(u
->names
, (char*) name
);
108 static void unit_init(Unit
*u
) {
115 assert(u
->type
>= 0);
117 cc
= unit_get_cgroup_context(u
);
119 cgroup_context_init(cc
);
121 /* Copy in the manager defaults into the cgroup
122 * context, _before_ the rest of the settings have
123 * been initialized */
125 cc
->cpu_accounting
= u
->manager
->default_cpu_accounting
;
126 cc
->blockio_accounting
= u
->manager
->default_blockio_accounting
;
127 cc
->memory_accounting
= u
->manager
->default_memory_accounting
;
130 ec
= unit_get_exec_context(u
);
132 exec_context_init(ec
);
134 kc
= unit_get_kill_context(u
);
136 kill_context_init(kc
);
138 if (UNIT_VTABLE(u
)->init
)
139 UNIT_VTABLE(u
)->init(u
);
142 int unit_add_name(Unit
*u
, const char *text
) {
143 _cleanup_free_
char *s
= NULL
, *i
= NULL
;
150 if (unit_name_is_valid(text
, UNIT_NAME_TEMPLATE
)) {
155 r
= unit_name_replace_instance(text
, u
->instance
, &s
);
164 if (set_contains(u
->names
, s
))
166 if (hashmap_contains(u
->manager
->units
, s
))
169 if (!unit_name_is_valid(s
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
172 t
= unit_name_to_type(s
);
176 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
)
179 r
= unit_name_to_instance(s
, &i
);
183 if (i
&& unit_vtable
[t
]->no_instances
)
186 /* Ensure that this unit is either instanced or not instanced,
187 * but not both. Note that we do allow names with different
188 * instance names however! */
189 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
)
192 if (unit_vtable
[t
]->no_alias
&& !set_isempty(u
->names
))
195 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
)
198 r
= set_put(u
->names
, s
);
203 r
= hashmap_put(u
->manager
->units
, s
, u
);
205 (void) set_remove(u
->names
, s
);
209 if (u
->type
== _UNIT_TYPE_INVALID
) {
214 LIST_PREPEND(units_by_type
, u
->manager
->units_by_type
[t
], u
);
223 unit_add_to_dbus_queue(u
);
227 int unit_choose_id(Unit
*u
, const char *name
) {
228 _cleanup_free_
char *t
= NULL
;
235 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
240 r
= unit_name_replace_instance(name
, u
->instance
, &t
);
247 /* Selects one of the names of this unit as the id */
248 s
= set_get(u
->names
, (char*) name
);
252 /* Determine the new instance from the new id */
253 r
= unit_name_to_instance(s
, &i
);
262 unit_add_to_dbus_queue(u
);
267 int unit_set_description(Unit
*u
, const char *description
) {
272 if (isempty(description
))
275 s
= strdup(description
);
280 free(u
->description
);
283 unit_add_to_dbus_queue(u
);
287 bool unit_check_gc(Unit
*u
) {
288 UnitActiveState state
;
297 state
= unit_active_state(u
);
299 /* If the unit is inactive and failed and no job is queued for
300 * it, then release its runtime resources */
301 if (UNIT_IS_INACTIVE_OR_FAILED(state
) &&
302 UNIT_VTABLE(u
)->release_resources
)
303 UNIT_VTABLE(u
)->release_resources(u
);
305 /* But we keep the unit object around for longer when it is
306 * referenced or configured to not be gc'ed */
307 if (state
!= UNIT_INACTIVE
)
310 if (UNIT_VTABLE(u
)->no_gc
)
319 if (UNIT_VTABLE(u
)->check_gc
)
320 if (UNIT_VTABLE(u
)->check_gc(u
))
326 void unit_add_to_load_queue(Unit
*u
) {
328 assert(u
->type
!= _UNIT_TYPE_INVALID
);
330 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
333 LIST_PREPEND(load_queue
, u
->manager
->load_queue
, u
);
334 u
->in_load_queue
= true;
337 void unit_add_to_cleanup_queue(Unit
*u
) {
340 if (u
->in_cleanup_queue
)
343 LIST_PREPEND(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
344 u
->in_cleanup_queue
= true;
347 void unit_add_to_gc_queue(Unit
*u
) {
350 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
353 if (unit_check_gc(u
))
356 LIST_PREPEND(gc_queue
, u
->manager
->gc_queue
, u
);
357 u
->in_gc_queue
= true;
359 u
->manager
->n_in_gc_queue
++;
362 void unit_add_to_dbus_queue(Unit
*u
) {
364 assert(u
->type
!= _UNIT_TYPE_INVALID
);
366 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
369 /* Shortcut things if nobody cares */
370 if (sd_bus_track_count(u
->manager
->subscribed
) <= 0 &&
371 set_isempty(u
->manager
->private_buses
)) {
372 u
->sent_dbus_new_signal
= true;
376 LIST_PREPEND(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
377 u
->in_dbus_queue
= true;
380 static void bidi_set_free(Unit
*u
, Set
*s
) {
386 /* Frees the set and makes sure we are dropped from the
387 * inverse pointers */
389 SET_FOREACH(other
, s
, i
) {
392 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
393 set_remove(other
->dependencies
[d
], u
);
395 unit_add_to_gc_queue(other
);
401 static void unit_remove_transient(Unit
*u
) {
409 if (u
->fragment_path
)
410 (void) unlink(u
->fragment_path
);
412 STRV_FOREACH(i
, u
->dropin_paths
) {
413 _cleanup_free_
char *p
= NULL
;
418 r
= path_get_parent(*i
, &p
);
424 static void unit_free_requires_mounts_for(Unit
*u
) {
427 STRV_FOREACH(j
, u
->requires_mounts_for
) {
428 char s
[strlen(*j
) + 1];
430 PATH_FOREACH_PREFIX_MORE(s
, *j
) {
434 x
= hashmap_get2(u
->manager
->units_requiring_mounts_for
, s
, (void**) &y
);
440 if (set_isempty(x
)) {
441 hashmap_remove(u
->manager
->units_requiring_mounts_for
, y
);
448 u
->requires_mounts_for
= strv_free(u
->requires_mounts_for
);
451 static void unit_done(Unit
*u
) {
460 if (UNIT_VTABLE(u
)->done
)
461 UNIT_VTABLE(u
)->done(u
);
463 ec
= unit_get_exec_context(u
);
465 exec_context_done(ec
);
467 cc
= unit_get_cgroup_context(u
);
469 cgroup_context_done(cc
);
472 void unit_free(Unit
*u
) {
479 if (u
->manager
->n_reloading
<= 0)
480 unit_remove_transient(u
);
482 bus_unit_send_removed_signal(u
);
486 sd_bus_slot_unref(u
->match_bus_slot
);
488 unit_free_requires_mounts_for(u
);
490 SET_FOREACH(t
, u
->names
, i
)
491 hashmap_remove_value(u
->manager
->units
, t
, u
);
505 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
506 bidi_set_free(u
, u
->dependencies
[d
]);
508 if (u
->type
!= _UNIT_TYPE_INVALID
)
509 LIST_REMOVE(units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
511 if (u
->in_load_queue
)
512 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
514 if (u
->in_dbus_queue
)
515 LIST_REMOVE(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
517 if (u
->in_cleanup_queue
)
518 LIST_REMOVE(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
520 if (u
->in_gc_queue
) {
521 LIST_REMOVE(gc_queue
, u
->manager
->gc_queue
, u
);
522 u
->manager
->n_in_gc_queue
--;
525 if (u
->in_cgroup_queue
)
526 LIST_REMOVE(cgroup_queue
, u
->manager
->cgroup_queue
, u
);
528 unit_release_cgroup(u
);
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 other
->dependencies
[d
] = set_free(other
->dependencies
[d
]);
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_HAS_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
) {
1322 const UnitStatusMessageFormats
*format_table
;
1325 assert(t
== JOB_START
|| t
== JOB_STOP
|| t
== JOB_RELOAD
);
1327 if (t
!= JOB_RELOAD
) {
1328 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1330 format
= format_table
->starting_stopping
[t
== JOB_STOP
];
1336 /* Return generic strings */
1338 return "Starting %s.";
1339 else if (t
== JOB_STOP
)
1340 return "Stopping %s.";
1342 return "Reloading %s.";
1345 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1350 format
= unit_get_status_message_format(u
, t
);
1352 DISABLE_WARNING_FORMAT_NONLITERAL
;
1353 unit_status_printf(u
, "", format
);
1357 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1364 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1367 if (log_on_console())
1370 /* We log status messages for all units and all operations. */
1372 format
= unit_get_status_message_format(u
, t
);
1374 DISABLE_WARNING_FORMAT_NONLITERAL
;
1375 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1378 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1379 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1380 SD_MESSAGE_UNIT_RELOADING
;
1382 /* Note that we deliberately use LOG_MESSAGE() instead of
1383 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1384 * closely what is written to screen using the status output,
1385 * which is supposed the highest level, friendliest output
1386 * possible, which means we should avoid the low-level unit
1388 log_struct(LOG_INFO
,
1389 LOG_MESSAGE_ID(mid
),
1391 LOG_MESSAGE("%s", buf
),
1395 void unit_status_emit_starting_stopping_reloading(Unit
*u
, JobType t
) {
1397 unit_status_log_starting_stopping_reloading(u
, t
);
1399 /* Reload status messages have traditionally not been printed to console. */
1400 if (t
!= JOB_RELOAD
)
1401 unit_status_print_starting_stopping(u
, t
);
1405 * -EBADR: This unit type does not support starting.
1406 * -EALREADY: Unit is already started.
1407 * -EAGAIN: An operation is already in progress. Retry later.
1408 * -ECANCELED: Too many requests for now.
1409 * -EPROTO: Assert failed
1411 int unit_start(Unit
*u
) {
1412 UnitActiveState state
;
1417 /* Units that aren't loaded cannot be started */
1418 if (u
->load_state
!= UNIT_LOADED
)
1421 /* If this is already started, then this will succeed. Note
1422 * that this will even succeed if this unit is not startable
1423 * by the user. This is relied on to detect when we need to
1424 * wait for units and when waiting is finished. */
1425 state
= unit_active_state(u
);
1426 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1429 /* If the conditions failed, don't do anything at all. If we
1430 * already are activating this call might still be useful to
1431 * speed up activation in case there is some hold-off time,
1432 * but we don't want to recheck the condition in that case. */
1433 if (state
!= UNIT_ACTIVATING
&&
1434 !unit_condition_test(u
)) {
1435 log_unit_debug(u
, "Starting requested but condition failed. Not starting unit.");
1439 /* If the asserts failed, fail the entire job */
1440 if (state
!= UNIT_ACTIVATING
&&
1441 !unit_assert_test(u
)) {
1442 log_unit_notice(u
, "Starting requested but asserts failed.");
1446 /* Units of types that aren't supported cannot be
1447 * started. Note that we do this test only after the condition
1448 * checks, so that we rather return condition check errors
1449 * (which are usually not considered a true failure) than "not
1450 * supported" errors (which are considered a failure).
1452 if (!unit_supported(u
))
1455 /* Forward to the main object, if we aren't it. */
1456 following
= unit_following(u
);
1458 log_unit_debug(u
, "Redirecting start request from %s to %s.", u
->id
, following
->id
);
1459 return unit_start(following
);
1462 /* If it is stopped, but we cannot start it, then fail */
1463 if (!UNIT_VTABLE(u
)->start
)
1466 /* We don't suppress calls to ->start() here when we are
1467 * already starting, to allow this request to be used as a
1468 * "hurry up" call, for example when the unit is in some "auto
1469 * restart" state where it waits for a holdoff timer to elapse
1470 * before it will start again. */
1472 unit_add_to_dbus_queue(u
);
1474 return UNIT_VTABLE(u
)->start(u
);
1477 bool unit_can_start(Unit
*u
) {
1480 if (u
->load_state
!= UNIT_LOADED
)
1483 if (!unit_supported(u
))
1486 return !!UNIT_VTABLE(u
)->start
;
1489 bool unit_can_isolate(Unit
*u
) {
1492 return unit_can_start(u
) &&
1497 * -EBADR: This unit type does not support stopping.
1498 * -EALREADY: Unit is already stopped.
1499 * -EAGAIN: An operation is already in progress. Retry later.
1501 int unit_stop(Unit
*u
) {
1502 UnitActiveState state
;
1507 state
= unit_active_state(u
);
1508 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1511 following
= unit_following(u
);
1513 log_unit_debug(u
, "Redirecting stop request from %s to %s.", u
->id
, following
->id
);
1514 return unit_stop(following
);
1517 if (!UNIT_VTABLE(u
)->stop
)
1520 unit_add_to_dbus_queue(u
);
1522 return UNIT_VTABLE(u
)->stop(u
);
1526 * -EBADR: This unit type does not support reloading.
1527 * -ENOEXEC: Unit is not started.
1528 * -EAGAIN: An operation is already in progress. Retry later.
1530 int unit_reload(Unit
*u
) {
1531 UnitActiveState state
;
1536 if (u
->load_state
!= UNIT_LOADED
)
1539 if (!unit_can_reload(u
))
1542 state
= unit_active_state(u
);
1543 if (state
== UNIT_RELOADING
)
1546 if (state
!= UNIT_ACTIVE
) {
1547 log_unit_warning(u
, "Unit cannot be reloaded because it is inactive.");
1551 following
= unit_following(u
);
1553 log_unit_debug(u
, "Redirecting reload request from %s to %s.", u
->id
, following
->id
);
1554 return unit_reload(following
);
1557 unit_add_to_dbus_queue(u
);
1559 return UNIT_VTABLE(u
)->reload(u
);
1562 bool unit_can_reload(Unit
*u
) {
1565 if (!UNIT_VTABLE(u
)->reload
)
1568 if (!UNIT_VTABLE(u
)->can_reload
)
1571 return UNIT_VTABLE(u
)->can_reload(u
);
1574 static void unit_check_unneeded(Unit
*u
) {
1576 static const UnitDependency needed_dependencies
[] = {
1578 UNIT_REQUIRED_BY_OVERRIDABLE
,
1580 UNIT_REQUISITE_OF_OVERRIDABLE
,
1592 /* If this service shall be shut down when unneeded then do
1595 if (!u
->stop_when_unneeded
)
1598 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1601 for (j
= 0; j
< ELEMENTSOF(needed_dependencies
); j
++)
1602 SET_FOREACH(other
, u
->dependencies
[needed_dependencies
[j
]], i
)
1603 if (unit_active_or_pending(other
))
1606 /* If stopping a unit fails continously we might enter a stop
1607 * loop here, hence stop acting on the service being
1608 * unnecessary after a while. */
1609 if (!ratelimit_test(&u
->auto_stop_ratelimit
)) {
1610 log_unit_warning(u
, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1614 log_unit_info(u
, "Unit not needed anymore. Stopping.");
1616 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1617 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1619 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1622 static void unit_check_binds_to(Unit
*u
) {
1633 if (unit_active_state(u
) != UNIT_ACTIVE
)
1636 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
) {
1640 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
1650 /* If stopping a unit fails continously we might enter a stop
1651 * loop here, hence stop acting on the service being
1652 * unnecessary after a while. */
1653 if (!ratelimit_test(&u
->auto_stop_ratelimit
)) {
1654 log_unit_warning(u
, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other
->id
);
1659 log_unit_info(u
, "Unit is bound to inactive unit %s. Stopping, too.", other
->id
);
1661 /* A unit we need to run is gone. Sniff. Let's stop this. */
1662 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1664 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1667 static void retroactively_start_dependencies(Unit
*u
) {
1672 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1674 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1675 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1676 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1677 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1679 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1680 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1681 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1682 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1684 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], 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_FAIL
, false, NULL
, NULL
);
1689 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], 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_FAIL
, false, NULL
, NULL
);
1694 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1695 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1696 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1698 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1699 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1700 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1703 static void retroactively_stop_dependencies(Unit
*u
) {
1708 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1710 /* Pull down units which are bound to us recursively if enabled */
1711 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1712 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1713 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1716 static void check_unneeded_dependencies(Unit
*u
) {
1721 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1723 /* Garbage collect services that might not be needed anymore, if enabled */
1724 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1725 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1726 unit_check_unneeded(other
);
1727 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1728 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1729 unit_check_unneeded(other
);
1730 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1731 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1732 unit_check_unneeded(other
);
1733 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1734 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1735 unit_check_unneeded(other
);
1736 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1737 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1738 unit_check_unneeded(other
);
1739 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1740 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1741 unit_check_unneeded(other
);
1744 void unit_start_on_failure(Unit
*u
) {
1750 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1753 log_unit_info(u
, "Triggering OnFailure= dependencies.");
1755 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1758 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1760 log_unit_error_errno(u
, r
, "Failed to enqueue OnFailure= job: %m");
1764 void unit_trigger_notify(Unit
*u
) {
1770 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1771 if (UNIT_VTABLE(other
)->trigger_notify
)
1772 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1775 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1780 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1781 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1783 /* Note that this is called for all low-level state changes,
1784 * even if they might map to the same high-level
1785 * UnitActiveState! That means that ns == os is an expected
1786 * behavior here. For example: if a mount point is remounted
1787 * this function will be called too! */
1791 /* Update timestamps for state changes */
1792 if (m
->n_reloading
<= 0) {
1795 dual_timestamp_get(&ts
);
1797 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1798 u
->inactive_exit_timestamp
= ts
;
1799 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1800 u
->inactive_enter_timestamp
= ts
;
1802 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1803 u
->active_enter_timestamp
= ts
;
1804 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1805 u
->active_exit_timestamp
= ts
;
1808 /* Keep track of failed units */
1809 manager_update_failed_units(u
->manager
, u
, ns
== UNIT_FAILED
);
1811 /* Make sure the cgroup is always removed when we become inactive */
1812 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1813 unit_prune_cgroup(u
);
1815 /* Note that this doesn't apply to RemainAfterExit services exiting
1816 * successfully, since there's no change of state in that case. Which is
1817 * why it is handled in service_set_state() */
1818 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1821 ec
= unit_get_exec_context(u
);
1822 if (ec
&& exec_context_may_touch_console(ec
)) {
1823 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1826 if (m
->n_on_console
== 0)
1827 /* unset no_console_output flag, since the console is free */
1828 m
->no_console_output
= false;
1837 if (u
->job
->state
== JOB_WAITING
)
1839 /* So we reached a different state for this
1840 * job. Let's see if we can run it now if it
1841 * failed previously due to EAGAIN. */
1842 job_add_to_run_queue(u
->job
);
1844 /* Let's check whether this state change constitutes a
1845 * finished job, or maybe contradicts a running job and
1846 * hence needs to invalidate jobs. */
1848 switch (u
->job
->type
) {
1851 case JOB_VERIFY_ACTIVE
:
1853 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1854 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1855 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1858 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1859 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1865 case JOB_RELOAD_OR_START
:
1867 if (u
->job
->state
== JOB_RUNNING
) {
1868 if (ns
== UNIT_ACTIVE
)
1869 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1870 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1873 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1874 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1882 case JOB_TRY_RESTART
:
1884 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1885 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1886 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1888 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1894 assert_not_reached("Job type unknown");
1900 if (m
->n_reloading
<= 0) {
1902 /* If this state change happened without being
1903 * requested by a job, then let's retroactively start
1904 * or stop dependencies. We skip that step when
1905 * deserializing, since we don't want to create any
1906 * additional jobs just because something is already
1910 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1911 retroactively_start_dependencies(u
);
1912 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1913 retroactively_stop_dependencies(u
);
1916 /* stop unneeded units regardless if going down was expected or not */
1917 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1918 check_unneeded_dependencies(u
);
1920 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1921 log_unit_notice(u
, "Unit entered failed state.");
1922 unit_start_on_failure(u
);
1926 /* Some names are special */
1927 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1929 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1930 /* The bus might have just become available,
1931 * hence try to connect to it, if we aren't
1935 if (u
->type
== UNIT_SERVICE
&&
1936 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1937 m
->n_reloading
<= 0) {
1938 /* Write audit record if we have just finished starting up */
1939 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1943 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1944 manager_send_unit_plymouth(m
, u
);
1948 /* We don't care about D-Bus here, since we'll get an
1949 * asynchronous notification for it anyway. */
1951 if (u
->type
== UNIT_SERVICE
&&
1952 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1953 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1954 m
->n_reloading
<= 0) {
1956 /* Hmm, if there was no start record written
1957 * write it now, so that we always have a nice
1960 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1962 if (ns
== UNIT_INACTIVE
)
1963 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1965 /* Write audit record if we have just finished shutting down */
1966 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1968 u
->in_audit
= false;
1972 manager_recheck_journal(m
);
1973 unit_trigger_notify(u
);
1975 if (u
->manager
->n_reloading
<= 0) {
1976 /* Maybe we finished startup and are now ready for
1977 * being stopped because unneeded? */
1978 unit_check_unneeded(u
);
1980 /* Maybe we finished startup, but something we needed
1981 * has vanished? Let's die then. (This happens when
1982 * something BindsTo= to a Type=oneshot unit, as these
1983 * units go directly from starting to inactive,
1984 * without ever entering started.) */
1985 unit_check_binds_to(u
);
1988 unit_add_to_dbus_queue(u
);
1989 unit_add_to_gc_queue(u
);
1992 int unit_watch_pid(Unit
*u
, pid_t pid
) {
1998 /* Watch a specific PID. We only support one or two units
1999 * watching each PID for now, not more. */
2001 r
= set_ensure_allocated(&u
->pids
, NULL
);
2005 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
2009 r
= hashmap_put(u
->manager
->watch_pids1
, PID_TO_PTR(pid
), u
);
2011 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
2015 r
= hashmap_put(u
->manager
->watch_pids2
, PID_TO_PTR(pid
), u
);
2018 q
= set_put(u
->pids
, PID_TO_PTR(pid
));
2025 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
2029 (void) hashmap_remove_value(u
->manager
->watch_pids1
, PID_TO_PTR(pid
), u
);
2030 (void) hashmap_remove_value(u
->manager
->watch_pids2
, PID_TO_PTR(pid
), u
);
2031 (void) set_remove(u
->pids
, PID_TO_PTR(pid
));
2034 void unit_unwatch_all_pids(Unit
*u
) {
2037 while (!set_isempty(u
->pids
))
2038 unit_unwatch_pid(u
, PTR_TO_PID(set_first(u
->pids
)));
2040 u
->pids
= set_free(u
->pids
);
2043 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2049 /* Cleans dead PIDs from our list */
2051 SET_FOREACH(e
, u
->pids
, i
) {
2052 pid_t pid
= PTR_TO_PID(e
);
2054 if (pid
== except1
|| pid
== except2
)
2057 if (!pid_is_unwaited(pid
))
2058 unit_unwatch_pid(u
, pid
);
2062 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2064 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2068 case JOB_VERIFY_ACTIVE
:
2075 case JOB_TRY_RESTART
:
2076 return unit_can_start(u
);
2079 return unit_can_reload(u
);
2081 case JOB_RELOAD_OR_START
:
2082 return unit_can_reload(u
) && unit_can_start(u
);
2085 assert_not_reached("Invalid job type");
2089 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
) {
2092 /* Only warn about some unit types */
2093 if (!IN_SET(dependency
, UNIT_CONFLICTS
, UNIT_CONFLICTED_BY
, UNIT_BEFORE
, UNIT_AFTER
, UNIT_ON_FAILURE
, UNIT_TRIGGERS
, UNIT_TRIGGERED_BY
))
2096 if (streq_ptr(u
->id
, other
))
2097 log_unit_warning(u
, "Dependency %s=%s dropped", unit_dependency_to_string(dependency
), u
->id
);
2099 log_unit_warning(u
, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency
), strna(other
), u
->id
);
2102 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2104 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2105 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2106 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2107 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2108 [UNIT_REQUISITE
] = UNIT_REQUISITE_OF
,
2109 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUISITE_OF_OVERRIDABLE
,
2110 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2111 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2112 [UNIT_REQUIRED_BY
] = UNIT_REQUIRES
,
2113 [UNIT_REQUIRED_BY_OVERRIDABLE
] = UNIT_REQUIRES_OVERRIDABLE
,
2114 [UNIT_REQUISITE_OF
] = UNIT_REQUISITE
,
2115 [UNIT_REQUISITE_OF_OVERRIDABLE
] = UNIT_REQUISITE_OVERRIDABLE
,
2116 [UNIT_WANTED_BY
] = UNIT_WANTS
,
2117 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2118 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2119 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2120 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2121 [UNIT_BEFORE
] = UNIT_AFTER
,
2122 [UNIT_AFTER
] = UNIT_BEFORE
,
2123 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2124 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2125 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2126 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2127 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2128 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2129 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2130 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2132 int r
, q
= 0, v
= 0, w
= 0;
2133 Unit
*orig_u
= u
, *orig_other
= other
;
2136 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2139 u
= unit_follow_merge(u
);
2140 other
= unit_follow_merge(other
);
2142 /* We won't allow dependencies on ourselves. We will not
2143 * consider them an error however. */
2145 maybe_warn_about_dependency(orig_u
, orig_other
->id
, d
);
2149 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2153 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2154 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2159 if (add_reference
) {
2160 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2164 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2169 q
= set_put(u
->dependencies
[d
], other
);
2173 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2174 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2181 if (add_reference
) {
2182 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2188 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2193 unit_add_to_dbus_queue(u
);
2198 set_remove(u
->dependencies
[d
], other
);
2201 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2204 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2209 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2214 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2218 return unit_add_dependency(u
, e
, other
, add_reference
);
2221 static int resolve_template(Unit
*u
, const char *name
, const char*path
, char **buf
, const char **ret
) {
2225 assert(name
|| path
);
2230 name
= basename(path
);
2232 if (!unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
2239 r
= unit_name_replace_instance(name
, u
->instance
, buf
);
2241 _cleanup_free_
char *i
= NULL
;
2243 r
= unit_name_to_prefix(u
->id
, &i
);
2247 r
= unit_name_replace_instance(name
, i
, buf
);
2256 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2257 _cleanup_free_
char *buf
= NULL
;
2262 assert(name
|| path
);
2264 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2268 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2272 return unit_add_dependency(u
, d
, other
, add_reference
);
2275 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2276 _cleanup_free_
char *buf
= NULL
;
2281 assert(name
|| path
);
2283 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2287 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2291 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2294 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2295 _cleanup_free_
char *buf
= NULL
;
2300 assert(name
|| path
);
2302 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2306 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2310 return unit_add_dependency(other
, d
, u
, add_reference
);
2313 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2314 _cleanup_free_
char *buf
= NULL
;
2319 assert(name
|| path
);
2321 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2325 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2329 return unit_add_two_dependencies(other
, d
, e
, u
, add_reference
);
2332 int set_unit_path(const char *p
) {
2333 /* This is mostly for debug purposes */
2334 if (setenv("SYSTEMD_UNIT_PATH", p
, 0) < 0)
2340 char *unit_dbus_path(Unit
*u
) {
2346 return unit_dbus_path_from_name(u
->id
);
2349 int unit_set_slice(Unit
*u
, Unit
*slice
) {
2353 /* Sets the unit slice if it has not been set before. Is extra
2354 * careful, to only allow this for units that actually have a
2355 * cgroup context. Also, we don't allow to set this for slices
2356 * (since the parent slice is derived from the name). Make
2357 * sure the unit we set is actually a slice. */
2359 if (!UNIT_HAS_CGROUP_CONTEXT(u
))
2362 if (u
->type
== UNIT_SLICE
)
2365 if (unit_active_state(u
) != UNIT_INACTIVE
)
2368 if (slice
->type
!= UNIT_SLICE
)
2371 if (unit_has_name(u
, SPECIAL_INIT_SCOPE
) &&
2372 !unit_has_name(slice
, SPECIAL_ROOT_SLICE
))
2375 if (UNIT_DEREF(u
->slice
) == slice
)
2378 if (UNIT_ISSET(u
->slice
))
2381 unit_ref_set(&u
->slice
, slice
);
2385 int unit_set_default_slice(Unit
*u
) {
2386 _cleanup_free_
char *b
= NULL
;
2387 const char *slice_name
;
2393 if (UNIT_ISSET(u
->slice
))
2397 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2399 /* Implicitly place all instantiated units in their
2400 * own per-template slice */
2402 r
= unit_name_to_prefix(u
->id
, &prefix
);
2406 /* The prefix is already escaped, but it might include
2407 * "-" which has a special meaning for slice units,
2408 * hence escape it here extra. */
2409 escaped
= unit_name_escape(prefix
);
2413 if (u
->manager
->running_as
== MANAGER_SYSTEM
)
2414 b
= strjoin("system-", escaped
, ".slice", NULL
);
2416 b
= strappend(escaped
, ".slice");
2423 u
->manager
->running_as
== MANAGER_SYSTEM
&& !unit_has_name(u
, SPECIAL_INIT_SCOPE
)
2424 ? SPECIAL_SYSTEM_SLICE
2425 : SPECIAL_ROOT_SLICE
;
2427 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2431 return unit_set_slice(u
, slice
);
2434 const char *unit_slice_name(Unit
*u
) {
2437 if (!UNIT_ISSET(u
->slice
))
2440 return UNIT_DEREF(u
->slice
)->id
;
2443 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2444 _cleanup_free_
char *t
= NULL
;
2451 r
= unit_name_change_suffix(u
->id
, type
, &t
);
2454 if (unit_has_name(u
, t
))
2457 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2458 assert(r
< 0 || *_found
!= u
);
2462 static int signal_name_owner_changed(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
2463 const char *name
, *old_owner
, *new_owner
;
2470 r
= sd_bus_message_read(message
, "sss", &name
, &old_owner
, &new_owner
);
2472 bus_log_parse_error(r
);
2476 if (UNIT_VTABLE(u
)->bus_name_owner_change
)
2477 UNIT_VTABLE(u
)->bus_name_owner_change(u
, name
, old_owner
, new_owner
);
2482 int unit_install_bus_match(sd_bus
*bus
, Unit
*u
, const char *name
) {
2483 _cleanup_free_
char *match
= NULL
;
2484 Manager
*m
= u
->manager
;
2488 if (u
->match_bus_slot
)
2491 match
= strjoin("type='signal',"
2492 "sender='org.freedesktop.DBus',"
2493 "path='/org/freedesktop/DBus',"
2494 "interface='org.freedesktop.DBus',"
2495 "member='NameOwnerChanged',"
2503 return sd_bus_add_match(bus
, &u
->match_bus_slot
, match
, signal_name_owner_changed
, u
);
2506 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2512 /* Watch a specific name on the bus. We only support one unit
2513 * watching each name for now. */
2515 if (u
->manager
->api_bus
) {
2516 /* If the bus is already available, install the match directly.
2517 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
2518 r
= unit_install_bus_match(u
->manager
->api_bus
, u
, name
);
2520 return log_warning_errno(r
, "Failed to subscribe to NameOwnerChanged signal: %m");
2523 r
= hashmap_put(u
->manager
->watch_bus
, name
, u
);
2525 u
->match_bus_slot
= sd_bus_slot_unref(u
->match_bus_slot
);
2526 return log_warning_errno(r
, "Failed to put bus name to hashmap: %m");
2532 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2536 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2537 u
->match_bus_slot
= sd_bus_slot_unref(u
->match_bus_slot
);
2540 bool unit_can_serialize(Unit
*u
) {
2543 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2546 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2553 if (unit_can_serialize(u
)) {
2556 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2560 rt
= unit_get_exec_runtime(u
);
2562 r
= exec_runtime_serialize(u
, rt
, f
, fds
);
2568 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2569 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2570 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2571 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2572 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2573 dual_timestamp_serialize(f
, "assert-timestamp", &u
->assert_timestamp
);
2575 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2576 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2578 if (dual_timestamp_is_set(&u
->assert_timestamp
))
2579 unit_serialize_item(u
, f
, "assert-result", yes_no(u
->assert_result
));
2581 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2582 unit_serialize_item_format(u
, f
, "cpuacct-usage-base", "%" PRIu64
, u
->cpuacct_usage_base
);
2585 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2586 unit_serialize_item(u
, f
, "cgroup-realized", yes_no(u
->cgroup_realized
));
2588 if (serialize_jobs
) {
2590 fprintf(f
, "job\n");
2591 job_serialize(u
->job
, f
, fds
);
2595 fprintf(f
, "job\n");
2596 job_serialize(u
->nop_job
, f
, fds
);
2605 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2616 va_start(ap
, format
);
2617 vfprintf(f
, format
, ap
);
2623 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2629 fprintf(f
, "%s=%s\n", key
, value
);
2632 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2633 ExecRuntime
**rt
= NULL
;
2641 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2643 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2646 char line
[LINE_MAX
], *l
, *v
;
2649 if (!fgets(line
, sizeof(line
), f
)) {
2662 k
= strcspn(l
, "=");
2670 if (streq(l
, "job")) {
2672 /* new-style serialized job */
2679 r
= job_deserialize(j
, f
, fds
);
2685 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2691 r
= job_install_deserialized(j
);
2693 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2697 } else /* legacy for pre-44 */
2698 log_unit_warning(u
, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v
);
2700 } else if (streq(l
, "inactive-exit-timestamp")) {
2701 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2703 } else if (streq(l
, "active-enter-timestamp")) {
2704 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2706 } else if (streq(l
, "active-exit-timestamp")) {
2707 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2709 } else if (streq(l
, "inactive-enter-timestamp")) {
2710 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2712 } else if (streq(l
, "condition-timestamp")) {
2713 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2715 } else if (streq(l
, "assert-timestamp")) {
2716 dual_timestamp_deserialize(v
, &u
->assert_timestamp
);
2718 } else if (streq(l
, "condition-result")) {
2720 r
= parse_boolean(v
);
2722 log_unit_debug(u
, "Failed to parse condition result value %s, ignoring.", v
);
2724 u
->condition_result
= r
;
2728 } else if (streq(l
, "assert-result")) {
2730 r
= parse_boolean(v
);
2732 log_unit_debug(u
, "Failed to parse assert result value %s, ignoring.", v
);
2734 u
->assert_result
= r
;
2738 } else if (streq(l
, "transient")) {
2740 r
= parse_boolean(v
);
2742 log_unit_debug(u
, "Failed to parse transient bool %s, ignoring.", v
);
2748 } else if (streq(l
, "cpuacct-usage-base")) {
2750 r
= safe_atou64(v
, &u
->cpuacct_usage_base
);
2752 log_unit_debug(u
, "Failed to parse CPU usage %s, ignoring.", v
);
2756 } else if (streq(l
, "cgroup")) {
2758 r
= unit_set_cgroup_path(u
, v
);
2760 log_unit_debug_errno(u
, r
, "Failed to set cgroup path %s, ignoring: %m", v
);
2762 (void) unit_watch_cgroup(u
);
2765 } else if (streq(l
, "cgroup-realized")) {
2768 b
= parse_boolean(v
);
2770 log_unit_debug(u
, "Failed to parse cgroup-realized bool %s, ignoring.", v
);
2772 u
->cgroup_realized
= b
;
2777 if (unit_can_serialize(u
)) {
2779 r
= exec_runtime_deserialize_item(u
, rt
, l
, v
, fds
);
2781 log_unit_warning(u
, "Failed to deserialize runtime parameter '%s', ignoring.", l
);
2785 /* Returns positive if key was handled by the call */
2790 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2792 log_unit_warning(u
, "Failed to deserialize unit parameter '%s', ignoring.", l
);
2797 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2799 _cleanup_free_
char *e
= NULL
;
2804 /* Adds in links to the device node that this unit is based on */
2808 if (!is_device_path(what
))
2811 /* When device units aren't supported (such as in a
2812 * container), don't create dependencies on them. */
2813 if (!unit_type_supported(UNIT_DEVICE
))
2816 r
= unit_name_from_path(what
, ".device", &e
);
2820 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2824 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_BINDS_TO
: UNIT_WANTS
, device
, true);
2829 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2837 int unit_coldplug(Unit
*u
) {
2842 /* Make sure we don't enter a loop, when coldplugging
2847 u
->coldplugged
= true;
2849 if (UNIT_VTABLE(u
)->coldplug
) {
2850 r
= UNIT_VTABLE(u
)->coldplug(u
);
2856 r
= job_coldplug(u
->job
);
2864 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2865 DISABLE_WARNING_FORMAT_NONLITERAL
;
2866 manager_status_printf(u
->manager
, STATUS_TYPE_NORMAL
,
2867 status
, unit_status_msg_format
, unit_description(u
));
2871 bool unit_need_daemon_reload(Unit
*u
) {
2872 _cleanup_strv_free_
char **t
= NULL
;
2875 unsigned loaded_cnt
, current_cnt
;
2879 if (u
->fragment_path
) {
2881 if (stat(u
->fragment_path
, &st
) < 0)
2882 /* What, cannot access this anymore? */
2885 if (u
->fragment_mtime
> 0 &&
2886 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2890 if (u
->source_path
) {
2892 if (stat(u
->source_path
, &st
) < 0)
2895 if (u
->source_mtime
> 0 &&
2896 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2900 (void) unit_find_dropin_paths(u
, &t
);
2901 loaded_cnt
= strv_length(t
);
2902 current_cnt
= strv_length(u
->dropin_paths
);
2904 if (loaded_cnt
== current_cnt
) {
2905 if (loaded_cnt
== 0)
2908 if (strv_overlap(u
->dropin_paths
, t
)) {
2909 STRV_FOREACH(path
, u
->dropin_paths
) {
2911 if (stat(*path
, &st
) < 0)
2914 if (u
->dropin_mtime
> 0 &&
2915 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2926 void unit_reset_failed(Unit
*u
) {
2929 if (UNIT_VTABLE(u
)->reset_failed
)
2930 UNIT_VTABLE(u
)->reset_failed(u
);
2933 Unit
*unit_following(Unit
*u
) {
2936 if (UNIT_VTABLE(u
)->following
)
2937 return UNIT_VTABLE(u
)->following(u
);
2942 bool unit_stop_pending(Unit
*u
) {
2945 /* This call does check the current state of the unit. It's
2946 * hence useful to be called from state change calls of the
2947 * unit itself, where the state isn't updated yet. This is
2948 * different from unit_inactive_or_pending() which checks both
2949 * the current state and for a queued job. */
2951 return u
->job
&& u
->job
->type
== JOB_STOP
;
2954 bool unit_inactive_or_pending(Unit
*u
) {
2957 /* Returns true if the unit is inactive or going down */
2959 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
2962 if (unit_stop_pending(u
))
2968 bool unit_active_or_pending(Unit
*u
) {
2971 /* Returns true if the unit is active or going up */
2973 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
2977 (u
->job
->type
== JOB_START
||
2978 u
->job
->type
== JOB_RELOAD_OR_START
||
2979 u
->job
->type
== JOB_RESTART
))
2985 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
2987 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
2989 assert(signo
< _NSIG
);
2991 if (!UNIT_VTABLE(u
)->kill
)
2994 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
2997 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
3001 pid_set
= set_new(NULL
);
3005 /* Exclude the main/control pids from being killed via the cgroup */
3007 r
= set_put(pid_set
, PID_TO_PTR(main_pid
));
3012 if (control_pid
> 0) {
3013 r
= set_put(pid_set
, PID_TO_PTR(control_pid
));
3025 int unit_kill_common(
3031 sd_bus_error
*error
) {
3035 if (who
== KILL_MAIN
) {
3037 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
3038 else if (main_pid
== 0)
3039 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
3042 if (who
== KILL_CONTROL
) {
3043 if (control_pid
< 0)
3044 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
3045 else if (control_pid
== 0)
3046 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
3049 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
3050 if (control_pid
> 0)
3051 if (kill(control_pid
, signo
) < 0)
3054 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
3056 if (kill(main_pid
, signo
) < 0)
3059 if (who
== KILL_ALL
&& u
->cgroup_path
) {
3060 _cleanup_set_free_ Set
*pid_set
= NULL
;
3063 /* Exclude the main/control pids from being killed via the cgroup */
3064 pid_set
= unit_pid_set(main_pid
, control_pid
);
3068 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, false, false, pid_set
);
3069 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
3076 int unit_following_set(Unit
*u
, Set
**s
) {
3080 if (UNIT_VTABLE(u
)->following_set
)
3081 return UNIT_VTABLE(u
)->following_set(u
, s
);
3087 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
3090 if (u
->unit_file_state
< 0 && u
->fragment_path
)
3091 u
->unit_file_state
= unit_file_get_state(
3092 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3093 NULL
, basename(u
->fragment_path
));
3095 return u
->unit_file_state
;
3098 int unit_get_unit_file_preset(Unit
*u
) {
3101 if (u
->unit_file_preset
< 0 && u
->fragment_path
)
3102 u
->unit_file_preset
= unit_file_query_preset(
3103 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3104 NULL
, basename(u
->fragment_path
));
3106 return u
->unit_file_preset
;
3109 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3114 unit_ref_unset(ref
);
3117 LIST_PREPEND(refs
, u
->refs
, ref
);
3121 void unit_ref_unset(UnitRef
*ref
) {
3127 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3131 int unit_patch_contexts(Unit
*u
) {
3139 /* Patch in the manager defaults into the exec and cgroup
3140 * contexts, _after_ the rest of the settings have been
3143 ec
= unit_get_exec_context(u
);
3145 /* This only copies in the ones that need memory */
3146 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3147 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3148 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3153 if (u
->manager
->running_as
== MANAGER_USER
&&
3154 !ec
->working_directory
) {
3156 r
= get_home_dir(&ec
->working_directory
);
3160 /* Allow user services to run, even if the
3161 * home directory is missing */
3162 ec
->working_directory_missing_ok
= true;
3165 if (u
->manager
->running_as
== MANAGER_USER
&&
3166 (ec
->syscall_whitelist
||
3167 !set_isempty(ec
->syscall_filter
) ||
3168 !set_isempty(ec
->syscall_archs
) ||
3169 ec
->address_families_whitelist
||
3170 !set_isempty(ec
->address_families
)))
3171 ec
->no_new_privileges
= true;
3173 if (ec
->private_devices
)
3174 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3177 cc
= unit_get_cgroup_context(u
);
3181 ec
->private_devices
&&
3182 cc
->device_policy
== CGROUP_AUTO
)
3183 cc
->device_policy
= CGROUP_CLOSED
;
3189 ExecContext
*unit_get_exec_context(Unit
*u
) {
3196 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3200 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3203 KillContext
*unit_get_kill_context(Unit
*u
) {
3210 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3214 return (KillContext
*) ((uint8_t*) u
+ offset
);
3217 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3223 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3227 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3230 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3236 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3240 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3243 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3246 if (u
->manager
->running_as
== MANAGER_USER
) {
3249 if (mode
== UNIT_PERSISTENT
&& !transient
)
3250 r
= user_config_home(dir
);
3252 r
= user_runtime_dir(dir
);
3259 if (mode
== UNIT_PERSISTENT
&& !transient
)
3260 *dir
= strdup("/etc/systemd/system");
3262 *dir
= strdup("/run/systemd/system");
3269 static int unit_drop_in_file(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, char **p
, char **q
) {
3270 _cleanup_free_
char *dir
= NULL
;
3275 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3279 return drop_in_file(dir
, u
->id
, 50, name
, p
, q
);
3282 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3284 _cleanup_free_
char *dir
= NULL
, *p
= NULL
, *q
= NULL
;
3289 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3292 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3296 r
= write_drop_in(dir
, u
->id
, 50, name
, data
);
3300 r
= drop_in_file(dir
, u
->id
, 50, name
, &p
, &q
);
3304 r
= strv_extend(&u
->dropin_paths
, q
);
3308 strv_sort(u
->dropin_paths
);
3309 strv_uniq(u
->dropin_paths
);
3311 u
->dropin_mtime
= now(CLOCK_REALTIME
);
3316 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3317 _cleanup_free_
char *p
= NULL
;
3325 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3328 va_start(ap
, format
);
3329 r
= vasprintf(&p
, format
, ap
);
3335 return unit_write_drop_in(u
, mode
, name
, p
);
3338 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3339 _cleanup_free_
char *ndata
= NULL
;
3345 if (!UNIT_VTABLE(u
)->private_section
)
3348 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3351 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3355 return unit_write_drop_in(u
, mode
, name
, ndata
);
3358 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3359 _cleanup_free_
char *p
= NULL
;
3367 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3370 va_start(ap
, format
);
3371 r
= vasprintf(&p
, format
, ap
);
3377 return unit_write_drop_in_private(u
, mode
, name
, p
);
3380 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
3381 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
3386 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3389 r
= unit_drop_in_file(u
, mode
, name
, &p
, &q
);
3394 r
= errno
== ENOENT
? 0 : -errno
;
3402 int unit_make_transient(Unit
*u
) {
3405 if (!UNIT_VTABLE(u
)->can_transient
)
3408 u
->load_state
= UNIT_STUB
;
3410 u
->transient
= true;
3411 u
->fragment_path
= mfree(u
->fragment_path
);
3416 int unit_kill_context(
3422 bool main_pid_alien
) {
3424 bool wait_for_exit
= false;
3430 if (c
->kill_mode
== KILL_NONE
)
3440 case KILL_TERMINATE
:
3441 sig
= c
->kill_signal
;
3444 assert_not_reached("KillOperation unknown");
3448 r
= kill_and_sigcont(main_pid
, sig
);
3450 if (r
< 0 && r
!= -ESRCH
) {
3451 _cleanup_free_
char *comm
= NULL
;
3452 get_process_comm(main_pid
, &comm
);
3454 log_unit_warning_errno(u
, r
, "Failed to kill main process " PID_FMT
" (%s), ignoring: %m", main_pid
, strna(comm
));
3456 if (!main_pid_alien
)
3457 wait_for_exit
= true;
3459 if (c
->send_sighup
&& k
== KILL_TERMINATE
)
3460 (void) kill(main_pid
, SIGHUP
);
3464 if (control_pid
> 0) {
3465 r
= kill_and_sigcont(control_pid
, sig
);
3467 if (r
< 0 && r
!= -ESRCH
) {
3468 _cleanup_free_
char *comm
= NULL
;
3469 get_process_comm(control_pid
, &comm
);
3471 log_unit_warning_errno(u
, r
, "Failed to kill control process " PID_FMT
" (%s), ignoring: %m", control_pid
, strna(comm
));
3473 wait_for_exit
= true;
3475 if (c
->send_sighup
&& k
== KILL_TERMINATE
)
3476 (void) kill(control_pid
, SIGHUP
);
3480 if (u
->cgroup_path
&&
3481 (c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& k
== KILL_KILL
))) {
3482 _cleanup_set_free_ Set
*pid_set
= NULL
;
3484 /* Exclude the main/control pids from being killed via the cgroup */
3485 pid_set
= unit_pid_set(main_pid
, control_pid
);
3489 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, k
!= KILL_TERMINATE
, false, pid_set
);
3491 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3492 log_unit_warning_errno(u
, r
, "Failed to kill control group %s, ignoring: %m", u
->cgroup_path
);
3496 /* FIXME: For now, on the legacy hierarchy, we
3497 * will not wait for the cgroup members to die
3498 * if we are running in a container or if this
3499 * is a delegation unit, simply because cgroup
3500 * notification is unreliable in these
3501 * cases. It doesn't work at all in
3502 * containers, and outside of containers it
3503 * can be confused easily by left-over
3504 * directories in the cgroup -- which however
3505 * should not exist in non-delegated units. On
3506 * the unified hierarchy that's different,
3507 * there we get proper events. Hence rely on
3510 if (cg_unified() > 0 ||
3511 (detect_container() == 0 && !unit_cgroup_delegate(u
)))
3512 wait_for_exit
= true;
3514 if (c
->send_sighup
&& k
!= KILL_KILL
) {
3517 pid_set
= unit_pid_set(main_pid
, control_pid
);
3521 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3526 return wait_for_exit
;
3529 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3530 char prefix
[strlen(path
) + 1], *p
;
3536 /* Registers a unit for requiring a certain path and all its
3537 * prefixes. We keep a simple array of these paths in the
3538 * unit, since its usually short. However, we build a prefix
3539 * table for all possible prefixes so that new appearing mount
3540 * units can easily determine which units to make themselves a
3543 if (!path_is_absolute(path
))
3550 path_kill_slashes(p
);
3552 if (!path_is_safe(p
)) {
3557 if (strv_contains(u
->requires_mounts_for
, p
)) {
3562 r
= strv_consume(&u
->requires_mounts_for
, p
);
3566 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3569 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3573 r
= hashmap_ensure_allocated(&u
->manager
->units_requiring_mounts_for
, &string_hash_ops
);
3587 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3603 int unit_setup_exec_runtime(Unit
*u
) {
3609 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3612 /* Check if there already is an ExecRuntime for this unit? */
3613 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3617 /* Try to get it from somebody else */
3618 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3620 *rt
= unit_get_exec_runtime(other
);
3622 exec_runtime_ref(*rt
);
3627 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3630 bool unit_type_supported(UnitType t
) {
3631 if (_unlikely_(t
< 0))
3633 if (_unlikely_(t
>= _UNIT_TYPE_MAX
))
3636 if (!unit_vtable
[t
]->supported
)
3639 return unit_vtable
[t
]->supported();
3642 void unit_warn_if_dir_nonempty(Unit
*u
, const char* where
) {
3648 r
= dir_is_empty(where
);
3652 log_unit_warning_errno(u
, r
, "Failed to check directory %s: %m", where
);
3656 log_struct(LOG_NOTICE
,
3657 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3659 LOG_UNIT_MESSAGE(u
, "Directory %s to mount over is not empty, mounting anyway.", where
),
3664 int unit_fail_if_symlink(Unit
*u
, const char* where
) {
3670 r
= is_symlink(where
);
3672 log_unit_debug_errno(u
, r
, "Failed to check symlink %s, ignoring: %m", where
);
3679 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3681 LOG_UNIT_MESSAGE(u
, "Mount on symlink %s not allowed.", where
),
3688 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3689 [UNIT_ACTIVE
] = "active",
3690 [UNIT_RELOADING
] = "reloading",
3691 [UNIT_INACTIVE
] = "inactive",
3692 [UNIT_FAILED
] = "failed",
3693 [UNIT_ACTIVATING
] = "activating",
3694 [UNIT_DEACTIVATING
] = "deactivating"
3697 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);