1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
29 #include "sd-messages.h"
34 #include "path-util.h"
35 #include "load-fragment.h"
36 #include "load-dropin.h"
38 #include "unit-name.h"
39 #include "dbus-unit.h"
41 #include "cgroup-util.h"
44 #include "fileio-label.h"
45 #include "bus-common-errors.h"
49 #include "formats-util.h"
50 #include "process-util.h"
52 const UnitVTable
* const unit_vtable
[_UNIT_TYPE_MAX
] = {
53 [UNIT_SERVICE
] = &service_vtable
,
54 [UNIT_SOCKET
] = &socket_vtable
,
55 [UNIT_BUSNAME
] = &busname_vtable
,
56 [UNIT_TARGET
] = &target_vtable
,
57 [UNIT_SNAPSHOT
] = &snapshot_vtable
,
58 [UNIT_DEVICE
] = &device_vtable
,
59 [UNIT_MOUNT
] = &mount_vtable
,
60 [UNIT_AUTOMOUNT
] = &automount_vtable
,
61 [UNIT_SWAP
] = &swap_vtable
,
62 [UNIT_TIMER
] = &timer_vtable
,
63 [UNIT_PATH
] = &path_vtable
,
64 [UNIT_SLICE
] = &slice_vtable
,
65 [UNIT_SCOPE
] = &scope_vtable
68 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
);
70 Unit
*unit_new(Manager
*m
, size_t size
) {
74 assert(size
>= sizeof(Unit
));
80 u
->names
= set_new(&string_hash_ops
);
87 u
->type
= _UNIT_TYPE_INVALID
;
88 u
->deserialized_job
= _JOB_TYPE_INVALID
;
89 u
->default_dependencies
= true;
90 u
->unit_file_state
= _UNIT_FILE_STATE_INVALID
;
91 u
->unit_file_preset
= -1;
92 u
->on_failure_job_mode
= JOB_REPLACE
;
97 bool unit_has_name(Unit
*u
, const char *name
) {
101 return !!set_get(u
->names
, (char*) name
);
104 static void unit_init(Unit
*u
) {
111 assert(u
->type
>= 0);
113 cc
= unit_get_cgroup_context(u
);
115 cgroup_context_init(cc
);
117 /* Copy in the manager defaults into the cgroup
118 * context, _before_ the rest of the settings have
119 * been initialized */
121 cc
->cpu_accounting
= u
->manager
->default_cpu_accounting
;
122 cc
->blockio_accounting
= u
->manager
->default_blockio_accounting
;
123 cc
->memory_accounting
= u
->manager
->default_memory_accounting
;
126 ec
= unit_get_exec_context(u
);
128 exec_context_init(ec
);
130 kc
= unit_get_kill_context(u
);
132 kill_context_init(kc
);
134 if (UNIT_VTABLE(u
)->init
)
135 UNIT_VTABLE(u
)->init(u
);
138 int unit_add_name(Unit
*u
, const char *text
) {
139 _cleanup_free_
char *s
= NULL
, *i
= NULL
;
146 if (unit_name_is_valid(text
, UNIT_NAME_TEMPLATE
)) {
151 r
= unit_name_replace_instance(text
, u
->instance
, &s
);
160 if (set_contains(u
->names
, s
))
162 if (hashmap_contains(u
->manager
->units
, s
))
165 if (!unit_name_is_valid(s
, UNIT_NAME_PLAIN
|UNIT_NAME_INSTANCE
))
168 t
= unit_name_to_type(s
);
172 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
)
175 r
= unit_name_to_instance(s
, &i
);
179 if (i
&& unit_vtable
[t
]->no_instances
)
182 /* Ensure that this unit is either instanced or not instanced,
183 * but not both. Note that we do allow names with different
184 * instance names however! */
185 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
)
188 if (unit_vtable
[t
]->no_alias
&& !set_isempty(u
->names
))
191 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
)
194 r
= set_put(u
->names
, s
);
199 r
= hashmap_put(u
->manager
->units
, s
, u
);
201 (void) set_remove(u
->names
, s
);
205 if (u
->type
== _UNIT_TYPE_INVALID
) {
210 LIST_PREPEND(units_by_type
, u
->manager
->units_by_type
[t
], u
);
219 unit_add_to_dbus_queue(u
);
223 int unit_choose_id(Unit
*u
, const char *name
) {
224 _cleanup_free_
char *t
= NULL
;
231 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
236 r
= unit_name_replace_instance(name
, u
->instance
, &t
);
243 /* Selects one of the names of this unit as the id */
244 s
= set_get(u
->names
, (char*) name
);
248 /* Determine the new instance from the new id */
249 r
= unit_name_to_instance(s
, &i
);
258 unit_add_to_dbus_queue(u
);
263 int unit_set_description(Unit
*u
, const char *description
) {
268 if (isempty(description
))
271 s
= strdup(description
);
276 free(u
->description
);
279 unit_add_to_dbus_queue(u
);
283 bool unit_check_gc(Unit
*u
) {
284 UnitActiveState state
;
293 state
= unit_active_state(u
);
295 /* If the unit is inactive and failed and no job is queued for
296 * it, then release its runtime resources */
297 if (UNIT_IS_INACTIVE_OR_FAILED(state
) &&
298 UNIT_VTABLE(u
)->release_resources
)
299 UNIT_VTABLE(u
)->release_resources(u
);
301 /* But we keep the unit object around for longer when it is
302 * referenced or configured to not be gc'ed */
303 if (state
!= UNIT_INACTIVE
)
306 if (UNIT_VTABLE(u
)->no_gc
)
315 if (UNIT_VTABLE(u
)->check_gc
)
316 if (UNIT_VTABLE(u
)->check_gc(u
))
322 void unit_add_to_load_queue(Unit
*u
) {
324 assert(u
->type
!= _UNIT_TYPE_INVALID
);
326 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
329 LIST_PREPEND(load_queue
, u
->manager
->load_queue
, u
);
330 u
->in_load_queue
= true;
333 void unit_add_to_cleanup_queue(Unit
*u
) {
336 if (u
->in_cleanup_queue
)
339 LIST_PREPEND(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
340 u
->in_cleanup_queue
= true;
343 void unit_add_to_gc_queue(Unit
*u
) {
346 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
349 if (unit_check_gc(u
))
352 LIST_PREPEND(gc_queue
, u
->manager
->gc_queue
, u
);
353 u
->in_gc_queue
= true;
355 u
->manager
->n_in_gc_queue
++;
358 void unit_add_to_dbus_queue(Unit
*u
) {
360 assert(u
->type
!= _UNIT_TYPE_INVALID
);
362 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
365 /* Shortcut things if nobody cares */
366 if (sd_bus_track_count(u
->manager
->subscribed
) <= 0 &&
367 set_isempty(u
->manager
->private_buses
)) {
368 u
->sent_dbus_new_signal
= true;
372 LIST_PREPEND(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
373 u
->in_dbus_queue
= true;
376 static void bidi_set_free(Unit
*u
, Set
*s
) {
382 /* Frees the set and makes sure we are dropped from the
383 * inverse pointers */
385 SET_FOREACH(other
, s
, i
) {
388 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
389 set_remove(other
->dependencies
[d
], u
);
391 unit_add_to_gc_queue(other
);
397 static void unit_remove_transient(Unit
*u
) {
405 if (u
->fragment_path
)
406 unlink(u
->fragment_path
);
408 STRV_FOREACH(i
, u
->dropin_paths
) {
409 _cleanup_free_
char *p
= NULL
;
414 r
= path_get_parent(*i
, &p
);
420 static void unit_free_requires_mounts_for(Unit
*u
) {
423 STRV_FOREACH(j
, u
->requires_mounts_for
) {
424 char s
[strlen(*j
) + 1];
426 PATH_FOREACH_PREFIX_MORE(s
, *j
) {
430 x
= hashmap_get2(u
->manager
->units_requiring_mounts_for
, s
, (void**) &y
);
436 if (set_isempty(x
)) {
437 hashmap_remove(u
->manager
->units_requiring_mounts_for
, y
);
444 strv_free(u
->requires_mounts_for
);
445 u
->requires_mounts_for
= NULL
;
448 static void unit_done(Unit
*u
) {
457 if (UNIT_VTABLE(u
)->done
)
458 UNIT_VTABLE(u
)->done(u
);
460 ec
= unit_get_exec_context(u
);
462 exec_context_done(ec
);
464 cc
= unit_get_cgroup_context(u
);
466 cgroup_context_done(cc
);
469 void unit_free(Unit
*u
) {
476 if (u
->manager
->n_reloading
<= 0)
477 unit_remove_transient(u
);
479 bus_unit_send_removed_signal(u
);
483 unit_free_requires_mounts_for(u
);
485 SET_FOREACH(t
, u
->names
, i
)
486 hashmap_remove_value(u
->manager
->units
, t
, u
);
500 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
501 bidi_set_free(u
, u
->dependencies
[d
]);
503 if (u
->type
!= _UNIT_TYPE_INVALID
)
504 LIST_REMOVE(units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
506 if (u
->in_load_queue
)
507 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
509 if (u
->in_dbus_queue
)
510 LIST_REMOVE(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
512 if (u
->in_cleanup_queue
)
513 LIST_REMOVE(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
515 if (u
->in_gc_queue
) {
516 LIST_REMOVE(gc_queue
, u
->manager
->gc_queue
, u
);
517 u
->manager
->n_in_gc_queue
--;
520 if (u
->in_cgroup_queue
)
521 LIST_REMOVE(cgroup_queue
, u
->manager
->cgroup_queue
, u
);
523 if (u
->cgroup_path
) {
524 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
525 free(u
->cgroup_path
);
528 manager_update_failed_units(u
->manager
, u
, false);
529 set_remove(u
->manager
->startup_units
, u
);
531 free(u
->description
);
532 strv_free(u
->documentation
);
533 free(u
->fragment_path
);
534 free(u
->source_path
);
535 strv_free(u
->dropin_paths
);
538 free(u
->job_timeout_reboot_arg
);
540 set_free_free(u
->names
);
542 unit_unwatch_all_pids(u
);
544 condition_free_list(u
->conditions
);
545 condition_free_list(u
->asserts
);
547 unit_ref_unset(&u
->slice
);
550 unit_ref_unset(u
->refs
);
555 UnitActiveState
unit_active_state(Unit
*u
) {
558 if (u
->load_state
== UNIT_MERGED
)
559 return unit_active_state(unit_follow_merge(u
));
561 /* After a reload it might happen that a unit is not correctly
562 * loaded but still has a process around. That's why we won't
563 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
565 return UNIT_VTABLE(u
)->active_state(u
);
568 const char* unit_sub_state_to_string(Unit
*u
) {
571 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
574 static int complete_move(Set
**s
, Set
**other
) {
584 r
= set_move(*s
, *other
);
595 static int merge_names(Unit
*u
, Unit
*other
) {
603 r
= complete_move(&u
->names
, &other
->names
);
607 set_free_free(other
->names
);
611 SET_FOREACH(t
, u
->names
, i
)
612 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
617 static int reserve_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
622 assert(d
< _UNIT_DEPENDENCY_MAX
);
625 * If u does not have this dependency set allocated, there is no need
626 * to reserve anything. In that case other's set will be transferred
627 * as a whole to u by complete_move().
629 if (!u
->dependencies
[d
])
632 /* merge_dependencies() will skip a u-on-u dependency */
633 n_reserve
= set_size(other
->dependencies
[d
]) - !!set_get(other
->dependencies
[d
], u
);
635 return set_reserve(u
->dependencies
[d
], n_reserve
);
638 static void merge_dependencies(Unit
*u
, Unit
*other
, const char *other_id
, UnitDependency d
) {
645 assert(d
< _UNIT_DEPENDENCY_MAX
);
647 /* Fix backwards pointers */
648 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
651 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++) {
652 /* Do not add dependencies between u and itself */
654 if (set_remove(back
->dependencies
[k
], other
))
655 maybe_warn_about_dependency(u
, other_id
, k
);
657 r
= set_remove_and_put(back
->dependencies
[k
], other
, u
);
659 set_remove(back
->dependencies
[k
], other
);
661 assert(r
>= 0 || r
== -ENOENT
);
666 /* Also do not move dependencies on u to itself */
667 back
= set_remove(other
->dependencies
[d
], u
);
669 maybe_warn_about_dependency(u
, other_id
, d
);
671 /* The move cannot fail. The caller must have performed a reservation. */
672 assert_se(complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]) == 0);
674 set_free(other
->dependencies
[d
]);
675 other
->dependencies
[d
] = NULL
;
678 int unit_merge(Unit
*u
, Unit
*other
) {
680 const char *other_id
= NULL
;
685 assert(u
->manager
== other
->manager
);
686 assert(u
->type
!= _UNIT_TYPE_INVALID
);
688 other
= unit_follow_merge(other
);
693 if (u
->type
!= other
->type
)
696 if (!u
->instance
!= !other
->instance
)
699 if (other
->load_state
!= UNIT_STUB
&&
700 other
->load_state
!= UNIT_NOT_FOUND
)
709 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
713 other_id
= strdupa(other
->id
);
715 /* Make reservations to ensure merge_dependencies() won't fail */
716 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
717 r
= reserve_dependencies(u
, other
, d
);
719 * We don't rollback reservations if we fail. We don't have
720 * a way to undo reservations. A reservation is not a leak.
727 r
= merge_names(u
, other
);
731 /* Redirect all references */
733 unit_ref_set(other
->refs
, u
);
735 /* Merge dependencies */
736 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
737 merge_dependencies(u
, other
, other_id
, d
);
739 other
->load_state
= UNIT_MERGED
;
740 other
->merged_into
= u
;
742 /* If there is still some data attached to the other node, we
743 * don't need it anymore, and can free it. */
744 if (other
->load_state
!= UNIT_STUB
)
745 if (UNIT_VTABLE(other
)->done
)
746 UNIT_VTABLE(other
)->done(other
);
748 unit_add_to_dbus_queue(u
);
749 unit_add_to_cleanup_queue(other
);
754 int unit_merge_by_name(Unit
*u
, const char *name
) {
757 _cleanup_free_
char *s
= NULL
;
762 if (unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
766 r
= unit_name_replace_instance(name
, u
->instance
, &s
);
773 other
= manager_get_unit(u
->manager
, name
);
775 return unit_merge(u
, other
);
777 return unit_add_name(u
, name
);
780 Unit
* unit_follow_merge(Unit
*u
) {
783 while (u
->load_state
== UNIT_MERGED
)
784 assert_se(u
= u
->merged_into
);
789 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
795 if (c
->working_directory
) {
796 r
= unit_require_mounts_for(u
, c
->working_directory
);
801 if (c
->root_directory
) {
802 r
= unit_require_mounts_for(u
, c
->root_directory
);
807 if (u
->manager
->running_as
!= MANAGER_SYSTEM
)
810 if (c
->private_tmp
) {
811 r
= unit_require_mounts_for(u
, "/tmp");
815 r
= unit_require_mounts_for(u
, "/var/tmp");
820 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
821 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
822 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
823 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
824 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
825 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
826 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
827 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
828 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
829 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
830 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
831 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
834 /* If syslog or kernel logging is requested, make sure our own
835 * logging daemon is run first. */
837 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
844 const char *unit_description(Unit
*u
) {
848 return u
->description
;
853 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
859 timestamp1
[FORMAT_TIMESTAMP_MAX
],
860 timestamp2
[FORMAT_TIMESTAMP_MAX
],
861 timestamp3
[FORMAT_TIMESTAMP_MAX
],
862 timestamp4
[FORMAT_TIMESTAMP_MAX
],
863 timespan
[FORMAT_TIMESPAN_MAX
];
865 _cleanup_set_free_ Set
*following_set
= NULL
;
869 assert(u
->type
>= 0);
871 prefix
= strempty(prefix
);
872 prefix2
= strjoina(prefix
, "\t");
876 "%s\tDescription: %s\n"
878 "%s\tUnit Load State: %s\n"
879 "%s\tUnit Active State: %s\n"
880 "%s\tInactive Exit Timestamp: %s\n"
881 "%s\tActive Enter Timestamp: %s\n"
882 "%s\tActive Exit Timestamp: %s\n"
883 "%s\tInactive Enter Timestamp: %s\n"
884 "%s\tGC Check Good: %s\n"
885 "%s\tNeed Daemon Reload: %s\n"
886 "%s\tTransient: %s\n"
889 "%s\tCGroup realized: %s\n"
890 "%s\tCGroup mask: 0x%x\n"
891 "%s\tCGroup members mask: 0x%x\n",
893 prefix
, unit_description(u
),
894 prefix
, strna(u
->instance
),
895 prefix
, unit_load_state_to_string(u
->load_state
),
896 prefix
, unit_active_state_to_string(unit_active_state(u
)),
897 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
898 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
899 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
900 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
901 prefix
, yes_no(unit_check_gc(u
)),
902 prefix
, yes_no(unit_need_daemon_reload(u
)),
903 prefix
, yes_no(u
->transient
),
904 prefix
, strna(unit_slice_name(u
)),
905 prefix
, strna(u
->cgroup_path
),
906 prefix
, yes_no(u
->cgroup_realized
),
907 prefix
, u
->cgroup_realized_mask
,
908 prefix
, u
->cgroup_members_mask
);
910 SET_FOREACH(t
, u
->names
, i
)
911 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
913 STRV_FOREACH(j
, u
->documentation
)
914 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
916 following
= unit_following(u
);
918 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
920 r
= unit_following_set(u
, &following_set
);
924 SET_FOREACH(other
, following_set
, i
)
925 fprintf(f
, "%s\tFollowing Set Member: %s\n", prefix
, other
->id
);
928 if (u
->fragment_path
)
929 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
932 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
934 STRV_FOREACH(j
, u
->dropin_paths
)
935 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
937 if (u
->job_timeout
> 0)
938 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
940 if (u
->job_timeout_action
!= FAILURE_ACTION_NONE
)
941 fprintf(f
, "%s\tJob Timeout Action: %s\n", prefix
, failure_action_to_string(u
->job_timeout_action
));
943 if (u
->job_timeout_reboot_arg
)
944 fprintf(f
, "%s\tJob Timeout Reboot Argument: %s\n", prefix
, u
->job_timeout_reboot_arg
);
946 condition_dump_list(u
->conditions
, f
, prefix
, condition_type_to_string
);
947 condition_dump_list(u
->asserts
, f
, prefix
, assert_type_to_string
);
949 if (dual_timestamp_is_set(&u
->condition_timestamp
))
951 "%s\tCondition Timestamp: %s\n"
952 "%s\tCondition Result: %s\n",
953 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
954 prefix
, yes_no(u
->condition_result
));
956 if (dual_timestamp_is_set(&u
->assert_timestamp
))
958 "%s\tAssert Timestamp: %s\n"
959 "%s\tAssert Result: %s\n",
960 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->assert_timestamp
.realtime
)),
961 prefix
, yes_no(u
->assert_result
));
963 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
966 SET_FOREACH(other
, u
->dependencies
[d
], i
)
967 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
970 if (!strv_isempty(u
->requires_mounts_for
)) {
972 "%s\tRequiresMountsFor:", prefix
);
974 STRV_FOREACH(j
, u
->requires_mounts_for
)
975 fprintf(f
, " %s", *j
);
980 if (u
->load_state
== UNIT_LOADED
) {
983 "%s\tStopWhenUnneeded: %s\n"
984 "%s\tRefuseManualStart: %s\n"
985 "%s\tRefuseManualStop: %s\n"
986 "%s\tDefaultDependencies: %s\n"
987 "%s\tOnFailureJobMode: %s\n"
988 "%s\tIgnoreOnIsolate: %s\n"
989 "%s\tIgnoreOnSnapshot: %s\n",
990 prefix
, yes_no(u
->stop_when_unneeded
),
991 prefix
, yes_no(u
->refuse_manual_start
),
992 prefix
, yes_no(u
->refuse_manual_stop
),
993 prefix
, yes_no(u
->default_dependencies
),
994 prefix
, job_mode_to_string(u
->on_failure_job_mode
),
995 prefix
, yes_no(u
->ignore_on_isolate
),
996 prefix
, yes_no(u
->ignore_on_snapshot
));
998 if (UNIT_VTABLE(u
)->dump
)
999 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
1001 } else if (u
->load_state
== UNIT_MERGED
)
1003 "%s\tMerged into: %s\n",
1004 prefix
, u
->merged_into
->id
);
1005 else if (u
->load_state
== UNIT_ERROR
)
1006 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
1010 job_dump(u
->job
, f
, prefix2
);
1013 job_dump(u
->nop_job
, f
, prefix2
);
1017 /* Common implementation for multiple backends */
1018 int unit_load_fragment_and_dropin(Unit
*u
) {
1023 /* Load a .{service,socket,...} file */
1024 r
= unit_load_fragment(u
);
1028 if (u
->load_state
== UNIT_STUB
)
1031 /* Load drop-in directory data */
1032 r
= unit_load_dropin(unit_follow_merge(u
));
1039 /* Common implementation for multiple backends */
1040 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
1045 /* Same as unit_load_fragment_and_dropin(), but whether
1046 * something can be loaded or not doesn't matter. */
1048 /* Load a .service file */
1049 r
= unit_load_fragment(u
);
1053 if (u
->load_state
== UNIT_STUB
)
1054 u
->load_state
= UNIT_LOADED
;
1056 /* Load drop-in directory data */
1057 r
= unit_load_dropin(unit_follow_merge(u
));
1064 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
1068 if (target
->type
!= UNIT_TARGET
)
1071 /* Only add the dependency if both units are loaded, so that
1072 * that loop check below is reliable */
1073 if (u
->load_state
!= UNIT_LOADED
||
1074 target
->load_state
!= UNIT_LOADED
)
1077 /* If either side wants no automatic dependencies, then let's
1079 if (!u
->default_dependencies
||
1080 !target
->default_dependencies
)
1083 /* Don't create loops */
1084 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
1087 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
1090 static int unit_add_target_dependencies(Unit
*u
) {
1092 static const UnitDependency deps
[] = {
1094 UNIT_REQUIRED_BY_OVERRIDABLE
,
1096 UNIT_REQUISITE_OF_OVERRIDABLE
,
1108 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
1109 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
1110 r
= unit_add_default_target_dependency(u
, target
);
1118 static int unit_add_slice_dependencies(Unit
*u
) {
1121 if (!unit_get_cgroup_context(u
))
1124 if (UNIT_ISSET(u
->slice
))
1125 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_WANTS
, UNIT_DEREF(u
->slice
), true);
1127 if (streq(u
->id
, SPECIAL_ROOT_SLICE
))
1130 return unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_WANTS
, SPECIAL_ROOT_SLICE
, NULL
, true);
1133 static int unit_add_mount_dependencies(Unit
*u
) {
1139 STRV_FOREACH(i
, u
->requires_mounts_for
) {
1140 char prefix
[strlen(*i
) + 1];
1142 PATH_FOREACH_PREFIX_MORE(prefix
, *i
) {
1145 r
= manager_get_unit_by_path(u
->manager
, prefix
, ".mount", &m
);
1153 if (m
->load_state
!= UNIT_LOADED
)
1156 r
= unit_add_dependency(u
, UNIT_AFTER
, m
, true);
1160 if (m
->fragment_path
) {
1161 r
= unit_add_dependency(u
, UNIT_REQUIRES
, m
, true);
1171 static int unit_add_startup_units(Unit
*u
) {
1174 c
= unit_get_cgroup_context(u
);
1178 if (c
->startup_cpu_shares
== (unsigned long) -1 &&
1179 c
->startup_blockio_weight
== (unsigned long) -1)
1182 return set_put(u
->manager
->startup_units
, u
);
1185 int unit_load(Unit
*u
) {
1190 if (u
->in_load_queue
) {
1191 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
1192 u
->in_load_queue
= false;
1195 if (u
->type
== _UNIT_TYPE_INVALID
)
1198 if (u
->load_state
!= UNIT_STUB
)
1201 if (UNIT_VTABLE(u
)->load
) {
1202 r
= UNIT_VTABLE(u
)->load(u
);
1207 if (u
->load_state
== UNIT_STUB
) {
1212 if (u
->load_state
== UNIT_LOADED
) {
1214 r
= unit_add_target_dependencies(u
);
1218 r
= unit_add_slice_dependencies(u
);
1222 r
= unit_add_mount_dependencies(u
);
1226 r
= unit_add_startup_units(u
);
1230 if (u
->on_failure_job_mode
== JOB_ISOLATE
&& set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
1231 log_unit_error(u
, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
1236 unit_update_cgroup_members_masks(u
);
1239 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
1241 unit_add_to_dbus_queue(unit_follow_merge(u
));
1242 unit_add_to_gc_queue(u
);
1247 u
->load_state
= u
->load_state
== UNIT_STUB
? UNIT_NOT_FOUND
: UNIT_ERROR
;
1249 unit_add_to_dbus_queue(u
);
1250 unit_add_to_gc_queue(u
);
1252 log_unit_debug_errno(u
, r
, "Failed to load configuration: %m");
1257 static bool unit_condition_test_list(Unit
*u
, Condition
*first
, const char *(*to_string
)(ConditionType t
)) {
1264 /* If the condition list is empty, then it is true */
1268 /* Otherwise, if all of the non-trigger conditions apply and
1269 * if any of the trigger conditions apply (unless there are
1270 * none) we return true */
1271 LIST_FOREACH(conditions
, c
, first
) {
1274 r
= condition_test(c
);
1277 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
1279 c
->trigger
? "|" : "",
1280 c
->negate
? "!" : "",
1286 c
->trigger
? "|" : "",
1287 c
->negate
? "!" : "",
1289 condition_result_to_string(c
->result
));
1291 if (!c
->trigger
&& r
<= 0)
1294 if (c
->trigger
&& triggered
<= 0)
1298 return triggered
!= 0;
1301 static bool unit_condition_test(Unit
*u
) {
1304 dual_timestamp_get(&u
->condition_timestamp
);
1305 u
->condition_result
= unit_condition_test_list(u
, u
->conditions
, condition_type_to_string
);
1307 return u
->condition_result
;
1310 static bool unit_assert_test(Unit
*u
) {
1313 dual_timestamp_get(&u
->assert_timestamp
);
1314 u
->assert_result
= unit_condition_test_list(u
, u
->asserts
, assert_type_to_string
);
1316 return u
->assert_result
;
1319 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1320 const UnitStatusMessageFormats
*format_table
;
1324 assert(t
< _JOB_TYPE_MAX
);
1326 if (t
!= JOB_START
&& t
!= JOB_STOP
)
1329 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1333 return format_table
->starting_stopping
[t
== JOB_STOP
];
1336 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
1341 assert(t
< _JOB_TYPE_MAX
);
1343 format
= unit_get_status_message_format(u
, t
);
1347 /* Return generic strings */
1349 return "Starting %s.";
1350 else if (t
== JOB_STOP
)
1351 return "Stopping %s.";
1352 else if (t
== JOB_RELOAD
)
1353 return "Reloading %s.";
1358 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1363 /* We only print status messages for selected units on
1364 * selected operations. */
1366 format
= unit_get_status_message_format(u
, t
);
1370 DISABLE_WARNING_FORMAT_NONLITERAL
;
1371 unit_status_printf(u
, "", format
);
1375 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1382 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1385 if (log_on_console())
1388 /* We log status messages for all units and all operations. */
1390 format
= unit_get_status_message_format_try_harder(u
, t
);
1394 DISABLE_WARNING_FORMAT_NONLITERAL
;
1395 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1398 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1399 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1400 SD_MESSAGE_UNIT_RELOADING
;
1402 /* Note that we deliberately use LOG_MESSAGE() instead of
1403 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1404 * closely what is written to screen using the status output,
1405 * which is supposed the highest level, friendliest output
1406 * possible, which means we should avoid the low-level unit
1408 log_struct(LOG_INFO
,
1409 LOG_MESSAGE_ID(mid
),
1411 LOG_MESSAGE("%s", buf
),
1416 * -EBADR: This unit type does not support starting.
1417 * -EALREADY: Unit is already started.
1418 * -EAGAIN: An operation is already in progress. Retry later.
1419 * -ECANCELED: Too many requests for now.
1420 * -EPROTO: Assert failed
1422 int unit_start(Unit
*u
) {
1423 UnitActiveState state
;
1429 if (u
->load_state
!= UNIT_LOADED
)
1432 /* If this is already started, then this will succeed. Note
1433 * that this will even succeed if this unit is not startable
1434 * by the user. This is relied on to detect when we need to
1435 * wait for units and when waiting is finished. */
1436 state
= unit_active_state(u
);
1437 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1440 /* If the conditions failed, don't do anything at all. If we
1441 * already are activating this call might still be useful to
1442 * speed up activation in case there is some hold-off time,
1443 * but we don't want to recheck the condition in that case. */
1444 if (state
!= UNIT_ACTIVATING
&&
1445 !unit_condition_test(u
)) {
1446 log_unit_debug(u
, "Starting requested but condition failed. Not starting unit.");
1450 /* If the asserts failed, fail the entire job */
1451 if (state
!= UNIT_ACTIVATING
&&
1452 !unit_assert_test(u
)) {
1453 log_unit_notice(u
, "Starting requested but asserts failed.");
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 (!unit_supported(u
))
1467 /* If it is stopped, but we cannot start it, then fail */
1468 if (!UNIT_VTABLE(u
)->start
)
1471 /* We don't suppress calls to ->start() here when we are
1472 * already starting, to allow this request to be used as a
1473 * "hurry up" call, for example when the unit is in some "auto
1474 * restart" state where it waits for a holdoff timer to elapse
1475 * before it will start again. */
1477 unit_add_to_dbus_queue(u
);
1479 r
= UNIT_VTABLE(u
)->start(u
);
1483 /* Log if the start function actually did something */
1484 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1485 unit_status_print_starting_stopping(u
, JOB_START
);
1489 bool unit_can_start(Unit
*u
) {
1492 return !!UNIT_VTABLE(u
)->start
;
1495 bool unit_can_isolate(Unit
*u
) {
1498 return unit_can_start(u
) &&
1503 * -EBADR: This unit type does not support stopping.
1504 * -EALREADY: Unit is already stopped.
1505 * -EAGAIN: An operation is already in progress. Retry later.
1507 int unit_stop(Unit
*u
) {
1508 UnitActiveState state
;
1514 state
= unit_active_state(u
);
1515 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1518 following
= unit_following(u
);
1520 log_unit_debug(u
, "Redirecting stop request from %s to %s.", u
->id
, following
->id
);
1521 return unit_stop(following
);
1524 if (!UNIT_VTABLE(u
)->stop
)
1527 unit_add_to_dbus_queue(u
);
1529 r
= UNIT_VTABLE(u
)->stop(u
);
1533 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1534 unit_status_print_starting_stopping(u
, JOB_STOP
);
1539 * -EBADR: This unit type does not support reloading.
1540 * -ENOEXEC: Unit is not started.
1541 * -EAGAIN: An operation is already in progress. Retry later.
1543 int unit_reload(Unit
*u
) {
1544 UnitActiveState state
;
1550 if (u
->load_state
!= UNIT_LOADED
)
1553 if (!unit_can_reload(u
))
1556 state
= unit_active_state(u
);
1557 if (state
== UNIT_RELOADING
)
1560 if (state
!= UNIT_ACTIVE
) {
1561 log_unit_warning(u
, "Unit cannot be reloaded because it is inactive.");
1565 following
= unit_following(u
);
1567 log_unit_debug(u
, "Redirecting reload request from %s to %s.", u
->id
, following
->id
);
1568 return unit_reload(following
);
1571 unit_add_to_dbus_queue(u
);
1573 r
= UNIT_VTABLE(u
)->reload(u
);
1577 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1581 bool unit_can_reload(Unit
*u
) {
1584 if (!UNIT_VTABLE(u
)->reload
)
1587 if (!UNIT_VTABLE(u
)->can_reload
)
1590 return UNIT_VTABLE(u
)->can_reload(u
);
1593 static void unit_check_unneeded(Unit
*u
) {
1595 static const UnitDependency needed_dependencies
[] = {
1597 UNIT_REQUIRED_BY_OVERRIDABLE
,
1599 UNIT_REQUISITE_OF_OVERRIDABLE
,
1611 /* If this service shall be shut down when unneeded then do
1614 if (!u
->stop_when_unneeded
)
1617 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1620 for (j
= 0; j
< ELEMENTSOF(needed_dependencies
); j
++)
1621 SET_FOREACH(other
, u
->dependencies
[j
], i
)
1622 if (unit_active_or_pending(other
))
1625 log_unit_info(u
, "Unit not needed anymore. Stopping.");
1627 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1628 r
= manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1630 log_unit_warning_errno(u
, r
, "Failed to enqueue stop job, ignoring: %m");
1633 static void unit_check_binds_to(Unit
*u
) {
1643 if (unit_active_state(u
) != UNIT_ACTIVE
)
1646 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
) {
1650 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
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 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1667 static void retroactively_start_dependencies(Unit
*u
) {
1672 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1674 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1675 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1676 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1677 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1679 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1680 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1681 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1682 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1684 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1685 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1686 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1687 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1689 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1690 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1691 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1692 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1694 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1695 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1696 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1698 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1699 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1700 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1703 static void retroactively_stop_dependencies(Unit
*u
) {
1708 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1710 /* Pull down units which are bound to us recursively if enabled */
1711 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1712 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1713 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1716 static void check_unneeded_dependencies(Unit
*u
) {
1721 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1723 /* Garbage collect services that might not be needed anymore, if enabled */
1724 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1725 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1726 unit_check_unneeded(other
);
1727 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1728 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1729 unit_check_unneeded(other
);
1730 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1731 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1732 unit_check_unneeded(other
);
1733 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1734 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1735 unit_check_unneeded(other
);
1736 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1737 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1738 unit_check_unneeded(other
);
1739 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1740 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1741 unit_check_unneeded(other
);
1744 void unit_start_on_failure(Unit
*u
) {
1750 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1753 log_unit_info(u
, "Triggering OnFailure= dependencies.");
1755 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1758 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1760 log_unit_error_errno(u
, r
, "Failed to enqueue OnFailure= job: %m");
1764 void unit_trigger_notify(Unit
*u
) {
1770 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1771 if (UNIT_VTABLE(other
)->trigger_notify
)
1772 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1775 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1780 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1781 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1783 /* Note that this is called for all low-level state changes,
1784 * even if they might map to the same high-level
1785 * UnitActiveState! That means that ns == os is an expected
1786 * behavior here. For example: if a mount point is remounted
1787 * this function will be called too! */
1791 /* Update timestamps for state changes */
1792 if (m
->n_reloading
<= 0) {
1795 dual_timestamp_get(&ts
);
1797 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1798 u
->inactive_exit_timestamp
= ts
;
1799 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1800 u
->inactive_enter_timestamp
= ts
;
1802 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1803 u
->active_enter_timestamp
= ts
;
1804 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1805 u
->active_exit_timestamp
= ts
;
1808 /* Keep track of failed units */
1809 manager_update_failed_units(u
->manager
, u
, ns
== UNIT_FAILED
);
1811 /* Make sure the cgroup is always removed when we become inactive */
1812 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1813 unit_destroy_cgroup_if_empty(u
);
1815 /* Note that this doesn't apply to RemainAfterExit services exiting
1816 * successfully, since there's no change of state in that case. Which is
1817 * why it is handled in service_set_state() */
1818 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1821 ec
= unit_get_exec_context(u
);
1822 if (ec
&& exec_context_may_touch_console(ec
)) {
1823 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1826 if (m
->n_on_console
== 0)
1827 /* unset no_console_output flag, since the console is free */
1828 m
->no_console_output
= false;
1837 if (u
->job
->state
== JOB_WAITING
)
1839 /* So we reached a different state for this
1840 * job. Let's see if we can run it now if it
1841 * failed previously due to EAGAIN. */
1842 job_add_to_run_queue(u
->job
);
1844 /* Let's check whether this state change constitutes a
1845 * finished job, or maybe contradicts a running job and
1846 * hence needs to invalidate jobs. */
1848 switch (u
->job
->type
) {
1851 case JOB_VERIFY_ACTIVE
:
1853 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1854 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1855 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1858 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1859 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1865 case JOB_RELOAD_OR_START
:
1867 if (u
->job
->state
== JOB_RUNNING
) {
1868 if (ns
== UNIT_ACTIVE
)
1869 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1870 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1873 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1874 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1882 case JOB_TRY_RESTART
:
1884 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1885 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1886 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1888 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1894 assert_not_reached("Job type unknown");
1900 if (m
->n_reloading
<= 0) {
1902 /* If this state change happened without being
1903 * requested by a job, then let's retroactively start
1904 * or stop dependencies. We skip that step when
1905 * deserializing, since we don't want to create any
1906 * additional jobs just because something is already
1910 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1911 retroactively_start_dependencies(u
);
1912 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1913 retroactively_stop_dependencies(u
);
1916 /* stop unneeded units regardless if going down was expected or not */
1917 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1918 check_unneeded_dependencies(u
);
1920 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1921 log_unit_notice(u
, "Unit entered failed state.");
1922 unit_start_on_failure(u
);
1926 /* Some names are special */
1927 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1929 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1930 /* The bus might have just become available,
1931 * hence try to connect to it, if we aren't
1935 if (u
->type
== UNIT_SERVICE
&&
1936 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1937 m
->n_reloading
<= 0) {
1938 /* Write audit record if we have just finished starting up */
1939 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1943 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1944 manager_send_unit_plymouth(m
, u
);
1948 /* We don't care about D-Bus here, since we'll get an
1949 * asynchronous notification for it anyway. */
1951 if (u
->type
== UNIT_SERVICE
&&
1952 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1953 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1954 m
->n_reloading
<= 0) {
1956 /* Hmm, if there was no start record written
1957 * write it now, so that we always have a nice
1960 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1962 if (ns
== UNIT_INACTIVE
)
1963 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1965 /* Write audit record if we have just finished shutting down */
1966 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1968 u
->in_audit
= false;
1972 manager_recheck_journal(m
);
1973 unit_trigger_notify(u
);
1975 if (u
->manager
->n_reloading
<= 0) {
1976 /* Maybe we finished startup and are now ready for
1977 * being stopped because unneeded? */
1978 unit_check_unneeded(u
);
1980 /* Maybe we finished startup, but something we needed
1981 * has vanished? Let's die then. (This happens when
1982 * something BindsTo= to a Type=oneshot unit, as these
1983 * units go directly from starting to inactive,
1984 * without ever entering started.) */
1985 unit_check_binds_to(u
);
1988 unit_add_to_dbus_queue(u
);
1989 unit_add_to_gc_queue(u
);
1992 int unit_watch_pid(Unit
*u
, pid_t pid
) {
1998 /* Watch a specific PID. We only support one or two units
1999 * watching each PID for now, not more. */
2001 r
= set_ensure_allocated(&u
->pids
, NULL
);
2005 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
2009 r
= hashmap_put(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2011 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
2015 r
= hashmap_put(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2018 q
= set_put(u
->pids
, LONG_TO_PTR(pid
));
2025 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
2029 hashmap_remove_value(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2030 hashmap_remove_value(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2031 set_remove(u
->pids
, LONG_TO_PTR(pid
));
2034 void unit_unwatch_all_pids(Unit
*u
) {
2037 while (!set_isempty(u
->pids
))
2038 unit_unwatch_pid(u
, PTR_TO_LONG(set_first(u
->pids
)));
2044 static int unit_watch_pids_in_path(Unit
*u
, const char *path
) {
2045 _cleanup_closedir_
DIR *d
= NULL
;
2046 _cleanup_fclose_
FILE *f
= NULL
;
2052 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
2054 r
= cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER
, path
, &f
);
2058 while ((r
= cg_read_pid(f
, &pid
)) > 0) {
2059 r
= unit_watch_pid(u
, pid
);
2060 if (r
< 0 && ret
>= 0)
2063 if (r
< 0 && ret
>= 0)
2066 } else if (ret
>= 0)
2069 r
= cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER
, path
, &d
);
2073 while ((r
= cg_read_subgroup(d
, &fn
)) > 0) {
2074 _cleanup_free_
char *p
= NULL
;
2076 p
= strjoin(path
, "/", fn
, NULL
);
2082 r
= unit_watch_pids_in_path(u
, p
);
2083 if (r
< 0 && ret
>= 0)
2086 if (r
< 0 && ret
>= 0)
2089 } else if (ret
>= 0)
2095 int unit_watch_all_pids(Unit
*u
) {
2098 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
2100 if (!u
->cgroup_path
)
2103 return unit_watch_pids_in_path(u
, u
->cgroup_path
);
2106 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2112 /* Cleans dead PIDs from our list */
2114 SET_FOREACH(e
, u
->pids
, i
) {
2115 pid_t pid
= PTR_TO_LONG(e
);
2117 if (pid
== except1
|| pid
== except2
)
2120 if (!pid_is_unwaited(pid
))
2121 unit_unwatch_pid(u
, pid
);
2125 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2127 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2131 case JOB_VERIFY_ACTIVE
:
2138 case JOB_TRY_RESTART
:
2139 return unit_can_start(u
);
2142 return unit_can_reload(u
);
2144 case JOB_RELOAD_OR_START
:
2145 return unit_can_reload(u
) && unit_can_start(u
);
2148 assert_not_reached("Invalid job type");
2152 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
) {
2155 /* Only warn about some unit types */
2156 if (!IN_SET(dependency
, UNIT_CONFLICTS
, UNIT_CONFLICTED_BY
, UNIT_BEFORE
, UNIT_AFTER
, UNIT_ON_FAILURE
, UNIT_TRIGGERS
, UNIT_TRIGGERED_BY
))
2159 if (streq_ptr(u
->id
, other
))
2160 log_unit_warning(u
, "Dependency %s=%s dropped", unit_dependency_to_string(dependency
), u
->id
);
2162 log_unit_warning(u
, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency
), strna(other
), u
->id
);
2165 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2167 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2168 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2169 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2170 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2171 [UNIT_REQUISITE
] = UNIT_REQUISITE_OF
,
2172 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUISITE_OF_OVERRIDABLE
,
2173 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2174 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2175 [UNIT_REQUIRED_BY
] = UNIT_REQUIRES
,
2176 [UNIT_REQUIRED_BY_OVERRIDABLE
] = UNIT_REQUIRES_OVERRIDABLE
,
2177 [UNIT_REQUISITE_OF
] = UNIT_REQUISITE
,
2178 [UNIT_REQUISITE_OF_OVERRIDABLE
] = UNIT_REQUISITE_OVERRIDABLE
,
2179 [UNIT_WANTED_BY
] = UNIT_WANTS
,
2180 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2181 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2182 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2183 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2184 [UNIT_BEFORE
] = UNIT_AFTER
,
2185 [UNIT_AFTER
] = UNIT_BEFORE
,
2186 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2187 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2188 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2189 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2190 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2191 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2192 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2193 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2195 int r
, q
= 0, v
= 0, w
= 0;
2196 Unit
*orig_u
= u
, *orig_other
= other
;
2199 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2202 u
= unit_follow_merge(u
);
2203 other
= unit_follow_merge(other
);
2205 /* We won't allow dependencies on ourselves. We will not
2206 * consider them an error however. */
2208 maybe_warn_about_dependency(orig_u
, orig_other
->id
, d
);
2212 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2216 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2217 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2222 if (add_reference
) {
2223 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2227 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2232 q
= set_put(u
->dependencies
[d
], other
);
2236 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2237 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2244 if (add_reference
) {
2245 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2251 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2256 unit_add_to_dbus_queue(u
);
2261 set_remove(u
->dependencies
[d
], other
);
2264 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2267 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2272 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2277 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2281 return unit_add_dependency(u
, e
, other
, add_reference
);
2284 static int resolve_template(Unit
*u
, const char *name
, const char*path
, char **buf
, const char **ret
) {
2288 assert(name
|| path
);
2293 name
= basename(path
);
2295 if (!unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
2302 r
= unit_name_replace_instance(name
, u
->instance
, buf
);
2304 _cleanup_free_
char *i
= NULL
;
2306 r
= unit_name_to_prefix(u
->id
, &i
);
2310 r
= unit_name_replace_instance(name
, i
, buf
);
2319 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2320 _cleanup_free_
char *buf
= NULL
;
2325 assert(name
|| path
);
2327 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2331 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2335 return unit_add_dependency(u
, d
, other
, add_reference
);
2338 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2339 _cleanup_free_
char *buf
= NULL
;
2344 assert(name
|| path
);
2346 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2350 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2354 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2357 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2358 _cleanup_free_
char *buf
= NULL
;
2363 assert(name
|| path
);
2365 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2369 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2373 return unit_add_dependency(other
, d
, u
, add_reference
);
2376 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2377 _cleanup_free_
char *buf
= NULL
;
2382 assert(name
|| path
);
2384 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2388 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2392 return unit_add_two_dependencies(other
, d
, e
, u
, add_reference
);
2395 int set_unit_path(const char *p
) {
2396 /* This is mostly for debug purposes */
2397 if (setenv("SYSTEMD_UNIT_PATH", p
, 0) < 0)
2403 char *unit_dbus_path(Unit
*u
) {
2409 return unit_dbus_path_from_name(u
->id
);
2412 char *unit_default_cgroup_path(Unit
*u
) {
2413 _cleanup_free_
char *escaped
= NULL
, *slice
= NULL
;
2418 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
2419 return strdup(u
->manager
->cgroup_root
);
2421 if (UNIT_ISSET(u
->slice
) && !unit_has_name(UNIT_DEREF(u
->slice
), SPECIAL_ROOT_SLICE
)) {
2422 r
= cg_slice_to_path(UNIT_DEREF(u
->slice
)->id
, &slice
);
2427 escaped
= cg_escape(u
->id
);
2432 return strjoin(u
->manager
->cgroup_root
, "/", slice
, "/", escaped
, NULL
);
2434 return strjoin(u
->manager
->cgroup_root
, "/", escaped
, NULL
);
2437 int unit_add_default_slice(Unit
*u
, CGroupContext
*c
) {
2438 _cleanup_free_
char *b
= NULL
;
2439 const char *slice_name
;
2446 if (UNIT_ISSET(u
->slice
))
2450 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2452 /* Implicitly place all instantiated units in their
2453 * own per-template slice */
2455 r
= unit_name_to_prefix(u
->id
, &prefix
);
2459 /* The prefix is already escaped, but it might include
2460 * "-" which has a special meaning for slice units,
2461 * hence escape it here extra. */
2462 escaped
= unit_name_escape(prefix
);
2466 if (u
->manager
->running_as
== MANAGER_SYSTEM
)
2467 b
= strjoin("system-", escaped
, ".slice", NULL
);
2469 b
= strappend(escaped
, ".slice");
2476 u
->manager
->running_as
== MANAGER_SYSTEM
2477 ? SPECIAL_SYSTEM_SLICE
2478 : SPECIAL_ROOT_SLICE
;
2480 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2484 unit_ref_set(&u
->slice
, slice
);
2488 const char *unit_slice_name(Unit
*u
) {
2491 if (!UNIT_ISSET(u
->slice
))
2494 return UNIT_DEREF(u
->slice
)->id
;
2497 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2498 _cleanup_free_
char *t
= NULL
;
2505 r
= unit_name_change_suffix(u
->id
, type
, &t
);
2508 if (unit_has_name(u
, t
))
2511 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2512 assert(r
< 0 || *_found
!= u
);
2516 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2520 /* Watch a specific name on the bus. We only support one unit
2521 * watching each name for now. */
2523 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2526 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2530 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2533 bool unit_can_serialize(Unit
*u
) {
2536 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2539 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2546 if (unit_can_serialize(u
)) {
2549 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2553 rt
= unit_get_exec_runtime(u
);
2555 r
= exec_runtime_serialize(u
, rt
, f
, fds
);
2561 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2562 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2563 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2564 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2565 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2566 dual_timestamp_serialize(f
, "assert-timestamp", &u
->assert_timestamp
);
2568 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2569 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2571 if (dual_timestamp_is_set(&u
->assert_timestamp
))
2572 unit_serialize_item(u
, f
, "assert-result", yes_no(u
->assert_result
));
2574 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2575 unit_serialize_item_format(u
, f
, "cpuacct-usage-base", "%" PRIu64
, u
->cpuacct_usage_base
);
2578 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2580 if (serialize_jobs
) {
2582 fprintf(f
, "job\n");
2583 job_serialize(u
->job
, f
, fds
);
2587 fprintf(f
, "job\n");
2588 job_serialize(u
->nop_job
, f
, fds
);
2597 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2608 va_start(ap
, format
);
2609 vfprintf(f
, format
, ap
);
2615 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2621 fprintf(f
, "%s=%s\n", key
, value
);
2624 static int unit_set_cgroup_path(Unit
*u
, const char *path
) {
2625 _cleanup_free_
char *p
= NULL
;
2637 if (streq_ptr(u
->cgroup_path
, p
))
2641 r
= hashmap_put(u
->manager
->cgroup_unit
, p
, u
);
2646 if (u
->cgroup_path
) {
2647 log_unit_debug(u
, "Changing cgroup path from %s to %s.", u
->cgroup_path
, strna(p
));
2648 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
2649 free(u
->cgroup_path
);
2658 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2659 ExecRuntime
**rt
= NULL
;
2667 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2669 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2672 char line
[LINE_MAX
], *l
, *v
;
2675 if (!fgets(line
, sizeof(line
), f
)) {
2688 k
= strcspn(l
, "=");
2696 if (streq(l
, "job")) {
2698 /* new-style serialized job */
2705 r
= job_deserialize(j
, f
, fds
);
2711 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2717 r
= job_install_deserialized(j
);
2719 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2727 type
= job_type_from_string(v
);
2729 log_unit_debug(u
, "Failed to parse job type value: %s", v
);
2731 u
->deserialized_job
= type
;
2734 } else if (streq(l
, "inactive-exit-timestamp")) {
2735 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2737 } else if (streq(l
, "active-enter-timestamp")) {
2738 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2740 } else if (streq(l
, "active-exit-timestamp")) {
2741 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2743 } else if (streq(l
, "inactive-enter-timestamp")) {
2744 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2746 } else if (streq(l
, "condition-timestamp")) {
2747 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2749 } else if (streq(l
, "assert-timestamp")) {
2750 dual_timestamp_deserialize(v
, &u
->assert_timestamp
);
2752 } else if (streq(l
, "condition-result")) {
2754 r
= parse_boolean(v
);
2756 log_unit_debug(u
, "Failed to parse condition result value %s, ignoring.", v
);
2758 u
->condition_result
= r
;
2762 } else if (streq(l
, "assert-result")) {
2764 r
= parse_boolean(v
);
2766 log_unit_debug(u
, "Failed to parse assert result value %s, ignoring.", v
);
2768 u
->assert_result
= r
;
2772 } else if (streq(l
, "transient")) {
2774 r
= parse_boolean(v
);
2776 log_unit_debug(u
, "Failed to parse transient bool %s, ignoring.", v
);
2782 } else if (streq(l
, "cpuacct-usage-base")) {
2784 r
= safe_atou64(v
, &u
->cpuacct_usage_base
);
2786 log_unit_debug(u
, "Failed to parse CPU usage %s, ignoring.", v
);
2790 } else if (streq(l
, "cgroup")) {
2792 r
= unit_set_cgroup_path(u
, v
);
2794 log_unit_debug_errno(u
, r
, "Failed to set cgroup path %s, ignoring: %m", v
);
2799 if (unit_can_serialize(u
)) {
2801 r
= exec_runtime_deserialize_item(u
, rt
, l
, v
, fds
);
2803 log_unit_warning(u
, "Failed to deserialize runtime parameter '%s', ignoring.", l
);
2807 /* Returns positive if key was handled by the call */
2812 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2814 log_unit_warning(u
, "Failed to deserialize unit parameter '%s', ignoring.", l
);
2819 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2821 _cleanup_free_
char *e
= NULL
;
2826 /* Adds in links to the device node that this unit is based on */
2830 if (!is_device_path(what
))
2833 /* When device units aren't supported (such as in a
2834 * container), don't create dependencies on them. */
2835 if (!unit_type_supported(UNIT_DEVICE
))
2838 r
= unit_name_from_path(what
, ".device", &e
);
2842 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2846 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_BINDS_TO
: UNIT_WANTS
, device
, true);
2851 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2859 int unit_coldplug(Unit
*u
) {
2864 /* Make sure we don't enter a loop, when coldplugging
2869 u
->coldplugged
= true;
2871 if (UNIT_VTABLE(u
)->coldplug
) {
2872 r
= UNIT_VTABLE(u
)->coldplug(u
);
2878 r
= job_coldplug(u
->job
);
2881 } else if (u
->deserialized_job
>= 0) {
2883 r
= manager_add_job(u
->manager
, u
->deserialized_job
, u
, JOB_IGNORE_REQUIREMENTS
, false, NULL
, NULL
);
2887 u
->deserialized_job
= _JOB_TYPE_INVALID
;
2893 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2894 DISABLE_WARNING_FORMAT_NONLITERAL
;
2895 manager_status_printf(u
->manager
, STATUS_TYPE_NORMAL
,
2896 status
, unit_status_msg_format
, unit_description(u
));
2900 bool unit_need_daemon_reload(Unit
*u
) {
2901 _cleanup_strv_free_
char **t
= NULL
;
2904 unsigned loaded_cnt
, current_cnt
;
2908 if (u
->fragment_path
) {
2910 if (stat(u
->fragment_path
, &st
) < 0)
2911 /* What, cannot access this anymore? */
2914 if (u
->fragment_mtime
> 0 &&
2915 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2919 if (u
->source_path
) {
2921 if (stat(u
->source_path
, &st
) < 0)
2924 if (u
->source_mtime
> 0 &&
2925 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2929 (void) unit_find_dropin_paths(u
, &t
);
2930 loaded_cnt
= strv_length(t
);
2931 current_cnt
= strv_length(u
->dropin_paths
);
2933 if (loaded_cnt
== current_cnt
) {
2934 if (loaded_cnt
== 0)
2937 if (strv_overlap(u
->dropin_paths
, t
)) {
2938 STRV_FOREACH(path
, u
->dropin_paths
) {
2940 if (stat(*path
, &st
) < 0)
2943 if (u
->dropin_mtime
> 0 &&
2944 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2955 void unit_reset_failed(Unit
*u
) {
2958 if (UNIT_VTABLE(u
)->reset_failed
)
2959 UNIT_VTABLE(u
)->reset_failed(u
);
2962 Unit
*unit_following(Unit
*u
) {
2965 if (UNIT_VTABLE(u
)->following
)
2966 return UNIT_VTABLE(u
)->following(u
);
2971 bool unit_stop_pending(Unit
*u
) {
2974 /* This call does check the current state of the unit. It's
2975 * hence useful to be called from state change calls of the
2976 * unit itself, where the state isn't updated yet. This is
2977 * different from unit_inactive_or_pending() which checks both
2978 * the current state and for a queued job. */
2980 return u
->job
&& u
->job
->type
== JOB_STOP
;
2983 bool unit_inactive_or_pending(Unit
*u
) {
2986 /* Returns true if the unit is inactive or going down */
2988 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
2991 if (unit_stop_pending(u
))
2997 bool unit_active_or_pending(Unit
*u
) {
3000 /* Returns true if the unit is active or going up */
3002 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
3006 (u
->job
->type
== JOB_START
||
3007 u
->job
->type
== JOB_RELOAD_OR_START
||
3008 u
->job
->type
== JOB_RESTART
))
3014 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
3016 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
3018 assert(signo
< _NSIG
);
3020 if (!UNIT_VTABLE(u
)->kill
)
3023 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
3026 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
3030 pid_set
= set_new(NULL
);
3034 /* Exclude the main/control pids from being killed via the cgroup */
3036 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
3041 if (control_pid
> 0) {
3042 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
3054 int unit_kill_common(
3060 sd_bus_error
*error
) {
3064 if (who
== KILL_MAIN
&& main_pid
<= 0) {
3066 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
3068 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
3071 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
3072 if (control_pid
< 0)
3073 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
3075 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
3078 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
3079 if (control_pid
> 0)
3080 if (kill(control_pid
, signo
) < 0)
3083 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
3085 if (kill(main_pid
, signo
) < 0)
3088 if (who
== KILL_ALL
&& u
->cgroup_path
) {
3089 _cleanup_set_free_ Set
*pid_set
= NULL
;
3092 /* Exclude the main/control pids from being killed via the cgroup */
3093 pid_set
= unit_pid_set(main_pid
, control_pid
);
3097 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, true, false, pid_set
);
3098 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
3105 int unit_following_set(Unit
*u
, Set
**s
) {
3109 if (UNIT_VTABLE(u
)->following_set
)
3110 return UNIT_VTABLE(u
)->following_set(u
, s
);
3116 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
3119 if (u
->unit_file_state
< 0 && u
->fragment_path
)
3120 u
->unit_file_state
= unit_file_get_state(
3121 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3122 NULL
, basename(u
->fragment_path
));
3124 return u
->unit_file_state
;
3127 int unit_get_unit_file_preset(Unit
*u
) {
3130 if (u
->unit_file_preset
< 0 && u
->fragment_path
)
3131 u
->unit_file_preset
= unit_file_query_preset(
3132 u
->manager
->running_as
== MANAGER_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3133 NULL
, basename(u
->fragment_path
));
3135 return u
->unit_file_preset
;
3138 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3143 unit_ref_unset(ref
);
3146 LIST_PREPEND(refs
, u
->refs
, ref
);
3150 void unit_ref_unset(UnitRef
*ref
) {
3156 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3160 int unit_patch_contexts(Unit
*u
) {
3168 /* Patch in the manager defaults into the exec and cgroup
3169 * contexts, _after_ the rest of the settings have been
3172 ec
= unit_get_exec_context(u
);
3174 /* This only copies in the ones that need memory */
3175 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3176 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3177 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3182 if (u
->manager
->running_as
== MANAGER_USER
&&
3183 !ec
->working_directory
) {
3185 r
= get_home_dir(&ec
->working_directory
);
3189 /* Allow user services to run, even if the
3190 * home directory is missing */
3191 ec
->working_directory_missing_ok
= true;
3194 if (u
->manager
->running_as
== MANAGER_USER
&&
3195 (ec
->syscall_whitelist
||
3196 !set_isempty(ec
->syscall_filter
) ||
3197 !set_isempty(ec
->syscall_archs
) ||
3198 ec
->address_families_whitelist
||
3199 !set_isempty(ec
->address_families
)))
3200 ec
->no_new_privileges
= true;
3202 if (ec
->private_devices
)
3203 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3206 cc
= unit_get_cgroup_context(u
);
3210 ec
->private_devices
&&
3211 cc
->device_policy
== CGROUP_AUTO
)
3212 cc
->device_policy
= CGROUP_CLOSED
;
3218 ExecContext
*unit_get_exec_context(Unit
*u
) {
3225 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3229 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3232 KillContext
*unit_get_kill_context(Unit
*u
) {
3239 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3243 return (KillContext
*) ((uint8_t*) u
+ offset
);
3246 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3252 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3256 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3259 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3265 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3269 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3272 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3273 if (u
->manager
->running_as
== MANAGER_USER
) {
3276 if (mode
== UNIT_PERSISTENT
&& !transient
)
3277 r
= user_config_home(dir
);
3279 r
= user_runtime_dir(dir
);
3286 if (mode
== UNIT_PERSISTENT
&& !transient
)
3287 *dir
= strdup("/etc/systemd/system");
3289 *dir
= strdup("/run/systemd/system");
3296 static int unit_drop_in_file(Unit
*u
,
3297 UnitSetPropertiesMode mode
, const char *name
, char **p
, char **q
) {
3298 _cleanup_free_
char *dir
= NULL
;
3303 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3307 return drop_in_file(dir
, u
->id
, 50, name
, p
, q
);
3310 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3312 _cleanup_free_
char *dir
= NULL
, *p
= NULL
, *q
= NULL
;
3317 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3320 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3324 r
= write_drop_in(dir
, u
->id
, 50, name
, data
);
3328 r
= drop_in_file(dir
, u
->id
, 50, name
, &p
, &q
);
3332 r
= strv_extend(&u
->dropin_paths
, q
);
3336 strv_sort(u
->dropin_paths
);
3337 strv_uniq(u
->dropin_paths
);
3339 u
->dropin_mtime
= now(CLOCK_REALTIME
);
3344 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3345 _cleanup_free_
char *p
= NULL
;
3353 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3356 va_start(ap
, format
);
3357 r
= vasprintf(&p
, format
, ap
);
3363 return unit_write_drop_in(u
, mode
, name
, p
);
3366 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3367 _cleanup_free_
char *ndata
= NULL
;
3373 if (!UNIT_VTABLE(u
)->private_section
)
3376 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3379 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3383 return unit_write_drop_in(u
, mode
, name
, ndata
);
3386 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3387 _cleanup_free_
char *p
= NULL
;
3395 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3398 va_start(ap
, format
);
3399 r
= vasprintf(&p
, format
, ap
);
3405 return unit_write_drop_in_private(u
, mode
, name
, p
);
3408 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
3409 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
3414 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3417 r
= unit_drop_in_file(u
, mode
, name
, &p
, &q
);
3422 r
= errno
== ENOENT
? 0 : -errno
;
3430 int unit_make_transient(Unit
*u
) {
3435 u
->load_state
= UNIT_STUB
;
3437 u
->transient
= true;
3439 free(u
->fragment_path
);
3440 u
->fragment_path
= NULL
;
3442 if (u
->manager
->running_as
== MANAGER_USER
) {
3443 _cleanup_free_
char *c
= NULL
;
3445 r
= user_runtime_dir(&c
);
3451 u
->fragment_path
= strjoin(c
, "/", u
->id
, NULL
);
3452 if (!u
->fragment_path
)
3457 u
->fragment_path
= strappend("/run/systemd/system/", u
->id
);
3458 if (!u
->fragment_path
)
3461 mkdir_p("/run/systemd/system", 0755);
3464 return write_string_file_atomic_label(u
->fragment_path
, "# Transient stub");
3467 int unit_kill_context(
3473 bool main_pid_alien
) {
3475 int sig
, wait_for_exit
= false, r
;
3480 if (c
->kill_mode
== KILL_NONE
)
3490 case KILL_TERMINATE
:
3491 sig
= c
->kill_signal
;
3494 assert_not_reached("KillOperation unknown");
3498 r
= kill_and_sigcont(main_pid
, sig
);
3500 if (r
< 0 && r
!= -ESRCH
) {
3501 _cleanup_free_
char *comm
= NULL
;
3502 get_process_comm(main_pid
, &comm
);
3504 log_unit_warning_errno(u
, r
, "Failed to kill main process " PID_FMT
" (%s): %m", main_pid
, strna(comm
));
3506 if (!main_pid_alien
)
3507 wait_for_exit
= true;
3509 if (c
->send_sighup
&& k
!= KILL_KILL
)
3510 kill(main_pid
, SIGHUP
);
3514 if (control_pid
> 0) {
3515 r
= kill_and_sigcont(control_pid
, sig
);
3517 if (r
< 0 && r
!= -ESRCH
) {
3518 _cleanup_free_
char *comm
= NULL
;
3519 get_process_comm(control_pid
, &comm
);
3521 log_unit_warning_errno(u
, r
, "Failed to kill control process " PID_FMT
" (%s): %m", control_pid
, strna(comm
));
3523 wait_for_exit
= true;
3525 if (c
->send_sighup
&& k
!= KILL_KILL
)
3526 kill(control_pid
, SIGHUP
);
3530 if ((c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& k
== KILL_KILL
)) && u
->cgroup_path
) {
3531 _cleanup_set_free_ Set
*pid_set
= NULL
;
3533 /* Exclude the main/control pids from being killed via the cgroup */
3534 pid_set
= unit_pid_set(main_pid
, control_pid
);
3538 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, true, false, pid_set
);
3540 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3541 log_unit_warning_errno(u
, r
, "Failed to kill control group: %m");
3544 /* FIXME: For now, we will not wait for the
3545 * cgroup members to die, simply because
3546 * cgroup notification is unreliable. It
3547 * doesn't work at all in containers, and
3548 * outside of containers it can be confused
3549 * easily by leaving directories in the
3552 /* wait_for_exit = true; */
3554 if (c
->send_sighup
&& k
!= KILL_KILL
) {
3557 pid_set
= unit_pid_set(main_pid
, control_pid
);
3561 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3566 return wait_for_exit
;
3569 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3570 char prefix
[strlen(path
) + 1], *p
;
3576 /* Registers a unit for requiring a certain path and all its
3577 * prefixes. We keep a simple array of these paths in the
3578 * unit, since its usually short. However, we build a prefix
3579 * table for all possible prefixes so that new appearing mount
3580 * units can easily determine which units to make themselves a
3583 if (!path_is_absolute(path
))
3590 path_kill_slashes(p
);
3592 if (!path_is_safe(p
)) {
3597 if (strv_contains(u
->requires_mounts_for
, p
)) {
3602 r
= strv_consume(&u
->requires_mounts_for
, p
);
3606 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3609 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3613 r
= hashmap_ensure_allocated(&u
->manager
->units_requiring_mounts_for
, &string_hash_ops
);
3627 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3643 int unit_setup_exec_runtime(Unit
*u
) {
3649 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3652 /* Check if there already is an ExecRuntime for this unit? */
3653 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3657 /* Try to get it from somebody else */
3658 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3660 *rt
= unit_get_exec_runtime(other
);
3662 exec_runtime_ref(*rt
);
3667 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3670 bool unit_type_supported(UnitType t
) {
3671 if (_unlikely_(t
< 0))
3673 if (_unlikely_(t
>= _UNIT_TYPE_MAX
))
3676 if (!unit_vtable
[t
]->supported
)
3679 return unit_vtable
[t
]->supported();
3682 void unit_warn_if_dir_nonempty(Unit
*u
, const char* where
) {
3688 r
= dir_is_empty(where
);
3692 log_unit_warning_errno(u
, r
, "Failed to check directory %s: %m", where
);
3696 log_struct(LOG_NOTICE
,
3697 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3699 LOG_UNIT_MESSAGE(u
, "Directory %s to mount over is not empty, mounting anyway.", where
),
3704 int unit_fail_if_symlink(Unit
*u
, const char* where
) {
3710 r
= is_symlink(where
);
3712 log_unit_debug_errno(u
, r
, "Failed to check symlink %s, ignoring: %m", where
);
3719 LOG_MESSAGE_ID(SD_MESSAGE_OVERMOUNTING
),
3721 LOG_UNIT_MESSAGE(u
, "Mount on symlink %s not allowed.", where
),
3728 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3729 [UNIT_ACTIVE
] = "active",
3730 [UNIT_RELOADING
] = "reloading",
3731 [UNIT_INACTIVE
] = "inactive",
3732 [UNIT_FAILED
] = "failed",
3733 [UNIT_ACTIVATING
] = "activating",
3734 [UNIT_DEACTIVATING
] = "deactivating"
3737 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);