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 int maybe_warn_about_dependency(const char *id
, 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
->id
, 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
->id
, 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
->id
, "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u
->id
);
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(u
->id
, "Failed to load configuration for %s: %s",
1251 u
->id
, strerror(-r
));
1256 static bool unit_condition_test_list(Unit
*u
, Condition
*first
, const char *(*to_string
)(ConditionType t
)) {
1263 /* If the condition list is empty, then it is true */
1267 /* Otherwise, if all of the non-trigger conditions apply and
1268 * if any of the trigger conditions apply (unless there are
1269 * none) we return true */
1270 LIST_FOREACH(conditions
, c
, first
) {
1273 r
= condition_test(c
);
1275 log_unit_warning(u
->id
,
1276 "Couldn't determine result for %s=%s%s%s for %s, assuming failed: %s",
1278 c
->trigger
? "|" : "",
1279 c
->negate
? "!" : "",
1284 log_unit_debug(u
->id
,
1285 "%s=%s%s%s %s for %s.",
1287 c
->trigger
? "|" : "",
1288 c
->negate
? "!" : "",
1290 condition_result_to_string(c
->result
),
1293 if (!c
->trigger
&& r
<= 0)
1296 if (c
->trigger
&& triggered
<= 0)
1300 return triggered
!= 0;
1303 static bool unit_condition_test(Unit
*u
) {
1306 dual_timestamp_get(&u
->condition_timestamp
);
1307 u
->condition_result
= unit_condition_test_list(u
, u
->conditions
, condition_type_to_string
);
1309 return u
->condition_result
;
1312 static bool unit_assert_test(Unit
*u
) {
1315 dual_timestamp_get(&u
->assert_timestamp
);
1316 u
->assert_result
= unit_condition_test_list(u
, u
->asserts
, assert_type_to_string
);
1318 return u
->assert_result
;
1321 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1322 const UnitStatusMessageFormats
*format_table
;
1326 assert(t
< _JOB_TYPE_MAX
);
1328 if (t
!= JOB_START
&& t
!= JOB_STOP
)
1331 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1335 return format_table
->starting_stopping
[t
== JOB_STOP
];
1338 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
1343 assert(t
< _JOB_TYPE_MAX
);
1345 format
= unit_get_status_message_format(u
, t
);
1349 /* Return generic strings */
1351 return "Starting %s.";
1352 else if (t
== JOB_STOP
)
1353 return "Stopping %s.";
1354 else if (t
== JOB_RELOAD
)
1355 return "Reloading %s.";
1360 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1365 /* We only print status messages for selected units on
1366 * selected operations. */
1368 format
= unit_get_status_message_format(u
, t
);
1372 DISABLE_WARNING_FORMAT_NONLITERAL
;
1373 unit_status_printf(u
, "", format
);
1377 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1384 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1387 if (log_on_console())
1390 /* We log status messages for all units and all operations. */
1392 format
= unit_get_status_message_format_try_harder(u
, t
);
1396 DISABLE_WARNING_FORMAT_NONLITERAL
;
1397 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1400 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1401 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1402 SD_MESSAGE_UNIT_RELOADING
;
1404 log_unit_struct(u
->id
,
1406 LOG_MESSAGE_ID(mid
),
1407 LOG_MESSAGE("%s", buf
),
1412 * -EBADR: This unit type does not support starting.
1413 * -EALREADY: Unit is already started.
1414 * -EAGAIN: An operation is already in progress. Retry later.
1415 * -ECANCELED: Too many requests for now.
1416 * -EPROTO: Assert failed
1418 int unit_start(Unit
*u
) {
1419 UnitActiveState state
;
1425 if (u
->load_state
!= UNIT_LOADED
)
1428 /* If this is already started, then this will succeed. Note
1429 * that this will even succeed if this unit is not startable
1430 * by the user. This is relied on to detect when we need to
1431 * wait for units and when waiting is finished. */
1432 state
= unit_active_state(u
);
1433 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1436 /* If the conditions failed, don't do anything at all. If we
1437 * already are activating this call might still be useful to
1438 * speed up activation in case there is some hold-off time,
1439 * but we don't want to recheck the condition in that case. */
1440 if (state
!= UNIT_ACTIVATING
&&
1441 !unit_condition_test(u
)) {
1442 log_unit_debug(u
->id
, "Starting of %s requested but condition failed. Not starting unit.", u
->id
);
1446 /* If the asserts failed, fail the entire job */
1447 if (state
!= UNIT_ACTIVATING
&&
1448 !unit_assert_test(u
)) {
1449 log_unit_debug(u
->id
, "Starting of %s requested but asserts failed.", u
->id
);
1453 /* Forward to the main object, if we aren't it. */
1454 following
= unit_following(u
);
1456 log_unit_debug(u
->id
, "Redirecting start request from %s to %s.", u
->id
, following
->id
);
1457 return unit_start(following
);
1460 if (!unit_supported(u
))
1463 /* If it is stopped, but we cannot start it, then fail */
1464 if (!UNIT_VTABLE(u
)->start
)
1467 /* We don't suppress calls to ->start() here when we are
1468 * already starting, to allow this request to be used as a
1469 * "hurry up" call, for example when the unit is in some "auto
1470 * restart" state where it waits for a holdoff timer to elapse
1471 * before it will start again. */
1473 unit_add_to_dbus_queue(u
);
1475 r
= UNIT_VTABLE(u
)->start(u
);
1479 /* Log if the start function actually did something */
1480 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1481 unit_status_print_starting_stopping(u
, JOB_START
);
1485 bool unit_can_start(Unit
*u
) {
1488 return !!UNIT_VTABLE(u
)->start
;
1491 bool unit_can_isolate(Unit
*u
) {
1494 return unit_can_start(u
) &&
1499 * -EBADR: This unit type does not support stopping.
1500 * -EALREADY: Unit is already stopped.
1501 * -EAGAIN: An operation is already in progress. Retry later.
1503 int unit_stop(Unit
*u
) {
1504 UnitActiveState state
;
1510 state
= unit_active_state(u
);
1511 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1514 following
= unit_following(u
);
1516 log_unit_debug(u
->id
, "Redirecting stop request from %s to %s.", u
->id
, following
->id
);
1517 return unit_stop(following
);
1520 if (!UNIT_VTABLE(u
)->stop
)
1523 unit_add_to_dbus_queue(u
);
1525 r
= UNIT_VTABLE(u
)->stop(u
);
1529 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1530 unit_status_print_starting_stopping(u
, JOB_STOP
);
1535 * -EBADR: This unit type does not support reloading.
1536 * -ENOEXEC: Unit is not started.
1537 * -EAGAIN: An operation is already in progress. Retry later.
1539 int unit_reload(Unit
*u
) {
1540 UnitActiveState state
;
1546 if (u
->load_state
!= UNIT_LOADED
)
1549 if (!unit_can_reload(u
))
1552 state
= unit_active_state(u
);
1553 if (state
== UNIT_RELOADING
)
1556 if (state
!= UNIT_ACTIVE
) {
1557 log_unit_warning(u
->id
, "Unit %s cannot be reloaded because it is inactive.", u
->id
);
1561 following
= unit_following(u
);
1563 log_unit_debug(u
->id
, "Redirecting reload request from %s to %s.", u
->id
, following
->id
);
1564 return unit_reload(following
);
1567 unit_add_to_dbus_queue(u
);
1569 r
= UNIT_VTABLE(u
)->reload(u
);
1573 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1577 bool unit_can_reload(Unit
*u
) {
1580 if (!UNIT_VTABLE(u
)->reload
)
1583 if (!UNIT_VTABLE(u
)->can_reload
)
1586 return UNIT_VTABLE(u
)->can_reload(u
);
1589 static void unit_check_unneeded(Unit
*u
) {
1595 /* If this service shall be shut down when unneeded then do
1598 if (!u
->stop_when_unneeded
)
1601 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1604 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY
], i
)
1605 if (unit_active_or_pending(other
))
1608 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY_OVERRIDABLE
], i
)
1609 if (unit_active_or_pending(other
))
1612 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTED_BY
], i
)
1613 if (unit_active_or_pending(other
))
1616 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1617 if (unit_active_or_pending(other
))
1620 log_unit_info(u
->id
, "Unit %s is not needed anymore. Stopping.", u
->id
);
1622 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1623 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1626 static void unit_check_binds_to(Unit
*u
) {
1636 if (unit_active_state(u
) != UNIT_ACTIVE
)
1639 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
) {
1643 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
1654 log_unit_info(u
->id
, "Unit %s is bound to inactive unit %s. Stopping, too.", u
->id
, other
->id
);
1656 /* A unit we need to run is gone. Sniff. Let's stop this. */
1657 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1660 static void retroactively_start_dependencies(Unit
*u
) {
1665 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1667 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1668 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1669 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1670 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1672 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1673 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1674 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1675 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1677 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1678 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1679 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1680 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1682 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1683 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1684 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1685 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1687 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1688 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1689 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1691 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1692 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1693 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1696 static void retroactively_stop_dependencies(Unit
*u
) {
1701 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1703 /* Pull down units which are bound to us recursively if enabled */
1704 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1705 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1706 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1709 static void check_unneeded_dependencies(Unit
*u
) {
1714 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1716 /* Garbage collect services that might not be needed anymore, if enabled */
1717 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1718 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1719 unit_check_unneeded(other
);
1720 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1721 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1722 unit_check_unneeded(other
);
1723 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1724 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1725 unit_check_unneeded(other
);
1726 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1727 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1728 unit_check_unneeded(other
);
1729 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1730 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1731 unit_check_unneeded(other
);
1732 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1733 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1734 unit_check_unneeded(other
);
1737 void unit_start_on_failure(Unit
*u
) {
1743 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1746 log_unit_info(u
->id
, "Triggering OnFailure= dependencies of %s.", u
->id
);
1748 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1751 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1753 log_unit_error_errno(u
->id
, r
, "Failed to enqueue OnFailure= job: %m");
1757 void unit_trigger_notify(Unit
*u
) {
1763 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1764 if (UNIT_VTABLE(other
)->trigger_notify
)
1765 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1768 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1773 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1774 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1776 /* Note that this is called for all low-level state changes,
1777 * even if they might map to the same high-level
1778 * UnitActiveState! That means that ns == os is an expected
1779 * behavior here. For example: if a mount point is remounted
1780 * this function will be called too! */
1784 /* Update timestamps for state changes */
1785 if (m
->n_reloading
<= 0) {
1788 dual_timestamp_get(&ts
);
1790 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1791 u
->inactive_exit_timestamp
= ts
;
1792 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1793 u
->inactive_enter_timestamp
= ts
;
1795 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1796 u
->active_enter_timestamp
= ts
;
1797 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1798 u
->active_exit_timestamp
= ts
;
1801 /* Keep track of failed units */
1802 manager_update_failed_units(u
->manager
, u
, ns
== UNIT_FAILED
);
1804 /* Make sure the cgroup is always removed when we become inactive */
1805 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1806 unit_destroy_cgroup_if_empty(u
);
1808 /* Note that this doesn't apply to RemainAfterExit services exiting
1809 * successfully, since there's no change of state in that case. Which is
1810 * why it is handled in service_set_state() */
1811 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1814 ec
= unit_get_exec_context(u
);
1815 if (ec
&& exec_context_may_touch_console(ec
)) {
1816 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1819 if (m
->n_on_console
== 0)
1820 /* unset no_console_output flag, since the console is free */
1821 m
->no_console_output
= false;
1830 if (u
->job
->state
== JOB_WAITING
)
1832 /* So we reached a different state for this
1833 * job. Let's see if we can run it now if it
1834 * failed previously due to EAGAIN. */
1835 job_add_to_run_queue(u
->job
);
1837 /* Let's check whether this state change constitutes a
1838 * finished job, or maybe contradicts a running job and
1839 * hence needs to invalidate jobs. */
1841 switch (u
->job
->type
) {
1844 case JOB_VERIFY_ACTIVE
:
1846 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1847 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1848 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1851 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1852 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1858 case JOB_RELOAD_OR_START
:
1860 if (u
->job
->state
== JOB_RUNNING
) {
1861 if (ns
== UNIT_ACTIVE
)
1862 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1863 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1866 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1867 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1875 case JOB_TRY_RESTART
:
1877 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1878 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1879 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1881 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1887 assert_not_reached("Job type unknown");
1893 if (m
->n_reloading
<= 0) {
1895 /* If this state change happened without being
1896 * requested by a job, then let's retroactively start
1897 * or stop dependencies. We skip that step when
1898 * deserializing, since we don't want to create any
1899 * additional jobs just because something is already
1903 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1904 retroactively_start_dependencies(u
);
1905 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1906 retroactively_stop_dependencies(u
);
1909 /* stop unneeded units regardless if going down was expected or not */
1910 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1911 check_unneeded_dependencies(u
);
1913 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1914 log_unit_notice(u
->id
, "Unit %s entered failed state.", u
->id
);
1915 unit_start_on_failure(u
);
1919 /* Some names are special */
1920 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1922 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1923 /* The bus might have just become available,
1924 * hence try to connect to it, if we aren't
1928 if (u
->type
== UNIT_SERVICE
&&
1929 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1930 m
->n_reloading
<= 0) {
1931 /* Write audit record if we have just finished starting up */
1932 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1936 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1937 manager_send_unit_plymouth(m
, u
);
1941 /* We don't care about D-Bus here, since we'll get an
1942 * asynchronous notification for it anyway. */
1944 if (u
->type
== UNIT_SERVICE
&&
1945 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1946 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1947 m
->n_reloading
<= 0) {
1949 /* Hmm, if there was no start record written
1950 * write it now, so that we always have a nice
1953 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1955 if (ns
== UNIT_INACTIVE
)
1956 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1958 /* Write audit record if we have just finished shutting down */
1959 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1961 u
->in_audit
= false;
1965 manager_recheck_journal(m
);
1966 unit_trigger_notify(u
);
1968 if (u
->manager
->n_reloading
<= 0) {
1969 /* Maybe we finished startup and are now ready for
1970 * being stopped because unneeded? */
1971 unit_check_unneeded(u
);
1973 /* Maybe we finished startup, but something we needed
1974 * has vanished? Let's die then. (This happens when
1975 * something BindsTo= to a Type=oneshot unit, as these
1976 * units go directly from starting to inactive,
1977 * without ever entering started.) */
1978 unit_check_binds_to(u
);
1981 unit_add_to_dbus_queue(u
);
1982 unit_add_to_gc_queue(u
);
1985 int unit_watch_pid(Unit
*u
, pid_t pid
) {
1991 /* Watch a specific PID. We only support one or two units
1992 * watching each PID for now, not more. */
1994 r
= set_ensure_allocated(&u
->pids
, NULL
);
1998 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
2002 r
= hashmap_put(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2004 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
2008 r
= hashmap_put(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2011 q
= set_put(u
->pids
, LONG_TO_PTR(pid
));
2018 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
2022 hashmap_remove_value(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
2023 hashmap_remove_value(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
2024 set_remove(u
->pids
, LONG_TO_PTR(pid
));
2027 void unit_unwatch_all_pids(Unit
*u
) {
2030 while (!set_isempty(u
->pids
))
2031 unit_unwatch_pid(u
, PTR_TO_LONG(set_first(u
->pids
)));
2037 static int unit_watch_pids_in_path(Unit
*u
, const char *path
) {
2038 _cleanup_closedir_
DIR *d
= NULL
;
2039 _cleanup_fclose_
FILE *f
= NULL
;
2045 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
2047 r
= cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER
, path
, &f
);
2051 while ((r
= cg_read_pid(f
, &pid
)) > 0) {
2052 r
= unit_watch_pid(u
, pid
);
2053 if (r
< 0 && ret
>= 0)
2056 if (r
< 0 && ret
>= 0)
2059 } else if (ret
>= 0)
2062 r
= cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER
, path
, &d
);
2066 while ((r
= cg_read_subgroup(d
, &fn
)) > 0) {
2067 _cleanup_free_
char *p
= NULL
;
2069 p
= strjoin(path
, "/", fn
, NULL
);
2075 r
= unit_watch_pids_in_path(u
, p
);
2076 if (r
< 0 && ret
>= 0)
2079 if (r
< 0 && ret
>= 0)
2082 } else if (ret
>= 0)
2088 int unit_watch_all_pids(Unit
*u
) {
2091 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
2093 if (!u
->cgroup_path
)
2096 return unit_watch_pids_in_path(u
, u
->cgroup_path
);
2099 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2105 /* Cleans dead PIDs from our list */
2107 SET_FOREACH(e
, u
->pids
, i
) {
2108 pid_t pid
= PTR_TO_LONG(e
);
2110 if (pid
== except1
|| pid
== except2
)
2113 if (!pid_is_unwaited(pid
))
2114 unit_unwatch_pid(u
, pid
);
2118 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2120 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2124 case JOB_VERIFY_ACTIVE
:
2131 case JOB_TRY_RESTART
:
2132 return unit_can_start(u
);
2135 return unit_can_reload(u
);
2137 case JOB_RELOAD_OR_START
:
2138 return unit_can_reload(u
) && unit_can_start(u
);
2141 assert_not_reached("Invalid job type");
2145 static int maybe_warn_about_dependency(const char *id
, const char *other
, UnitDependency dependency
) {
2148 switch (dependency
) {
2150 case UNIT_REQUIRES_OVERRIDABLE
:
2152 case UNIT_REQUISITE
:
2153 case UNIT_REQUISITE_OVERRIDABLE
:
2156 case UNIT_REQUIRED_BY
:
2157 case UNIT_REQUIRED_BY_OVERRIDABLE
:
2158 case UNIT_WANTED_BY
:
2160 case UNIT_CONSISTS_OF
:
2161 case UNIT_REFERENCES
:
2162 case UNIT_REFERENCED_BY
:
2163 case UNIT_PROPAGATES_RELOAD_TO
:
2164 case UNIT_RELOAD_PROPAGATED_FROM
:
2165 case UNIT_JOINS_NAMESPACE_OF
:
2168 case UNIT_CONFLICTS
:
2169 case UNIT_CONFLICTED_BY
:
2172 case UNIT_ON_FAILURE
:
2174 case UNIT_TRIGGERED_BY
:
2175 if (streq_ptr(id
, other
))
2176 log_unit_warning(id
, "Dependency %s=%s dropped from unit %s",
2177 unit_dependency_to_string(dependency
), id
, other
);
2179 log_unit_warning(id
, "Dependency %s=%s dropped from unit %s merged into %s",
2180 unit_dependency_to_string(dependency
), id
,
2184 case _UNIT_DEPENDENCY_MAX
:
2185 case _UNIT_DEPENDENCY_INVALID
:
2189 assert_not_reached("Invalid dependency type");
2192 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2194 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2195 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2196 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2197 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2198 [UNIT_REQUISITE
] = UNIT_REQUIRED_BY
,
2199 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2200 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2201 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2202 [UNIT_REQUIRED_BY
] = _UNIT_DEPENDENCY_INVALID
,
2203 [UNIT_REQUIRED_BY_OVERRIDABLE
] = _UNIT_DEPENDENCY_INVALID
,
2204 [UNIT_WANTED_BY
] = _UNIT_DEPENDENCY_INVALID
,
2205 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2206 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2207 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2208 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2209 [UNIT_BEFORE
] = UNIT_AFTER
,
2210 [UNIT_AFTER
] = UNIT_BEFORE
,
2211 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2212 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2213 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2214 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2215 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2216 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2217 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2218 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2220 int r
, q
= 0, v
= 0, w
= 0;
2221 Unit
*orig_u
= u
, *orig_other
= other
;
2224 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2227 u
= unit_follow_merge(u
);
2228 other
= unit_follow_merge(other
);
2230 /* We won't allow dependencies on ourselves. We will not
2231 * consider them an error however. */
2233 maybe_warn_about_dependency(orig_u
->id
, orig_other
->id
, d
);
2237 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2241 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2242 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2247 if (add_reference
) {
2248 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2252 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2257 q
= set_put(u
->dependencies
[d
], other
);
2261 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2262 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2269 if (add_reference
) {
2270 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2276 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2281 unit_add_to_dbus_queue(u
);
2286 set_remove(u
->dependencies
[d
], other
);
2289 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2292 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2297 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2302 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2306 return unit_add_dependency(u
, e
, other
, add_reference
);
2309 static int resolve_template(Unit
*u
, const char *name
, const char*path
, char **buf
, const char **ret
) {
2313 assert(name
|| path
);
2318 name
= basename(path
);
2320 if (!unit_name_is_valid(name
, UNIT_NAME_TEMPLATE
)) {
2327 r
= unit_name_replace_instance(name
, u
->instance
, buf
);
2329 _cleanup_free_
char *i
= NULL
;
2331 r
= unit_name_to_prefix(u
->id
, &i
);
2335 r
= unit_name_replace_instance(name
, i
, buf
);
2344 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2345 _cleanup_free_
char *buf
= NULL
;
2350 assert(name
|| path
);
2352 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2356 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2360 return unit_add_dependency(u
, d
, other
, add_reference
);
2363 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2364 _cleanup_free_
char *buf
= NULL
;
2369 assert(name
|| path
);
2371 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2375 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2379 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2382 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2383 _cleanup_free_
char *buf
= NULL
;
2388 assert(name
|| path
);
2390 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2394 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2398 return unit_add_dependency(other
, d
, u
, add_reference
);
2401 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2402 _cleanup_free_
char *buf
= NULL
;
2407 assert(name
|| path
);
2409 r
= resolve_template(u
, name
, path
, &buf
, &name
);
2413 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2417 return unit_add_two_dependencies(other
, d
, e
, u
, add_reference
);
2420 int set_unit_path(const char *p
) {
2421 /* This is mostly for debug purposes */
2422 if (setenv("SYSTEMD_UNIT_PATH", p
, 0) < 0)
2428 char *unit_dbus_path(Unit
*u
) {
2434 return unit_dbus_path_from_name(u
->id
);
2437 char *unit_default_cgroup_path(Unit
*u
) {
2438 _cleanup_free_
char *escaped
= NULL
, *slice
= NULL
;
2443 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
2444 return strdup(u
->manager
->cgroup_root
);
2446 if (UNIT_ISSET(u
->slice
) && !unit_has_name(UNIT_DEREF(u
->slice
), SPECIAL_ROOT_SLICE
)) {
2447 r
= cg_slice_to_path(UNIT_DEREF(u
->slice
)->id
, &slice
);
2452 escaped
= cg_escape(u
->id
);
2457 return strjoin(u
->manager
->cgroup_root
, "/", slice
, "/", escaped
, NULL
);
2459 return strjoin(u
->manager
->cgroup_root
, "/", escaped
, NULL
);
2462 int unit_add_default_slice(Unit
*u
, CGroupContext
*c
) {
2463 _cleanup_free_
char *b
= NULL
;
2464 const char *slice_name
;
2471 if (UNIT_ISSET(u
->slice
))
2475 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2477 /* Implicitly place all instantiated units in their
2478 * own per-template slice */
2480 r
= unit_name_to_prefix(u
->id
, &prefix
);
2484 /* The prefix is already escaped, but it might include
2485 * "-" which has a special meaning for slice units,
2486 * hence escape it here extra. */
2487 escaped
= unit_name_escape(prefix
);
2491 if (u
->manager
->running_as
== SYSTEMD_SYSTEM
)
2492 b
= strjoin("system-", escaped
, ".slice", NULL
);
2494 b
= strappend(escaped
, ".slice");
2501 u
->manager
->running_as
== SYSTEMD_SYSTEM
2502 ? SPECIAL_SYSTEM_SLICE
2503 : SPECIAL_ROOT_SLICE
;
2505 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2509 unit_ref_set(&u
->slice
, slice
);
2513 const char *unit_slice_name(Unit
*u
) {
2516 if (!UNIT_ISSET(u
->slice
))
2519 return UNIT_DEREF(u
->slice
)->id
;
2522 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2523 _cleanup_free_
char *t
= NULL
;
2530 r
= unit_name_change_suffix(u
->id
, type
, &t
);
2533 if (unit_has_name(u
, t
))
2536 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2537 assert(r
< 0 || *_found
!= u
);
2541 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2545 /* Watch a specific name on the bus. We only support one unit
2546 * watching each name for now. */
2548 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2551 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2555 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2558 bool unit_can_serialize(Unit
*u
) {
2561 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2564 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2571 if (unit_can_serialize(u
)) {
2574 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2578 rt
= unit_get_exec_runtime(u
);
2580 r
= exec_runtime_serialize(rt
, u
, f
, fds
);
2586 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2587 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2588 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2589 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2590 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2591 dual_timestamp_serialize(f
, "assert-timestamp", &u
->assert_timestamp
);
2593 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2594 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2596 if (dual_timestamp_is_set(&u
->assert_timestamp
))
2597 unit_serialize_item(u
, f
, "assert-result", yes_no(u
->assert_result
));
2599 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2600 unit_serialize_item_format(u
, f
, "cpuacct-usage-base", "%" PRIu64
, u
->cpuacct_usage_base
);
2603 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2605 if (serialize_jobs
) {
2607 fprintf(f
, "job\n");
2608 job_serialize(u
->job
, f
, fds
);
2612 fprintf(f
, "job\n");
2613 job_serialize(u
->nop_job
, f
, fds
);
2622 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2633 va_start(ap
, format
);
2634 vfprintf(f
, format
, ap
);
2640 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2646 fprintf(f
, "%s=%s\n", key
, value
);
2649 static int unit_set_cgroup_path(Unit
*u
, const char *path
) {
2650 _cleanup_free_
char *p
= NULL
;
2662 if (streq_ptr(u
->cgroup_path
, p
))
2666 r
= hashmap_put(u
->manager
->cgroup_unit
, p
, u
);
2671 if (u
->cgroup_path
) {
2672 log_unit_debug(u
->id
, "%s: Changing cgroup path from %s to %s.", u
->id
, u
->cgroup_path
, strna(p
));
2673 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
2674 free(u
->cgroup_path
);
2683 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2684 ExecRuntime
**rt
= NULL
;
2692 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2694 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2697 char line
[LINE_MAX
], *l
, *v
;
2700 if (!fgets(line
, sizeof(line
), f
)) {
2713 k
= strcspn(l
, "=");
2721 if (streq(l
, "job")) {
2723 /* new-style serialized job */
2730 r
= job_deserialize(j
, f
, fds
);
2736 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2742 r
= job_install_deserialized(j
);
2744 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2752 type
= job_type_from_string(v
);
2754 log_debug("Failed to parse job type value %s", v
);
2756 u
->deserialized_job
= type
;
2759 } else if (streq(l
, "inactive-exit-timestamp")) {
2760 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2762 } else if (streq(l
, "active-enter-timestamp")) {
2763 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2765 } else if (streq(l
, "active-exit-timestamp")) {
2766 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2768 } else if (streq(l
, "inactive-enter-timestamp")) {
2769 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2771 } else if (streq(l
, "condition-timestamp")) {
2772 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2774 } else if (streq(l
, "assert-timestamp")) {
2775 dual_timestamp_deserialize(v
, &u
->assert_timestamp
);
2777 } else if (streq(l
, "condition-result")) {
2779 r
= parse_boolean(v
);
2781 log_debug("Failed to parse condition result value %s, ignoring.", v
);
2783 u
->condition_result
= r
;
2787 } else if (streq(l
, "assert-result")) {
2789 r
= parse_boolean(v
);
2791 log_debug("Failed to parse assert result value %s, ignoring.", v
);
2793 u
->assert_result
= r
;
2797 } else if (streq(l
, "transient")) {
2799 r
= parse_boolean(v
);
2801 log_debug("Failed to parse transient bool %s, ignoring.", v
);
2807 } else if (streq(l
, "cpuacct-usage-base")) {
2809 r
= safe_atou64(v
, &u
->cpuacct_usage_base
);
2811 log_debug("Failed to parse CPU usage %s, ignoring.", v
);
2815 } else if (streq(l
, "cgroup")) {
2817 r
= unit_set_cgroup_path(u
, v
);
2819 log_debug_errno(r
, "Failed to set cgroup path %s, ignoring: %m", v
);
2824 if (unit_can_serialize(u
)) {
2826 r
= exec_runtime_deserialize_item(rt
, u
, l
, v
, fds
);
2828 log_unit_warning(u
->id
, "Failed to deserialize runtime parameter '%s', ignoring.", l
);
2832 /* Returns positive if key was handled by the call */
2837 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2839 log_unit_warning(u
->id
, "Failed to deserialize unit parameter '%s', ignoring.", l
);
2844 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2846 _cleanup_free_
char *e
= NULL
;
2851 /* Adds in links to the device node that this unit is based on */
2855 if (!is_device_path(what
))
2858 /* When device units aren't supported (such as in a
2859 * container), don't create dependencies on them. */
2860 if (!unit_type_supported(UNIT_DEVICE
))
2863 r
= unit_name_from_path(what
, ".device", &e
);
2867 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2871 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_BINDS_TO
: UNIT_WANTS
, device
, true);
2876 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2884 int unit_coldplug(Unit
*u
) {
2889 /* Make sure we don't enter a loop, when coldplugging
2894 u
->coldplugged
= true;
2896 if (UNIT_VTABLE(u
)->coldplug
) {
2897 r
= UNIT_VTABLE(u
)->coldplug(u
);
2903 r
= job_coldplug(u
->job
);
2906 } else if (u
->deserialized_job
>= 0) {
2908 r
= manager_add_job(u
->manager
, u
->deserialized_job
, u
, JOB_IGNORE_REQUIREMENTS
, false, NULL
, NULL
);
2912 u
->deserialized_job
= _JOB_TYPE_INVALID
;
2918 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2919 DISABLE_WARNING_FORMAT_NONLITERAL
;
2920 manager_status_printf(u
->manager
, STATUS_TYPE_NORMAL
,
2921 status
, unit_status_msg_format
, unit_description(u
));
2925 bool unit_need_daemon_reload(Unit
*u
) {
2926 _cleanup_strv_free_
char **t
= NULL
;
2929 unsigned loaded_cnt
, current_cnt
;
2933 if (u
->fragment_path
) {
2935 if (stat(u
->fragment_path
, &st
) < 0)
2936 /* What, cannot access this anymore? */
2939 if (u
->fragment_mtime
> 0 &&
2940 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2944 if (u
->source_path
) {
2946 if (stat(u
->source_path
, &st
) < 0)
2949 if (u
->source_mtime
> 0 &&
2950 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2954 (void) unit_find_dropin_paths(u
, &t
);
2955 loaded_cnt
= strv_length(t
);
2956 current_cnt
= strv_length(u
->dropin_paths
);
2958 if (loaded_cnt
== current_cnt
) {
2959 if (loaded_cnt
== 0)
2962 if (strv_overlap(u
->dropin_paths
, t
)) {
2963 STRV_FOREACH(path
, u
->dropin_paths
) {
2965 if (stat(*path
, &st
) < 0)
2968 if (u
->dropin_mtime
> 0 &&
2969 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2980 void unit_reset_failed(Unit
*u
) {
2983 if (UNIT_VTABLE(u
)->reset_failed
)
2984 UNIT_VTABLE(u
)->reset_failed(u
);
2987 Unit
*unit_following(Unit
*u
) {
2990 if (UNIT_VTABLE(u
)->following
)
2991 return UNIT_VTABLE(u
)->following(u
);
2996 bool unit_stop_pending(Unit
*u
) {
2999 /* This call does check the current state of the unit. It's
3000 * hence useful to be called from state change calls of the
3001 * unit itself, where the state isn't updated yet. This is
3002 * different from unit_inactive_or_pending() which checks both
3003 * the current state and for a queued job. */
3005 return u
->job
&& u
->job
->type
== JOB_STOP
;
3008 bool unit_inactive_or_pending(Unit
*u
) {
3011 /* Returns true if the unit is inactive or going down */
3013 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
3016 if (unit_stop_pending(u
))
3022 bool unit_active_or_pending(Unit
*u
) {
3025 /* Returns true if the unit is active or going up */
3027 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
3031 (u
->job
->type
== JOB_START
||
3032 u
->job
->type
== JOB_RELOAD_OR_START
||
3033 u
->job
->type
== JOB_RESTART
))
3039 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
3041 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
3043 assert(signo
< _NSIG
);
3045 if (!UNIT_VTABLE(u
)->kill
)
3048 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
3051 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
3055 pid_set
= set_new(NULL
);
3059 /* Exclude the main/control pids from being killed via the cgroup */
3061 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
3066 if (control_pid
> 0) {
3067 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
3079 int unit_kill_common(
3085 sd_bus_error
*error
) {
3089 if (who
== KILL_MAIN
&& main_pid
<= 0) {
3091 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
3093 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
3096 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
3097 if (control_pid
< 0)
3098 return sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
3100 return sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
3103 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
3104 if (control_pid
> 0)
3105 if (kill(control_pid
, signo
) < 0)
3108 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
3110 if (kill(main_pid
, signo
) < 0)
3113 if (who
== KILL_ALL
&& u
->cgroup_path
) {
3114 _cleanup_set_free_ Set
*pid_set
= NULL
;
3117 /* Exclude the main/control pids from being killed via the cgroup */
3118 pid_set
= unit_pid_set(main_pid
, control_pid
);
3122 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, true, false, pid_set
);
3123 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
3130 int unit_following_set(Unit
*u
, Set
**s
) {
3134 if (UNIT_VTABLE(u
)->following_set
)
3135 return UNIT_VTABLE(u
)->following_set(u
, s
);
3141 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
3144 if (u
->unit_file_state
< 0 && u
->fragment_path
)
3145 u
->unit_file_state
= unit_file_get_state(
3146 u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3147 NULL
, basename(u
->fragment_path
));
3149 return u
->unit_file_state
;
3152 int unit_get_unit_file_preset(Unit
*u
) {
3155 if (u
->unit_file_preset
< 0 && u
->fragment_path
)
3156 u
->unit_file_preset
= unit_file_query_preset(
3157 u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
3158 NULL
, basename(u
->fragment_path
));
3160 return u
->unit_file_preset
;
3163 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3168 unit_ref_unset(ref
);
3171 LIST_PREPEND(refs
, u
->refs
, ref
);
3175 void unit_ref_unset(UnitRef
*ref
) {
3181 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3185 int unit_patch_contexts(Unit
*u
) {
3193 /* Patch in the manager defaults into the exec and cgroup
3194 * contexts, _after_ the rest of the settings have been
3197 ec
= unit_get_exec_context(u
);
3199 /* This only copies in the ones that need memory */
3200 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3201 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3202 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3207 if (u
->manager
->running_as
== SYSTEMD_USER
&&
3208 !ec
->working_directory
) {
3210 r
= get_home_dir(&ec
->working_directory
);
3214 /* Allow user services to run, even if the
3215 * home directory is missing */
3216 ec
->working_directory_missing_ok
= true;
3219 if (u
->manager
->running_as
== SYSTEMD_USER
&&
3220 (ec
->syscall_whitelist
||
3221 !set_isempty(ec
->syscall_filter
) ||
3222 !set_isempty(ec
->syscall_archs
) ||
3223 ec
->address_families_whitelist
||
3224 !set_isempty(ec
->address_families
)))
3225 ec
->no_new_privileges
= true;
3227 if (ec
->private_devices
)
3228 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3231 cc
= unit_get_cgroup_context(u
);
3235 ec
->private_devices
&&
3236 cc
->device_policy
== CGROUP_AUTO
)
3237 cc
->device_policy
= CGROUP_CLOSED
;
3243 ExecContext
*unit_get_exec_context(Unit
*u
) {
3250 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3254 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3257 KillContext
*unit_get_kill_context(Unit
*u
) {
3264 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3268 return (KillContext
*) ((uint8_t*) u
+ offset
);
3271 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3277 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3281 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3284 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3290 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3294 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3297 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3298 if (u
->manager
->running_as
== SYSTEMD_USER
) {
3301 if (mode
== UNIT_PERSISTENT
&& !transient
)
3302 r
= user_config_home(dir
);
3304 r
= user_runtime_dir(dir
);
3311 if (mode
== UNIT_PERSISTENT
&& !transient
)
3312 *dir
= strdup("/etc/systemd/system");
3314 *dir
= strdup("/run/systemd/system");
3321 static int unit_drop_in_file(Unit
*u
,
3322 UnitSetPropertiesMode mode
, const char *name
, char **p
, char **q
) {
3323 _cleanup_free_
char *dir
= NULL
;
3328 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3332 return drop_in_file(dir
, u
->id
, 50, name
, p
, q
);
3335 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3337 _cleanup_free_
char *dir
= NULL
, *p
= NULL
, *q
= NULL
;
3342 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3345 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3349 r
= write_drop_in(dir
, u
->id
, 50, name
, data
);
3353 r
= drop_in_file(dir
, u
->id
, 50, name
, &p
, &q
);
3357 r
= strv_extend(&u
->dropin_paths
, q
);
3361 strv_sort(u
->dropin_paths
);
3362 strv_uniq(u
->dropin_paths
);
3364 u
->dropin_mtime
= now(CLOCK_REALTIME
);
3369 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3370 _cleanup_free_
char *p
= NULL
;
3378 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3381 va_start(ap
, format
);
3382 r
= vasprintf(&p
, format
, ap
);
3388 return unit_write_drop_in(u
, mode
, name
, p
);
3391 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3392 _cleanup_free_
char *ndata
= NULL
;
3398 if (!UNIT_VTABLE(u
)->private_section
)
3401 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3404 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3408 return unit_write_drop_in(u
, mode
, name
, ndata
);
3411 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3412 _cleanup_free_
char *p
= NULL
;
3420 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3423 va_start(ap
, format
);
3424 r
= vasprintf(&p
, format
, ap
);
3430 return unit_write_drop_in_private(u
, mode
, name
, p
);
3433 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
3434 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
3439 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3442 r
= unit_drop_in_file(u
, mode
, name
, &p
, &q
);
3447 r
= errno
== ENOENT
? 0 : -errno
;
3455 int unit_make_transient(Unit
*u
) {
3460 u
->load_state
= UNIT_STUB
;
3462 u
->transient
= true;
3464 free(u
->fragment_path
);
3465 u
->fragment_path
= NULL
;
3467 if (u
->manager
->running_as
== SYSTEMD_USER
) {
3468 _cleanup_free_
char *c
= NULL
;
3470 r
= user_runtime_dir(&c
);
3476 u
->fragment_path
= strjoin(c
, "/", u
->id
, NULL
);
3477 if (!u
->fragment_path
)
3482 u
->fragment_path
= strappend("/run/systemd/system/", u
->id
);
3483 if (!u
->fragment_path
)
3486 mkdir_p("/run/systemd/system", 0755);
3489 return write_string_file_atomic_label(u
->fragment_path
, "# Transient stub");
3492 int unit_kill_context(
3498 bool main_pid_alien
) {
3500 int sig
, wait_for_exit
= false, r
;
3505 if (c
->kill_mode
== KILL_NONE
)
3515 case KILL_TERMINATE
:
3516 sig
= c
->kill_signal
;
3519 assert_not_reached("KillOperation unknown");
3523 r
= kill_and_sigcont(main_pid
, sig
);
3525 if (r
< 0 && r
!= -ESRCH
) {
3526 _cleanup_free_
char *comm
= NULL
;
3527 get_process_comm(main_pid
, &comm
);
3529 log_unit_warning_errno(u
->id
, r
, "Failed to kill main process " PID_FMT
" (%s): %m", main_pid
, strna(comm
));
3531 if (!main_pid_alien
)
3532 wait_for_exit
= true;
3534 if (c
->send_sighup
&& k
!= KILL_KILL
)
3535 kill(main_pid
, SIGHUP
);
3539 if (control_pid
> 0) {
3540 r
= kill_and_sigcont(control_pid
, sig
);
3542 if (r
< 0 && r
!= -ESRCH
) {
3543 _cleanup_free_
char *comm
= NULL
;
3544 get_process_comm(control_pid
, &comm
);
3546 log_unit_warning_errno(u
->id
, r
, "Failed to kill control process " PID_FMT
" (%s): %m", control_pid
, strna(comm
));
3548 wait_for_exit
= true;
3550 if (c
->send_sighup
&& k
!= KILL_KILL
)
3551 kill(control_pid
, SIGHUP
);
3555 if ((c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& k
== KILL_KILL
)) && u
->cgroup_path
) {
3556 _cleanup_set_free_ Set
*pid_set
= NULL
;
3558 /* Exclude the main/control pids from being killed via the cgroup */
3559 pid_set
= unit_pid_set(main_pid
, control_pid
);
3563 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, true, false, pid_set
);
3565 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3566 log_unit_warning_errno(u
->id
, r
, "Failed to kill control group: %m");
3569 /* FIXME: For now, we will not wait for the
3570 * cgroup members to die, simply because
3571 * cgroup notification is unreliable. It
3572 * doesn't work at all in containers, and
3573 * outside of containers it can be confused
3574 * easily by leaving directories in the
3577 /* wait_for_exit = true; */
3579 if (c
->send_sighup
&& k
!= KILL_KILL
) {
3582 pid_set
= unit_pid_set(main_pid
, control_pid
);
3586 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3591 return wait_for_exit
;
3594 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3595 char prefix
[strlen(path
) + 1], *p
;
3601 /* Registers a unit for requiring a certain path and all its
3602 * prefixes. We keep a simple array of these paths in the
3603 * unit, since its usually short. However, we build a prefix
3604 * table for all possible prefixes so that new appearing mount
3605 * units can easily determine which units to make themselves a
3608 if (!path_is_absolute(path
))
3615 path_kill_slashes(p
);
3617 if (!path_is_safe(p
)) {
3622 if (strv_contains(u
->requires_mounts_for
, p
)) {
3627 r
= strv_consume(&u
->requires_mounts_for
, p
);
3631 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3634 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3638 r
= hashmap_ensure_allocated(&u
->manager
->units_requiring_mounts_for
, &string_hash_ops
);
3652 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3668 int unit_setup_exec_runtime(Unit
*u
) {
3674 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3677 /* Check if there already is an ExecRuntime for this unit? */
3678 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3682 /* Try to get it from somebody else */
3683 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3685 *rt
= unit_get_exec_runtime(other
);
3687 exec_runtime_ref(*rt
);
3692 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3695 bool unit_type_supported(UnitType t
) {
3696 if (_unlikely_(t
< 0))
3698 if (_unlikely_(t
>= _UNIT_TYPE_MAX
))
3701 if (!unit_vtable
[t
]->supported
)
3704 return unit_vtable
[t
]->supported();
3707 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3708 [UNIT_ACTIVE
] = "active",
3709 [UNIT_RELOADING
] = "reloading",
3710 [UNIT_INACTIVE
] = "inactive",
3711 [UNIT_FAILED
] = "failed",
3712 [UNIT_ACTIVATING
] = "activating",
3713 [UNIT_DEACTIVATING
] = "deactivating"
3716 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);