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
!= SYSTEMD_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
,
1106 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
1107 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
1108 r
= unit_add_default_target_dependency(u
, target
);
1116 static int unit_add_slice_dependencies(Unit
*u
) {
1119 if (!unit_get_cgroup_context(u
))
1122 if (UNIT_ISSET(u
->slice
))
1123 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_WANTS
, UNIT_DEREF(u
->slice
), true);
1125 if (streq(u
->id
, SPECIAL_ROOT_SLICE
))
1128 return unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_WANTS
, SPECIAL_ROOT_SLICE
, NULL
, true);
1131 static int unit_add_mount_dependencies(Unit
*u
) {
1137 STRV_FOREACH(i
, u
->requires_mounts_for
) {
1138 char prefix
[strlen(*i
) + 1];
1140 PATH_FOREACH_PREFIX_MORE(prefix
, *i
) {
1143 r
= manager_get_unit_by_path(u
->manager
, prefix
, ".mount", &m
);
1151 if (m
->load_state
!= UNIT_LOADED
)
1154 r
= unit_add_dependency(u
, UNIT_AFTER
, m
, true);
1158 if (m
->fragment_path
) {
1159 r
= unit_add_dependency(u
, UNIT_REQUIRES
, m
, true);
1169 static int unit_add_startup_units(Unit
*u
) {
1172 c
= unit_get_cgroup_context(u
);
1176 if (c
->startup_cpu_shares
== (unsigned long) -1 &&
1177 c
->startup_blockio_weight
== (unsigned long) -1)
1180 return set_put(u
->manager
->startup_units
, u
);
1183 int unit_load(Unit
*u
) {
1188 if (u
->in_load_queue
) {
1189 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
1190 u
->in_load_queue
= false;
1193 if (u
->type
== _UNIT_TYPE_INVALID
)
1196 if (u
->load_state
!= UNIT_STUB
)
1199 if (UNIT_VTABLE(u
)->load
) {
1200 r
= UNIT_VTABLE(u
)->load(u
);
1205 if (u
->load_state
== UNIT_STUB
) {
1210 if (u
->load_state
== UNIT_LOADED
) {
1212 r
= unit_add_target_dependencies(u
);
1216 r
= unit_add_slice_dependencies(u
);
1220 r
= unit_add_mount_dependencies(u
);
1224 r
= unit_add_startup_units(u
);
1228 if (u
->on_failure_job_mode
== JOB_ISOLATE
&& set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
1229 log_unit_error(u
, "More than one OnFailure= dependencies specified but OnFailureJobMode=isolate set. Refusing.");
1234 unit_update_cgroup_members_masks(u
);
1237 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
1239 unit_add_to_dbus_queue(unit_follow_merge(u
));
1240 unit_add_to_gc_queue(u
);
1245 u
->load_state
= u
->load_state
== UNIT_STUB
? UNIT_NOT_FOUND
: UNIT_ERROR
;
1247 unit_add_to_dbus_queue(u
);
1248 unit_add_to_gc_queue(u
);
1250 log_unit_debug_errno(u
, r
, "Failed to load configuration: %m");
1255 static bool unit_condition_test_list(Unit
*u
, Condition
*first
, const char *(*to_string
)(ConditionType t
)) {
1262 /* If the condition list is empty, then it is true */
1266 /* Otherwise, if all of the non-trigger conditions apply and
1267 * if any of the trigger conditions apply (unless there are
1268 * none) we return true */
1269 LIST_FOREACH(conditions
, c
, first
) {
1272 r
= condition_test(c
);
1275 "Couldn't determine result for %s=%s%s%s, assuming failed: %m",
1277 c
->trigger
? "|" : "",
1278 c
->negate
? "!" : "",
1284 c
->trigger
? "|" : "",
1285 c
->negate
? "!" : "",
1287 condition_result_to_string(c
->result
));
1289 if (!c
->trigger
&& r
<= 0)
1292 if (c
->trigger
&& triggered
<= 0)
1296 return triggered
!= 0;
1299 static bool unit_condition_test(Unit
*u
) {
1302 dual_timestamp_get(&u
->condition_timestamp
);
1303 u
->condition_result
= unit_condition_test_list(u
, u
->conditions
, condition_type_to_string
);
1305 return u
->condition_result
;
1308 static bool unit_assert_test(Unit
*u
) {
1311 dual_timestamp_get(&u
->assert_timestamp
);
1312 u
->assert_result
= unit_condition_test_list(u
, u
->asserts
, assert_type_to_string
);
1314 return u
->assert_result
;
1317 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1318 const UnitStatusMessageFormats
*format_table
;
1322 assert(t
< _JOB_TYPE_MAX
);
1324 if (t
!= JOB_START
&& t
!= JOB_STOP
)
1327 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1331 return format_table
->starting_stopping
[t
== JOB_STOP
];
1334 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
1339 assert(t
< _JOB_TYPE_MAX
);
1341 format
= unit_get_status_message_format(u
, t
);
1345 /* Return generic strings */
1347 return "Starting %s.";
1348 else if (t
== JOB_STOP
)
1349 return "Stopping %s.";
1350 else if (t
== JOB_RELOAD
)
1351 return "Reloading %s.";
1356 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1361 /* We only print status messages for selected units on
1362 * selected operations. */
1364 format
= unit_get_status_message_format(u
, t
);
1368 DISABLE_WARNING_FORMAT_NONLITERAL
;
1369 unit_status_printf(u
, "", format
);
1373 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1380 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1383 if (log_on_console())
1386 /* We log status messages for all units and all operations. */
1388 format
= unit_get_status_message_format_try_harder(u
, t
);
1392 DISABLE_WARNING_FORMAT_NONLITERAL
;
1393 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1396 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1397 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1398 SD_MESSAGE_UNIT_RELOADING
;
1400 /* Note that we deliberately use LOG_MESSAGE() instead of
1401 * LOG_UNIT_MESSAGE() here, since this is supposed to mimic
1402 * closely what is written to screen using the status output,
1403 * which is supposed the highest level, friendliest output
1404 * possible, which means we should avoid the low-level unit
1406 log_struct(LOG_INFO
,
1407 LOG_MESSAGE_ID(mid
),
1409 LOG_MESSAGE("%s", buf
),
1414 * -EBADR: This unit type does not support starting.
1415 * -EALREADY: Unit is already started.
1416 * -EAGAIN: An operation is already in progress. Retry later.
1417 * -ECANCELED: Too many requests for now.
1418 * -EPROTO: Assert failed
1420 int unit_start(Unit
*u
) {
1421 UnitActiveState state
;
1427 if (u
->load_state
!= UNIT_LOADED
)
1430 /* If this is already started, then this will succeed. Note
1431 * that this will even succeed if this unit is not startable
1432 * by the user. This is relied on to detect when we need to
1433 * wait for units and when waiting is finished. */
1434 state
= unit_active_state(u
);
1435 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1438 /* If the conditions failed, don't do anything at all. If we
1439 * already are activating this call might still be useful to
1440 * speed up activation in case there is some hold-off time,
1441 * but we don't want to recheck the condition in that case. */
1442 if (state
!= UNIT_ACTIVATING
&&
1443 !unit_condition_test(u
)) {
1444 log_unit_debug(u
, "Starting requested but condition failed. Not starting unit.");
1448 /* If the asserts failed, fail the entire job */
1449 if (state
!= UNIT_ACTIVATING
&&
1450 !unit_assert_test(u
)) {
1451 log_unit_notice(u
, "Starting requested but asserts failed.");
1455 /* Forward to the main object, if we aren't it. */
1456 following
= unit_following(u
);
1458 log_unit_debug(u
, "Redirecting start request from %s to %s.", u
->id
, following
->id
);
1459 return unit_start(following
);
1462 if (!unit_supported(u
))
1465 /* If it is stopped, but we cannot start it, then fail */
1466 if (!UNIT_VTABLE(u
)->start
)
1469 /* We don't suppress calls to ->start() here when we are
1470 * already starting, to allow this request to be used as a
1471 * "hurry up" call, for example when the unit is in some "auto
1472 * restart" state where it waits for a holdoff timer to elapse
1473 * before it will start again. */
1475 unit_add_to_dbus_queue(u
);
1477 r
= UNIT_VTABLE(u
)->start(u
);
1481 /* Log if the start function actually did something */
1482 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1483 unit_status_print_starting_stopping(u
, JOB_START
);
1487 bool unit_can_start(Unit
*u
) {
1490 return !!UNIT_VTABLE(u
)->start
;
1493 bool unit_can_isolate(Unit
*u
) {
1496 return unit_can_start(u
) &&
1501 * -EBADR: This unit type does not support stopping.
1502 * -EALREADY: Unit is already stopped.
1503 * -EAGAIN: An operation is already in progress. Retry later.
1505 int unit_stop(Unit
*u
) {
1506 UnitActiveState state
;
1512 state
= unit_active_state(u
);
1513 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1516 following
= unit_following(u
);
1518 log_unit_debug(u
, "Redirecting stop request from %s to %s.", u
->id
, following
->id
);
1519 return unit_stop(following
);
1522 if (!UNIT_VTABLE(u
)->stop
)
1525 unit_add_to_dbus_queue(u
);
1527 r
= UNIT_VTABLE(u
)->stop(u
);
1531 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1532 unit_status_print_starting_stopping(u
, JOB_STOP
);
1537 * -EBADR: This unit type does not support reloading.
1538 * -ENOEXEC: Unit is not started.
1539 * -EAGAIN: An operation is already in progress. Retry later.
1541 int unit_reload(Unit
*u
) {
1542 UnitActiveState state
;
1548 if (u
->load_state
!= UNIT_LOADED
)
1551 if (!unit_can_reload(u
))
1554 state
= unit_active_state(u
);
1555 if (state
== UNIT_RELOADING
)
1558 if (state
!= UNIT_ACTIVE
) {
1559 log_unit_warning(u
, "Unit cannot be reloaded because it is inactive.");
1563 following
= unit_following(u
);
1565 log_unit_debug(u
, "Redirecting reload request from %s to %s.", u
->id
, following
->id
);
1566 return unit_reload(following
);
1569 unit_add_to_dbus_queue(u
);
1571 r
= UNIT_VTABLE(u
)->reload(u
);
1575 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1579 bool unit_can_reload(Unit
*u
) {
1582 if (!UNIT_VTABLE(u
)->reload
)
1585 if (!UNIT_VTABLE(u
)->can_reload
)
1588 return UNIT_VTABLE(u
)->can_reload(u
);
1591 static void unit_check_unneeded(Unit
*u
) {
1597 /* If this service shall be shut down when unneeded then do
1600 if (!u
->stop_when_unneeded
)
1603 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1606 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY
], i
)
1607 if (unit_active_or_pending(other
))
1610 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY_OVERRIDABLE
], i
)
1611 if (unit_active_or_pending(other
))
1614 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTED_BY
], i
)
1615 if (unit_active_or_pending(other
))
1618 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1619 if (unit_active_or_pending(other
))
1622 log_unit_info(u
, "Unit not needed anymore. Stopping.");
1624 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1625 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1628 static void unit_check_binds_to(Unit
*u
) {
1638 if (unit_active_state(u
) != UNIT_ACTIVE
)
1641 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
) {
1645 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
1656 log_unit_info(u
, "Unit is bound to inactive unit %s. Stopping, too.", other
->id
);
1658 /* A unit we need to run is gone. Sniff. Let's stop this. */
1659 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1662 static void retroactively_start_dependencies(Unit
*u
) {
1667 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1669 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1670 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1671 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1672 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1674 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], 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_REQUIRES_OVERRIDABLE
], 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_FAIL
, false, NULL
, NULL
);
1684 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], 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_CONFLICTS
], i
)
1690 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1691 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1693 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1694 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1695 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1698 static void retroactively_stop_dependencies(Unit
*u
) {
1703 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1705 /* Pull down units which are bound to us recursively if enabled */
1706 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1707 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1708 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1711 static void check_unneeded_dependencies(Unit
*u
) {
1716 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1718 /* Garbage collect services that might not be needed anymore, if enabled */
1719 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1720 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1721 unit_check_unneeded(other
);
1722 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1723 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1724 unit_check_unneeded(other
);
1725 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1726 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1727 unit_check_unneeded(other
);
1728 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1729 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1730 unit_check_unneeded(other
);
1731 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1732 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1733 unit_check_unneeded(other
);
1734 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1735 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1736 unit_check_unneeded(other
);
1739 void unit_start_on_failure(Unit
*u
) {
1745 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1748 log_unit_info(u
, "Triggering OnFailure= dependencies.");
1750 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1753 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1755 log_unit_error_errno(u
, r
, "Failed to enqueue OnFailure= job: %m");
1759 void unit_trigger_notify(Unit
*u
) {
1765 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1766 if (UNIT_VTABLE(other
)->trigger_notify
)
1767 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1770 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1775 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1776 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1778 /* Note that this is called for all low-level state changes,
1779 * even if they might map to the same high-level
1780 * UnitActiveState! That means that ns == os is an expected
1781 * behavior here. For example: if a mount point is remounted
1782 * this function will be called too! */
1786 /* Update timestamps for state changes */
1787 if (m
->n_reloading
<= 0) {
1790 dual_timestamp_get(&ts
);
1792 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1793 u
->inactive_exit_timestamp
= ts
;
1794 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1795 u
->inactive_enter_timestamp
= ts
;
1797 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1798 u
->active_enter_timestamp
= ts
;
1799 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1800 u
->active_exit_timestamp
= ts
;
1803 /* Keep track of failed units */
1804 manager_update_failed_units(u
->manager
, u
, ns
== UNIT_FAILED
);
1806 /* Make sure the cgroup is always removed when we become inactive */
1807 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1808 unit_destroy_cgroup_if_empty(u
);
1810 /* Note that this doesn't apply to RemainAfterExit services exiting
1811 * successfully, since there's no change of state in that case. Which is
1812 * why it is handled in service_set_state() */
1813 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1816 ec
= unit_get_exec_context(u
);
1817 if (ec
&& exec_context_may_touch_console(ec
)) {
1818 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1821 if (m
->n_on_console
== 0)
1822 /* unset no_console_output flag, since the console is free */
1823 m
->no_console_output
= false;
1832 if (u
->job
->state
== JOB_WAITING
)
1834 /* So we reached a different state for this
1835 * job. Let's see if we can run it now if it
1836 * failed previously due to EAGAIN. */
1837 job_add_to_run_queue(u
->job
);
1839 /* Let's check whether this state change constitutes a
1840 * finished job, or maybe contradicts a running job and
1841 * hence needs to invalidate jobs. */
1843 switch (u
->job
->type
) {
1846 case JOB_VERIFY_ACTIVE
:
1848 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1849 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1850 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1853 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1854 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1860 case JOB_RELOAD_OR_START
:
1862 if (u
->job
->state
== JOB_RUNNING
) {
1863 if (ns
== UNIT_ACTIVE
)
1864 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1865 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1868 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1869 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1877 case JOB_TRY_RESTART
:
1879 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1880 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1881 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1883 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1889 assert_not_reached("Job type unknown");
1895 if (m
->n_reloading
<= 0) {
1897 /* If this state change happened without being
1898 * requested by a job, then let's retroactively start
1899 * or stop dependencies. We skip that step when
1900 * deserializing, since we don't want to create any
1901 * additional jobs just because something is already
1905 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1906 retroactively_start_dependencies(u
);
1907 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1908 retroactively_stop_dependencies(u
);
1911 /* stop unneeded units regardless if going down was expected or not */
1912 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1913 check_unneeded_dependencies(u
);
1915 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1916 log_unit_notice(u
, "Unit entered failed state.");
1917 unit_start_on_failure(u
);
1921 /* Some names are special */
1922 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1924 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1925 /* The bus might have just become available,
1926 * hence try to connect to it, if we aren't
1930 if (u
->type
== UNIT_SERVICE
&&
1931 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1932 m
->n_reloading
<= 0) {
1933 /* Write audit record if we have just finished starting up */
1934 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1938 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1939 manager_send_unit_plymouth(m
, u
);
1943 /* We don't care about D-Bus here, since we'll get an
1944 * asynchronous notification for it anyway. */
1946 if (u
->type
== UNIT_SERVICE
&&
1947 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1948 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1949 m
->n_reloading
<= 0) {
1951 /* Hmm, if there was no start record written
1952 * write it now, so that we always have a nice
1955 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1957 if (ns
== UNIT_INACTIVE
)
1958 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1960 /* Write audit record if we have just finished shutting down */
1961 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1963 u
->in_audit
= false;
1967 manager_recheck_journal(m
);
1968 unit_trigger_notify(u
);
1970 if (u
->manager
->n_reloading
<= 0) {
1971 /* Maybe we finished startup and are now ready for
1972 * being stopped because unneeded? */
1973 unit_check_unneeded(u
);
1975 /* Maybe we finished startup, but something we needed
1976 * has vanished? Let's die then. (This happens when
1977 * something BindsTo= to a Type=oneshot unit, as these
1978 * units go directly from starting to inactive,
1979 * without ever entering started.) */
1980 unit_check_binds_to(u
);
1983 unit_add_to_dbus_queue(u
);
1984 unit_add_to_gc_queue(u
);
1987 int unit_watch_pid(Unit
*u
, pid_t pid
) {
1993 /* Watch a specific PID. We only support one or two units
1994 * watching each PID for now, not more. */
1996 r
= set_ensure_allocated(&u
->pids
, NULL
);
2000 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
2004 r
= hashmap_put(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2006 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
2010 r
= hashmap_put(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2013 q
= set_put(u
->pids
, LONG_TO_PTR(pid
));
2020 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
2024 hashmap_remove_value(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2025 hashmap_remove_value(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2026 set_remove(u
->pids
, LONG_TO_PTR(pid
));
2029 void unit_unwatch_all_pids(Unit
*u
) {
2032 while (!set_isempty(u
->pids
))
2033 unit_unwatch_pid(u
, PTR_TO_LONG(set_first(u
->pids
)));
2039 static int unit_watch_pids_in_path(Unit
*u
, const char *path
) {
2040 _cleanup_closedir_
DIR *d
= NULL
;
2041 _cleanup_fclose_
FILE *f
= NULL
;
2047 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
2049 r
= cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER
, path
, &f
);
2053 while ((r
= cg_read_pid(f
, &pid
)) > 0) {
2054 r
= unit_watch_pid(u
, pid
);
2055 if (r
< 0 && ret
>= 0)
2058 if (r
< 0 && ret
>= 0)
2061 } else if (ret
>= 0)
2064 r
= cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER
, path
, &d
);
2068 while ((r
= cg_read_subgroup(d
, &fn
)) > 0) {
2069 _cleanup_free_
char *p
= NULL
;
2071 p
= strjoin(path
, "/", fn
, NULL
);
2077 r
= unit_watch_pids_in_path(u
, p
);
2078 if (r
< 0 && ret
>= 0)
2081 if (r
< 0 && ret
>= 0)
2084 } else if (ret
>= 0)
2090 int unit_watch_all_pids(Unit
*u
) {
2093 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
2095 if (!u
->cgroup_path
)
2098 return unit_watch_pids_in_path(u
, u
->cgroup_path
);
2101 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2107 /* Cleans dead PIDs from our list */
2109 SET_FOREACH(e
, u
->pids
, i
) {
2110 pid_t pid
= PTR_TO_LONG(e
);
2112 if (pid
== except1
|| pid
== except2
)
2115 if (!pid_is_unwaited(pid
))
2116 unit_unwatch_pid(u
, pid
);
2120 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2122 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2126 case JOB_VERIFY_ACTIVE
:
2133 case JOB_TRY_RESTART
:
2134 return unit_can_start(u
);
2137 return unit_can_reload(u
);
2139 case JOB_RELOAD_OR_START
:
2140 return unit_can_reload(u
) && unit_can_start(u
);
2143 assert_not_reached("Invalid job type");
2147 static void maybe_warn_about_dependency(Unit
*u
, const char *other
, UnitDependency dependency
) {
2150 /* Only warn about some unit types */
2151 if (!IN_SET(dependency
, UNIT_CONFLICTS
, UNIT_CONFLICTED_BY
, UNIT_BEFORE
, UNIT_AFTER
, UNIT_ON_FAILURE
, UNIT_TRIGGERS
, UNIT_TRIGGERED_BY
))
2154 if (streq_ptr(u
->id
, other
))
2155 log_unit_warning(u
, "Dependency %s=%s dropped", unit_dependency_to_string(dependency
), u
->id
);
2157 log_unit_warning(u
, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency
), strna(other
), u
->id
);
2160 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2162 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2163 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2164 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2165 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2166 [UNIT_REQUISITE
] = UNIT_REQUIRED_BY
,
2167 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2168 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2169 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2170 [UNIT_REQUIRED_BY
] = _UNIT_DEPENDENCY_INVALID
,
2171 [UNIT_REQUIRED_BY_OVERRIDABLE
] = _UNIT_DEPENDENCY_INVALID
,
2172 [UNIT_WANTED_BY
] = _UNIT_DEPENDENCY_INVALID
,
2173 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2174 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2175 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2176 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2177 [UNIT_BEFORE
] = UNIT_AFTER
,
2178 [UNIT_AFTER
] = UNIT_BEFORE
,
2179 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2180 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2181 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2182 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2183 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2184 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2185 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2186 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2188 int r
, q
= 0, v
= 0, w
= 0;
2189 Unit
*orig_u
= u
, *orig_other
= other
;
2192 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2195 u
= unit_follow_merge(u
);
2196 other
= unit_follow_merge(other
);
2198 /* We won't allow dependencies on ourselves. We will not
2199 * consider them an error however. */
2201 maybe_warn_about_dependency(orig_u
, orig_other
->id
, d
);
2205 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2209 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2210 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2215 if (add_reference
) {
2216 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2220 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2225 q
= set_put(u
->dependencies
[d
], other
);
2229 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2230 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2237 if (add_reference
) {
2238 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2244 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2249 unit_add_to_dbus_queue(u
);
2254 set_remove(u
->dependencies
[d
], other
);
2257 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2260 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2265 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2270 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2274 return unit_add_dependency(u
, e
, other
, add_reference
);
2277 static int resolve_template(Unit
*u
, const char *name
, const char*path
, char **buf
, const char **ret
) {
2281 assert(name
|| path
);
2286 name
= basename(path
);
2288 if (!unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
2295 r
= unit_name_replace_instance(name
, u
->instance
, buf
);
2297 _cleanup_free_
char *i
= NULL
;
2299 r
= unit_name_to_prefix(u
->id
, &i
);
2303 r
= unit_name_replace_instance(name
, i
, buf
);
2312 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2313 _cleanup_free_
char *buf
= NULL
;
2318 assert(name
|| path
);
2320 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2324 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2328 return unit_add_dependency(u
, d
, other
, add_reference
);
2331 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2332 _cleanup_free_
char *buf
= NULL
;
2337 assert(name
|| path
);
2339 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2343 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2347 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2350 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2351 _cleanup_free_
char *buf
= NULL
;
2356 assert(name
|| path
);
2358 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2362 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2366 return unit_add_dependency(other
, d
, u
, add_reference
);
2369 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2370 _cleanup_free_
char *buf
= NULL
;
2375 assert(name
|| path
);
2377 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2381 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2385 return unit_add_two_dependencies(other
, d
, e
, u
, add_reference
);
2388 int set_unit_path(const char *p
) {
2389 /* This is mostly for debug purposes */
2390 if (setenv("SYSTEMD_UNIT_PATH", p
, 0) < 0)
2396 char *unit_dbus_path(Unit
*u
) {
2402 return unit_dbus_path_from_name(u
->id
);
2405 char *unit_default_cgroup_path(Unit
*u
) {
2406 _cleanup_free_
char *escaped
= NULL
, *slice
= NULL
;
2411 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
2412 return strdup(u
->manager
->cgroup_root
);
2414 if (UNIT_ISSET(u
->slice
) && !unit_has_name(UNIT_DEREF(u
->slice
), SPECIAL_ROOT_SLICE
)) {
2415 r
= cg_slice_to_path(UNIT_DEREF(u
->slice
)->id
, &slice
);
2420 escaped
= cg_escape(u
->id
);
2425 return strjoin(u
->manager
->cgroup_root
, "/", slice
, "/", escaped
, NULL
);
2427 return strjoin(u
->manager
->cgroup_root
, "/", escaped
, NULL
);
2430 int unit_add_default_slice(Unit
*u
, CGroupContext
*c
) {
2431 _cleanup_free_
char *b
= NULL
;
2432 const char *slice_name
;
2439 if (UNIT_ISSET(u
->slice
))
2443 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2445 /* Implicitly place all instantiated units in their
2446 * own per-template slice */
2448 r
= unit_name_to_prefix(u
->id
, &prefix
);
2452 /* The prefix is already escaped, but it might include
2453 * "-" which has a special meaning for slice units,
2454 * hence escape it here extra. */
2455 escaped
= unit_name_escape(prefix
);
2459 if (u
->manager
->running_as
== SYSTEMD_SYSTEM
)
2460 b
= strjoin("system-", escaped
, ".slice", NULL
);
2462 b
= strappend(escaped
, ".slice");
2469 u
->manager
->running_as
== SYSTEMD_SYSTEM
2470 ? SPECIAL_SYSTEM_SLICE
2471 : SPECIAL_ROOT_SLICE
;
2473 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2477 unit_ref_set(&u
->slice
, slice
);
2481 const char *unit_slice_name(Unit
*u
) {
2484 if (!UNIT_ISSET(u
->slice
))
2487 return UNIT_DEREF(u
->slice
)->id
;
2490 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2491 _cleanup_free_
char *t
= NULL
;
2498 r
= unit_name_change_suffix(u
->id
, type
, &t
);
2501 if (unit_has_name(u
, t
))
2504 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2505 assert(r
< 0 || *_found
!= u
);
2509 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2513 /* Watch a specific name on the bus. We only support one unit
2514 * watching each name for now. */
2516 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2519 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2523 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2526 bool unit_can_serialize(Unit
*u
) {
2529 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2532 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2539 if (unit_can_serialize(u
)) {
2542 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2546 rt
= unit_get_exec_runtime(u
);
2548 r
= exec_runtime_serialize(u
, rt
, f
, fds
);
2554 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2555 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2556 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2557 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2558 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2559 dual_timestamp_serialize(f
, "assert-timestamp", &u
->assert_timestamp
);
2561 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2562 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2564 if (dual_timestamp_is_set(&u
->assert_timestamp
))
2565 unit_serialize_item(u
, f
, "assert-result", yes_no(u
->assert_result
));
2567 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2568 unit_serialize_item_format(u
, f
, "cpuacct-usage-base", "%" PRIu64
, u
->cpuacct_usage_base
);
2571 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2573 if (serialize_jobs
) {
2575 fprintf(f
, "job\n");
2576 job_serialize(u
->job
, f
, fds
);
2580 fprintf(f
, "job\n");
2581 job_serialize(u
->nop_job
, f
, fds
);
2590 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2601 va_start(ap
, format
);
2602 vfprintf(f
, format
, ap
);
2608 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2614 fprintf(f
, "%s=%s\n", key
, value
);
2617 static int unit_set_cgroup_path(Unit
*u
, const char *path
) {
2618 _cleanup_free_
char *p
= NULL
;
2630 if (streq_ptr(u
->cgroup_path
, p
))
2634 r
= hashmap_put(u
->manager
->cgroup_unit
, p
, u
);
2639 if (u
->cgroup_path
) {
2640 log_unit_debug(u
, "Changing cgroup path from %s to %s.", u
->cgroup_path
, strna(p
));
2641 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
2642 free(u
->cgroup_path
);
2651 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2652 ExecRuntime
**rt
= NULL
;
2660 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2662 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2665 char line
[LINE_MAX
], *l
, *v
;
2668 if (!fgets(line
, sizeof(line
), f
)) {
2681 k
= strcspn(l
, "=");
2689 if (streq(l
, "job")) {
2691 /* new-style serialized job */
2698 r
= job_deserialize(j
, f
, fds
);
2704 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2710 r
= job_install_deserialized(j
);
2712 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2720 type
= job_type_from_string(v
);
2722 log_unit_debug(u
, "Failed to parse job type value: %s", v
);
2724 u
->deserialized_job
= type
;
2727 } else if (streq(l
, "inactive-exit-timestamp")) {
2728 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2730 } else if (streq(l
, "active-enter-timestamp")) {
2731 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2733 } else if (streq(l
, "active-exit-timestamp")) {
2734 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2736 } else if (streq(l
, "inactive-enter-timestamp")) {
2737 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2739 } else if (streq(l
, "condition-timestamp")) {
2740 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2742 } else if (streq(l
, "assert-timestamp")) {
2743 dual_timestamp_deserialize(v
, &u
->assert_timestamp
);
2745 } else if (streq(l
, "condition-result")) {
2747 r
= parse_boolean(v
);
2749 log_unit_debug(u
, "Failed to parse condition result value %s, ignoring.", v
);
2751 u
->condition_result
= r
;
2755 } else if (streq(l
, "assert-result")) {
2757 r
= parse_boolean(v
);
2759 log_unit_debug(u
, "Failed to parse assert result value %s, ignoring.", v
);
2761 u
->assert_result
= r
;
2765 } else if (streq(l
, "transient")) {
2767 r
= parse_boolean(v
);
2769 log_unit_debug(u
, "Failed to parse transient bool %s, ignoring.", v
);
2775 } else if (streq(l
, "cpuacct-usage-base")) {
2777 r
= safe_atou64(v
, &u
->cpuacct_usage_base
);
2779 log_unit_debug(u
, "Failed to parse CPU usage %s, ignoring.", v
);
2783 } else if (streq(l
, "cgroup")) {
2785 r
= unit_set_cgroup_path(u
, v
);
2787 log_unit_debug_errno(u
, r
, "Failed to set cgroup path %s, ignoring: %m", v
);
2792 if (unit_can_serialize(u
)) {
2794 r
= exec_runtime_deserialize_item(u
, rt
, l
, v
, fds
);
2796 log_unit_warning(u
, "Failed to deserialize runtime parameter '%s', ignoring.", l
);
2800 /* Returns positive if key was handled by the call */
2805 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2807 log_unit_warning(u
, "Failed to deserialize unit parameter '%s', ignoring.", l
);
2812 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2814 _cleanup_free_
char *e
= NULL
;
2819 /* Adds in links to the device node that this unit is based on */
2823 if (!is_device_path(what
))
2826 /* When device units aren't supported (such as in a
2827 * container), don't create dependencies on them. */
2828 if (!unit_type_supported(UNIT_DEVICE
))
2831 r
= unit_name_from_path(what
, ".device", &e
);
2835 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2839 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_BINDS_TO
: UNIT_WANTS
, device
, true);
2844 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2852 int unit_coldplug(Unit
*u
) {
2857 /* Make sure we don't enter a loop, when coldplugging
2862 u
->coldplugged
= true;
2864 if (UNIT_VTABLE(u
)->coldplug
) {
2865 r
= UNIT_VTABLE(u
)->coldplug(u
);
2871 r
= job_coldplug(u
->job
);
2874 } else if (u
->deserialized_job
>= 0) {
2876 r
= manager_add_job(u
->manager
, u
->deserialized_job
, u
, JOB_IGNORE_REQUIREMENTS
, false, NULL
, NULL
);
2880 u
->deserialized_job
= _JOB_TYPE_INVALID
;
2886 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2887 DISABLE_WARNING_FORMAT_NONLITERAL
;
2888 manager_status_printf(u
->manager
, STATUS_TYPE_NORMAL
,
2889 status
, unit_status_msg_format
, unit_description(u
));
2893 bool unit_need_daemon_reload(Unit
*u
) {
2894 _cleanup_strv_free_
char **t
= NULL
;
2897 unsigned loaded_cnt
, current_cnt
;
2901 if (u
->fragment_path
) {
2903 if (stat(u
->fragment_path
, &st
) < 0)
2904 /* What, cannot access this anymore? */
2907 if (u
->fragment_mtime
> 0 &&
2908 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2912 if (u
->source_path
) {
2914 if (stat(u
->source_path
, &st
) < 0)
2917 if (u
->source_mtime
> 0 &&
2918 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2922 (void) unit_find_dropin_paths(u
, &t
);
2923 loaded_cnt
= strv_length(t
);
2924 current_cnt
= strv_length(u
->dropin_paths
);
2926 if (loaded_cnt
== current_cnt
) {
2927 if (loaded_cnt
== 0)
2930 if (strv_overlap(u
->dropin_paths
, t
)) {
2931 STRV_FOREACH(path
, u
->dropin_paths
) {
2933 if (stat(*path
, &st
) < 0)
2936 if (u
->dropin_mtime
> 0 &&
2937 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2948 void unit_reset_failed(Unit
*u
) {
2951 if (UNIT_VTABLE(u
)->reset_failed
)
2952 UNIT_VTABLE(u
)->reset_failed(u
);
2955 Unit
*unit_following(Unit
*u
) {
2958 if (UNIT_VTABLE(u
)->following
)
2959 return UNIT_VTABLE(u
)->following(u
);
2964 bool unit_stop_pending(Unit
*u
) {
2967 /* This call does check the current state of the unit. It's
2968 * hence useful to be called from state change calls of the
2969 * unit itself, where the state isn't updated yet. This is
2970 * different from unit_inactive_or_pending() which checks both
2971 * the current state and for a queued job. */
2973 return u
->job
&& u
->job
->type
== JOB_STOP
;
2976 bool unit_inactive_or_pending(Unit
*u
) {
2979 /* Returns true if the unit is inactive or going down */
2981 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
2984 if (unit_stop_pending(u
))
2990 bool unit_active_or_pending(Unit
*u
) {
2993 /* Returns true if the unit is active or going up */
2995 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
2999 (u
->job
->type
== JOB_START
||
3000 u
->job
->type
== JOB_RELOAD_OR_START
||
3001 u
->job
->type
== JOB_RESTART
))
3007 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
3009 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
3011 assert(signo
< _NSIG
);
3013 if (!UNIT_VTABLE(u
)->kill
)
3016 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
3019 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
3023 pid_set
= set_new(NULL
);
3027 /* Exclude the main/control pids from being killed via the cgroup */
3029 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
3034 if (control_pid
> 0) {
3035 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
3047 int unit_kill_common(
3053 sd_bus_error
*error
) {
3057 if (who
== KILL_MAIN
&& main_pid
<= 0) {
3059 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
3061 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
3064 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
3065 if (control_pid
< 0)
3066 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
3068 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
3071 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
3072 if (control_pid
> 0)
3073 if (kill(control_pid
, signo
) < 0)
3076 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
3078 if (kill(main_pid
, signo
) < 0)
3081 if (who
== KILL_ALL
&& u
->cgroup_path
) {
3082 _cleanup_set_free_ Set
*pid_set
= NULL
;
3085 /* Exclude the main/control pids from being killed via the cgroup */
3086 pid_set
= unit_pid_set(main_pid
, control_pid
);
3090 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, true, false, pid_set
);
3091 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
3098 int unit_following_set(Unit
*u
, Set
**s
) {
3102 if (UNIT_VTABLE(u
)->following_set
)
3103 return UNIT_VTABLE(u
)->following_set(u
, s
);
3109 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
3112 if (u
->unit_file_state
< 0 && u
->fragment_path
)
3113 u
->unit_file_state
= unit_file_get_state(
3114 u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3115 NULL
, basename(u
->fragment_path
));
3117 return u
->unit_file_state
;
3120 int unit_get_unit_file_preset(Unit
*u
) {
3123 if (u
->unit_file_preset
< 0 && u
->fragment_path
)
3124 u
->unit_file_preset
= unit_file_query_preset(
3125 u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3126 NULL
, basename(u
->fragment_path
));
3128 return u
->unit_file_preset
;
3131 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3136 unit_ref_unset(ref
);
3139 LIST_PREPEND(refs
, u
->refs
, ref
);
3143 void unit_ref_unset(UnitRef
*ref
) {
3149 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3153 int unit_patch_contexts(Unit
*u
) {
3161 /* Patch in the manager defaults into the exec and cgroup
3162 * contexts, _after_ the rest of the settings have been
3165 ec
= unit_get_exec_context(u
);
3167 /* This only copies in the ones that need memory */
3168 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3169 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3170 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3175 if (u
->manager
->running_as
== SYSTEMD_USER
&&
3176 !ec
->working_directory
) {
3178 r
= get_home_dir(&ec
->working_directory
);
3182 /* Allow user services to run, even if the
3183 * home directory is missing */
3184 ec
->working_directory_missing_ok
= true;
3187 if (u
->manager
->running_as
== SYSTEMD_USER
&&
3188 (ec
->syscall_whitelist
||
3189 !set_isempty(ec
->syscall_filter
) ||
3190 !set_isempty(ec
->syscall_archs
) ||
3191 ec
->address_families_whitelist
||
3192 !set_isempty(ec
->address_families
)))
3193 ec
->no_new_privileges
= true;
3195 if (ec
->private_devices
)
3196 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3199 cc
= unit_get_cgroup_context(u
);
3203 ec
->private_devices
&&
3204 cc
->device_policy
== CGROUP_AUTO
)
3205 cc
->device_policy
= CGROUP_CLOSED
;
3211 ExecContext
*unit_get_exec_context(Unit
*u
) {
3218 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3222 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3225 KillContext
*unit_get_kill_context(Unit
*u
) {
3232 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3236 return (KillContext
*) ((uint8_t*) u
+ offset
);
3239 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3245 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3249 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3252 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3258 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3262 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3265 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3266 if (u
->manager
->running_as
== SYSTEMD_USER
) {
3269 if (mode
== UNIT_PERSISTENT
&& !transient
)
3270 r
= user_config_home(dir
);
3272 r
= user_runtime_dir(dir
);
3279 if (mode
== UNIT_PERSISTENT
&& !transient
)
3280 *dir
= strdup("/etc/systemd/system");
3282 *dir
= strdup("/run/systemd/system");
3289 static int unit_drop_in_file(Unit
*u
,
3290 UnitSetPropertiesMode mode
, const char *name
, char **p
, char **q
) {
3291 _cleanup_free_
char *dir
= NULL
;
3296 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3300 return drop_in_file(dir
, u
->id
, 50, name
, p
, q
);
3303 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3305 _cleanup_free_
char *dir
= NULL
, *p
= NULL
, *q
= NULL
;
3310 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3313 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3317 r
= write_drop_in(dir
, u
->id
, 50, name
, data
);
3321 r
= drop_in_file(dir
, u
->id
, 50, name
, &p
, &q
);
3325 r
= strv_extend(&u
->dropin_paths
, q
);
3329 strv_sort(u
->dropin_paths
);
3330 strv_uniq(u
->dropin_paths
);
3332 u
->dropin_mtime
= now(CLOCK_REALTIME
);
3337 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3338 _cleanup_free_
char *p
= NULL
;
3346 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3349 va_start(ap
, format
);
3350 r
= vasprintf(&p
, format
, ap
);
3356 return unit_write_drop_in(u
, mode
, name
, p
);
3359 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3360 _cleanup_free_
char *ndata
= NULL
;
3366 if (!UNIT_VTABLE(u
)->private_section
)
3369 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3372 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3376 return unit_write_drop_in(u
, mode
, name
, ndata
);
3379 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3380 _cleanup_free_
char *p
= NULL
;
3388 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3391 va_start(ap
, format
);
3392 r
= vasprintf(&p
, format
, ap
);
3398 return unit_write_drop_in_private(u
, mode
, name
, p
);
3401 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
3402 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
3407 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3410 r
= unit_drop_in_file(u
, mode
, name
, &p
, &q
);
3415 r
= errno
== ENOENT
? 0 : -errno
;
3423 int unit_make_transient(Unit
*u
) {
3428 u
->load_state
= UNIT_STUB
;
3430 u
->transient
= true;
3432 free(u
->fragment_path
);
3433 u
->fragment_path
= NULL
;
3435 if (u
->manager
->running_as
== SYSTEMD_USER
) {
3436 _cleanup_free_
char *c
= NULL
;
3438 r
= user_runtime_dir(&c
);
3444 u
->fragment_path
= strjoin(c
, "/", u
->id
, NULL
);
3445 if (!u
->fragment_path
)
3450 u
->fragment_path
= strappend("/run/systemd/system/", u
->id
);
3451 if (!u
->fragment_path
)
3454 mkdir_p("/run/systemd/system", 0755);
3457 return write_string_file_atomic_label(u
->fragment_path
, "# Transient stub");
3460 int unit_kill_context(
3466 bool main_pid_alien
) {
3468 int sig
, wait_for_exit
= false, r
;
3473 if (c
->kill_mode
== KILL_NONE
)
3483 case KILL_TERMINATE
:
3484 sig
= c
->kill_signal
;
3487 assert_not_reached("KillOperation unknown");
3491 r
= kill_and_sigcont(main_pid
, sig
);
3493 if (r
< 0 && r
!= -ESRCH
) {
3494 _cleanup_free_
char *comm
= NULL
;
3495 get_process_comm(main_pid
, &comm
);
3497 log_unit_warning_errno(u
, r
, "Failed to kill main process " PID_FMT
" (%s): %m", main_pid
, strna(comm
));
3499 if (!main_pid_alien
)
3500 wait_for_exit
= true;
3502 if (c
->send_sighup
&& k
!= KILL_KILL
)
3503 kill(main_pid
, SIGHUP
);
3507 if (control_pid
> 0) {
3508 r
= kill_and_sigcont(control_pid
, sig
);
3510 if (r
< 0 && r
!= -ESRCH
) {
3511 _cleanup_free_
char *comm
= NULL
;
3512 get_process_comm(control_pid
, &comm
);
3514 log_unit_warning_errno(u
, r
, "Failed to kill control process " PID_FMT
" (%s): %m", control_pid
, strna(comm
));
3516 wait_for_exit
= true;
3518 if (c
->send_sighup
&& k
!= KILL_KILL
)
3519 kill(control_pid
, SIGHUP
);
3523 if ((c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& k
== KILL_KILL
)) && u
->cgroup_path
) {
3524 _cleanup_set_free_ Set
*pid_set
= NULL
;
3526 /* Exclude the main/control pids from being killed via the cgroup */
3527 pid_set
= unit_pid_set(main_pid
, control_pid
);
3531 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, true, false, pid_set
);
3533 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3534 log_unit_warning_errno(u
, r
, "Failed to kill control group: %m");
3537 /* FIXME: For now, we will not wait for the
3538 * cgroup members to die, simply because
3539 * cgroup notification is unreliable. It
3540 * doesn't work at all in containers, and
3541 * outside of containers it can be confused
3542 * easily by leaving directories in the
3545 /* wait_for_exit = true; */
3547 if (c
->send_sighup
&& k
!= KILL_KILL
) {
3550 pid_set
= unit_pid_set(main_pid
, control_pid
);
3554 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3559 return wait_for_exit
;
3562 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3563 char prefix
[strlen(path
) + 1], *p
;
3569 /* Registers a unit for requiring a certain path and all its
3570 * prefixes. We keep a simple array of these paths in the
3571 * unit, since its usually short. However, we build a prefix
3572 * table for all possible prefixes so that new appearing mount
3573 * units can easily determine which units to make themselves a
3576 if (!path_is_absolute(path
))
3583 path_kill_slashes(p
);
3585 if (!path_is_safe(p
)) {
3590 if (strv_contains(u
->requires_mounts_for
, p
)) {
3595 r
= strv_consume(&u
->requires_mounts_for
, p
);
3599 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3602 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3606 r
= hashmap_ensure_allocated(&u
->manager
->units_requiring_mounts_for
, &string_hash_ops
);
3620 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3636 int unit_setup_exec_runtime(Unit
*u
) {
3642 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3645 /* Check if there already is an ExecRuntime for this unit? */
3646 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3650 /* Try to get it from somebody else */
3651 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3653 *rt
= unit_get_exec_runtime(other
);
3655 exec_runtime_ref(*rt
);
3660 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3663 bool unit_type_supported(UnitType t
) {
3664 if (_unlikely_(t
< 0))
3666 if (_unlikely_(t
>= _UNIT_TYPE_MAX
))
3669 if (!unit_vtable
[t
]->supported
)
3672 return unit_vtable
[t
]->supported();
3675 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3676 [UNIT_ACTIVE
] = "active",
3677 [UNIT_RELOADING
] = "reloading",
3678 [UNIT_INACTIVE
] = "inactive",
3679 [UNIT_FAILED
] = "failed",
3680 [UNIT_ACTIVATING
] = "activating",
3681 [UNIT_DEACTIVATING
] = "deactivating"
3684 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);