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"
31 #include "alloc-util.h"
32 #include "bus-common-errors.h"
34 #include "cgroup-util.h"
35 #include "dbus-unit.h"
40 #include "fileio-label.h"
41 #include "formats-util.h"
42 #include "load-dropin.h"
43 #include "load-fragment.h"
48 #include "parse-util.h"
49 #include "path-util.h"
50 #include "process-util.h"
53 #include "stat-util.h"
54 #include "string-util.h"
56 #include "unit-name.h"
58 #include "user-util.h"
61 const UnitVTable
* const unit_vtable
[_UNIT_TYPE_MAX
] = {
62 [UNIT_SERVICE
] = &service_vtable
,
63 [UNIT_SOCKET
] = &socket_vtable
,
64 [UNIT_BUSNAME
] = &busname_vtable
,
65 [UNIT_TARGET
] = &target_vtable
,
66 [UNIT_SNAPSHOT
] = &snapshot_vtable
,
67 [UNIT_DEVICE
] = &device_vtable
,
68 [UNIT_MOUNT
] = &mount_vtable
,
69 [UNIT_AUTOMOUNT
] = &automount_vtable
,
70 [UNIT_SWAP
] = &swap_vtable
,
71 [UNIT_TIMER
] = &timer_vtable
,
72 [UNIT_PATH
] = &path_vtable
,
73 [UNIT_SLICE
] = &slice_vtable
,
74 [UNIT_SCOPE
] = &scope_vtable
77 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
);
79 Unit
*unit_new(Manager
*m
, size_t size
) {
83 assert(size
>= sizeof(Unit
));
89 u
->names
= set_new(&string_hash_ops
);
96 u
->type
= _UNIT_TYPE_INVALID
;
97 u
->default_dependencies
= true;
98 u
->unit_file_state
= _UNIT_FILE_STATE_INVALID
;
99 u
->unit_file_preset
= -1;
100 u
->on_failure_job_mode
= JOB_REPLACE
;
101 u
->cgroup_inotify_wd
= -1;
103 RATELIMIT_INIT(u
->auto_stop_ratelimit
, 10 * USEC_PER_SEC
, 16);
108 bool unit_has_name(Unit
*u
, const char *name
) {
112 return !!set_get(u
->names
, (char*) name
);
115 static void unit_init(Unit
*u
) {
122 assert(u
->type
>= 0);
124 cc
= unit_get_cgroup_context(u
);
126 cgroup_context_init(cc
);
128 /* Copy in the manager defaults into the cgroup
129 * context, _before_ the rest of the settings have
130 * been initialized */
132 cc
->cpu_accounting
= u
->manager
->default_cpu_accounting
;
133 cc
->blockio_accounting
= u
->manager
->default_blockio_accounting
;
134 cc
->memory_accounting
= u
->manager
->default_memory_accounting
;
135 cc
->tasks_accounting
= u
->manager
->default_tasks_accounting
;
138 ec
= unit_get_exec_context(u
);
140 exec_context_init(ec
);
142 kc
= unit_get_kill_context(u
);
144 kill_context_init(kc
);
146 if (UNIT_VTABLE(u
)->init
)
147 UNIT_VTABLE(u
)->init(u
);
150 int unit_add_name(Unit
*u
, const char *text
) {
151 _cleanup_free_
char *s
= NULL
, *i
= NULL
;
158 if (unit_name_is_valid(text
, UNIT_NAME_TEMPLATE
)) {
163 r
= unit_name_replace_instance(text
, u
->instance
, &s
);
172 if (set_contains(u
->names
, s
))
174 if (hashmap_contains(u
->manager
->units
, s
))
177 if (!unit_name_is_valid(s
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
180 t
= unit_name_to_type(s
);
184 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
)
187 r
= unit_name_to_instance(s
, &i
);
191 if (i
&& unit_vtable
[t
]->no_instances
)
194 /* Ensure that this unit is either instanced or not instanced,
195 * but not both. Note that we do allow names with different
196 * instance names however! */
197 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
)
200 if (unit_vtable
[t
]->no_alias
&& !set_isempty(u
->names
))
203 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
)
206 r
= set_put(u
->names
, s
);
211 r
= hashmap_put(u
->manager
->units
, s
, u
);
213 (void) set_remove(u
->names
, s
);
217 if (u
->type
== _UNIT_TYPE_INVALID
) {
222 LIST_PREPEND(units_by_type
, u
->manager
->units_by_type
[t
], u
);
231 unit_add_to_dbus_queue(u
);
235 int unit_choose_id(Unit
*u
, const char *name
) {
236 _cleanup_free_
char *t
= NULL
;
243 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
248 r
= unit_name_replace_instance(name
, u
->instance
, &t
);
255 /* Selects one of the names of this unit as the id */
256 s
= set_get(u
->names
, (char*) name
);
260 /* Determine the new instance from the new id */
261 r
= unit_name_to_instance(s
, &i
);
270 unit_add_to_dbus_queue(u
);
275 int unit_set_description(Unit
*u
, const char *description
) {
280 if (isempty(description
))
283 s
= strdup(description
);
288 free(u
->description
);
291 unit_add_to_dbus_queue(u
);
295 bool unit_check_gc(Unit
*u
) {
296 UnitActiveState state
;
305 state
= unit_active_state(u
);
307 /* If the unit is inactive and failed and no job is queued for
308 * it, then release its runtime resources */
309 if (UNIT_IS_INACTIVE_OR_FAILED(state
) &&
310 UNIT_VTABLE(u
)->release_resources
)
311 UNIT_VTABLE(u
)->release_resources(u
);
313 /* But we keep the unit object around for longer when it is
314 * referenced or configured to not be gc'ed */
315 if (state
!= UNIT_INACTIVE
)
318 if (UNIT_VTABLE(u
)->no_gc
)
327 if (UNIT_VTABLE(u
)->check_gc
)
328 if (UNIT_VTABLE(u
)->check_gc(u
))
334 void unit_add_to_load_queue(Unit
*u
) {
336 assert(u
->type
!= _UNIT_TYPE_INVALID
);
338 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
341 LIST_PREPEND(load_queue
, u
->manager
->load_queue
, u
);
342 u
->in_load_queue
= true;
345 void unit_add_to_cleanup_queue(Unit
*u
) {
348 if (u
->in_cleanup_queue
)
351 LIST_PREPEND(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
352 u
->in_cleanup_queue
= true;
355 void unit_add_to_gc_queue(Unit
*u
) {
358 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
361 if (unit_check_gc(u
))
364 LIST_PREPEND(gc_queue
, u
->manager
->gc_queue
, u
);
365 u
->in_gc_queue
= true;
367 u
->manager
->n_in_gc_queue
++;
370 void unit_add_to_dbus_queue(Unit
*u
) {
372 assert(u
->type
!= _UNIT_TYPE_INVALID
);
374 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
377 /* Shortcut things if nobody cares */
378 if (sd_bus_track_count(u
->manager
->subscribed
) <= 0 &&
379 set_isempty(u
->manager
->private_buses
)) {
380 u
->sent_dbus_new_signal
= true;
384 LIST_PREPEND(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
385 u
->in_dbus_queue
= true;
388 static void bidi_set_free(Unit
*u
, Set
*s
) {
394 /* Frees the set and makes sure we are dropped from the
395 * inverse pointers */
397 SET_FOREACH(other
, s
, i
) {
400 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
401 set_remove(other
->dependencies
[d
], u
);
403 unit_add_to_gc_queue(other
);
409 static void unit_remove_transient(Unit
*u
) {
417 if (u
->fragment_path
)
418 (void) unlink(u
->fragment_path
);
420 STRV_FOREACH(i
, u
->dropin_paths
) {
421 _cleanup_free_
char *p
= NULL
;
425 p
= dirname_malloc(*i
);
431 static void unit_free_requires_mounts_for(Unit
*u
) {
434 STRV_FOREACH(j
, u
->requires_mounts_for
) {
435 char s
[strlen(*j
) + 1];
437 PATH_FOREACH_PREFIX_MORE(s
, *j
) {
441 x
= hashmap_get2(u
->manager
->units_requiring_mounts_for
, s
, (void**) &y
);
447 if (set_isempty(x
)) {
448 hashmap_remove(u
->manager
->units_requiring_mounts_for
, y
);
455 u
->requires_mounts_for
= strv_free(u
->requires_mounts_for
);
458 static void unit_done(Unit
*u
) {
468 if (UNIT_VTABLE(u
)->done
)
469 UNIT_VTABLE(u
)->done(u
);
471 ec
= unit_get_exec_context(u
);
473 exec_context_done(ec
);
475 cc
= unit_get_cgroup_context(u
);
477 cgroup_context_done(cc
);
479 r
= unit_remove_from_netclass_cgroup(u
);
481 log_warning_errno(r
, "Unable to remove unit from netclass group: %m");
484 void unit_free(Unit
*u
) {
491 if (u
->manager
->n_reloading
<= 0)
492 unit_remove_transient(u
);
494 bus_unit_send_removed_signal(u
);
498 sd_bus_slot_unref(u
->match_bus_slot
);
500 unit_free_requires_mounts_for(u
);
502 SET_FOREACH(t
, u
->names
, i
)
503 hashmap_remove_value(u
->manager
->units
, t
, u
);
517 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
518 bidi_set_free(u
, u
->dependencies
[d
]);
520 if (u
->type
!= _UNIT_TYPE_INVALID
)
521 LIST_REMOVE(units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
523 if (u
->in_load_queue
)
524 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
526 if (u
->in_dbus_queue
)
527 LIST_REMOVE(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
529 if (u
->in_cleanup_queue
)
530 LIST_REMOVE(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
532 if (u
->in_gc_queue
) {
533 LIST_REMOVE(gc_queue
, u
->manager
->gc_queue
, u
);
534 u
->manager
->n_in_gc_queue
--;
537 if (u
->in_cgroup_queue
)
538 LIST_REMOVE(cgroup_queue
, u
->manager
->cgroup_queue
, u
);
540 unit_release_cgroup(u
);
542 (void) manager_update_failed_units(u
->manager
, u
, false);
543 set_remove(u
->manager
->startup_units
, u
);
545 free(u
->description
);
546 strv_free(u
->documentation
);
547 free(u
->fragment_path
);
548 free(u
->source_path
);
549 strv_free(u
->dropin_paths
);
552 free(u
->job_timeout_reboot_arg
);
554 set_free_free(u
->names
);
556 unit_unwatch_all_pids(u
);
558 condition_free_list(u
->conditions
);
559 condition_free_list(u
->asserts
);
561 unit_ref_unset(&u
->slice
);
564 unit_ref_unset(u
->refs
);
569 UnitActiveState
unit_active_state(Unit
*u
) {
572 if (u
->load_state
== UNIT_MERGED
)
573 return unit_active_state(unit_follow_merge(u
));
575 /* After a reload it might happen that a unit is not correctly
576 * loaded but still has a process around. That's why we won't
577 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
579 return UNIT_VTABLE(u
)->active_state(u
);
582 const char* unit_sub_state_to_string(Unit
*u
) {
585 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
588 static int complete_move(Set
**s
, Set
**other
) {
598 r
= set_move(*s
, *other
);
609 static int merge_names(Unit
*u
, Unit
*other
) {
617 r
= complete_move(&u
->names
, &other
->names
);
621 set_free_free(other
->names
);
625 SET_FOREACH(t
, u
->names
, i
)
626 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
631 static int reserve_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
636 assert(d
< _UNIT_DEPENDENCY_MAX
);
639 * If u does not have this dependency set allocated, there is no need
640 * to reserve anything. In that case other's set will be transferred
641 * as a whole to u by complete_move().
643 if (!u
->dependencies
[d
])
646 /* merge_dependencies() will skip a u-on-u dependency */
647 n_reserve
= set_size(other
->dependencies
[d
]) - !!set_get(other
->dependencies
[d
], u
);
649 return set_reserve(u
->dependencies
[d
], n_reserve
);
652 static void merge_dependencies(Unit
*u
, Unit
*other
, const char *other_id
, UnitDependency d
) {
659 assert(d
< _UNIT_DEPENDENCY_MAX
);
661 /* Fix backwards pointers */
662 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
665 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++) {
666 /* Do not add dependencies between u and itself */
668 if (set_remove(back
->dependencies
[k
], other
))
669 maybe_warn_about_dependency(u
, other_id
, k
);
671 r
= set_remove_and_put(back
->dependencies
[k
], other
, u
);
673 set_remove(back
->dependencies
[k
], other
);
675 assert(r
>= 0 || r
== -ENOENT
);
680 /* Also do not move dependencies on u to itself */
681 back
= set_remove(other
->dependencies
[d
], u
);
683 maybe_warn_about_dependency(u
, other_id
, d
);
685 /* The move cannot fail. The caller must have performed a reservation. */
686 assert_se(complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]) == 0);
688 other
->dependencies
[d
] = set_free(other
->dependencies
[d
]);
691 int unit_merge(Unit
*u
, Unit
*other
) {
693 const char *other_id
= NULL
;
698 assert(u
->manager
== other
->manager
);
699 assert(u
->type
!= _UNIT_TYPE_INVALID
);
701 other
= unit_follow_merge(other
);
706 if (u
->type
!= other
->type
)
709 if (!u
->instance
!= !other
->instance
)
712 if (other
->load_state
!= UNIT_STUB
&&
713 other
->load_state
!= UNIT_NOT_FOUND
)
722 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
726 other_id
= strdupa(other
->id
);
728 /* Make reservations to ensure merge_dependencies() won't fail */
729 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
730 r
= reserve_dependencies(u
, other
, d
);
732 * We don't rollback reservations if we fail. We don't have
733 * a way to undo reservations. A reservation is not a leak.
740 r
= merge_names(u
, other
);
744 /* Redirect all references */
746 unit_ref_set(other
->refs
, u
);
748 /* Merge dependencies */
749 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
750 merge_dependencies(u
, other
, other_id
, d
);
752 other
->load_state
= UNIT_MERGED
;
753 other
->merged_into
= u
;
755 /* If there is still some data attached to the other node, we
756 * don't need it anymore, and can free it. */
757 if (other
->load_state
!= UNIT_STUB
)
758 if (UNIT_VTABLE(other
)->done
)
759 UNIT_VTABLE(other
)->done(other
);
761 unit_add_to_dbus_queue(u
);
762 unit_add_to_cleanup_queue(other
);
767 int unit_merge_by_name(Unit
*u
, const char *name
) {
770 _cleanup_free_
char *s
= NULL
;
775 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
779 r
= unit_name_replace_instance(name
, u
->instance
, &s
);
786 other
= manager_get_unit(u
->manager
, name
);
788 return unit_merge(u
, other
);
790 return unit_add_name(u
, name
);
793 Unit
* unit_follow_merge(Unit
*u
) {
796 while (u
->load_state
== UNIT_MERGED
)
797 assert_se(u
= u
->merged_into
);
802 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
808 if (c
->working_directory
) {
809 r
= unit_require_mounts_for(u
, c
->working_directory
);
814 if (c
->root_directory
) {
815 r
= unit_require_mounts_for(u
, c
->root_directory
);
820 if (u
->manager
->running_as
!= MANAGER_SYSTEM
)
823 if (c
->private_tmp
) {
824 r
= unit_require_mounts_for(u
, "/tmp");
828 r
= unit_require_mounts_for(u
, "/var/tmp");
833 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
834 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
835 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
836 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
837 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
838 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
839 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
840 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
841 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
842 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
843 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
844 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
847 /* If syslog or kernel logging is requested, make sure our own
848 * logging daemon is run first. */
850 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
857 const char *unit_description(Unit
*u
) {
861 return u
->description
;
866 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
872 timestamp1
[FORMAT_TIMESTAMP_MAX
],
873 timestamp2
[FORMAT_TIMESTAMP_MAX
],
874 timestamp3
[FORMAT_TIMESTAMP_MAX
],
875 timestamp4
[FORMAT_TIMESTAMP_MAX
],
876 timespan
[FORMAT_TIMESPAN_MAX
];
878 _cleanup_set_free_ Set
*following_set
= NULL
;
882 assert(u
->type
>= 0);
884 prefix
= strempty(prefix
);
885 prefix2
= strjoina(prefix
, "\t");
889 "%s\tDescription: %s\n"
891 "%s\tUnit Load State: %s\n"
892 "%s\tUnit Active State: %s\n"
893 "%s\tInactive Exit Timestamp: %s\n"
894 "%s\tActive Enter Timestamp: %s\n"
895 "%s\tActive Exit Timestamp: %s\n"
896 "%s\tInactive Enter Timestamp: %s\n"
897 "%s\tGC Check Good: %s\n"
898 "%s\tNeed Daemon Reload: %s\n"
899 "%s\tTransient: %s\n"
902 "%s\tCGroup realized: %s\n"
903 "%s\tCGroup mask: 0x%x\n"
904 "%s\tCGroup members mask: 0x%x\n",
906 prefix
, unit_description(u
),
907 prefix
, strna(u
->instance
),
908 prefix
, unit_load_state_to_string(u
->load_state
),
909 prefix
, unit_active_state_to_string(unit_active_state(u
)),
910 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
911 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
912 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
913 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
914 prefix
, yes_no(unit_check_gc(u
)),
915 prefix
, yes_no(unit_need_daemon_reload(u
)),
916 prefix
, yes_no(u
->transient
),
917 prefix
, strna(unit_slice_name(u
)),
918 prefix
, strna(u
->cgroup_path
),
919 prefix
, yes_no(u
->cgroup_realized
),
920 prefix
, u
->cgroup_realized_mask
,
921 prefix
, u
->cgroup_members_mask
);
923 SET_FOREACH(t
, u
->names
, i
)
924 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
926 STRV_FOREACH(j
, u
->documentation
)
927 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
929 following
= unit_following(u
);
931 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
933 r
= unit_following_set(u
, &following_set
);
937 SET_FOREACH(other
, following_set
, i
)
938 fprintf(f
, "%s\tFollowing Set Member: %s\n", prefix
, other
->id
);
941 if (u
->fragment_path
)
942 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
945 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
947 STRV_FOREACH(j
, u
->dropin_paths
)
948 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
950 if (u
->job_timeout
> 0)
951 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
953 if (u
->job_timeout_action
!= FAILURE_ACTION_NONE
)
954 fprintf(f
, "%s\tJob Timeout Action: %s\n", prefix
, failure_action_to_string(u
->job_timeout_action
));
956 if (u
->job_timeout_reboot_arg
)
957 fprintf(f
, "%s\tJob Timeout Reboot Argument: %s\n", prefix
, u
->job_timeout_reboot_arg
);
959 condition_dump_list(u
->conditions
, f
, prefix
, condition_type_to_string
);
960 condition_dump_list(u
->asserts
, f
, prefix
, assert_type_to_string
);
962 if (dual_timestamp_is_set(&u
->condition_timestamp
))
964 "%s\tCondition Timestamp: %s\n"
965 "%s\tCondition Result: %s\n",
966 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
967 prefix
, yes_no(u
->condition_result
));
969 if (dual_timestamp_is_set(&u
->assert_timestamp
))
971 "%s\tAssert Timestamp: %s\n"
972 "%s\tAssert Result: %s\n",
973 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->assert_timestamp
.realtime
)),
974 prefix
, yes_no(u
->assert_result
));
976 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
979 SET_FOREACH(other
, u
->dependencies
[d
], i
)
980 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
983 if (!strv_isempty(u
->requires_mounts_for
)) {
985 "%s\tRequiresMountsFor:", prefix
);
987 STRV_FOREACH(j
, u
->requires_mounts_for
)
988 fprintf(f
, " %s", *j
);
993 if (u
->load_state
== UNIT_LOADED
) {
996 "%s\tStopWhenUnneeded: %s\n"
997 "%s\tRefuseManualStart: %s\n"
998 "%s\tRefuseManualStop: %s\n"
999 "%s\tDefaultDependencies: %s\n"
1000 "%s\tOnFailureJobMode: %s\n"
1001 "%s\tIgnoreOnIsolate: %s\n"
1002 "%s\tIgnoreOnSnapshot: %s\n",
1003 prefix
, yes_no(u
->stop_when_unneeded
),
1004 prefix
, yes_no(u
->refuse_manual_start
),
1005 prefix
, yes_no(u
->refuse_manual_stop
),
1006 prefix
, yes_no(u
->default_dependencies
),
1007 prefix
, job_mode_to_string(u
->on_failure_job_mode
),
1008 prefix
, yes_no(u
->ignore_on_isolate
),
1009 prefix
, yes_no(u
->ignore_on_snapshot
));
1011 if (UNIT_VTABLE(u
)->dump
)
1012 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
1014 } else if (u
->load_state
== UNIT_MERGED
)
1016 "%s\tMerged into: %s\n",
1017 prefix
, u
->merged_into
->id
);
1018 else if (u
->load_state
== UNIT_ERROR
)
1019 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
1023 job_dump(u
->job
, f
, prefix2
);
1026 job_dump(u
->nop_job
, f
, prefix2
);
1030 /* Common implementation for multiple backends */
1031 int unit_load_fragment_and_dropin(Unit
*u
) {
1036 /* Load a .{service,socket,...} file */
1037 r
= unit_load_fragment(u
);
1041 if (u
->load_state
== UNIT_STUB
)
1044 /* Load drop-in directory data */
1045 r
= unit_load_dropin(unit_follow_merge(u
));
1052 /* Common implementation for multiple backends */
1053 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
1058 /* Same as unit_load_fragment_and_dropin(), but whether
1059 * something can be loaded or not doesn't matter. */
1061 /* Load a .service file */
1062 r
= unit_load_fragment(u
);
1066 if (u
->load_state
== UNIT_STUB
)
1067 u
->load_state
= UNIT_LOADED
;
1069 /* Load drop-in directory data */
1070 r
= unit_load_dropin(unit_follow_merge(u
));
1077 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
1081 if (target
->type
!= UNIT_TARGET
)
1084 /* Only add the dependency if both units are loaded, so that
1085 * that loop check below is reliable */
1086 if (u
->load_state
!= UNIT_LOADED
||
1087 target
->load_state
!= UNIT_LOADED
)
1090 /* If either side wants no automatic dependencies, then let's
1092 if (!u
->default_dependencies
||
1093 !target
->default_dependencies
)
1096 /* Don't create loops */
1097 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
1100 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
1103 static int unit_add_target_dependencies(Unit
*u
) {
1105 static const UnitDependency deps
[] = {
1107 UNIT_REQUIRED_BY_OVERRIDABLE
,
1109 UNIT_REQUISITE_OF_OVERRIDABLE
,
1121 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
1122 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
1123 r
= unit_add_default_target_dependency(u
, target
);
1131 static int unit_add_slice_dependencies(Unit
*u
) {
1134 if (!UNIT_HAS_CGROUP_CONTEXT(u
))
1137 if (UNIT_ISSET(u
->slice
))
1138 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_REQUIRES
, UNIT_DEREF(u
->slice
), true);
1140 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
1143 return unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_ROOT_SLICE
, NULL
, true);
1146 static int unit_add_mount_dependencies(Unit
*u
) {
1152 STRV_FOREACH(i
, u
->requires_mounts_for
) {
1153 char prefix
[strlen(*i
) + 1];
1155 PATH_FOREACH_PREFIX_MORE(prefix
, *i
) {
1156 _cleanup_free_
char *p
= NULL
;
1159 r
= unit_name_from_path(prefix
, ".mount", &p
);
1163 m
= manager_get_unit(u
->manager
, p
);
1165 /* Make sure to load the mount unit if
1166 * it exists. If so the dependencies
1167 * on this unit will be added later
1168 * during the loading of the mount
1170 (void) manager_load_unit_prepare(u
->manager
, p
, NULL
, NULL
, &m
);
1176 if (m
->load_state
!= UNIT_LOADED
)
1179 r
= unit_add_dependency(u
, UNIT_AFTER
, m
, true);
1183 if (m
->fragment_path
) {
1184 r
= unit_add_dependency(u
, UNIT_REQUIRES
, m
, true);
1194 static int unit_add_startup_units(Unit
*u
) {
1198 c
= unit_get_cgroup_context(u
);
1202 if (c
->startup_cpu_shares
== CGROUP_CPU_SHARES_INVALID
&&
1203 c
->startup_blockio_weight
== CGROUP_BLKIO_WEIGHT_INVALID
)
1206 r
= set_ensure_allocated(&u
->manager
->startup_units
, NULL
);
1210 return set_put(u
->manager
->startup_units
, u
);
1213 int unit_load(Unit
*u
) {
1218 if (u
->in_load_queue
) {
1219 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
1220 u
->in_load_queue
= false;
1223 if (u
->type
== _UNIT_TYPE_INVALID
)
1226 if (u
->load_state
!= UNIT_STUB
)
1229 if (UNIT_VTABLE(u
)->load
) {
1230 r
= UNIT_VTABLE(u
)->load(u
);
1235 if (u
->load_state
== UNIT_STUB
) {
1240 if (u
->load_state
== UNIT_LOADED
) {
1242 r
= unit_add_target_dependencies(u
);
1246 r
= unit_add_slice_dependencies(u
);
1250 r
= unit_add_mount_dependencies(u
);
1254 r
= unit_add_startup_units(u
);
1258 if (u
->on_failure_job_mode
== JOB_ISOLATE
&& set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
1259 log_unit_error(u
, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
1264 unit_update_cgroup_members_masks(u
);
1266 /* If we are reloading, we need to wait for the deserializer
1267 * to restore the net_cls ids that have been set previously */
1268 if (u
->manager
->n_reloading
<= 0) {
1269 r
= unit_add_to_netclass_cgroup(u
);
1275 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
1277 unit_add_to_dbus_queue(unit_follow_merge(u
));
1278 unit_add_to_gc_queue(u
);
1283 u
->load_state
= u
->load_state
== UNIT_STUB
? UNIT_NOT_FOUND
: UNIT_ERROR
;
1285 unit_add_to_dbus_queue(u
);
1286 unit_add_to_gc_queue(u
);
1288 log_unit_debug_errno(u
, r
, "Failed to load configuration: %m");
1293 static bool unit_condition_test_list(Unit
*u
, Condition
*first
, const char *(*to_string
)(ConditionType t
)) {
1300 /* If the condition list is empty, then it is true */
1304 /* Otherwise, if all of the non-trigger conditions apply and
1305 * if any of the trigger conditions apply (unless there are
1306 * none) we return true */
1307 LIST_FOREACH(conditions
, c
, first
) {
1310 r
= condition_test(c
);
1313 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
1315 c
->trigger
? "|" : "",
1316 c
->negate
? "!" : "",
1322 c
->trigger
? "|" : "",
1323 c
->negate
? "!" : "",
1325 condition_result_to_string(c
->result
));
1327 if (!c
->trigger
&& r
<= 0)
1330 if (c
->trigger
&& triggered
<= 0)
1334 return triggered
!= 0;
1337 static bool unit_condition_test(Unit
*u
) {
1340 dual_timestamp_get(&u
->condition_timestamp
);
1341 u
->condition_result
= unit_condition_test_list(u
, u
->conditions
, condition_type_to_string
);
1343 return u
->condition_result
;
1346 static bool unit_assert_test(Unit
*u
) {
1349 dual_timestamp_get(&u
->assert_timestamp
);
1350 u
->assert_result
= unit_condition_test_list(u
, u
->asserts
, assert_type_to_string
);
1352 return u
->assert_result
;
1355 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1357 const UnitStatusMessageFormats
*format_table
;
1360 assert(t
== JOB_START
|| t
== JOB_STOP
|| t
== JOB_RELOAD
);
1362 if (t
!= JOB_RELOAD
) {
1363 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1365 format
= format_table
->starting_stopping
[t
== JOB_STOP
];
1371 /* Return generic strings */
1373 return "Starting %s.";
1374 else if (t
== JOB_STOP
)
1375 return "Stopping %s.";
1377 return "Reloading %s.";
1380 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1385 format
= unit_get_status_message_format(u
, t
);
1387 DISABLE_WARNING_FORMAT_NONLITERAL
;
1388 unit_status_printf(u
, "", format
);
1392 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1399 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1402 if (log_on_console())
1405 /* We log status messages for all units and all operations. */
1407 format
= unit_get_status_message_format(u
, t
);
1409 DISABLE_WARNING_FORMAT_NONLITERAL
;
1410 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1413 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1414 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1415 SD_MESSAGE_UNIT_RELOADING
;
1417 /* Note that we deliberately use LOG_MESSAGE() instead of
1418 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1419 * closely what is written to screen using the status output,
1420 * which is supposed the highest level, friendliest output
1421 * possible, which means we should avoid the low-level unit
1423 log_struct(LOG_INFO
,
1424 LOG_MESSAGE_ID(mid
),
1426 LOG_MESSAGE("%s", buf
),
1430 void unit_status_emit_starting_stopping_reloading(Unit
*u
, JobType t
) {
1432 unit_status_log_starting_stopping_reloading(u
, t
);
1434 /* Reload status messages have traditionally not been printed to console. */
1435 if (t
!= JOB_RELOAD
)
1436 unit_status_print_starting_stopping(u
, t
);
1440 * -EBADR: This unit type does not support starting.
1441 * -EALREADY: Unit is already started.
1442 * -EAGAIN: An operation is already in progress. Retry later.
1443 * -ECANCELED: Too many requests for now.
1444 * -EPROTO: Assert failed
1446 int unit_start(Unit
*u
) {
1447 UnitActiveState state
;
1452 /* Units that aren't loaded cannot be started */
1453 if (u
->load_state
!= UNIT_LOADED
)
1456 /* If this is already started, then this will succeed. Note
1457 * that this will even succeed if this unit is not startable
1458 * by the user. This is relied on to detect when we need to
1459 * wait for units and when waiting is finished. */
1460 state
= unit_active_state(u
);
1461 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1464 /* If the conditions failed, don't do anything at all. If we
1465 * already are activating this call might still be useful to
1466 * speed up activation in case there is some hold-off time,
1467 * but we don't want to recheck the condition in that case. */
1468 if (state
!= UNIT_ACTIVATING
&&
1469 !unit_condition_test(u
)) {
1470 log_unit_debug(u
, "Starting requested but condition failed. Not starting unit.");
1474 /* If the asserts failed, fail the entire job */
1475 if (state
!= UNIT_ACTIVATING
&&
1476 !unit_assert_test(u
)) {
1477 log_unit_notice(u
, "Starting requested but asserts failed.");
1481 /* Units of types that aren't supported cannot be
1482 * started. Note that we do this test only after the condition
1483 * checks, so that we rather return condition check errors
1484 * (which are usually not considered a true failure) than "not
1485 * supported" errors (which are considered a failure).
1487 if (!unit_supported(u
))
1490 /* Forward to the main object, if we aren't it. */
1491 following
= unit_following(u
);
1493 log_unit_debug(u
, "Redirecting start request from %s to %s.", u
->id
, following
->id
);
1494 return unit_start(following
);
1497 /* If it is stopped, but we cannot start it, then fail */
1498 if (!UNIT_VTABLE(u
)->start
)
1501 /* We don't suppress calls to ->start() here when we are
1502 * already starting, to allow this request to be used as a
1503 * "hurry up" call, for example when the unit is in some "auto
1504 * restart" state where it waits for a holdoff timer to elapse
1505 * before it will start again. */
1507 unit_add_to_dbus_queue(u
);
1509 return UNIT_VTABLE(u
)->start(u
);
1512 bool unit_can_start(Unit
*u
) {
1515 if (u
->load_state
!= UNIT_LOADED
)
1518 if (!unit_supported(u
))
1521 return !!UNIT_VTABLE(u
)->start
;
1524 bool unit_can_isolate(Unit
*u
) {
1527 return unit_can_start(u
) &&
1532 * -EBADR: This unit type does not support stopping.
1533 * -EALREADY: Unit is already stopped.
1534 * -EAGAIN: An operation is already in progress. Retry later.
1536 int unit_stop(Unit
*u
) {
1537 UnitActiveState state
;
1542 state
= unit_active_state(u
);
1543 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1546 following
= unit_following(u
);
1548 log_unit_debug(u
, "Redirecting stop request from %s to %s.", u
->id
, following
->id
);
1549 return unit_stop(following
);
1552 if (!UNIT_VTABLE(u
)->stop
)
1555 unit_add_to_dbus_queue(u
);
1557 return UNIT_VTABLE(u
)->stop(u
);
1561 * -EBADR: This unit type does not support reloading.
1562 * -ENOEXEC: Unit is not started.
1563 * -EAGAIN: An operation is already in progress. Retry later.
1565 int unit_reload(Unit
*u
) {
1566 UnitActiveState state
;
1571 if (u
->load_state
!= UNIT_LOADED
)
1574 if (!unit_can_reload(u
))
1577 state
= unit_active_state(u
);
1578 if (state
== UNIT_RELOADING
)
1581 if (state
!= UNIT_ACTIVE
) {
1582 log_unit_warning(u
, "Unit cannot be reloaded because it is inactive.");
1586 following
= unit_following(u
);
1588 log_unit_debug(u
, "Redirecting reload request from %s to %s.", u
->id
, following
->id
);
1589 return unit_reload(following
);
1592 unit_add_to_dbus_queue(u
);
1594 return UNIT_VTABLE(u
)->reload(u
);
1597 bool unit_can_reload(Unit
*u
) {
1600 if (!UNIT_VTABLE(u
)->reload
)
1603 if (!UNIT_VTABLE(u
)->can_reload
)
1606 return UNIT_VTABLE(u
)->can_reload(u
);
1609 static void unit_check_unneeded(Unit
*u
) {
1611 static const UnitDependency needed_dependencies
[] = {
1613 UNIT_REQUIRED_BY_OVERRIDABLE
,
1615 UNIT_REQUISITE_OF_OVERRIDABLE
,
1627 /* If this service shall be shut down when unneeded then do
1630 if (!u
->stop_when_unneeded
)
1633 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1636 for (j
= 0; j
< ELEMENTSOF(needed_dependencies
); j
++)
1637 SET_FOREACH(other
, u
->dependencies
[needed_dependencies
[j
]], i
)
1638 if (unit_active_or_pending(other
))
1641 /* If stopping a unit fails continously we might enter a stop
1642 * loop here, hence stop acting on the service being
1643 * unnecessary after a while. */
1644 if (!ratelimit_test(&u
->auto_stop_ratelimit
)) {
1645 log_unit_warning(u
, "Unit not needed anymore, but not stopping since we tried this too often recently.");
1649 log_unit_info(u
, "Unit not needed anymore. Stopping.");
1651 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1652 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1654 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1657 static void unit_check_binds_to(Unit
*u
) {
1668 if (unit_active_state(u
) != UNIT_ACTIVE
)
1671 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
) {
1675 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
1685 /* If stopping a unit fails continously we might enter a stop
1686 * loop here, hence stop acting on the service being
1687 * unnecessary after a while. */
1688 if (!ratelimit_test(&u
->auto_stop_ratelimit
)) {
1689 log_unit_warning(u
, "Unit is bound to inactive unit %s, but not stopping since we tried this too often recently.", other
->id
);
1694 log_unit_info(u
, "Unit is bound to inactive unit %s. Stopping, too.", other
->id
);
1696 /* A unit we need to run is gone. Sniff. Let's stop this. */
1697 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1699 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1702 static void retroactively_start_dependencies(Unit
*u
) {
1707 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1709 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1710 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1711 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1712 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1714 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1715 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1716 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1717 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1719 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1720 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1721 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1722 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1724 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1725 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1726 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1727 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1729 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1730 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1731 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1733 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1734 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1735 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1738 static void retroactively_stop_dependencies(Unit
*u
) {
1743 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1745 /* Pull down units which are bound to us recursively if enabled */
1746 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1747 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1748 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1751 static void check_unneeded_dependencies(Unit
*u
) {
1756 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1758 /* Garbage collect services that might not be needed anymore, if enabled */
1759 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1760 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1761 unit_check_unneeded(other
);
1762 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1763 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1764 unit_check_unneeded(other
);
1765 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1766 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1767 unit_check_unneeded(other
);
1768 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1769 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1770 unit_check_unneeded(other
);
1771 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1772 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1773 unit_check_unneeded(other
);
1774 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1775 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1776 unit_check_unneeded(other
);
1779 void unit_start_on_failure(Unit
*u
) {
1785 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1788 log_unit_info(u
, "Triggering OnFailure= dependencies.");
1790 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1793 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1795 log_unit_error_errno(u
, r
, "Failed to enqueue OnFailure= job: %m");
1799 void unit_trigger_notify(Unit
*u
) {
1805 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1806 if (UNIT_VTABLE(other
)->trigger_notify
)
1807 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1810 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1815 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1816 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1818 /* Note that this is called for all low-level state changes,
1819 * even if they might map to the same high-level
1820 * UnitActiveState! That means that ns == os is an expected
1821 * behavior here. For example: if a mount point is remounted
1822 * this function will be called too! */
1826 /* Update timestamps for state changes */
1827 if (m
->n_reloading
<= 0) {
1830 dual_timestamp_get(&ts
);
1832 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1833 u
->inactive_exit_timestamp
= ts
;
1834 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1835 u
->inactive_enter_timestamp
= ts
;
1837 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1838 u
->active_enter_timestamp
= ts
;
1839 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1840 u
->active_exit_timestamp
= ts
;
1843 /* Keep track of failed units */
1844 (void) manager_update_failed_units(u
->manager
, u
, ns
== UNIT_FAILED
);
1846 /* Make sure the cgroup is always removed when we become inactive */
1847 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1848 unit_prune_cgroup(u
);
1850 /* Note that this doesn't apply to RemainAfterExit services exiting
1851 * successfully, since there's no change of state in that case. Which is
1852 * why it is handled in service_set_state() */
1853 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1856 ec
= unit_get_exec_context(u
);
1857 if (ec
&& exec_context_may_touch_console(ec
)) {
1858 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1861 if (m
->n_on_console
== 0)
1862 /* unset no_console_output flag, since the console is free */
1863 m
->no_console_output
= false;
1872 if (u
->job
->state
== JOB_WAITING
)
1874 /* So we reached a different state for this
1875 * job. Let's see if we can run it now if it
1876 * failed previously due to EAGAIN. */
1877 job_add_to_run_queue(u
->job
);
1879 /* Let's check whether this state change constitutes a
1880 * finished job, or maybe contradicts a running job and
1881 * hence needs to invalidate jobs. */
1883 switch (u
->job
->type
) {
1886 case JOB_VERIFY_ACTIVE
:
1888 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1889 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1890 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1893 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1894 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1900 case JOB_RELOAD_OR_START
:
1902 if (u
->job
->state
== JOB_RUNNING
) {
1903 if (ns
== UNIT_ACTIVE
)
1904 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1905 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1908 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1909 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1917 case JOB_TRY_RESTART
:
1919 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1920 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1921 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1923 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1929 assert_not_reached("Job type unknown");
1935 if (m
->n_reloading
<= 0) {
1937 /* If this state change happened without being
1938 * requested by a job, then let's retroactively start
1939 * or stop dependencies. We skip that step when
1940 * deserializing, since we don't want to create any
1941 * additional jobs just because something is already
1945 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1946 retroactively_start_dependencies(u
);
1947 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1948 retroactively_stop_dependencies(u
);
1951 /* stop unneeded units regardless if going down was expected or not */
1952 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1953 check_unneeded_dependencies(u
);
1955 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1956 log_unit_notice(u
, "Unit entered failed state.");
1957 unit_start_on_failure(u
);
1961 /* Some names are special */
1962 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1964 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1965 /* The bus might have just become available,
1966 * hence try to connect to it, if we aren't
1970 if (u
->type
== UNIT_SERVICE
&&
1971 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1972 m
->n_reloading
<= 0) {
1973 /* Write audit record if we have just finished starting up */
1974 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1978 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1979 manager_send_unit_plymouth(m
, u
);
1983 /* We don't care about D-Bus here, since we'll get an
1984 * asynchronous notification for it anyway. */
1986 if (u
->type
== UNIT_SERVICE
&&
1987 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1988 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1989 m
->n_reloading
<= 0) {
1991 /* Hmm, if there was no start record written
1992 * write it now, so that we always have a nice
1995 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1997 if (ns
== UNIT_INACTIVE
)
1998 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
2000 /* Write audit record if we have just finished shutting down */
2001 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
2003 u
->in_audit
= false;
2007 manager_recheck_journal(m
);
2008 unit_trigger_notify(u
);
2010 if (u
->manager
->n_reloading
<= 0) {
2011 /* Maybe we finished startup and are now ready for
2012 * being stopped because unneeded? */
2013 unit_check_unneeded(u
);
2015 /* Maybe we finished startup, but something we needed
2016 * has vanished? Let's die then. (This happens when
2017 * something BindsTo= to a Type=oneshot unit, as these
2018 * units go directly from starting to inactive,
2019 * without ever entering started.) */
2020 unit_check_binds_to(u
);
2023 unit_add_to_dbus_queue(u
);
2024 unit_add_to_gc_queue(u
);
2027 int unit_watch_pid(Unit
*u
, pid_t pid
) {
2033 /* Watch a specific PID. We only support one or two units
2034 * watching each PID for now, not more. */
2036 r
= set_ensure_allocated(&u
->pids
, NULL
);
2040 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
2044 r
= hashmap_put(u
->manager
->watch_pids1
, PID_TO_PTR(pid
), u
);
2046 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
2050 r
= hashmap_put(u
->manager
->watch_pids2
, PID_TO_PTR(pid
), u
);
2053 q
= set_put(u
->pids
, PID_TO_PTR(pid
));
2060 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
2064 (void) hashmap_remove_value(u
->manager
->watch_pids1
, PID_TO_PTR(pid
), u
);
2065 (void) hashmap_remove_value(u
->manager
->watch_pids2
, PID_TO_PTR(pid
), u
);
2066 (void) set_remove(u
->pids
, PID_TO_PTR(pid
));
2069 void unit_unwatch_all_pids(Unit
*u
) {
2072 while (!set_isempty(u
->pids
))
2073 unit_unwatch_pid(u
, PTR_TO_PID(set_first(u
->pids
)));
2075 u
->pids
= set_free(u
->pids
);
2078 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2084 /* Cleans dead PIDs from our list */
2086 SET_FOREACH(e
, u
->pids
, i
) {
2087 pid_t pid
= PTR_TO_PID(e
);
2089 if (pid
== except1
|| pid
== except2
)
2092 if (!pid_is_unwaited(pid
))
2093 unit_unwatch_pid(u
, pid
);
2097 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2099 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2103 case JOB_VERIFY_ACTIVE
:
2110 case JOB_TRY_RESTART
:
2111 return unit_can_start(u
);
2114 return unit_can_reload(u
);
2116 case JOB_RELOAD_OR_START
:
2117 return unit_can_reload(u
) && unit_can_start(u
);
2120 assert_not_reached("Invalid job type");
2124 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
) {
2127 /* Only warn about some unit types */
2128 if (!IN_SET(dependency
, UNIT_CONFLICTS
, UNIT_CONFLICTED_BY
, UNIT_BEFORE
, UNIT_AFTER
, UNIT_ON_FAILURE
, UNIT_TRIGGERS
, UNIT_TRIGGERED_BY
))
2131 if (streq_ptr(u
->id
, other
))
2132 log_unit_warning(u
, "Dependency %s=%s dropped", unit_dependency_to_string(dependency
), u
->id
);
2134 log_unit_warning(u
, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency
), strna(other
), u
->id
);
2137 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2139 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2140 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2141 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2142 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2143 [UNIT_REQUISITE
] = UNIT_REQUISITE_OF
,
2144 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUISITE_OF_OVERRIDABLE
,
2145 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2146 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2147 [UNIT_REQUIRED_BY
] = UNIT_REQUIRES
,
2148 [UNIT_REQUIRED_BY_OVERRIDABLE
] = UNIT_REQUIRES_OVERRIDABLE
,
2149 [UNIT_REQUISITE_OF
] = UNIT_REQUISITE
,
2150 [UNIT_REQUISITE_OF_OVERRIDABLE
] = UNIT_REQUISITE_OVERRIDABLE
,
2151 [UNIT_WANTED_BY
] = UNIT_WANTS
,
2152 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2153 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2154 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2155 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2156 [UNIT_BEFORE
] = UNIT_AFTER
,
2157 [UNIT_AFTER
] = UNIT_BEFORE
,
2158 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2159 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2160 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2161 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2162 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2163 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2164 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2165 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2167 int r
, q
= 0, v
= 0, w
= 0;
2168 Unit
*orig_u
= u
, *orig_other
= other
;
2171 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2174 u
= unit_follow_merge(u
);
2175 other
= unit_follow_merge(other
);
2177 /* We won't allow dependencies on ourselves. We will not
2178 * consider them an error however. */
2180 maybe_warn_about_dependency(orig_u
, orig_other
->id
, d
);
2184 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2188 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2189 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2194 if (add_reference
) {
2195 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2199 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2204 q
= set_put(u
->dependencies
[d
], other
);
2208 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2209 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2216 if (add_reference
) {
2217 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2223 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2228 unit_add_to_dbus_queue(u
);
2233 set_remove(u
->dependencies
[d
], other
);
2236 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2239 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2244 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2249 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2253 return unit_add_dependency(u
, e
, other
, add_reference
);
2256 static int resolve_template(Unit
*u
, const char *name
, const char*path
, char **buf
, const char **ret
) {
2260 assert(name
|| path
);
2265 name
= basename(path
);
2267 if (!unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
2274 r
= unit_name_replace_instance(name
, u
->instance
, buf
);
2276 _cleanup_free_
char *i
= NULL
;
2278 r
= unit_name_to_prefix(u
->id
, &i
);
2282 r
= unit_name_replace_instance(name
, i
, buf
);
2291 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2292 _cleanup_free_
char *buf
= NULL
;
2297 assert(name
|| path
);
2299 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2303 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2307 return unit_add_dependency(u
, d
, other
, add_reference
);
2310 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2311 _cleanup_free_
char *buf
= NULL
;
2316 assert(name
|| path
);
2318 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2322 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2326 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2329 int set_unit_path(const char *p
) {
2330 /* This is mostly for debug purposes */
2331 if (setenv("SYSTEMD_UNIT_PATH", p
, 1) < 0)
2337 char *unit_dbus_path(Unit
*u
) {
2343 return unit_dbus_path_from_name(u
->id
);
2346 int unit_set_slice(Unit
*u
, Unit
*slice
) {
2350 /* Sets the unit slice if it has not been set before. Is extra
2351 * careful, to only allow this for units that actually have a
2352 * cgroup context. Also, we don't allow to set this for slices
2353 * (since the parent slice is derived from the name). Make
2354 * sure the unit we set is actually a slice. */
2356 if (!UNIT_HAS_CGROUP_CONTEXT(u
))
2359 if (u
->type
== UNIT_SLICE
)
2362 if (unit_active_state(u
) != UNIT_INACTIVE
)
2365 if (slice
->type
!= UNIT_SLICE
)
2368 if (unit_has_name(u
, SPECIAL_INIT_SCOPE
) &&
2369 !unit_has_name(slice
, SPECIAL_ROOT_SLICE
))
2372 if (UNIT_DEREF(u
->slice
) == slice
)
2375 if (UNIT_ISSET(u
->slice
))
2378 unit_ref_set(&u
->slice
, slice
);
2382 int unit_set_default_slice(Unit
*u
) {
2383 _cleanup_free_
char *b
= NULL
;
2384 const char *slice_name
;
2390 if (UNIT_ISSET(u
->slice
))
2394 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2396 /* Implicitly place all instantiated units in their
2397 * own per-template slice */
2399 r
= unit_name_to_prefix(u
->id
, &prefix
);
2403 /* The prefix is already escaped, but it might include
2404 * "-" which has a special meaning for slice units,
2405 * hence escape it here extra. */
2406 escaped
= unit_name_escape(prefix
);
2410 if (u
->manager
->running_as
== MANAGER_SYSTEM
)
2411 b
= strjoin("system-", escaped
, ".slice", NULL
);
2413 b
= strappend(escaped
, ".slice");
2420 u
->manager
->running_as
== MANAGER_SYSTEM
&& !unit_has_name(u
, SPECIAL_INIT_SCOPE
)
2421 ? SPECIAL_SYSTEM_SLICE
2422 : SPECIAL_ROOT_SLICE
;
2424 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2428 return unit_set_slice(u
, slice
);
2431 const char *unit_slice_name(Unit
*u
) {
2434 if (!UNIT_ISSET(u
->slice
))
2437 return UNIT_DEREF(u
->slice
)->id
;
2440 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2441 _cleanup_free_
char *t
= NULL
;
2448 r
= unit_name_change_suffix(u
->id
, type
, &t
);
2451 if (unit_has_name(u
, t
))
2454 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2455 assert(r
< 0 || *_found
!= u
);
2459 static int signal_name_owner_changed(sd_bus_message
*message
, void *userdata
, sd_bus_error
*error
) {
2460 const char *name
, *old_owner
, *new_owner
;
2467 r
= sd_bus_message_read(message
, "sss", &name
, &old_owner
, &new_owner
);
2469 bus_log_parse_error(r
);
2473 if (UNIT_VTABLE(u
)->bus_name_owner_change
)
2474 UNIT_VTABLE(u
)->bus_name_owner_change(u
, name
, old_owner
, new_owner
);
2479 int unit_install_bus_match(Unit
*u
, sd_bus
*bus
, const char *name
) {
2486 if (u
->match_bus_slot
)
2489 match
= strjoina("type='signal',"
2490 "sender='org.freedesktop.DBus',"
2491 "path='/org/freedesktop/DBus',"
2492 "interface='org.freedesktop.DBus',"
2493 "member='NameOwnerChanged',"
2494 "arg0='", name
, "'",
2497 return sd_bus_add_match(bus
, &u
->match_bus_slot
, match
, signal_name_owner_changed
, u
);
2500 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2506 /* Watch a specific name on the bus. We only support one unit
2507 * watching each name for now. */
2509 if (u
->manager
->api_bus
) {
2510 /* If the bus is already available, install the match directly.
2511 * Otherwise, just put the name in the list. bus_setup_api() will take care later. */
2512 r
= unit_install_bus_match(u
, u
->manager
->api_bus
, name
);
2514 return log_warning_errno(r
, "Failed to subscribe to NameOwnerChanged signal: %m");
2517 r
= hashmap_put(u
->manager
->watch_bus
, name
, u
);
2519 u
->match_bus_slot
= sd_bus_slot_unref(u
->match_bus_slot
);
2520 return log_warning_errno(r
, "Failed to put bus name to hashmap: %m");
2526 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2530 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2531 u
->match_bus_slot
= sd_bus_slot_unref(u
->match_bus_slot
);
2534 bool unit_can_serialize(Unit
*u
) {
2537 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2540 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2547 if (unit_can_serialize(u
)) {
2550 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2554 rt
= unit_get_exec_runtime(u
);
2556 r
= exec_runtime_serialize(u
, rt
, f
, fds
);
2562 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2563 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2564 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2565 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2566 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2567 dual_timestamp_serialize(f
, "assert-timestamp", &u
->assert_timestamp
);
2569 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2570 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2572 if (dual_timestamp_is_set(&u
->assert_timestamp
))
2573 unit_serialize_item(u
, f
, "assert-result", yes_no(u
->assert_result
));
2575 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2576 unit_serialize_item_format(u
, f
, "cpuacct-usage-base", "%" PRIu64
, u
->cpuacct_usage_base
);
2579 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2580 unit_serialize_item(u
, f
, "cgroup-realized", yes_no(u
->cgroup_realized
));
2582 if (u
->cgroup_netclass_id
)
2583 unit_serialize_item_format(u
, f
, "netclass-id", "%" PRIu32
, u
->cgroup_netclass_id
);
2585 if (serialize_jobs
) {
2587 fprintf(f
, "job\n");
2588 job_serialize(u
->job
, f
, fds
);
2592 fprintf(f
, "job\n");
2593 job_serialize(u
->nop_job
, f
, fds
);
2602 int unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2618 int unit_serialize_item_escaped(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2619 _cleanup_free_
char *c
= NULL
;
2640 int unit_serialize_item_fd(Unit
*u
, FILE *f
, FDSet
*fds
, const char *key
, int fd
) {
2650 copy
= fdset_put_dup(fds
, fd
);
2654 fprintf(f
, "%s=%i\n", key
, copy
);
2658 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2669 va_start(ap
, format
);
2670 vfprintf(f
, format
, ap
);
2676 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2677 ExecRuntime
**rt
= NULL
;
2685 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2687 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2690 char line
[LINE_MAX
], *l
, *v
;
2693 if (!fgets(line
, sizeof(line
), f
)) {
2706 k
= strcspn(l
, "=");
2714 if (streq(l
, "job")) {
2716 /* new-style serialized job */
2723 r
= job_deserialize(j
, f
, fds
);
2729 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2735 r
= job_install_deserialized(j
);
2737 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2741 } else /* legacy for pre-44 */
2742 log_unit_warning(u
, "Update from too old systemd versions are unsupported, cannot deserialize job: %s", v
);
2744 } else if (streq(l
, "inactive-exit-timestamp")) {
2745 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2747 } else if (streq(l
, "active-enter-timestamp")) {
2748 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2750 } else if (streq(l
, "active-exit-timestamp")) {
2751 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2753 } else if (streq(l
, "inactive-enter-timestamp")) {
2754 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2756 } else if (streq(l
, "condition-timestamp")) {
2757 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2759 } else if (streq(l
, "assert-timestamp")) {
2760 dual_timestamp_deserialize(v
, &u
->assert_timestamp
);
2762 } else if (streq(l
, "condition-result")) {
2764 r
= parse_boolean(v
);
2766 log_unit_debug(u
, "Failed to parse condition result value %s, ignoring.", v
);
2768 u
->condition_result
= r
;
2772 } else if (streq(l
, "assert-result")) {
2774 r
= parse_boolean(v
);
2776 log_unit_debug(u
, "Failed to parse assert result value %s, ignoring.", v
);
2778 u
->assert_result
= r
;
2782 } else if (streq(l
, "transient")) {
2784 r
= parse_boolean(v
);
2786 log_unit_debug(u
, "Failed to parse transient bool %s, ignoring.", v
);
2792 } else if (streq(l
, "cpuacct-usage-base")) {
2794 r
= safe_atou64(v
, &u
->cpuacct_usage_base
);
2796 log_unit_debug(u
, "Failed to parse CPU usage %s, ignoring.", v
);
2800 } else if (streq(l
, "cgroup")) {
2802 r
= unit_set_cgroup_path(u
, v
);
2804 log_unit_debug_errno(u
, r
, "Failed to set cgroup path %s, ignoring: %m", v
);
2806 (void) unit_watch_cgroup(u
);
2809 } else if (streq(l
, "cgroup-realized")) {
2812 b
= parse_boolean(v
);
2814 log_unit_debug(u
, "Failed to parse cgroup-realized bool %s, ignoring.", v
);
2816 u
->cgroup_realized
= b
;
2819 } else if (streq(l
, "netclass-id")) {
2820 r
= safe_atou32(v
, &u
->cgroup_netclass_id
);
2822 log_unit_debug(u
, "Failed to parse netclass ID %s, ignoring.", v
);
2824 r
= unit_add_to_netclass_cgroup(u
);
2826 log_unit_debug_errno(u
, r
, "Failed to add unit to netclass cgroup, ignoring: %m");
2832 if (unit_can_serialize(u
)) {
2834 r
= exec_runtime_deserialize_item(u
, rt
, l
, v
, fds
);
2836 log_unit_warning(u
, "Failed to deserialize runtime parameter '%s', ignoring.", l
);
2840 /* Returns positive if key was handled by the call */
2845 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2847 log_unit_warning(u
, "Failed to deserialize unit parameter '%s', ignoring.", l
);
2852 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2854 _cleanup_free_
char *e
= NULL
;
2859 /* Adds in links to the device node that this unit is based on */
2863 if (!is_device_path(what
))
2866 /* When device units aren't supported (such as in a
2867 * container), don't create dependencies on them. */
2868 if (!unit_type_supported(UNIT_DEVICE
))
2871 r
= unit_name_from_path(what
, ".device", &e
);
2875 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2879 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_BINDS_TO
: UNIT_WANTS
, device
, true);
2884 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2892 int unit_coldplug(Unit
*u
) {
2897 /* Make sure we don't enter a loop, when coldplugging
2902 u
->coldplugged
= true;
2904 if (UNIT_VTABLE(u
)->coldplug
) {
2905 r
= UNIT_VTABLE(u
)->coldplug(u
);
2911 r
= job_coldplug(u
->job
);
2919 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2920 DISABLE_WARNING_FORMAT_NONLITERAL
;
2921 manager_status_printf(u
->manager
, STATUS_TYPE_NORMAL
,
2922 status
, unit_status_msg_format
, unit_description(u
));
2926 bool unit_need_daemon_reload(Unit
*u
) {
2927 _cleanup_strv_free_
char **t
= NULL
;
2930 unsigned loaded_cnt
, current_cnt
;
2934 if (u
->fragment_path
) {
2936 if (stat(u
->fragment_path
, &st
) < 0)
2937 /* What, cannot access this anymore? */
2940 if (u
->fragment_mtime
> 0 &&
2941 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2945 if (u
->source_path
) {
2947 if (stat(u
->source_path
, &st
) < 0)
2950 if (u
->source_mtime
> 0 &&
2951 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2955 (void) unit_find_dropin_paths(u
, &t
);
2956 loaded_cnt
= strv_length(t
);
2957 current_cnt
= strv_length(u
->dropin_paths
);
2959 if (loaded_cnt
== current_cnt
) {
2960 if (loaded_cnt
== 0)
2963 if (strv_overlap(u
->dropin_paths
, t
)) {
2964 STRV_FOREACH(path
, u
->dropin_paths
) {
2966 if (stat(*path
, &st
) < 0)
2969 if (u
->dropin_mtime
> 0 &&
2970 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2981 void unit_reset_failed(Unit
*u
) {
2984 if (UNIT_VTABLE(u
)->reset_failed
)
2985 UNIT_VTABLE(u
)->reset_failed(u
);
2988 Unit
*unit_following(Unit
*u
) {
2991 if (UNIT_VTABLE(u
)->following
)
2992 return UNIT_VTABLE(u
)->following(u
);
2997 bool unit_stop_pending(Unit
*u
) {
3000 /* This call does check the current state of the unit. It's
3001 * hence useful to be called from state change calls of the
3002 * unit itself, where the state isn't updated yet. This is
3003 * different from unit_inactive_or_pending() which checks both
3004 * the current state and for a queued job. */
3006 return u
->job
&& u
->job
->type
== JOB_STOP
;
3009 bool unit_inactive_or_pending(Unit
*u
) {
3012 /* Returns true if the unit is inactive or going down */
3014 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
3017 if (unit_stop_pending(u
))
3023 bool unit_active_or_pending(Unit
*u
) {
3026 /* Returns true if the unit is active or going up */
3028 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
3032 (u
->job
->type
== JOB_START
||
3033 u
->job
->type
== JOB_RELOAD_OR_START
||
3034 u
->job
->type
== JOB_RESTART
))
3040 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
3042 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
3044 assert(signo
< _NSIG
);
3046 if (!UNIT_VTABLE(u
)->kill
)
3049 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
3052 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
3056 pid_set
= set_new(NULL
);
3060 /* Exclude the main/control pids from being killed via the cgroup */
3062 r
= set_put(pid_set
, PID_TO_PTR(main_pid
));
3067 if (control_pid
> 0) {
3068 r
= set_put(pid_set
, PID_TO_PTR(control_pid
));
3080 int unit_kill_common(
3086 sd_bus_error
*error
) {
3089 bool killed
= false;
3091 if (IN_SET(who
, KILL_MAIN
, KILL_MAIN_FAIL
)) {
3093 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
3094 else if (main_pid
== 0)
3095 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
3098 if (IN_SET(who
, KILL_CONTROL
, KILL_CONTROL_FAIL
)) {
3099 if (control_pid
< 0)
3100 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
3101 else if (control_pid
== 0)
3102 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
3105 if (IN_SET(who
, KILL_CONTROL
, KILL_CONTROL_FAIL
, KILL_ALL
, KILL_ALL_FAIL
))
3106 if (control_pid
> 0) {
3107 if (kill(control_pid
, signo
) < 0)
3113 if (IN_SET(who
, KILL_MAIN
, KILL_MAIN_FAIL
, KILL_ALL
, KILL_ALL_FAIL
))
3115 if (kill(main_pid
, signo
) < 0)
3121 if (IN_SET(who
, KILL_ALL
, KILL_ALL_FAIL
) && u
->cgroup_path
) {
3122 _cleanup_set_free_ Set
*pid_set
= NULL
;
3125 /* Exclude the main/control pids from being killed via the cgroup */
3126 pid_set
= unit_pid_set(main_pid
, control_pid
);
3130 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, false, false, pid_set
);
3131 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
3137 if (r
== 0 && !killed
&& IN_SET(who
, KILL_ALL_FAIL
, KILL_CONTROL_FAIL
, KILL_ALL_FAIL
))
3143 int unit_following_set(Unit
*u
, Set
**s
) {
3147 if (UNIT_VTABLE(u
)->following_set
)
3148 return UNIT_VTABLE(u
)->following_set(u
, s
);
3154 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
3157 if (u
->unit_file_state
< 0 && u
->fragment_path
)
3158 u
->unit_file_state
= unit_file_get_state(
3159 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3160 NULL
, basename(u
->fragment_path
));
3162 return u
->unit_file_state
;
3165 int unit_get_unit_file_preset(Unit
*u
) {
3168 if (u
->unit_file_preset
< 0 && u
->fragment_path
)
3169 u
->unit_file_preset
= unit_file_query_preset(
3170 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3171 NULL
, basename(u
->fragment_path
));
3173 return u
->unit_file_preset
;
3176 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3181 unit_ref_unset(ref
);
3184 LIST_PREPEND(refs
, u
->refs
, ref
);
3188 void unit_ref_unset(UnitRef
*ref
) {
3194 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3198 int unit_patch_contexts(Unit
*u
) {
3206 /* Patch in the manager defaults into the exec and cgroup
3207 * contexts, _after_ the rest of the settings have been
3210 ec
= unit_get_exec_context(u
);
3212 /* This only copies in the ones that need memory */
3213 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3214 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3215 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3220 if (u
->manager
->running_as
== MANAGER_USER
&&
3221 !ec
->working_directory
) {
3223 r
= get_home_dir(&ec
->working_directory
);
3227 /* Allow user services to run, even if the
3228 * home directory is missing */
3229 ec
->working_directory_missing_ok
= true;
3232 if (u
->manager
->running_as
== MANAGER_USER
&&
3233 (ec
->syscall_whitelist
||
3234 !set_isempty(ec
->syscall_filter
) ||
3235 !set_isempty(ec
->syscall_archs
) ||
3236 ec
->address_families_whitelist
||
3237 !set_isempty(ec
->address_families
)))
3238 ec
->no_new_privileges
= true;
3240 if (ec
->private_devices
)
3241 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3244 cc
= unit_get_cgroup_context(u
);
3248 ec
->private_devices
&&
3249 cc
->device_policy
== CGROUP_AUTO
)
3250 cc
->device_policy
= CGROUP_CLOSED
;
3256 ExecContext
*unit_get_exec_context(Unit
*u
) {
3263 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3267 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3270 KillContext
*unit_get_kill_context(Unit
*u
) {
3277 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3281 return (KillContext
*) ((uint8_t*) u
+ offset
);
3284 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3290 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3294 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3297 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3303 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3307 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3310 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3313 if (u
->manager
->running_as
== MANAGER_USER
) {
3316 if (mode
== UNIT_PERSISTENT
&& !transient
)
3317 r
= user_config_home(dir
);
3319 r
= user_runtime_dir(dir
);
3326 if (mode
== UNIT_PERSISTENT
&& !transient
)
3327 *dir
= strdup("/etc/systemd/system");
3329 *dir
= strdup("/run/systemd/system");
3336 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3338 _cleanup_free_
char *dir
= NULL
, *p
= NULL
, *q
= NULL
;
3343 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3346 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3350 r
= write_drop_in(dir
, u
->id
, 50, name
, data
);
3354 r
= drop_in_file(dir
, u
->id
, 50, name
, &p
, &q
);
3358 r
= strv_extend(&u
->dropin_paths
, q
);
3362 strv_sort(u
->dropin_paths
);
3363 strv_uniq(u
->dropin_paths
);
3365 u
->dropin_mtime
= now(CLOCK_REALTIME
);
3370 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3371 _cleanup_free_
char *p
= NULL
;
3379 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3382 va_start(ap
, format
);
3383 r
= vasprintf(&p
, format
, ap
);
3389 return unit_write_drop_in(u
, mode
, name
, p
);
3392 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3393 _cleanup_free_
char *ndata
= NULL
;
3399 if (!UNIT_VTABLE(u
)->private_section
)
3402 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3405 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3409 return unit_write_drop_in(u
, mode
, name
, ndata
);
3412 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3413 _cleanup_free_
char *p
= NULL
;
3421 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3424 va_start(ap
, format
);
3425 r
= vasprintf(&p
, format
, ap
);
3431 return unit_write_drop_in_private(u
, mode
, name
, p
);
3434 int unit_make_transient(Unit
*u
) {
3437 if (!UNIT_VTABLE(u
)->can_transient
)
3440 u
->load_state
= UNIT_STUB
;
3442 u
->transient
= true;
3443 u
->fragment_path
= mfree(u
->fragment_path
);
3448 int unit_kill_context(
3454 bool main_pid_alien
) {
3456 bool wait_for_exit
= false;
3462 if (c
->kill_mode
== KILL_NONE
)
3472 case KILL_TERMINATE
:
3473 sig
= c
->kill_signal
;
3476 assert_not_reached("KillOperation unknown");
3480 r
= kill_and_sigcont(main_pid
, sig
);
3482 if (r
< 0 && r
!= -ESRCH
) {
3483 _cleanup_free_
char *comm
= NULL
;
3484 get_process_comm(main_pid
, &comm
);
3486 log_unit_warning_errno(u
, r
, "Failed to kill main process " PID_FMT
" (%s), ignoring: %m", main_pid
, strna(comm
));
3488 if (!main_pid_alien
)
3489 wait_for_exit
= true;
3491 if (c
->send_sighup
&& k
== KILL_TERMINATE
)
3492 (void) kill(main_pid
, SIGHUP
);
3496 if (control_pid
> 0) {
3497 r
= kill_and_sigcont(control_pid
, sig
);
3499 if (r
< 0 && r
!= -ESRCH
) {
3500 _cleanup_free_
char *comm
= NULL
;
3501 get_process_comm(control_pid
, &comm
);
3503 log_unit_warning_errno(u
, r
, "Failed to kill control process " PID_FMT
" (%s), ignoring: %m", control_pid
, strna(comm
));
3505 wait_for_exit
= true;
3507 if (c
->send_sighup
&& k
== KILL_TERMINATE
)
3508 (void) kill(control_pid
, SIGHUP
);
3512 if (u
->cgroup_path
&&
3513 (c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& k
== KILL_KILL
))) {
3514 _cleanup_set_free_ Set
*pid_set
= NULL
;
3516 /* Exclude the main/control pids from being killed via the cgroup */
3517 pid_set
= unit_pid_set(main_pid
, control_pid
);
3521 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, k
!= KILL_TERMINATE
, false, pid_set
);
3523 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3524 log_unit_warning_errno(u
, r
, "Failed to kill control group %s, ignoring: %m", u
->cgroup_path
);
3528 /* FIXME: For now, on the legacy hierarchy, we
3529 * will not wait for the cgroup members to die
3530 * if we are running in a container or if this
3531 * is a delegation unit, simply because cgroup
3532 * notification is unreliable in these
3533 * cases. It doesn't work at all in
3534 * containers, and outside of containers it
3535 * can be confused easily by left-over
3536 * directories in the cgroup -- which however
3537 * should not exist in non-delegated units. On
3538 * the unified hierarchy that's different,
3539 * there we get proper events. Hence rely on
3542 if (cg_unified() > 0 ||
3543 (detect_container() == 0 && !unit_cgroup_delegate(u
)))
3544 wait_for_exit
= true;
3546 if (c
->send_sighup
&& k
!= KILL_KILL
) {
3549 pid_set
= unit_pid_set(main_pid
, control_pid
);
3553 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3558 return wait_for_exit
;
3561 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3562 char prefix
[strlen(path
) + 1], *p
;
3568 /* Registers a unit for requiring a certain path and all its
3569 * prefixes. We keep a simple array of these paths in the
3570 * unit, since its usually short. However, we build a prefix
3571 * table for all possible prefixes so that new appearing mount
3572 * units can easily determine which units to make themselves a
3575 if (!path_is_absolute(path
))
3582 path_kill_slashes(p
);
3584 if (!path_is_safe(p
)) {
3589 if (strv_contains(u
->requires_mounts_for
, p
)) {
3594 r
= strv_consume(&u
->requires_mounts_for
, p
);
3598 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3601 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3605 r
= hashmap_ensure_allocated(&u
->manager
->units_requiring_mounts_for
, &string_hash_ops
);
3619 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3635 int unit_setup_exec_runtime(Unit
*u
) {
3641 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3644 /* Check if there already is an ExecRuntime for this unit? */
3645 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3649 /* Try to get it from somebody else */
3650 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3652 *rt
= unit_get_exec_runtime(other
);
3654 exec_runtime_ref(*rt
);
3659 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3662 bool unit_type_supported(UnitType t
) {
3663 if (_unlikely_(t
< 0))
3665 if (_unlikely_(t
>= _UNIT_TYPE_MAX
))
3668 if (!unit_vtable
[t
]->supported
)
3671 return unit_vtable
[t
]->supported();
3674 void unit_warn_if_dir_nonempty(Unit
*u
, const char* where
) {
3680 r
= dir_is_empty(where
);
3684 log_unit_warning_errno(u
, r
, "Failed to check directory %s: %m", where
);
3688 log_struct(LOG_NOTICE
,
3689 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3691 LOG_UNIT_MESSAGE(u
, "Directory %s to mount over is not empty, mounting anyway.", where
),
3696 int unit_fail_if_symlink(Unit
*u
, const char* where
) {
3702 r
= is_symlink(where
);
3704 log_unit_debug_errno(u
, r
, "Failed to check symlink %s, ignoring: %m", where
);
3711 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3713 LOG_UNIT_MESSAGE(u
, "Mount on symlink %s not allowed.", where
),