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 strv_free(u
->requires_mounts_for
);
449 u
->requires_mounts_for
= NULL
;
452 static void unit_done(Unit
*u
) {
461 if (UNIT_VTABLE(u
)->done
)
462 UNIT_VTABLE(u
)->done(u
);
464 ec
= unit_get_exec_context(u
);
466 exec_context_done(ec
);
468 cc
= unit_get_cgroup_context(u
);
470 cgroup_context_done(cc
);
473 void unit_free(Unit
*u
) {
480 if (u
->manager
->n_reloading
<= 0)
481 unit_remove_transient(u
);
483 bus_unit_send_removed_signal(u
);
487 sd_bus_slot_unref(u
->match_bus_slot
);
489 unit_free_requires_mounts_for(u
);
491 SET_FOREACH(t
, u
->names
, i
)
492 hashmap_remove_value(u
->manager
->units
, t
, u
);
506 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
507 bidi_set_free(u
, u
->dependencies
[d
]);
509 if (u
->type
!= _UNIT_TYPE_INVALID
)
510 LIST_REMOVE(units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
512 if (u
->in_load_queue
)
513 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
515 if (u
->in_dbus_queue
)
516 LIST_REMOVE(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
518 if (u
->in_cleanup_queue
)
519 LIST_REMOVE(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
521 if (u
->in_gc_queue
) {
522 LIST_REMOVE(gc_queue
, u
->manager
->gc_queue
, u
);
523 u
->manager
->n_in_gc_queue
--;
526 if (u
->in_cgroup_queue
)
527 LIST_REMOVE(cgroup_queue
, u
->manager
->cgroup_queue
, u
);
529 unit_release_cgroup(u
);
531 manager_update_failed_units(u
->manager
, u
, false);
532 set_remove(u
->manager
->startup_units
, u
);
534 free(u
->description
);
535 strv_free(u
->documentation
);
536 free(u
->fragment_path
);
537 free(u
->source_path
);
538 strv_free(u
->dropin_paths
);
541 free(u
->job_timeout_reboot_arg
);
543 set_free_free(u
->names
);
545 unit_unwatch_all_pids(u
);
547 condition_free_list(u
->conditions
);
548 condition_free_list(u
->asserts
);
550 unit_ref_unset(&u
->slice
);
553 unit_ref_unset(u
->refs
);
558 UnitActiveState
unit_active_state(Unit
*u
) {
561 if (u
->load_state
== UNIT_MERGED
)
562 return unit_active_state(unit_follow_merge(u
));
564 /* After a reload it might happen that a unit is not correctly
565 * loaded but still has a process around. That's why we won't
566 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
568 return UNIT_VTABLE(u
)->active_state(u
);
571 const char* unit_sub_state_to_string(Unit
*u
) {
574 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
577 static int complete_move(Set
**s
, Set
**other
) {
587 r
= set_move(*s
, *other
);
598 static int merge_names(Unit
*u
, Unit
*other
) {
606 r
= complete_move(&u
->names
, &other
->names
);
610 set_free_free(other
->names
);
614 SET_FOREACH(t
, u
->names
, i
)
615 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
620 static int reserve_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
625 assert(d
< _UNIT_DEPENDENCY_MAX
);
628 * If u does not have this dependency set allocated, there is no need
629 * to reserve anything. In that case other's set will be transferred
630 * as a whole to u by complete_move().
632 if (!u
->dependencies
[d
])
635 /* merge_dependencies() will skip a u-on-u dependency */
636 n_reserve
= set_size(other
->dependencies
[d
]) - !!set_get(other
->dependencies
[d
], u
);
638 return set_reserve(u
->dependencies
[d
], n_reserve
);
641 static void merge_dependencies(Unit
*u
, Unit
*other
, const char *other_id
, UnitDependency d
) {
648 assert(d
< _UNIT_DEPENDENCY_MAX
);
650 /* Fix backwards pointers */
651 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
654 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++) {
655 /* Do not add dependencies between u and itself */
657 if (set_remove(back
->dependencies
[k
], other
))
658 maybe_warn_about_dependency(u
, other_id
, k
);
660 r
= set_remove_and_put(back
->dependencies
[k
], other
, u
);
662 set_remove(back
->dependencies
[k
], other
);
664 assert(r
>= 0 || r
== -ENOENT
);
669 /* Also do not move dependencies on u to itself */
670 back
= set_remove(other
->dependencies
[d
], u
);
672 maybe_warn_about_dependency(u
, other_id
, d
);
674 /* The move cannot fail. The caller must have performed a reservation. */
675 assert_se(complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]) == 0);
677 set_free(other
->dependencies
[d
]);
678 other
->dependencies
[d
] = NULL
;
681 int unit_merge(Unit
*u
, Unit
*other
) {
683 const char *other_id
= NULL
;
688 assert(u
->manager
== other
->manager
);
689 assert(u
->type
!= _UNIT_TYPE_INVALID
);
691 other
= unit_follow_merge(other
);
696 if (u
->type
!= other
->type
)
699 if (!u
->instance
!= !other
->instance
)
702 if (other
->load_state
!= UNIT_STUB
&&
703 other
->load_state
!= UNIT_NOT_FOUND
)
712 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
716 other_id
= strdupa(other
->id
);
718 /* Make reservations to ensure merge_dependencies() won't fail */
719 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
720 r
= reserve_dependencies(u
, other
, d
);
722 * We don't rollback reservations if we fail. We don't have
723 * a way to undo reservations. A reservation is not a leak.
730 r
= merge_names(u
, other
);
734 /* Redirect all references */
736 unit_ref_set(other
->refs
, u
);
738 /* Merge dependencies */
739 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
740 merge_dependencies(u
, other
, other_id
, d
);
742 other
->load_state
= UNIT_MERGED
;
743 other
->merged_into
= u
;
745 /* If there is still some data attached to the other node, we
746 * don't need it anymore, and can free it. */
747 if (other
->load_state
!= UNIT_STUB
)
748 if (UNIT_VTABLE(other
)->done
)
749 UNIT_VTABLE(other
)->done(other
);
751 unit_add_to_dbus_queue(u
);
752 unit_add_to_cleanup_queue(other
);
757 int unit_merge_by_name(Unit
*u
, const char *name
) {
760 _cleanup_free_
char *s
= NULL
;
765 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
769 r
= unit_name_replace_instance(name
, u
->instance
, &s
);
776 other
= manager_get_unit(u
->manager
, name
);
778 return unit_merge(u
, other
);
780 return unit_add_name(u
, name
);
783 Unit
* unit_follow_merge(Unit
*u
) {
786 while (u
->load_state
== UNIT_MERGED
)
787 assert_se(u
= u
->merged_into
);
792 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
798 if (c
->working_directory
) {
799 r
= unit_require_mounts_for(u
, c
->working_directory
);
804 if (c
->root_directory
) {
805 r
= unit_require_mounts_for(u
, c
->root_directory
);
810 if (u
->manager
->running_as
!= MANAGER_SYSTEM
)
813 if (c
->private_tmp
) {
814 r
= unit_require_mounts_for(u
, "/tmp");
818 r
= unit_require_mounts_for(u
, "/var/tmp");
823 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
824 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
825 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
826 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
827 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
828 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
829 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
830 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
831 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
832 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
833 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
834 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
837 /* If syslog or kernel logging is requested, make sure our own
838 * logging daemon is run first. */
840 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
847 const char *unit_description(Unit
*u
) {
851 return u
->description
;
856 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
862 timestamp1
[FORMAT_TIMESTAMP_MAX
],
863 timestamp2
[FORMAT_TIMESTAMP_MAX
],
864 timestamp3
[FORMAT_TIMESTAMP_MAX
],
865 timestamp4
[FORMAT_TIMESTAMP_MAX
],
866 timespan
[FORMAT_TIMESPAN_MAX
];
868 _cleanup_set_free_ Set
*following_set
= NULL
;
872 assert(u
->type
>= 0);
874 prefix
= strempty(prefix
);
875 prefix2
= strjoina(prefix
, "\t");
879 "%s\tDescription: %s\n"
881 "%s\tUnit Load State: %s\n"
882 "%s\tUnit Active State: %s\n"
883 "%s\tInactive Exit Timestamp: %s\n"
884 "%s\tActive Enter Timestamp: %s\n"
885 "%s\tActive Exit Timestamp: %s\n"
886 "%s\tInactive Enter Timestamp: %s\n"
887 "%s\tGC Check Good: %s\n"
888 "%s\tNeed Daemon Reload: %s\n"
889 "%s\tTransient: %s\n"
892 "%s\tCGroup realized: %s\n"
893 "%s\tCGroup mask: 0x%x\n"
894 "%s\tCGroup members mask: 0x%x\n",
896 prefix
, unit_description(u
),
897 prefix
, strna(u
->instance
),
898 prefix
, unit_load_state_to_string(u
->load_state
),
899 prefix
, unit_active_state_to_string(unit_active_state(u
)),
900 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
901 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
902 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
903 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
904 prefix
, yes_no(unit_check_gc(u
)),
905 prefix
, yes_no(unit_need_daemon_reload(u
)),
906 prefix
, yes_no(u
->transient
),
907 prefix
, strna(unit_slice_name(u
)),
908 prefix
, strna(u
->cgroup_path
),
909 prefix
, yes_no(u
->cgroup_realized
),
910 prefix
, u
->cgroup_realized_mask
,
911 prefix
, u
->cgroup_members_mask
);
913 SET_FOREACH(t
, u
->names
, i
)
914 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
916 STRV_FOREACH(j
, u
->documentation
)
917 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
919 following
= unit_following(u
);
921 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
923 r
= unit_following_set(u
, &following_set
);
927 SET_FOREACH(other
, following_set
, i
)
928 fprintf(f
, "%s\tFollowing Set Member: %s\n", prefix
, other
->id
);
931 if (u
->fragment_path
)
932 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
935 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
937 STRV_FOREACH(j
, u
->dropin_paths
)
938 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
940 if (u
->job_timeout
> 0)
941 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
943 if (u
->job_timeout_action
!= FAILURE_ACTION_NONE
)
944 fprintf(f
, "%s\tJob Timeout Action: %s\n", prefix
, failure_action_to_string(u
->job_timeout_action
));
946 if (u
->job_timeout_reboot_arg
)
947 fprintf(f
, "%s\tJob Timeout Reboot Argument: %s\n", prefix
, u
->job_timeout_reboot_arg
);
949 condition_dump_list(u
->conditions
, f
, prefix
, condition_type_to_string
);
950 condition_dump_list(u
->asserts
, f
, prefix
, assert_type_to_string
);
952 if (dual_timestamp_is_set(&u
->condition_timestamp
))
954 "%s\tCondition Timestamp: %s\n"
955 "%s\tCondition Result: %s\n",
956 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
957 prefix
, yes_no(u
->condition_result
));
959 if (dual_timestamp_is_set(&u
->assert_timestamp
))
961 "%s\tAssert Timestamp: %s\n"
962 "%s\tAssert Result: %s\n",
963 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->assert_timestamp
.realtime
)),
964 prefix
, yes_no(u
->assert_result
));
966 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
969 SET_FOREACH(other
, u
->dependencies
[d
], i
)
970 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
973 if (!strv_isempty(u
->requires_mounts_for
)) {
975 "%s\tRequiresMountsFor:", prefix
);
977 STRV_FOREACH(j
, u
->requires_mounts_for
)
978 fprintf(f
, " %s", *j
);
983 if (u
->load_state
== UNIT_LOADED
) {
986 "%s\tStopWhenUnneeded: %s\n"
987 "%s\tRefuseManualStart: %s\n"
988 "%s\tRefuseManualStop: %s\n"
989 "%s\tDefaultDependencies: %s\n"
990 "%s\tOnFailureJobMode: %s\n"
991 "%s\tIgnoreOnIsolate: %s\n"
992 "%s\tIgnoreOnSnapshot: %s\n",
993 prefix
, yes_no(u
->stop_when_unneeded
),
994 prefix
, yes_no(u
->refuse_manual_start
),
995 prefix
, yes_no(u
->refuse_manual_stop
),
996 prefix
, yes_no(u
->default_dependencies
),
997 prefix
, job_mode_to_string(u
->on_failure_job_mode
),
998 prefix
, yes_no(u
->ignore_on_isolate
),
999 prefix
, yes_no(u
->ignore_on_snapshot
));
1001 if (UNIT_VTABLE(u
)->dump
)
1002 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
1004 } else if (u
->load_state
== UNIT_MERGED
)
1006 "%s\tMerged into: %s\n",
1007 prefix
, u
->merged_into
->id
);
1008 else if (u
->load_state
== UNIT_ERROR
)
1009 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
1013 job_dump(u
->job
, f
, prefix2
);
1016 job_dump(u
->nop_job
, f
, prefix2
);
1020 /* Common implementation for multiple backends */
1021 int unit_load_fragment_and_dropin(Unit
*u
) {
1026 /* Load a .{service,socket,...} file */
1027 r
= unit_load_fragment(u
);
1031 if (u
->load_state
== UNIT_STUB
)
1034 /* Load drop-in directory data */
1035 r
= unit_load_dropin(unit_follow_merge(u
));
1042 /* Common implementation for multiple backends */
1043 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
1048 /* Same as unit_load_fragment_and_dropin(), but whether
1049 * something can be loaded or not doesn't matter. */
1051 /* Load a .service file */
1052 r
= unit_load_fragment(u
);
1056 if (u
->load_state
== UNIT_STUB
)
1057 u
->load_state
= UNIT_LOADED
;
1059 /* Load drop-in directory data */
1060 r
= unit_load_dropin(unit_follow_merge(u
));
1067 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
1071 if (target
->type
!= UNIT_TARGET
)
1074 /* Only add the dependency if both units are loaded, so that
1075 * that loop check below is reliable */
1076 if (u
->load_state
!= UNIT_LOADED
||
1077 target
->load_state
!= UNIT_LOADED
)
1080 /* If either side wants no automatic dependencies, then let's
1082 if (!u
->default_dependencies
||
1083 !target
->default_dependencies
)
1086 /* Don't create loops */
1087 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
1090 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
1093 static int unit_add_target_dependencies(Unit
*u
) {
1095 static const UnitDependency deps
[] = {
1097 UNIT_REQUIRED_BY_OVERRIDABLE
,
1099 UNIT_REQUISITE_OF_OVERRIDABLE
,
1111 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
1112 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
1113 r
= unit_add_default_target_dependency(u
, target
);
1121 static int unit_add_slice_dependencies(Unit
*u
) {
1124 if (!UNIT_HAS_CGROUP_CONTEXT(u
))
1127 if (UNIT_ISSET(u
->slice
))
1128 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_WANTS
, UNIT_DEREF(u
->slice
), true);
1130 if (streq(u
->id
, SPECIAL_ROOT_SLICE
))
1133 return unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_WANTS
, SPECIAL_ROOT_SLICE
, NULL
, true);
1136 static int unit_add_mount_dependencies(Unit
*u
) {
1142 STRV_FOREACH(i
, u
->requires_mounts_for
) {
1143 char prefix
[strlen(*i
) + 1];
1145 PATH_FOREACH_PREFIX_MORE(prefix
, *i
) {
1148 r
= manager_get_unit_by_path(u
->manager
, prefix
, ".mount", &m
);
1156 if (m
->load_state
!= UNIT_LOADED
)
1159 r
= unit_add_dependency(u
, UNIT_AFTER
, m
, true);
1163 if (m
->fragment_path
) {
1164 r
= unit_add_dependency(u
, UNIT_REQUIRES
, m
, true);
1174 static int unit_add_startup_units(Unit
*u
) {
1177 c
= unit_get_cgroup_context(u
);
1181 if (c
->startup_cpu_shares
== (unsigned long) -1 &&
1182 c
->startup_blockio_weight
== (unsigned long) -1)
1185 return set_put(u
->manager
->startup_units
, u
);
1188 int unit_load(Unit
*u
) {
1193 if (u
->in_load_queue
) {
1194 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
1195 u
->in_load_queue
= false;
1198 if (u
->type
== _UNIT_TYPE_INVALID
)
1201 if (u
->load_state
!= UNIT_STUB
)
1204 if (UNIT_VTABLE(u
)->load
) {
1205 r
= UNIT_VTABLE(u
)->load(u
);
1210 if (u
->load_state
== UNIT_STUB
) {
1215 if (u
->load_state
== UNIT_LOADED
) {
1217 r
= unit_add_target_dependencies(u
);
1221 r
= unit_add_slice_dependencies(u
);
1225 r
= unit_add_mount_dependencies(u
);
1229 r
= unit_add_startup_units(u
);
1233 if (u
->on_failure_job_mode
== JOB_ISOLATE
&& set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
1234 log_unit_error(u
, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
1239 unit_update_cgroup_members_masks(u
);
1242 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
1244 unit_add_to_dbus_queue(unit_follow_merge(u
));
1245 unit_add_to_gc_queue(u
);
1250 u
->load_state
= u
->load_state
== UNIT_STUB
? UNIT_NOT_FOUND
: UNIT_ERROR
;
1252 unit_add_to_dbus_queue(u
);
1253 unit_add_to_gc_queue(u
);
1255 log_unit_debug_errno(u
, r
, "Failed to load configuration: %m");
1260 static bool unit_condition_test_list(Unit
*u
, Condition
*first
, const char *(*to_string
)(ConditionType t
)) {
1267 /* If the condition list is empty, then it is true */
1271 /* Otherwise, if all of the non-trigger conditions apply and
1272 * if any of the trigger conditions apply (unless there are
1273 * none) we return true */
1274 LIST_FOREACH(conditions
, c
, first
) {
1277 r
= condition_test(c
);
1280 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
1282 c
->trigger
? "|" : "",
1283 c
->negate
? "!" : "",
1289 c
->trigger
? "|" : "",
1290 c
->negate
? "!" : "",
1292 condition_result_to_string(c
->result
));
1294 if (!c
->trigger
&& r
<= 0)
1297 if (c
->trigger
&& triggered
<= 0)
1301 return triggered
!= 0;
1304 static bool unit_condition_test(Unit
*u
) {
1307 dual_timestamp_get(&u
->condition_timestamp
);
1308 u
->condition_result
= unit_condition_test_list(u
, u
->conditions
, condition_type_to_string
);
1310 return u
->condition_result
;
1313 static bool unit_assert_test(Unit
*u
) {
1316 dual_timestamp_get(&u
->assert_timestamp
);
1317 u
->assert_result
= unit_condition_test_list(u
, u
->asserts
, assert_type_to_string
);
1319 return u
->assert_result
;
1322 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1324 const UnitStatusMessageFormats
*format_table
;
1327 assert(t
== JOB_START
|| t
== JOB_STOP
|| t
== JOB_RELOAD
);
1329 if (t
!= JOB_RELOAD
) {
1330 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1332 format
= format_table
->starting_stopping
[t
== JOB_STOP
];
1338 /* Return generic strings */
1340 return "Starting %s.";
1341 else if (t
== JOB_STOP
)
1342 return "Stopping %s.";
1344 return "Reloading %s.";
1347 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1352 format
= unit_get_status_message_format(u
, t
);
1354 DISABLE_WARNING_FORMAT_NONLITERAL
;
1355 unit_status_printf(u
, "", format
);
1359 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1366 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1369 if (log_on_console())
1372 /* We log status messages for all units and all operations. */
1374 format
= unit_get_status_message_format(u
, t
);
1376 DISABLE_WARNING_FORMAT_NONLITERAL
;
1377 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1380 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1381 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1382 SD_MESSAGE_UNIT_RELOADING
;
1384 /* Note that we deliberately use LOG_MESSAGE() instead of
1385 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1386 * closely what is written to screen using the status output,
1387 * which is supposed the highest level, friendliest output
1388 * possible, which means we should avoid the low-level unit
1390 log_struct(LOG_INFO
,
1391 LOG_MESSAGE_ID(mid
),
1393 LOG_MESSAGE("%s", buf
),
1397 void unit_status_emit_starting_stopping_reloading(Unit
*u
, JobType t
) {
1399 unit_status_log_starting_stopping_reloading(u
, t
);
1401 /* Reload status messages have traditionally not been printed to console. */
1402 if (t
!= JOB_RELOAD
)
1403 unit_status_print_starting_stopping(u
, t
);
1407 * -EBADR: This unit type does not support starting.
1408 * -EALREADY: Unit is already started.
1409 * -EAGAIN: An operation is already in progress. Retry later.
1410 * -ECANCELED: Too many requests for now.
1411 * -EPROTO: Assert failed
1413 int unit_start(Unit
*u
) {
1414 UnitActiveState state
;
1419 /* Units that aren't loaded cannot be started */
1420 if (u
->load_state
!= UNIT_LOADED
)
1423 /* If this is already started, then this will succeed. Note
1424 * that this will even succeed if this unit is not startable
1425 * by the user. This is relied on to detect when we need to
1426 * wait for units and when waiting is finished. */
1427 state
= unit_active_state(u
);
1428 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1431 /* If the conditions failed, don't do anything at all. If we
1432 * already are activating this call might still be useful to
1433 * speed up activation in case there is some hold-off time,
1434 * but we don't want to recheck the condition in that case. */
1435 if (state
!= UNIT_ACTIVATING
&&
1436 !unit_condition_test(u
)) {
1437 log_unit_debug(u
, "Starting requested but condition failed. Not starting unit.");
1441 /* If the asserts failed, fail the entire job */
1442 if (state
!= UNIT_ACTIVATING
&&
1443 !unit_assert_test(u
)) {
1444 log_unit_notice(u
, "Starting requested but asserts failed.");
1448 /* Units of types that aren't supported cannot be
1449 * started. Note that we do this test only after the condition
1450 * checks, so that we rather return condition check errors
1451 * (which are usually not considered a true failure) than "not
1452 * supported" errors (which are considered a failure).
1454 if (!unit_supported(u
))
1457 /* Forward to the main object, if we aren't it. */
1458 following
= unit_following(u
);
1460 log_unit_debug(u
, "Redirecting start request from %s to %s.", u
->id
, following
->id
);
1461 return unit_start(following
);
1464 /* If it is stopped, but we cannot start it, then fail */
1465 if (!UNIT_VTABLE(u
)->start
)
1468 /* We don't suppress calls to ->start() here when we are
1469 * already starting, to allow this request to be used as a
1470 * "hurry up" call, for example when the unit is in some "auto
1471 * restart" state where it waits for a holdoff timer to elapse
1472 * before it will start again. */
1474 unit_add_to_dbus_queue(u
);
1476 return UNIT_VTABLE(u
)->start(u
);
1479 bool unit_can_start(Unit
*u
) {
1482 if (u
->load_state
!= UNIT_LOADED
)
1485 if (!unit_supported(u
))
1488 return !!UNIT_VTABLE(u
)->start
;
1491 bool unit_can_isolate(Unit
*u
) {
1494 return unit_can_start(u
) &&
1499 * -EBADR: This unit type does not support stopping.
1500 * -EALREADY: Unit is already stopped.
1501 * -EAGAIN: An operation is already in progress. Retry later.
1503 int unit_stop(Unit
*u
) {
1504 UnitActiveState state
;
1509 state
= unit_active_state(u
);
1510 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1513 following
= unit_following(u
);
1515 log_unit_debug(u
, "Redirecting stop request from %s to %s.", u
->id
, following
->id
);
1516 return unit_stop(following
);
1519 if (!UNIT_VTABLE(u
)->stop
)
1522 unit_add_to_dbus_queue(u
);
1524 return UNIT_VTABLE(u
)->stop(u
);
1528 * -EBADR: This unit type does not support reloading.
1529 * -ENOEXEC: Unit is not started.
1530 * -EAGAIN: An operation is already in progress. Retry later.
1532 int unit_reload(Unit
*u
) {
1533 UnitActiveState state
;
1538 if (u
->load_state
!= UNIT_LOADED
)
1541 if (!unit_can_reload(u
))
1544 state
= unit_active_state(u
);
1545 if (state
== UNIT_RELOADING
)
1548 if (state
!= UNIT_ACTIVE
) {
1549 log_unit_warning(u
, "Unit cannot be reloaded because it is inactive.");
1553 following
= unit_following(u
);
1555 log_unit_debug(u
, "Redirecting reload request from %s to %s.", u
->id
, following
->id
);
1556 return unit_reload(following
);
1559 unit_add_to_dbus_queue(u
);
1561 return UNIT_VTABLE(u
)->reload(u
);
1564 bool unit_can_reload(Unit
*u
) {
1567 if (!UNIT_VTABLE(u
)->reload
)
1570 if (!UNIT_VTABLE(u
)->can_reload
)
1573 return UNIT_VTABLE(u
)->can_reload(u
);
1576 static void unit_check_unneeded(Unit
*u
) {
1578 static const UnitDependency needed_dependencies
[] = {
1580 UNIT_REQUIRED_BY_OVERRIDABLE
,
1582 UNIT_REQUISITE_OF_OVERRIDABLE
,
1594 /* If this service shall be shut down when unneeded then do
1597 if (!u
->stop_when_unneeded
)
1600 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1603 for (j
= 0; j
< ELEMENTSOF(needed_dependencies
); j
++)
1604 SET_FOREACH(other
, u
->dependencies
[needed_dependencies
[j
]], i
)
1605 if (unit_active_or_pending(other
))
1608 /* If stopping a unit fails continously we might enter a stop
1609 * loop here, hence stop acting on the service being
1610 * unnecessary after a while. */
1611 if (!ratelimit_test(&u
->auto_stop_ratelimit
)) {
1612 log_unit_warning(u
, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1616 log_unit_info(u
, "Unit not needed anymore. Stopping.");
1618 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1619 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1621 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1624 static void unit_check_binds_to(Unit
*u
) {
1635 if (unit_active_state(u
) != UNIT_ACTIVE
)
1638 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
) {
1642 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
1652 /* If stopping a unit fails continously we might enter a stop
1653 * loop here, hence stop acting on the service being
1654 * unnecessary after a while. */
1655 if (!ratelimit_test(&u
->auto_stop_ratelimit
)) {
1656 log_unit_warning(u
, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other
->id
);
1661 log_unit_info(u
, "Unit is bound to inactive unit %s. Stopping, too.", other
->id
);
1663 /* A unit we need to run is gone. Sniff. Let's stop this. */
1664 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1666 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1669 static void retroactively_start_dependencies(Unit
*u
) {
1674 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1676 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1677 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1678 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1679 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1681 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1682 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1683 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1684 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1686 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1687 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1688 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1689 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1691 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1692 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1693 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1694 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1696 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1697 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1698 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1700 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1701 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1702 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1705 static void retroactively_stop_dependencies(Unit
*u
) {
1710 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1712 /* Pull down units which are bound to us recursively if enabled */
1713 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1714 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1715 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1718 static void check_unneeded_dependencies(Unit
*u
) {
1723 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1725 /* Garbage collect services that might not be needed anymore, if enabled */
1726 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1727 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1728 unit_check_unneeded(other
);
1729 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1730 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1731 unit_check_unneeded(other
);
1732 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1733 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1734 unit_check_unneeded(other
);
1735 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1736 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1737 unit_check_unneeded(other
);
1738 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1739 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1740 unit_check_unneeded(other
);
1741 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1742 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1743 unit_check_unneeded(other
);
1746 void unit_start_on_failure(Unit
*u
) {
1752 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1755 log_unit_info(u
, "Triggering OnFailure= dependencies.");
1757 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1760 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1762 log_unit_error_errno(u
, r
, "Failed to enqueue OnFailure= job: %m");
1766 void unit_trigger_notify(Unit
*u
) {
1772 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1773 if (UNIT_VTABLE(other
)->trigger_notify
)
1774 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1777 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1782 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1783 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1785 /* Note that this is called for all low-level state changes,
1786 * even if they might map to the same high-level
1787 * UnitActiveState! That means that ns == os is an expected
1788 * behavior here. For example: if a mount point is remounted
1789 * this function will be called too! */
1793 /* Update timestamps for state changes */
1794 if (m
->n_reloading
<= 0) {
1797 dual_timestamp_get(&ts
);
1799 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1800 u
->inactive_exit_timestamp
= ts
;
1801 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1802 u
->inactive_enter_timestamp
= ts
;
1804 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1805 u
->active_enter_timestamp
= ts
;
1806 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1807 u
->active_exit_timestamp
= ts
;
1810 /* Keep track of failed units */
1811 manager_update_failed_units(u
->manager
, u
, ns
== UNIT_FAILED
);
1813 /* Make sure the cgroup is always removed when we become inactive */
1814 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1815 unit_prune_cgroup(u
);
1817 /* Note that this doesn't apply to RemainAfterExit services exiting
1818 * successfully, since there's no change of state in that case. Which is
1819 * why it is handled in service_set_state() */
1820 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1823 ec
= unit_get_exec_context(u
);
1824 if (ec
&& exec_context_may_touch_console(ec
)) {
1825 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1828 if (m
->n_on_console
== 0)
1829 /* unset no_console_output flag, since the console is free */
1830 m
->no_console_output
= false;
1839 if (u
->job
->state
== JOB_WAITING
)
1841 /* So we reached a different state for this
1842 * job. Let's see if we can run it now if it
1843 * failed previously due to EAGAIN. */
1844 job_add_to_run_queue(u
->job
);
1846 /* Let's check whether this state change constitutes a
1847 * finished job, or maybe contradicts a running job and
1848 * hence needs to invalidate jobs. */
1850 switch (u
->job
->type
) {
1853 case JOB_VERIFY_ACTIVE
:
1855 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1856 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1857 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1860 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1861 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1867 case JOB_RELOAD_OR_START
:
1869 if (u
->job
->state
== JOB_RUNNING
) {
1870 if (ns
== UNIT_ACTIVE
)
1871 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1872 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1875 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1876 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1884 case JOB_TRY_RESTART
:
1886 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1887 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1888 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1890 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1896 assert_not_reached("Job type unknown");
1902 if (m
->n_reloading
<= 0) {
1904 /* If this state change happened without being
1905 * requested by a job, then let's retroactively start
1906 * or stop dependencies. We skip that step when
1907 * deserializing, since we don't want to create any
1908 * additional jobs just because something is already
1912 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1913 retroactively_start_dependencies(u
);
1914 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1915 retroactively_stop_dependencies(u
);
1918 /* stop unneeded units regardless if going down was expected or not */
1919 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1920 check_unneeded_dependencies(u
);
1922 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1923 log_unit_notice(u
, "Unit entered failed state.");
1924 unit_start_on_failure(u
);
1928 /* Some names are special */
1929 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1931 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1932 /* The bus might have just become available,
1933 * hence try to connect to it, if we aren't
1937 if (u
->type
== UNIT_SERVICE
&&
1938 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1939 m
->n_reloading
<= 0) {
1940 /* Write audit record if we have just finished starting up */
1941 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1945 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1946 manager_send_unit_plymouth(m
, u
);
1950 /* We don't care about D-Bus here, since we'll get an
1951 * asynchronous notification for it anyway. */
1953 if (u
->type
== UNIT_SERVICE
&&
1954 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1955 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1956 m
->n_reloading
<= 0) {
1958 /* Hmm, if there was no start record written
1959 * write it now, so that we always have a nice
1962 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1964 if (ns
== UNIT_INACTIVE
)
1965 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1967 /* Write audit record if we have just finished shutting down */
1968 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1970 u
->in_audit
= false;
1974 manager_recheck_journal(m
);
1975 unit_trigger_notify(u
);
1977 if (u
->manager
->n_reloading
<= 0) {
1978 /* Maybe we finished startup and are now ready for
1979 * being stopped because unneeded? */
1980 unit_check_unneeded(u
);
1982 /* Maybe we finished startup, but something we needed
1983 * has vanished? Let's die then. (This happens when
1984 * something BindsTo= to a Type=oneshot unit, as these
1985 * units go directly from starting to inactive,
1986 * without ever entering started.) */
1987 unit_check_binds_to(u
);
1990 unit_add_to_dbus_queue(u
);
1991 unit_add_to_gc_queue(u
);
1994 int unit_watch_pid(Unit
*u
, pid_t pid
) {
2000 /* Watch a specific PID. We only support one or two units
2001 * watching each PID for now, not more. */
2003 r
= set_ensure_allocated(&u
->pids
, NULL
);
2007 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
2011 r
= hashmap_put(u
->manager
->watch_pids1
, PID_TO_PTR(pid
), u
);
2013 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
2017 r
= hashmap_put(u
->manager
->watch_pids2
, PID_TO_PTR(pid
), u
);
2020 q
= set_put(u
->pids
, PID_TO_PTR(pid
));
2027 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
2031 (void) hashmap_remove_value(u
->manager
->watch_pids1
, PID_TO_PTR(pid
), u
);
2032 (void) hashmap_remove_value(u
->manager
->watch_pids2
, PID_TO_PTR(pid
), u
);
2033 (void) set_remove(u
->pids
, PID_TO_PTR(pid
));
2036 void unit_unwatch_all_pids(Unit
*u
) {
2039 while (!set_isempty(u
->pids
))
2040 unit_unwatch_pid(u
, PTR_TO_PID(set_first(u
->pids
)));
2042 u
->pids
= set_free(u
->pids
);
2045 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2051 /* Cleans dead PIDs from our list */
2053 SET_FOREACH(e
, u
->pids
, i
) {
2054 pid_t pid
= PTR_TO_PID(e
);
2056 if (pid
== except1
|| pid
== except2
)
2059 if (!pid_is_unwaited(pid
))
2060 unit_unwatch_pid(u
, pid
);
2064 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2066 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2070 case JOB_VERIFY_ACTIVE
:
2077 case JOB_TRY_RESTART
:
2078 return unit_can_start(u
);
2081 return unit_can_reload(u
);
2083 case JOB_RELOAD_OR_START
:
2084 return unit_can_reload(u
) && unit_can_start(u
);
2087 assert_not_reached("Invalid job type");
2091 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
) {
2094 /* Only warn about some unit types */
2095 if (!IN_SET(dependency
, UNIT_CONFLICTS
, UNIT_CONFLICTED_BY
, UNIT_BEFORE
, UNIT_AFTER
, UNIT_ON_FAILURE
, UNIT_TRIGGERS
, UNIT_TRIGGERED_BY
))
2098 if (streq_ptr(u
->id
, other
))
2099 log_unit_warning(u
, "Dependency %s=%s dropped", unit_dependency_to_string(dependency
), u
->id
);
2101 log_unit_warning(u
, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency
), strna(other
), u
->id
);
2104 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2106 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2107 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2108 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2109 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2110 [UNIT_REQUISITE
] = UNIT_REQUISITE_OF
,
2111 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUISITE_OF_OVERRIDABLE
,
2112 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2113 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2114 [UNIT_REQUIRED_BY
] = UNIT_REQUIRES
,
2115 [UNIT_REQUIRED_BY_OVERRIDABLE
] = UNIT_REQUIRES_OVERRIDABLE
,
2116 [UNIT_REQUISITE_OF
] = UNIT_REQUISITE
,
2117 [UNIT_REQUISITE_OF_OVERRIDABLE
] = UNIT_REQUISITE_OVERRIDABLE
,
2118 [UNIT_WANTED_BY
] = UNIT_WANTS
,
2119 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2120 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2121 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2122 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2123 [UNIT_BEFORE
] = UNIT_AFTER
,
2124 [UNIT_AFTER
] = UNIT_BEFORE
,
2125 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2126 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2127 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2128 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2129 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2130 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2131 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2132 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2134 int r
, q
= 0, v
= 0, w
= 0;
2135 Unit
*orig_u
= u
, *orig_other
= other
;
2138 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2141 u
= unit_follow_merge(u
);
2142 other
= unit_follow_merge(other
);
2144 /* We won't allow dependencies on ourselves. We will not
2145 * consider them an error however. */
2147 maybe_warn_about_dependency(orig_u
, orig_other
->id
, d
);
2151 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2155 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2156 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2161 if (add_reference
) {
2162 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2166 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2171 q
= set_put(u
->dependencies
[d
], other
);
2175 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2176 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2183 if (add_reference
) {
2184 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2190 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2195 unit_add_to_dbus_queue(u
);
2200 set_remove(u
->dependencies
[d
], other
);
2203 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2206 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2211 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2216 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2220 return unit_add_dependency(u
, e
, other
, add_reference
);
2223 static int resolve_template(Unit
*u
, const char *name
, const char*path
, char **buf
, const char **ret
) {
2227 assert(name
|| path
);
2232 name
= basename(path
);
2234 if (!unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
2241 r
= unit_name_replace_instance(name
, u
->instance
, buf
);
2243 _cleanup_free_
char *i
= NULL
;
2245 r
= unit_name_to_prefix(u
->id
, &i
);
2249 r
= unit_name_replace_instance(name
, i
, buf
);
2258 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2259 _cleanup_free_
char *buf
= NULL
;
2264 assert(name
|| path
);
2266 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2270 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2274 return unit_add_dependency(u
, d
, other
, add_reference
);
2277 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2278 _cleanup_free_
char *buf
= NULL
;
2283 assert(name
|| path
);
2285 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2289 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2293 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2296 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2297 _cleanup_free_
char *buf
= NULL
;
2302 assert(name
|| path
);
2304 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2308 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2312 return unit_add_dependency(other
, d
, u
, add_reference
);
2315 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2316 _cleanup_free_
char *buf
= NULL
;
2321 assert(name
|| path
);
2323 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2327 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2331 return unit_add_two_dependencies(other
, d
, e
, u
, add_reference
);
2334 int set_unit_path(const char *p
) {
2335 /* This is mostly for debug purposes */
2336 if (setenv("SYSTEMD_UNIT_PATH", p
, 0) < 0)
2342 char *unit_dbus_path(Unit
*u
) {
2348 return unit_dbus_path_from_name(u
->id
);
2351 int unit_set_slice(Unit
*u
, Unit
*slice
) {
2355 /* Sets the unit slice if it has not been set before. Is extra
2356 * careful, to only allow this for units that actually have a
2357 * cgroup context. Also, we don't allow to set this for slices
2358 * (since the parent slice is derived from the name). Make
2359 * sure the unit we set is actually a slice. */
2361 if (!UNIT_HAS_CGROUP_CONTEXT(u
))
2364 if (u
->type
== UNIT_SLICE
)
2367 if (unit_active_state(u
) != UNIT_INACTIVE
)
2370 if (slice
->type
!= UNIT_SLICE
)
2373 if (unit_has_name(u
, SPECIAL_INIT_SCOPE
) &&
2374 !unit_has_name(slice
, SPECIAL_ROOT_SLICE
))
2377 if (UNIT_DEREF(u
->slice
) == slice
)
2380 if (UNIT_ISSET(u
->slice
))
2383 unit_ref_set(&u
->slice
, slice
);
2387 int unit_set_default_slice(Unit
*u
) {
2388 _cleanup_free_
char *b
= NULL
;
2389 const char *slice_name
;
2395 if (UNIT_ISSET(u
->slice
))
2399 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2401 /* Implicitly place all instantiated units in their
2402 * own per-template slice */
2404 r
= unit_name_to_prefix(u
->id
, &prefix
);
2408 /* The prefix is already escaped, but it might include
2409 * "-" which has a special meaning for slice units,
2410 * hence escape it here extra. */
2411 escaped
= unit_name_escape(prefix
);
2415 if (u
->manager
->running_as
== MANAGER_SYSTEM
)
2416 b
= strjoin("system-", escaped
, ".slice", NULL
);
2418 b
= strappend(escaped
, ".slice");
2425 u
->manager
->running_as
== MANAGER_SYSTEM
&& !unit_has_name(u
, SPECIAL_INIT_SCOPE
)
2426 ? SPECIAL_SYSTEM_SLICE
2427 : SPECIAL_ROOT_SLICE
;
2429 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2433 return unit_set_slice(u
, slice
);
2436 const char *unit_slice_name(Unit
*u
) {
2439 if (!UNIT_ISSET(u
->slice
))
2442 return UNIT_DEREF(u
->slice
)->id
;
2445 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2446 _cleanup_free_
char *t
= NULL
;
2453 r
= unit_name_change_suffix(u
->id
, type
, &t
);
2456 if (unit_has_name(u
, t
))
2459 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2460 assert(r
< 0 || *_found
!= u
);
2464 static int signal_name_owner_changed(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
2465 const char *name
, *old_owner
, *new_owner
;
2472 r
= sd_bus_message_read(message
, "sss", &name
, &old_owner
, &new_owner
);
2474 bus_log_parse_error(r
);
2478 if (UNIT_VTABLE(u
)->bus_name_owner_change
)
2479 UNIT_VTABLE(u
)->bus_name_owner_change(u
, name
, old_owner
, new_owner
);
2484 int unit_install_bus_match(sd_bus
*bus
, Unit
*u
, const char *name
) {
2485 _cleanup_free_
char *match
= NULL
;
2486 Manager
*m
= u
->manager
;
2490 if (u
->match_bus_slot
)
2493 match
= strjoin("type='signal',"
2494 "sender='org.freedesktop.DBus',"
2495 "path='/org/freedesktop/DBus',"
2496 "interface='org.freedesktop.DBus',"
2497 "member='NameOwnerChanged',"
2505 return sd_bus_add_match(bus
, &u
->match_bus_slot
, match
, signal_name_owner_changed
, u
);
2508 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2514 /* Watch a specific name on the bus. We only support one unit
2515 * watching each name for now. */
2517 if (u
->manager
->api_bus
) {
2518 /* If the bus is already available, install the match directly.
2519 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
2520 r
= unit_install_bus_match(u
->manager
->api_bus
, u
, name
);
2522 return log_warning_errno(r
, "Failed to subscribe to NameOwnerChanged signal: %m");
2525 r
= hashmap_put(u
->manager
->watch_bus
, name
, u
);
2527 u
->match_bus_slot
= sd_bus_slot_unref(u
->match_bus_slot
);
2528 return log_warning_errno(r
, "Failed to put bus name to hashmap: %m");
2534 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2538 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2539 u
->match_bus_slot
= sd_bus_slot_unref(u
->match_bus_slot
);
2542 bool unit_can_serialize(Unit
*u
) {
2545 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2548 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2555 if (unit_can_serialize(u
)) {
2558 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2562 rt
= unit_get_exec_runtime(u
);
2564 r
= exec_runtime_serialize(u
, rt
, f
, fds
);
2570 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2571 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2572 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2573 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2574 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2575 dual_timestamp_serialize(f
, "assert-timestamp", &u
->assert_timestamp
);
2577 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2578 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2580 if (dual_timestamp_is_set(&u
->assert_timestamp
))
2581 unit_serialize_item(u
, f
, "assert-result", yes_no(u
->assert_result
));
2583 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2584 unit_serialize_item_format(u
, f
, "cpuacct-usage-base", "%" PRIu64
, u
->cpuacct_usage_base
);
2587 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2588 unit_serialize_item(u
, f
, "cgroup-realized", yes_no(u
->cgroup_realized
));
2590 if (serialize_jobs
) {
2592 fprintf(f
, "job\n");
2593 job_serialize(u
->job
, f
, fds
);
2597 fprintf(f
, "job\n");
2598 job_serialize(u
->nop_job
, f
, fds
);
2607 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2618 va_start(ap
, format
);
2619 vfprintf(f
, format
, ap
);
2625 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2631 fprintf(f
, "%s=%s\n", key
, value
);
2634 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2635 ExecRuntime
**rt
= NULL
;
2643 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2645 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2648 char line
[LINE_MAX
], *l
, *v
;
2651 if (!fgets(line
, sizeof(line
), f
)) {
2664 k
= strcspn(l
, "=");
2672 if (streq(l
, "job")) {
2674 /* new-style serialized job */
2681 r
= job_deserialize(j
, f
, fds
);
2687 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2693 r
= job_install_deserialized(j
);
2695 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2699 } else /* legacy for pre-44 */
2700 log_unit_warning(u
, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v
);
2702 } else if (streq(l
, "inactive-exit-timestamp")) {
2703 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2705 } else if (streq(l
, "active-enter-timestamp")) {
2706 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2708 } else if (streq(l
, "active-exit-timestamp")) {
2709 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2711 } else if (streq(l
, "inactive-enter-timestamp")) {
2712 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2714 } else if (streq(l
, "condition-timestamp")) {
2715 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2717 } else if (streq(l
, "assert-timestamp")) {
2718 dual_timestamp_deserialize(v
, &u
->assert_timestamp
);
2720 } else if (streq(l
, "condition-result")) {
2722 r
= parse_boolean(v
);
2724 log_unit_debug(u
, "Failed to parse condition result value %s, ignoring.", v
);
2726 u
->condition_result
= r
;
2730 } else if (streq(l
, "assert-result")) {
2732 r
= parse_boolean(v
);
2734 log_unit_debug(u
, "Failed to parse assert result value %s, ignoring.", v
);
2736 u
->assert_result
= r
;
2740 } else if (streq(l
, "transient")) {
2742 r
= parse_boolean(v
);
2744 log_unit_debug(u
, "Failed to parse transient bool %s, ignoring.", v
);
2750 } else if (streq(l
, "cpuacct-usage-base")) {
2752 r
= safe_atou64(v
, &u
->cpuacct_usage_base
);
2754 log_unit_debug(u
, "Failed to parse CPU usage %s, ignoring.", v
);
2758 } else if (streq(l
, "cgroup")) {
2760 r
= unit_set_cgroup_path(u
, v
);
2762 log_unit_debug_errno(u
, r
, "Failed to set cgroup path %s, ignoring: %m", v
);
2764 (void) unit_watch_cgroup(u
);
2767 } else if (streq(l
, "cgroup-realized")) {
2770 b
= parse_boolean(v
);
2772 log_unit_debug(u
, "Failed to parse cgroup-realized bool %s, ignoring.", v
);
2774 u
->cgroup_realized
= b
;
2779 if (unit_can_serialize(u
)) {
2781 r
= exec_runtime_deserialize_item(u
, rt
, l
, v
, fds
);
2783 log_unit_warning(u
, "Failed to deserialize runtime parameter '%s', ignoring.", l
);
2787 /* Returns positive if key was handled by the call */
2792 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2794 log_unit_warning(u
, "Failed to deserialize unit parameter '%s', ignoring.", l
);
2799 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2801 _cleanup_free_
char *e
= NULL
;
2806 /* Adds in links to the device node that this unit is based on */
2810 if (!is_device_path(what
))
2813 /* When device units aren't supported (such as in a
2814 * container), don't create dependencies on them. */
2815 if (!unit_type_supported(UNIT_DEVICE
))
2818 r
= unit_name_from_path(what
, ".device", &e
);
2822 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2826 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_BINDS_TO
: UNIT_WANTS
, device
, true);
2831 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2839 int unit_coldplug(Unit
*u
) {
2844 /* Make sure we don't enter a loop, when coldplugging
2849 u
->coldplugged
= true;
2851 if (UNIT_VTABLE(u
)->coldplug
) {
2852 r
= UNIT_VTABLE(u
)->coldplug(u
);
2858 r
= job_coldplug(u
->job
);
2866 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2867 DISABLE_WARNING_FORMAT_NONLITERAL
;
2868 manager_status_printf(u
->manager
, STATUS_TYPE_NORMAL
,
2869 status
, unit_status_msg_format
, unit_description(u
));
2873 bool unit_need_daemon_reload(Unit
*u
) {
2874 _cleanup_strv_free_
char **t
= NULL
;
2877 unsigned loaded_cnt
, current_cnt
;
2881 if (u
->fragment_path
) {
2883 if (stat(u
->fragment_path
, &st
) < 0)
2884 /* What, cannot access this anymore? */
2887 if (u
->fragment_mtime
> 0 &&
2888 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2892 if (u
->source_path
) {
2894 if (stat(u
->source_path
, &st
) < 0)
2897 if (u
->source_mtime
> 0 &&
2898 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2902 (void) unit_find_dropin_paths(u
, &t
);
2903 loaded_cnt
= strv_length(t
);
2904 current_cnt
= strv_length(u
->dropin_paths
);
2906 if (loaded_cnt
== current_cnt
) {
2907 if (loaded_cnt
== 0)
2910 if (strv_overlap(u
->dropin_paths
, t
)) {
2911 STRV_FOREACH(path
, u
->dropin_paths
) {
2913 if (stat(*path
, &st
) < 0)
2916 if (u
->dropin_mtime
> 0 &&
2917 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2928 void unit_reset_failed(Unit
*u
) {
2931 if (UNIT_VTABLE(u
)->reset_failed
)
2932 UNIT_VTABLE(u
)->reset_failed(u
);
2935 Unit
*unit_following(Unit
*u
) {
2938 if (UNIT_VTABLE(u
)->following
)
2939 return UNIT_VTABLE(u
)->following(u
);
2944 bool unit_stop_pending(Unit
*u
) {
2947 /* This call does check the current state of the unit. It's
2948 * hence useful to be called from state change calls of the
2949 * unit itself, where the state isn't updated yet. This is
2950 * different from unit_inactive_or_pending() which checks both
2951 * the current state and for a queued job. */
2953 return u
->job
&& u
->job
->type
== JOB_STOP
;
2956 bool unit_inactive_or_pending(Unit
*u
) {
2959 /* Returns true if the unit is inactive or going down */
2961 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
2964 if (unit_stop_pending(u
))
2970 bool unit_active_or_pending(Unit
*u
) {
2973 /* Returns true if the unit is active or going up */
2975 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
2979 (u
->job
->type
== JOB_START
||
2980 u
->job
->type
== JOB_RELOAD_OR_START
||
2981 u
->job
->type
== JOB_RESTART
))
2987 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
2989 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
2991 assert(signo
< _NSIG
);
2993 if (!UNIT_VTABLE(u
)->kill
)
2996 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
2999 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
3003 pid_set
= set_new(NULL
);
3007 /* Exclude the main/control pids from being killed via the cgroup */
3009 r
= set_put(pid_set
, PID_TO_PTR(main_pid
));
3014 if (control_pid
> 0) {
3015 r
= set_put(pid_set
, PID_TO_PTR(control_pid
));
3027 int unit_kill_common(
3033 sd_bus_error
*error
) {
3037 if (who
== KILL_MAIN
) {
3039 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
3040 else if (main_pid
== 0)
3041 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
3044 if (who
== KILL_CONTROL
) {
3045 if (control_pid
< 0)
3046 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
3047 else if (control_pid
== 0)
3048 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
3051 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
3052 if (control_pid
> 0)
3053 if (kill(control_pid
, signo
) < 0)
3056 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
3058 if (kill(main_pid
, signo
) < 0)
3061 if (who
== KILL_ALL
&& u
->cgroup_path
) {
3062 _cleanup_set_free_ Set
*pid_set
= NULL
;
3065 /* Exclude the main/control pids from being killed via the cgroup */
3066 pid_set
= unit_pid_set(main_pid
, control_pid
);
3070 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, false, false, pid_set
);
3071 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
3078 int unit_following_set(Unit
*u
, Set
**s
) {
3082 if (UNIT_VTABLE(u
)->following_set
)
3083 return UNIT_VTABLE(u
)->following_set(u
, s
);
3089 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
3092 if (u
->unit_file_state
< 0 && u
->fragment_path
)
3093 u
->unit_file_state
= unit_file_get_state(
3094 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3095 NULL
, basename(u
->fragment_path
));
3097 return u
->unit_file_state
;
3100 int unit_get_unit_file_preset(Unit
*u
) {
3103 if (u
->unit_file_preset
< 0 && u
->fragment_path
)
3104 u
->unit_file_preset
= unit_file_query_preset(
3105 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3106 NULL
, basename(u
->fragment_path
));
3108 return u
->unit_file_preset
;
3111 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3116 unit_ref_unset(ref
);
3119 LIST_PREPEND(refs
, u
->refs
, ref
);
3123 void unit_ref_unset(UnitRef
*ref
) {
3129 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3133 int unit_patch_contexts(Unit
*u
) {
3141 /* Patch in the manager defaults into the exec and cgroup
3142 * contexts, _after_ the rest of the settings have been
3145 ec
= unit_get_exec_context(u
);
3147 /* This only copies in the ones that need memory */
3148 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3149 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3150 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3155 if (u
->manager
->running_as
== MANAGER_USER
&&
3156 !ec
->working_directory
) {
3158 r
= get_home_dir(&ec
->working_directory
);
3162 /* Allow user services to run, even if the
3163 * home directory is missing */
3164 ec
->working_directory_missing_ok
= true;
3167 if (u
->manager
->running_as
== MANAGER_USER
&&
3168 (ec
->syscall_whitelist
||
3169 !set_isempty(ec
->syscall_filter
) ||
3170 !set_isempty(ec
->syscall_archs
) ||
3171 ec
->address_families_whitelist
||
3172 !set_isempty(ec
->address_families
)))
3173 ec
->no_new_privileges
= true;
3175 if (ec
->private_devices
)
3176 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3179 cc
= unit_get_cgroup_context(u
);
3183 ec
->private_devices
&&
3184 cc
->device_policy
== CGROUP_AUTO
)
3185 cc
->device_policy
= CGROUP_CLOSED
;
3191 ExecContext
*unit_get_exec_context(Unit
*u
) {
3198 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3202 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3205 KillContext
*unit_get_kill_context(Unit
*u
) {
3212 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3216 return (KillContext
*) ((uint8_t*) u
+ offset
);
3219 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3225 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3229 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3232 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3238 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3242 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3245 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3248 if (u
->manager
->running_as
== MANAGER_USER
) {
3251 if (mode
== UNIT_PERSISTENT
&& !transient
)
3252 r
= user_config_home(dir
);
3254 r
= user_runtime_dir(dir
);
3261 if (mode
== UNIT_PERSISTENT
&& !transient
)
3262 *dir
= strdup("/etc/systemd/system");
3264 *dir
= strdup("/run/systemd/system");
3271 static int unit_drop_in_file(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, char **p
, char **q
) {
3272 _cleanup_free_
char *dir
= NULL
;
3277 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3281 return drop_in_file(dir
, u
->id
, 50, name
, p
, q
);
3284 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3286 _cleanup_free_
char *dir
= NULL
, *p
= NULL
, *q
= NULL
;
3291 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3294 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3298 r
= write_drop_in(dir
, u
->id
, 50, name
, data
);
3302 r
= drop_in_file(dir
, u
->id
, 50, name
, &p
, &q
);
3306 r
= strv_extend(&u
->dropin_paths
, q
);
3310 strv_sort(u
->dropin_paths
);
3311 strv_uniq(u
->dropin_paths
);
3313 u
->dropin_mtime
= now(CLOCK_REALTIME
);
3318 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3319 _cleanup_free_
char *p
= NULL
;
3327 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3330 va_start(ap
, format
);
3331 r
= vasprintf(&p
, format
, ap
);
3337 return unit_write_drop_in(u
, mode
, name
, p
);
3340 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3341 _cleanup_free_
char *ndata
= NULL
;
3347 if (!UNIT_VTABLE(u
)->private_section
)
3350 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3353 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3357 return unit_write_drop_in(u
, mode
, name
, ndata
);
3360 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3361 _cleanup_free_
char *p
= NULL
;
3369 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3372 va_start(ap
, format
);
3373 r
= vasprintf(&p
, format
, ap
);
3379 return unit_write_drop_in_private(u
, mode
, name
, p
);
3382 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
3383 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
3388 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3391 r
= unit_drop_in_file(u
, mode
, name
, &p
, &q
);
3396 r
= errno
== ENOENT
? 0 : -errno
;
3404 int unit_make_transient(Unit
*u
) {
3407 if (!UNIT_VTABLE(u
)->can_transient
)
3410 u
->load_state
= UNIT_STUB
;
3412 u
->transient
= true;
3413 u
->fragment_path
= mfree(u
->fragment_path
);
3418 int unit_kill_context(
3424 bool main_pid_alien
) {
3426 bool wait_for_exit
= false;
3432 if (c
->kill_mode
== KILL_NONE
)
3442 case KILL_TERMINATE
:
3443 sig
= c
->kill_signal
;
3446 assert_not_reached("KillOperation unknown");
3450 r
= kill_and_sigcont(main_pid
, sig
);
3452 if (r
< 0 && r
!= -ESRCH
) {
3453 _cleanup_free_
char *comm
= NULL
;
3454 get_process_comm(main_pid
, &comm
);
3456 log_unit_warning_errno(u
, r
, "Failed to kill main process " PID_FMT
" (%s), ignoring: %m", main_pid
, strna(comm
));
3458 if (!main_pid_alien
)
3459 wait_for_exit
= true;
3461 if (c
->send_sighup
&& k
== KILL_TERMINATE
)
3462 (void) kill(main_pid
, SIGHUP
);
3466 if (control_pid
> 0) {
3467 r
= kill_and_sigcont(control_pid
, sig
);
3469 if (r
< 0 && r
!= -ESRCH
) {
3470 _cleanup_free_
char *comm
= NULL
;
3471 get_process_comm(control_pid
, &comm
);
3473 log_unit_warning_errno(u
, r
, "Failed to kill control process " PID_FMT
" (%s), ignoring: %m", control_pid
, strna(comm
));
3475 wait_for_exit
= true;
3477 if (c
->send_sighup
&& k
== KILL_TERMINATE
)
3478 (void) kill(control_pid
, SIGHUP
);
3482 if (u
->cgroup_path
&&
3483 (c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& k
== KILL_KILL
))) {
3484 _cleanup_set_free_ Set
*pid_set
= NULL
;
3486 /* Exclude the main/control pids from being killed via the cgroup */
3487 pid_set
= unit_pid_set(main_pid
, control_pid
);
3491 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, k
!= KILL_TERMINATE
, false, pid_set
);
3493 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3494 log_unit_warning_errno(u
, r
, "Failed to kill control group %s, ignoring: %m", u
->cgroup_path
);
3498 /* FIXME: For now, on the legacy hierarchy, we
3499 * will not wait for the cgroup members to die
3500 * if we are running in a container or if this
3501 * is a delegation unit, simply because cgroup
3502 * notification is unreliable in these
3503 * cases. It doesn't work at all in
3504 * containers, and outside of containers it
3505 * can be confused easily by left-over
3506 * directories in the cgroup -- which however
3507 * should not exist in non-delegated units. On
3508 * the unified hierarchy that's different,
3509 * there we get proper events. Hence rely on
3512 if (cg_unified() > 0 ||
3513 (detect_container() == 0 && !unit_cgroup_delegate(u
)))
3514 wait_for_exit
= true;
3516 if (c
->send_sighup
&& k
!= KILL_KILL
) {
3519 pid_set
= unit_pid_set(main_pid
, control_pid
);
3523 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3528 return wait_for_exit
;
3531 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3532 char prefix
[strlen(path
) + 1], *p
;
3538 /* Registers a unit for requiring a certain path and all its
3539 * prefixes. We keep a simple array of these paths in the
3540 * unit, since its usually short. However, we build a prefix
3541 * table for all possible prefixes so that new appearing mount
3542 * units can easily determine which units to make themselves a
3545 if (!path_is_absolute(path
))
3552 path_kill_slashes(p
);
3554 if (!path_is_safe(p
)) {
3559 if (strv_contains(u
->requires_mounts_for
, p
)) {
3564 r
= strv_consume(&u
->requires_mounts_for
, p
);
3568 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3571 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3575 r
= hashmap_ensure_allocated(&u
->manager
->units_requiring_mounts_for
, &string_hash_ops
);
3589 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3605 int unit_setup_exec_runtime(Unit
*u
) {
3611 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3614 /* Check if there already is an ExecRuntime for this unit? */
3615 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3619 /* Try to get it from somebody else */
3620 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3622 *rt
= unit_get_exec_runtime(other
);
3624 exec_runtime_ref(*rt
);
3629 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3632 bool unit_type_supported(UnitType t
) {
3633 if (_unlikely_(t
< 0))
3635 if (_unlikely_(t
>= _UNIT_TYPE_MAX
))
3638 if (!unit_vtable
[t
]->supported
)
3641 return unit_vtable
[t
]->supported();
3644 void unit_warn_if_dir_nonempty(Unit
*u
, const char* where
) {
3650 r
= dir_is_empty(where
);
3654 log_unit_warning_errno(u
, r
, "Failed to check directory %s: %m", where
);
3658 log_struct(LOG_NOTICE
,
3659 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3661 LOG_UNIT_MESSAGE(u
, "Directory %s to mount over is not empty, mounting anyway.", where
),
3666 int unit_fail_if_symlink(Unit
*u
, const char* where
) {
3672 r
= is_symlink(where
);
3674 log_unit_debug_errno(u
, r
, "Failed to check symlink %s, ignoring: %m", where
);
3681 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3683 LOG_UNIT_MESSAGE(u
, "Mount on symlink %s not allowed.", where
),
3690 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3691 [UNIT_ACTIVE
] = "active",
3692 [UNIT_RELOADING
] = "reloading",
3693 [UNIT_INACTIVE
] = "inactive",
3694 [UNIT_FAILED
] = "failed",
3695 [UNIT_ACTIVATING
] = "activating",
3696 [UNIT_DEACTIVATING
] = "deactivating"
3699 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);