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/>.
25 #include <sys/epoll.h>
26 #include <sys/timerfd.h>
32 #include "systemd/sd-id128.h"
33 #include "systemd/sd-messages.h"
38 #include "path-util.h"
39 #include "load-fragment.h"
40 #include "load-dropin.h"
42 #include "unit-name.h"
43 #include "dbus-unit.h"
45 #include "cgroup-util.h"
49 #include "fileio-label.h"
50 #include "bus-errors.h"
52 const UnitVTable
* const unit_vtable
[_UNIT_TYPE_MAX
] = {
53 [UNIT_SERVICE
] = &service_vtable
,
54 [UNIT_TIMER
] = &timer_vtable
,
55 [UNIT_SOCKET
] = &socket_vtable
,
56 [UNIT_TARGET
] = &target_vtable
,
57 [UNIT_DEVICE
] = &device_vtable
,
58 [UNIT_MOUNT
] = &mount_vtable
,
59 [UNIT_AUTOMOUNT
] = &automount_vtable
,
60 [UNIT_SNAPSHOT
] = &snapshot_vtable
,
61 [UNIT_SWAP
] = &swap_vtable
,
62 [UNIT_PATH
] = &path_vtable
,
63 [UNIT_SLICE
] = &slice_vtable
66 Unit
*unit_new(Manager
*m
, size_t size
) {
70 assert(size
>= sizeof(Unit
));
76 u
->names
= set_new(string_hash_func
, string_compare_func
);
83 u
->type
= _UNIT_TYPE_INVALID
;
84 u
->deserialized_job
= _JOB_TYPE_INVALID
;
85 u
->default_dependencies
= true;
86 u
->unit_file_state
= _UNIT_FILE_STATE_INVALID
;
91 bool unit_has_name(Unit
*u
, const char *name
) {
95 return !!set_get(u
->names
, (char*) name
);
98 int unit_add_name(Unit
*u
, const char *text
) {
106 if (unit_name_is_template(text
)) {
110 s
= unit_name_replace_instance(text
, u
->instance
);
117 if (!unit_name_is_valid(s
, false)) {
122 assert_se((t
= unit_name_to_type(s
)) >= 0);
124 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
) {
129 if ((r
= unit_name_to_instance(s
, &i
)) < 0)
132 if (i
&& unit_vtable
[t
]->no_instances
) {
137 /* Ensure that this unit is either instanced or not instanced,
139 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
) {
144 if (unit_vtable
[t
]->no_alias
&&
145 !set_isempty(u
->names
) &&
146 !set_get(u
->names
, s
)) {
151 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
) {
156 if ((r
= set_put(u
->names
, s
)) < 0) {
162 if ((r
= hashmap_put(u
->manager
->units
, s
, u
)) < 0) {
163 set_remove(u
->names
, s
);
167 if (u
->type
== _UNIT_TYPE_INVALID
) {
173 LIST_PREPEND(Unit
, units_by_type
, u
->manager
->units_by_type
[t
], u
);
175 if (UNIT_VTABLE(u
)->init
)
176 UNIT_VTABLE(u
)->init(u
);
180 unit_add_to_dbus_queue(u
);
190 int unit_choose_id(Unit
*u
, const char *name
) {
191 char *s
, *t
= NULL
, *i
;
197 if (unit_name_is_template(name
)) {
202 if (!(t
= unit_name_replace_instance(name
, u
->instance
)))
208 /* Selects one of the names of this unit as the id */
209 s
= set_get(u
->names
, (char*) name
);
215 if ((r
= unit_name_to_instance(s
, &i
)) < 0)
223 unit_add_to_dbus_queue(u
);
228 int unit_set_description(Unit
*u
, const char *description
) {
233 if (!(s
= strdup(description
)))
236 free(u
->description
);
239 unit_add_to_dbus_queue(u
);
243 bool unit_check_gc(Unit
*u
) {
246 if (u
->load_state
== UNIT_STUB
)
249 if (UNIT_VTABLE(u
)->no_gc
)
261 if (unit_active_state(u
) != UNIT_INACTIVE
)
267 if (UNIT_VTABLE(u
)->check_gc
)
268 if (UNIT_VTABLE(u
)->check_gc(u
))
274 void unit_add_to_load_queue(Unit
*u
) {
276 assert(u
->type
!= _UNIT_TYPE_INVALID
);
278 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
281 LIST_PREPEND(Unit
, load_queue
, u
->manager
->load_queue
, u
);
282 u
->in_load_queue
= true;
285 void unit_add_to_cleanup_queue(Unit
*u
) {
288 if (u
->in_cleanup_queue
)
291 LIST_PREPEND(Unit
, cleanup_queue
, u
->manager
->cleanup_queue
, u
);
292 u
->in_cleanup_queue
= true;
295 void unit_add_to_gc_queue(Unit
*u
) {
298 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
301 if (unit_check_gc(u
))
304 LIST_PREPEND(Unit
, gc_queue
, u
->manager
->gc_queue
, u
);
305 u
->in_gc_queue
= true;
307 u
->manager
->n_in_gc_queue
++;
309 if (u
->manager
->gc_queue_timestamp
<= 0)
310 u
->manager
->gc_queue_timestamp
= now(CLOCK_MONOTONIC
);
313 void unit_add_to_dbus_queue(Unit
*u
) {
315 assert(u
->type
!= _UNIT_TYPE_INVALID
);
317 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
320 /* Shortcut things if nobody cares */
321 if (!bus_has_subscriber(u
->manager
)) {
322 u
->sent_dbus_new_signal
= true;
326 LIST_PREPEND(Unit
, dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
327 u
->in_dbus_queue
= true;
330 static void bidi_set_free(Unit
*u
, Set
*s
) {
336 /* Frees the set and makes sure we are dropped from the
337 * inverse pointers */
339 SET_FOREACH(other
, s
, i
) {
342 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
343 set_remove(other
->dependencies
[d
], u
);
345 unit_add_to_gc_queue(other
);
351 void unit_free(Unit
*u
) {
358 bus_unit_send_removed_signal(u
);
360 if (u
->load_state
!= UNIT_STUB
)
361 if (UNIT_VTABLE(u
)->done
)
362 UNIT_VTABLE(u
)->done(u
);
364 SET_FOREACH(t
, u
->names
, i
)
365 hashmap_remove_value(u
->manager
->units
, t
, u
);
379 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
380 bidi_set_free(u
, u
->dependencies
[d
]);
382 if (u
->requires_mounts_for
) {
383 LIST_REMOVE(Unit
, has_requires_mounts_for
, u
->manager
->has_requires_mounts_for
, u
);
384 strv_free(u
->requires_mounts_for
);
387 if (u
->type
!= _UNIT_TYPE_INVALID
)
388 LIST_REMOVE(Unit
, units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
390 if (u
->in_load_queue
)
391 LIST_REMOVE(Unit
, load_queue
, u
->manager
->load_queue
, u
);
393 if (u
->in_dbus_queue
)
394 LIST_REMOVE(Unit
, dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
396 if (u
->in_cleanup_queue
)
397 LIST_REMOVE(Unit
, cleanup_queue
, u
->manager
->cleanup_queue
, u
);
399 if (u
->in_gc_queue
) {
400 LIST_REMOVE(Unit
, gc_queue
, u
->manager
->gc_queue
, u
);
401 u
->manager
->n_in_gc_queue
--;
404 if (u
->in_cgroup_queue
)
405 LIST_REMOVE(Unit
, cgroup_queue
, u
->manager
->cgroup_queue
, u
);
407 free(u
->cgroup_path
);
408 free(u
->description
);
409 strv_free(u
->documentation
);
410 free(u
->fragment_path
);
411 free(u
->source_path
);
412 strv_free(u
->dropin_paths
);
415 set_free_free(u
->names
);
417 condition_free_list(u
->conditions
);
419 unit_ref_unset(&u
->slice
);
422 unit_ref_unset(u
->refs
);
427 UnitActiveState
unit_active_state(Unit
*u
) {
430 if (u
->load_state
== UNIT_MERGED
)
431 return unit_active_state(unit_follow_merge(u
));
433 /* After a reload it might happen that a unit is not correctly
434 * loaded but still has a process around. That's why we won't
435 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
437 return UNIT_VTABLE(u
)->active_state(u
);
440 const char* unit_sub_state_to_string(Unit
*u
) {
443 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
446 static void complete_move(Set
**s
, Set
**other
) {
454 set_move(*s
, *other
);
461 static void merge_names(Unit
*u
, Unit
*other
) {
468 complete_move(&u
->names
, &other
->names
);
470 set_free_free(other
->names
);
474 SET_FOREACH(t
, u
->names
, i
)
475 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
478 static void merge_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
485 assert(d
< _UNIT_DEPENDENCY_MAX
);
487 /* Fix backwards pointers */
488 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
491 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++)
492 if ((r
= set_remove_and_put(back
->dependencies
[k
], other
, u
)) < 0) {
495 set_remove(back
->dependencies
[k
], other
);
497 assert(r
== -ENOENT
);
501 complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]);
503 set_free(other
->dependencies
[d
]);
504 other
->dependencies
[d
] = NULL
;
507 int unit_merge(Unit
*u
, Unit
*other
) {
512 assert(u
->manager
== other
->manager
);
513 assert(u
->type
!= _UNIT_TYPE_INVALID
);
515 other
= unit_follow_merge(other
);
520 if (u
->type
!= other
->type
)
523 if (!u
->instance
!= !other
->instance
)
526 if (other
->load_state
!= UNIT_STUB
&&
527 other
->load_state
!= UNIT_ERROR
)
536 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
540 merge_names(u
, other
);
542 /* Redirect all references */
544 unit_ref_set(other
->refs
, u
);
546 /* Merge dependencies */
547 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
548 merge_dependencies(u
, other
, d
);
550 other
->load_state
= UNIT_MERGED
;
551 other
->merged_into
= u
;
553 /* If there is still some data attached to the other node, we
554 * don't need it anymore, and can free it. */
555 if (other
->load_state
!= UNIT_STUB
)
556 if (UNIT_VTABLE(other
)->done
)
557 UNIT_VTABLE(other
)->done(other
);
559 unit_add_to_dbus_queue(u
);
560 unit_add_to_cleanup_queue(other
);
565 int unit_merge_by_name(Unit
*u
, const char *name
) {
573 if (unit_name_is_template(name
)) {
577 if (!(s
= unit_name_replace_instance(name
, u
->instance
)))
583 if (!(other
= manager_get_unit(u
->manager
, name
)))
584 r
= unit_add_name(u
, name
);
586 r
= unit_merge(u
, other
);
592 Unit
* unit_follow_merge(Unit
*u
) {
595 while (u
->load_state
== UNIT_MERGED
)
596 assert_se(u
= u
->merged_into
);
601 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
607 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
608 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
609 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
610 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
611 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
612 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
613 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
614 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
615 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
616 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
617 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
618 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
621 /* If syslog or kernel logging is requested, make sure our own
622 * logging daemon is run first. */
624 if (u
->manager
->running_as
== SYSTEMD_SYSTEM
) {
625 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
633 const char *unit_description(Unit
*u
) {
637 return u
->description
;
642 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
649 timestamp1
[FORMAT_TIMESTAMP_MAX
],
650 timestamp2
[FORMAT_TIMESTAMP_MAX
],
651 timestamp3
[FORMAT_TIMESTAMP_MAX
],
652 timestamp4
[FORMAT_TIMESTAMP_MAX
],
653 timespan
[FORMAT_TIMESPAN_MAX
];
657 assert(u
->type
>= 0);
661 p2
= strappend(prefix
, "\t");
662 prefix2
= p2
? p2
: prefix
;
666 "%s\tDescription: %s\n"
668 "%s\tUnit Load State: %s\n"
669 "%s\tUnit Active State: %s\n"
670 "%s\tInactive Exit Timestamp: %s\n"
671 "%s\tActive Enter Timestamp: %s\n"
672 "%s\tActive Exit Timestamp: %s\n"
673 "%s\tInactive Enter Timestamp: %s\n"
674 "%s\tGC Check Good: %s\n"
675 "%s\tNeed Daemon Reload: %s\n"
678 "%s\tCGroup realized: %s\n"
679 "%s\tCGroup mask: 0x%x\n",
681 prefix
, unit_description(u
),
682 prefix
, strna(u
->instance
),
683 prefix
, unit_load_state_to_string(u
->load_state
),
684 prefix
, unit_active_state_to_string(unit_active_state(u
)),
685 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
686 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
687 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
688 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
689 prefix
, yes_no(unit_check_gc(u
)),
690 prefix
, yes_no(unit_need_daemon_reload(u
)),
691 prefix
, strna(unit_slice_name(u
)),
692 prefix
, strna(u
->cgroup_path
),
693 prefix
, yes_no(u
->cgroup_realized
),
694 prefix
, u
->cgroup_mask
);
696 SET_FOREACH(t
, u
->names
, i
)
697 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
699 STRV_FOREACH(j
, u
->documentation
)
700 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
702 if ((following
= unit_following(u
)))
703 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
705 if (u
->fragment_path
)
706 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
709 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
711 STRV_FOREACH(j
, u
->dropin_paths
)
712 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
714 if (u
->job_timeout
> 0)
715 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
717 condition_dump_list(u
->conditions
, f
, prefix
);
719 if (dual_timestamp_is_set(&u
->condition_timestamp
))
721 "%s\tCondition Timestamp: %s\n"
722 "%s\tCondition Result: %s\n",
723 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
724 prefix
, yes_no(u
->condition_result
));
726 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
729 SET_FOREACH(other
, u
->dependencies
[d
], i
)
730 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
733 if (!strv_isempty(u
->requires_mounts_for
)) {
735 "%s\tRequiresMountsFor:", prefix
);
737 STRV_FOREACH(j
, u
->requires_mounts_for
)
738 fprintf(f
, " %s", *j
);
743 if (u
->load_state
== UNIT_LOADED
) {
746 "%s\tStopWhenUnneeded: %s\n"
747 "%s\tRefuseManualStart: %s\n"
748 "%s\tRefuseManualStop: %s\n"
749 "%s\tDefaultDependencies: %s\n"
750 "%s\tOnFailureIsolate: %s\n"
751 "%s\tIgnoreOnIsolate: %s\n"
752 "%s\tIgnoreOnSnapshot: %s\n",
753 prefix
, yes_no(u
->stop_when_unneeded
),
754 prefix
, yes_no(u
->refuse_manual_start
),
755 prefix
, yes_no(u
->refuse_manual_stop
),
756 prefix
, yes_no(u
->default_dependencies
),
757 prefix
, yes_no(u
->on_failure_isolate
),
758 prefix
, yes_no(u
->ignore_on_isolate
),
759 prefix
, yes_no(u
->ignore_on_snapshot
));
761 if (UNIT_VTABLE(u
)->dump
)
762 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
764 } else if (u
->load_state
== UNIT_MERGED
)
766 "%s\tMerged into: %s\n",
767 prefix
, u
->merged_into
->id
);
768 else if (u
->load_state
== UNIT_ERROR
)
769 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
773 job_dump(u
->job
, f
, prefix2
);
776 job_dump(u
->nop_job
, f
, prefix2
);
781 /* Common implementation for multiple backends */
782 int unit_load_fragment_and_dropin(Unit
*u
) {
787 /* Load a .service file */
788 r
= unit_load_fragment(u
);
792 if (u
->load_state
== UNIT_STUB
)
795 /* Load drop-in directory data */
796 r
= unit_load_dropin(unit_follow_merge(u
));
803 /* Common implementation for multiple backends */
804 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
809 /* Same as unit_load_fragment_and_dropin(), but whether
810 * something can be loaded or not doesn't matter. */
812 /* Load a .service file */
813 r
= unit_load_fragment(u
);
817 if (u
->load_state
== UNIT_STUB
)
818 u
->load_state
= UNIT_LOADED
;
820 /* Load drop-in directory data */
821 r
= unit_load_dropin(unit_follow_merge(u
));
828 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
832 if (target
->type
!= UNIT_TARGET
)
835 /* Only add the dependency if both units are loaded, so that
836 * that loop check below is reliable */
837 if (u
->load_state
!= UNIT_LOADED
||
838 target
->load_state
!= UNIT_LOADED
)
841 /* If either side wants no automatic dependencies, then let's
843 if (!u
->default_dependencies
||
844 !target
->default_dependencies
)
847 /* Don't create loops */
848 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
851 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
854 static int unit_add_default_dependencies(Unit
*u
) {
856 static const UnitDependency deps
[] = {
858 UNIT_REQUIRED_BY_OVERRIDABLE
,
870 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
871 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
872 r
= unit_add_default_target_dependency(u
, target
);
877 if (u
->default_dependencies
&& unit_get_cgroup_context(u
)) {
878 if (UNIT_ISSET(u
->slice
))
879 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_WANTS
, UNIT_DEREF(u
->slice
), true);
881 r
= unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_WANTS
, SPECIAL_ROOT_SLICE
, NULL
, true);
890 int unit_load(Unit
*u
) {
895 if (u
->in_load_queue
) {
896 LIST_REMOVE(Unit
, load_queue
, u
->manager
->load_queue
, u
);
897 u
->in_load_queue
= false;
900 if (u
->type
== _UNIT_TYPE_INVALID
)
903 if (u
->load_state
!= UNIT_STUB
)
906 if (UNIT_VTABLE(u
)->load
)
907 if ((r
= UNIT_VTABLE(u
)->load(u
)) < 0)
910 if (u
->load_state
== UNIT_STUB
) {
915 if (u
->load_state
== UNIT_LOADED
&&
916 u
->default_dependencies
)
917 if ((r
= unit_add_default_dependencies(u
)) < 0)
920 if (u
->load_state
== UNIT_LOADED
) {
921 r
= unit_add_mount_links(u
);
926 if (u
->on_failure_isolate
&&
927 set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
929 log_error_unit(u
->id
,
930 "More than one OnFailure= dependencies specified for %s but OnFailureIsolate= enabled. Refusing.", u
->id
);
936 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
938 unit_add_to_dbus_queue(unit_follow_merge(u
));
939 unit_add_to_gc_queue(u
);
944 u
->load_state
= UNIT_ERROR
;
946 unit_add_to_dbus_queue(u
);
947 unit_add_to_gc_queue(u
);
949 log_debug_unit(u
->id
, "Failed to load configuration for %s: %s",
950 u
->id
, strerror(-r
));
955 bool unit_condition_test(Unit
*u
) {
958 dual_timestamp_get(&u
->condition_timestamp
);
959 u
->condition_result
= condition_test_list(u
->conditions
);
961 return u
->condition_result
;
964 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
965 const UnitStatusMessageFormats
*format_table
;
969 assert(t
< _JOB_TYPE_MAX
);
971 if (t
!= JOB_START
&& t
!= JOB_STOP
)
974 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
978 return format_table
->starting_stopping
[t
== JOB_STOP
];
981 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
986 assert(t
< _JOB_TYPE_MAX
);
988 format
= unit_get_status_message_format(u
, t
);
992 /* Return generic strings */
994 return "Starting %s.";
995 else if (t
== JOB_STOP
)
996 return "Stopping %s.";
997 else if (t
== JOB_RELOAD
)
998 return "Reloading %s.";
1003 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1008 /* We only print status messages for selected units on
1009 * selected operations. */
1011 format
= unit_get_status_message_format(u
, t
);
1015 unit_status_printf(u
, "", format
);
1018 #pragma GCC diagnostic push
1019 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
1020 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1027 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1030 if (log_on_console())
1033 /* We log status messages for all units and all operations. */
1035 format
= unit_get_status_message_format_try_harder(u
, t
);
1039 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1042 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1043 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1044 SD_MESSAGE_UNIT_RELOADING
;
1046 log_struct_unit(LOG_INFO
,
1052 #pragma GCC diagnostic pop
1055 * -EBADR: This unit type does not support starting.
1056 * -EALREADY: Unit is already started.
1057 * -EAGAIN: An operation is already in progress. Retry later.
1058 * -ECANCELED: Too many requests for now.
1060 int unit_start(Unit
*u
) {
1061 UnitActiveState state
;
1066 if (u
->load_state
!= UNIT_LOADED
)
1069 /* If this is already started, then this will succeed. Note
1070 * that this will even succeed if this unit is not startable
1071 * by the user. This is relied on to detect when we need to
1072 * wait for units and when waiting is finished. */
1073 state
= unit_active_state(u
);
1074 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1077 /* If the conditions failed, don't do anything at all. If we
1078 * already are activating this call might still be useful to
1079 * speed up activation in case there is some hold-off time,
1080 * but we don't want to recheck the condition in that case. */
1081 if (state
!= UNIT_ACTIVATING
&&
1082 !unit_condition_test(u
)) {
1083 log_debug_unit(u
->id
, "Starting of %s requested but condition failed. Ignoring.", u
->id
);
1087 /* Forward to the main object, if we aren't it. */
1088 if ((following
= unit_following(u
))) {
1089 log_debug_unit(u
->id
, "Redirecting start request from %s to %s.",
1090 u
->id
, following
->id
);
1091 return unit_start(following
);
1094 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1095 unit_status_print_starting_stopping(u
, JOB_START
);
1097 /* If it is stopped, but we cannot start it, then fail */
1098 if (!UNIT_VTABLE(u
)->start
)
1101 /* We don't suppress calls to ->start() here when we are
1102 * already starting, to allow this request to be used as a
1103 * "hurry up" call, for example when the unit is in some "auto
1104 * restart" state where it waits for a holdoff timer to elapse
1105 * before it will start again. */
1107 unit_add_to_dbus_queue(u
);
1109 return UNIT_VTABLE(u
)->start(u
);
1112 bool unit_can_start(Unit
*u
) {
1115 return !!UNIT_VTABLE(u
)->start
;
1118 bool unit_can_isolate(Unit
*u
) {
1121 return unit_can_start(u
) &&
1126 * -EBADR: This unit type does not support stopping.
1127 * -EALREADY: Unit is already stopped.
1128 * -EAGAIN: An operation is already in progress. Retry later.
1130 int unit_stop(Unit
*u
) {
1131 UnitActiveState state
;
1136 state
= unit_active_state(u
);
1137 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1140 if ((following
= unit_following(u
))) {
1141 log_debug_unit(u
->id
, "Redirecting stop request from %s to %s.",
1142 u
->id
, following
->id
);
1143 return unit_stop(following
);
1146 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1147 unit_status_print_starting_stopping(u
, JOB_STOP
);
1149 if (!UNIT_VTABLE(u
)->stop
)
1152 unit_add_to_dbus_queue(u
);
1154 return UNIT_VTABLE(u
)->stop(u
);
1158 * -EBADR: This unit type does not support reloading.
1159 * -ENOEXEC: Unit is not started.
1160 * -EAGAIN: An operation is already in progress. Retry later.
1162 int unit_reload(Unit
*u
) {
1163 UnitActiveState state
;
1168 if (u
->load_state
!= UNIT_LOADED
)
1171 if (!unit_can_reload(u
))
1174 state
= unit_active_state(u
);
1175 if (state
== UNIT_RELOADING
)
1178 if (state
!= UNIT_ACTIVE
)
1181 if ((following
= unit_following(u
))) {
1182 log_debug_unit(u
->id
, "Redirecting reload request from %s to %s.",
1183 u
->id
, following
->id
);
1184 return unit_reload(following
);
1187 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1189 unit_add_to_dbus_queue(u
);
1190 return UNIT_VTABLE(u
)->reload(u
);
1193 bool unit_can_reload(Unit
*u
) {
1196 if (!UNIT_VTABLE(u
)->reload
)
1199 if (!UNIT_VTABLE(u
)->can_reload
)
1202 return UNIT_VTABLE(u
)->can_reload(u
);
1205 static void unit_check_unneeded(Unit
*u
) {
1211 /* If this service shall be shut down when unneeded then do
1214 if (!u
->stop_when_unneeded
)
1217 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1220 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY
], i
)
1221 if (unit_active_or_pending(other
))
1224 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY_OVERRIDABLE
], i
)
1225 if (unit_active_or_pending(other
))
1228 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTED_BY
], i
)
1229 if (unit_active_or_pending(other
))
1232 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1233 if (unit_active_or_pending(other
))
1236 log_info_unit(u
->id
, "Service %s is not needed anymore. Stopping.", u
->id
);
1238 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1239 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1242 static void retroactively_start_dependencies(Unit
*u
) {
1247 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1249 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1250 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1251 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1252 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1254 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1255 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1256 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1257 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1259 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1260 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1261 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1262 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1264 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1265 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1266 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1267 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1269 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1270 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1271 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1273 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1274 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1275 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1278 static void retroactively_stop_dependencies(Unit
*u
) {
1283 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1285 /* Pull down units which are bound to us recursively if enabled */
1286 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1287 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1288 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1291 static void check_unneeded_dependencies(Unit
*u
) {
1296 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1298 /* Garbage collect services that might not be needed anymore, if enabled */
1299 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1300 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1301 unit_check_unneeded(other
);
1302 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1303 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1304 unit_check_unneeded(other
);
1305 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1306 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1307 unit_check_unneeded(other
);
1308 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1309 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1310 unit_check_unneeded(other
);
1311 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1312 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1313 unit_check_unneeded(other
);
1314 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1315 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1316 unit_check_unneeded(other
);
1319 void unit_start_on_failure(Unit
*u
) {
1325 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1328 log_info_unit(u
->id
, "Triggering OnFailure= dependencies of %s.", u
->id
);
1330 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1333 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_isolate
? JOB_ISOLATE
: JOB_REPLACE
, true, NULL
, NULL
);
1335 log_error_unit(u
->id
, "Failed to enqueue OnFailure= job: %s", strerror(-r
));
1339 void unit_trigger_notify(Unit
*u
) {
1345 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1346 if (UNIT_VTABLE(other
)->trigger_notify
)
1347 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1350 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1355 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1356 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1358 /* Note that this is called for all low-level state changes,
1359 * even if they might map to the same high-level
1360 * UnitActiveState! That means that ns == os is OK an expected
1361 * behavior here. For example: if a mount point is remounted
1362 * this function will be called too! */
1366 if (m
->n_reloading
<= 0) {
1369 dual_timestamp_get(&ts
);
1371 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1372 u
->inactive_exit_timestamp
= ts
;
1373 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1374 u
->inactive_enter_timestamp
= ts
;
1376 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1377 u
->active_enter_timestamp
= ts
;
1378 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1379 u
->active_exit_timestamp
= ts
;
1382 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1383 unit_destroy_cgroup(u
);
1385 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1386 ExecContext
*ec
= unit_get_exec_context(u
);
1387 if (ec
&& exec_context_may_touch_console(ec
)) {
1388 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1398 if (u
->job
->state
== JOB_WAITING
)
1400 /* So we reached a different state for this
1401 * job. Let's see if we can run it now if it
1402 * failed previously due to EAGAIN. */
1403 job_add_to_run_queue(u
->job
);
1405 /* Let's check whether this state change constitutes a
1406 * finished job, or maybe contradicts a running job and
1407 * hence needs to invalidate jobs. */
1409 switch (u
->job
->type
) {
1412 case JOB_VERIFY_ACTIVE
:
1414 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1415 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1416 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1419 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1420 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1426 case JOB_RELOAD_OR_START
:
1428 if (u
->job
->state
== JOB_RUNNING
) {
1429 if (ns
== UNIT_ACTIVE
)
1430 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1431 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1434 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1435 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1443 case JOB_TRY_RESTART
:
1445 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1446 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1447 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1449 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1455 assert_not_reached("Job type unknown");
1461 if (m
->n_reloading
<= 0) {
1463 /* If this state change happened without being
1464 * requested by a job, then let's retroactively start
1465 * or stop dependencies. We skip that step when
1466 * deserializing, since we don't want to create any
1467 * additional jobs just because something is already
1471 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1472 retroactively_start_dependencies(u
);
1473 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1474 retroactively_stop_dependencies(u
);
1477 /* stop unneeded units regardless if going down was expected or not */
1478 if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1479 check_unneeded_dependencies(u
);
1481 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1482 log_notice_unit(u
->id
,
1483 "Unit %s entered failed state.", u
->id
);
1484 unit_start_on_failure(u
);
1488 /* Some names are special */
1489 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1491 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1492 /* The bus just might have become available,
1493 * hence try to connect to it, if we aren't
1497 if (u
->type
== UNIT_SERVICE
&&
1498 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1499 m
->n_reloading
<= 0) {
1500 /* Write audit record if we have just finished starting up */
1501 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1505 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1506 manager_send_unit_plymouth(m
, u
);
1510 /* We don't care about D-Bus here, since we'll get an
1511 * asynchronous notification for it anyway. */
1513 if (u
->type
== UNIT_SERVICE
&&
1514 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1515 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1516 m
->n_reloading
<= 0) {
1518 /* Hmm, if there was no start record written
1519 * write it now, so that we always have a nice
1522 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1524 if (ns
== UNIT_INACTIVE
)
1525 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1527 /* Write audit record if we have just finished shutting down */
1528 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1530 u
->in_audit
= false;
1534 manager_recheck_journal(m
);
1535 unit_trigger_notify(u
);
1537 /* Maybe we finished startup and are now ready for being
1538 * stopped because unneeded? */
1539 if (u
->manager
->n_reloading
<= 0)
1540 unit_check_unneeded(u
);
1542 unit_add_to_dbus_queue(u
);
1543 unit_add_to_gc_queue(u
);
1546 int unit_watch_fd(Unit
*u
, int fd
, uint32_t events
, Watch
*w
) {
1547 struct epoll_event ev
= {
1555 assert(w
->type
== WATCH_INVALID
|| (w
->type
== WATCH_FD
&& w
->fd
== fd
&& w
->data
.unit
== u
));
1557 if (epoll_ctl(u
->manager
->epoll_fd
,
1558 w
->type
== WATCH_INVALID
? EPOLL_CTL_ADD
: EPOLL_CTL_MOD
,
1570 void unit_unwatch_fd(Unit
*u
, Watch
*w
) {
1574 if (w
->type
== WATCH_INVALID
)
1577 assert(w
->type
== WATCH_FD
);
1578 assert(w
->data
.unit
== u
);
1579 assert_se(epoll_ctl(u
->manager
->epoll_fd
, EPOLL_CTL_DEL
, w
->fd
, NULL
) >= 0);
1582 w
->type
= WATCH_INVALID
;
1583 w
->data
.unit
= NULL
;
1586 int unit_watch_pid(Unit
*u
, pid_t pid
) {
1590 /* Watch a specific PID. We only support one unit watching
1591 * each PID for now. */
1593 return hashmap_put(u
->manager
->watch_pids
, LONG_TO_PTR(pid
), u
);
1596 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
1600 hashmap_remove_value(u
->manager
->watch_pids
, LONG_TO_PTR(pid
), u
);
1603 int unit_watch_timer(Unit
*u
, clockid_t clock_id
, bool relative
, usec_t usec
, Watch
*w
) {
1604 struct itimerspec its
= {};
1610 assert(w
->type
== WATCH_INVALID
|| (w
->type
== WATCH_UNIT_TIMER
&& w
->data
.unit
== u
));
1612 /* This will try to reuse the old timer if there is one */
1614 if (w
->type
== WATCH_UNIT_TIMER
) {
1615 assert(w
->data
.unit
== u
);
1620 } else if (w
->type
== WATCH_INVALID
) {
1623 fd
= timerfd_create(clock_id
, TFD_NONBLOCK
|TFD_CLOEXEC
);
1627 assert_not_reached("Invalid watch type");
1630 /* Set absolute time in the past, but not 0, since we
1631 * don't want to disarm the timer */
1632 its
.it_value
.tv_sec
= 0;
1633 its
.it_value
.tv_nsec
= 1;
1635 flags
= TFD_TIMER_ABSTIME
;
1637 timespec_store(&its
.it_value
, usec
);
1638 flags
= relative
? 0 : TFD_TIMER_ABSTIME
;
1641 /* This will also flush the elapse counter */
1642 if (timerfd_settime(fd
, flags
, &its
, NULL
) < 0)
1645 if (w
->type
== WATCH_INVALID
) {
1646 struct epoll_event ev
= {
1651 if (epoll_ctl(u
->manager
->epoll_fd
, EPOLL_CTL_ADD
, fd
, &ev
) < 0)
1655 w
->type
= WATCH_UNIT_TIMER
;
1663 close_nointr_nofail(fd
);
1668 void unit_unwatch_timer(Unit
*u
, Watch
*w
) {
1672 if (w
->type
== WATCH_INVALID
)
1675 assert(w
->type
== WATCH_UNIT_TIMER
);
1676 assert(w
->data
.unit
== u
);
1679 assert_se(epoll_ctl(u
->manager
->epoll_fd
, EPOLL_CTL_DEL
, w
->fd
, NULL
) >= 0);
1680 close_nointr_nofail(w
->fd
);
1683 w
->type
= WATCH_INVALID
;
1684 w
->data
.unit
= NULL
;
1687 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
1689 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
1693 case JOB_VERIFY_ACTIVE
:
1700 case JOB_TRY_RESTART
:
1701 return unit_can_start(u
);
1704 return unit_can_reload(u
);
1706 case JOB_RELOAD_OR_START
:
1707 return unit_can_reload(u
) && unit_can_start(u
);
1710 assert_not_reached("Invalid job type");
1714 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
1716 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
1717 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
1718 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
1719 [UNIT_WANTS
] = UNIT_WANTED_BY
,
1720 [UNIT_REQUISITE
] = UNIT_REQUIRED_BY
,
1721 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
1722 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
1723 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
1724 [UNIT_REQUIRED_BY
] = _UNIT_DEPENDENCY_INVALID
,
1725 [UNIT_REQUIRED_BY_OVERRIDABLE
] = _UNIT_DEPENDENCY_INVALID
,
1726 [UNIT_WANTED_BY
] = _UNIT_DEPENDENCY_INVALID
,
1727 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
1728 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
1729 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
1730 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
1731 [UNIT_BEFORE
] = UNIT_AFTER
,
1732 [UNIT_AFTER
] = UNIT_BEFORE
,
1733 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
1734 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
1735 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
1736 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
1737 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
1738 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
1739 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
1741 int r
, q
= 0, v
= 0, w
= 0;
1744 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
1747 u
= unit_follow_merge(u
);
1748 other
= unit_follow_merge(other
);
1750 /* We won't allow dependencies on ourselves. We will not
1751 * consider them an error however. */
1755 if ((r
= set_ensure_allocated(&u
->dependencies
[d
], trivial_hash_func
, trivial_compare_func
)) < 0)
1758 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
)
1759 if ((r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], trivial_hash_func
, trivial_compare_func
)) < 0)
1763 if ((r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], trivial_hash_func
, trivial_compare_func
)) < 0 ||
1764 (r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], trivial_hash_func
, trivial_compare_func
)) < 0)
1767 if ((q
= set_put(u
->dependencies
[d
], other
)) < 0)
1770 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
)
1771 if ((v
= set_put(other
->dependencies
[inverse_table
[d
]], u
)) < 0) {
1776 if (add_reference
) {
1777 if ((w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
)) < 0) {
1782 if ((r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
)) < 0)
1786 unit_add_to_dbus_queue(u
);
1791 set_remove(u
->dependencies
[d
], other
);
1794 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
1797 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
1802 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
1807 if ((r
= unit_add_dependency(u
, d
, other
, add_reference
)) < 0)
1810 if ((r
= unit_add_dependency(u
, e
, other
, add_reference
)) < 0)
1816 static const char *resolve_template(Unit
*u
, const char *name
, const char*path
, char **p
) {
1820 assert(name
|| path
);
1824 name
= path_get_file_name(path
);
1826 if (!unit_name_is_template(name
)) {
1832 s
= unit_name_replace_instance(name
, u
->instance
);
1834 _cleanup_free_
char *i
= NULL
;
1836 i
= unit_name_to_prefix(u
->id
);
1840 s
= unit_name_replace_instance(name
, i
);
1850 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
1853 _cleanup_free_
char *s
= NULL
;
1856 assert(name
|| path
);
1858 name
= resolve_template(u
, name
, path
, &s
);
1862 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
1866 return unit_add_dependency(u
, d
, other
, add_reference
);
1869 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
1875 assert(name
|| path
);
1877 if (!(name
= resolve_template(u
, name
, path
, &s
)))
1880 if ((r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
)) < 0)
1883 r
= unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
1890 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
1896 assert(name
|| path
);
1898 if (!(name
= resolve_template(u
, name
, path
, &s
)))
1901 if ((r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
)) < 0)
1904 r
= unit_add_dependency(other
, d
, u
, add_reference
);
1911 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
1917 assert(name
|| path
);
1919 if (!(name
= resolve_template(u
, name
, path
, &s
)))
1922 if ((r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
)) < 0)
1925 if ((r
= unit_add_two_dependencies(other
, d
, e
, u
, add_reference
)) < 0)
1933 int set_unit_path(const char *p
) {
1934 _cleanup_free_
char *c
= NULL
;
1936 /* This is mostly for debug purposes */
1937 c
= path_make_absolute_cwd(p
);
1938 if (setenv("SYSTEMD_UNIT_PATH", c
, 0) < 0)
1944 char *unit_dbus_path(Unit
*u
) {
1950 return unit_dbus_path_from_name(u
->id
);
1953 char *unit_default_cgroup_path(Unit
*u
) {
1954 _cleanup_free_
char *escaped_instance
= NULL
, *slice
= NULL
;
1959 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
1960 return strdup(u
->manager
->cgroup_root
);
1962 if (UNIT_ISSET(u
->slice
) && !unit_has_name(UNIT_DEREF(u
->slice
), SPECIAL_ROOT_SLICE
)) {
1963 r
= cg_slice_to_path(UNIT_DEREF(u
->slice
)->id
, &slice
);
1968 escaped_instance
= cg_escape(u
->id
);
1969 if (!escaped_instance
)
1973 _cleanup_free_
char *t
= NULL
, *escaped_template
= NULL
;
1975 t
= unit_name_template(u
->id
);
1979 escaped_template
= cg_escape(t
);
1980 if (!escaped_template
)
1983 return strjoin(u
->manager
->cgroup_root
, "/",
1984 slice
? slice
: "", slice
? "/" : "",
1985 escaped_template
, "/", escaped_instance
, NULL
);
1987 return strjoin(u
->manager
->cgroup_root
, "/",
1988 slice
? slice
: "", slice
? "/" : "",
1989 escaped_instance
, NULL
);
1992 int unit_add_default_slice(Unit
*u
) {
1998 if (UNIT_ISSET(u
->slice
))
2001 if (!unit_get_cgroup_context(u
))
2004 r
= manager_load_unit(u
->manager
, u
->manager
->running_as
== SYSTEMD_SYSTEM
? SPECIAL_SYSTEM_SLICE
: SPECIAL_ROOT_SLICE
, NULL
, NULL
, &slice
);
2008 unit_ref_set(&u
->slice
, slice
);
2012 const char *unit_slice_name(Unit
*u
) {
2015 if (!UNIT_ISSET(u
->slice
))
2018 return UNIT_DEREF(u
->slice
)->id
;
2021 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2022 _cleanup_free_
char *t
= NULL
;
2029 t
= unit_name_change_suffix(u
->id
, type
);
2033 assert(!unit_has_name(u
, t
));
2035 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2036 assert(r
< 0 || *_found
!= u
);
2040 int unit_get_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2041 _cleanup_free_
char *t
= NULL
;
2048 t
= unit_name_change_suffix(u
->id
, type
);
2052 assert(!unit_has_name(u
, t
));
2054 found
= manager_get_unit(u
->manager
, t
);
2062 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2066 /* Watch a specific name on the bus. We only support one unit
2067 * watching each name for now. */
2069 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2072 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2076 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2079 bool unit_can_serialize(Unit
*u
) {
2082 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2085 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2092 if (!unit_can_serialize(u
))
2095 if ((r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
)) < 0)
2099 if (serialize_jobs
) {
2101 fprintf(f
, "job\n");
2102 job_serialize(u
->job
, f
, fds
);
2106 fprintf(f
, "job\n");
2107 job_serialize(u
->nop_job
, f
, fds
);
2111 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2112 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2113 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2114 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2115 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2117 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2118 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2125 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2136 va_start(ap
, format
);
2137 vfprintf(f
, format
, ap
);
2143 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2149 fprintf(f
, "%s=%s\n", key
, value
);
2152 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2159 if (!unit_can_serialize(u
))
2163 char line
[LINE_MAX
], *l
, *v
;
2166 if (!fgets(line
, sizeof(line
), f
)) {
2179 k
= strcspn(l
, "=");
2187 if (streq(l
, "job")) {
2189 /* new-style serialized job */
2190 Job
*j
= job_new_raw(u
);
2194 r
= job_deserialize(j
, f
, fds
);
2200 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2206 r
= job_install_deserialized(j
);
2208 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2213 if (j
->state
== JOB_RUNNING
)
2214 u
->manager
->n_running_jobs
++;
2217 JobType type
= job_type_from_string(v
);
2219 log_debug("Failed to parse job type value %s", v
);
2221 u
->deserialized_job
= type
;
2224 } else if (streq(l
, "inactive-exit-timestamp")) {
2225 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2227 } else if (streq(l
, "active-enter-timestamp")) {
2228 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2230 } else if (streq(l
, "active-exit-timestamp")) {
2231 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2233 } else if (streq(l
, "inactive-enter-timestamp")) {
2234 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2236 } else if (streq(l
, "condition-timestamp")) {
2237 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2239 } else if (streq(l
, "condition-result")) {
2242 if ((b
= parse_boolean(v
)) < 0)
2243 log_debug("Failed to parse condition result value %s", v
);
2245 u
->condition_result
= b
;
2250 if ((r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
)) < 0)
2255 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2265 /* Adds in links to the device node that this unit is based on */
2267 if (!is_device_path(what
))
2270 e
= unit_name_from_path(what
, ".device");
2274 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2279 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_BINDS_TO
, device
, true);
2284 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2292 int unit_coldplug(Unit
*u
) {
2297 if (UNIT_VTABLE(u
)->coldplug
)
2298 if ((r
= UNIT_VTABLE(u
)->coldplug(u
)) < 0)
2302 r
= job_coldplug(u
->job
);
2305 } else if (u
->deserialized_job
>= 0) {
2307 r
= manager_add_job(u
->manager
, u
->deserialized_job
, u
, JOB_IGNORE_REQUIREMENTS
, false, NULL
, NULL
);
2311 u
->deserialized_job
= _JOB_TYPE_INVALID
;
2317 #pragma GCC diagnostic push
2318 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
2319 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2320 manager_status_printf(u
->manager
, false, status
, unit_status_msg_format
, unit_description(u
));
2322 #pragma GCC diagnostic pop
2324 bool unit_need_daemon_reload(Unit
*u
) {
2325 _cleanup_strv_free_
char **t
= NULL
;
2328 unsigned loaded_cnt
, current_cnt
;
2332 if (u
->fragment_path
) {
2334 if (stat(u
->fragment_path
, &st
) < 0)
2335 /* What, cannot access this anymore? */
2338 if (u
->fragment_mtime
> 0 &&
2339 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2343 if (u
->source_path
) {
2345 if (stat(u
->source_path
, &st
) < 0)
2348 if (u
->source_mtime
> 0 &&
2349 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2353 t
= unit_find_dropin_paths(u
);
2354 loaded_cnt
= strv_length(t
);
2355 current_cnt
= strv_length(u
->dropin_paths
);
2357 if (loaded_cnt
== current_cnt
) {
2358 if (loaded_cnt
== 0)
2361 if (strv_overlap(u
->dropin_paths
, t
)) {
2362 STRV_FOREACH(path
, u
->dropin_paths
) {
2364 if (stat(*path
, &st
) < 0)
2367 if (u
->dropin_mtime
> 0 &&
2368 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2379 void unit_reset_failed(Unit
*u
) {
2382 if (UNIT_VTABLE(u
)->reset_failed
)
2383 UNIT_VTABLE(u
)->reset_failed(u
);
2386 Unit
*unit_following(Unit
*u
) {
2389 if (UNIT_VTABLE(u
)->following
)
2390 return UNIT_VTABLE(u
)->following(u
);
2395 bool unit_stop_pending(Unit
*u
) {
2398 /* This call does check the current state of the unit. It's
2399 * hence useful to be called from state change calls of the
2400 * unit itself, where the state isn't updated yet. This is
2401 * different from unit_inactive_or_pending() which checks both
2402 * the current state and for a queued job. */
2404 return u
->job
&& u
->job
->type
== JOB_STOP
;
2407 bool unit_inactive_or_pending(Unit
*u
) {
2410 /* Returns true if the unit is inactive or going down */
2412 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
2415 if (unit_stop_pending(u
))
2421 bool unit_active_or_pending(Unit
*u
) {
2424 /* Returns true if the unit is active or going up */
2426 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
2430 (u
->job
->type
== JOB_START
||
2431 u
->job
->type
== JOB_RELOAD_OR_START
||
2432 u
->job
->type
== JOB_RESTART
))
2438 int unit_kill(Unit
*u
, KillWho w
, int signo
, DBusError
*error
) {
2440 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
2442 assert(signo
< _NSIG
);
2444 if (!UNIT_VTABLE(u
)->kill
)
2447 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
2450 int unit_kill_common(
2460 if (who
== KILL_MAIN
&& main_pid
<= 0) {
2462 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
2464 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
2468 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
2469 if (control_pid
< 0)
2470 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
2472 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
2476 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
2477 if (control_pid
> 0)
2478 if (kill(control_pid
, signo
) < 0)
2481 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
2483 if (kill(main_pid
, signo
) < 0)
2486 if (who
== KILL_ALL
&& u
->cgroup_path
) {
2487 _cleanup_set_free_ Set
*pid_set
= NULL
;
2490 pid_set
= set_new(trivial_hash_func
, trivial_compare_func
);
2494 /* Exclude the control/main pid from being killed via the cgroup */
2495 if (control_pid
> 0) {
2496 q
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
2502 q
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
2507 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, true, false, pid_set
);
2508 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
2515 int unit_following_set(Unit
*u
, Set
**s
) {
2519 if (UNIT_VTABLE(u
)->following_set
)
2520 return UNIT_VTABLE(u
)->following_set(u
, s
);
2526 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
2529 if (u
->unit_file_state
< 0 && u
->fragment_path
)
2530 u
->unit_file_state
= unit_file_get_state(
2531 u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
2532 NULL
, path_get_file_name(u
->fragment_path
));
2534 return u
->unit_file_state
;
2537 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
2542 unit_ref_unset(ref
);
2545 LIST_PREPEND(UnitRef
, refs
, u
->refs
, ref
);
2549 void unit_ref_unset(UnitRef
*ref
) {
2555 LIST_REMOVE(UnitRef
, refs
, ref
->unit
->refs
, ref
);
2559 int unit_add_one_mount_link(Unit
*u
, Mount
*m
) {
2565 if (u
->load_state
!= UNIT_LOADED
||
2566 UNIT(m
)->load_state
!= UNIT_LOADED
)
2569 STRV_FOREACH(i
, u
->requires_mounts_for
) {
2574 if (!path_startswith(*i
, m
->where
))
2577 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_REQUIRES
, UNIT(m
), true);
2583 int unit_add_mount_links(Unit
*u
) {
2589 LIST_FOREACH(units_by_type
, other
, u
->manager
->units_by_type
[UNIT_MOUNT
]) {
2590 r
= unit_add_one_mount_link(u
, MOUNT(other
));
2598 int unit_exec_context_defaults(Unit
*u
, ExecContext
*c
) {
2605 /* This only copies in the ones that need memory */
2606 for (i
= 0; i
< RLIMIT_NLIMITS
; i
++)
2607 if (u
->manager
->rlimit
[i
] && !c
->rlimit
[i
]) {
2608 c
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
2613 if (u
->manager
->running_as
== SYSTEMD_USER
&&
2614 !c
->working_directory
) {
2616 r
= get_home_dir(&c
->working_directory
);
2624 ExecContext
*unit_get_exec_context(Unit
*u
) {
2628 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
2632 return (ExecContext
*) ((uint8_t*) u
+ offset
);
2635 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
2638 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
2642 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
2645 static int drop_in_file(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, char **_p
, char **_q
) {
2653 assert(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
));
2655 if (u
->manager
->running_as
== SYSTEMD_USER
&& !(mode
& UNIT_PERSISTENT
))
2658 if (!filename_is_safe(name
))
2661 if (u
->manager
->running_as
== SYSTEMD_USER
) {
2662 _cleanup_free_
char *c
= NULL
;
2664 r
= user_config_home(&c
);
2670 p
= strjoin(c
, "/", u
->id
, ".d", NULL
);
2671 } else if (mode
& UNIT_PERSISTENT
)
2672 p
= strjoin("/etc/systemd/system/", u
->id
, ".d", NULL
);
2674 p
= strjoin("/run/systemd/system/", u
->id
, ".d", NULL
);
2678 q
= strjoin(p
, "/50-", name
, ".conf", NULL
);
2689 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
2690 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
2697 if (!(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
)))
2700 r
= drop_in_file(u
, mode
, name
, &p
, &q
);
2705 return write_string_file_atomic_label(q
, data
);
2708 int unit_write_drop_in_private_section(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
2709 _cleanup_free_
char *ndata
= NULL
;
2715 if (!UNIT_VTABLE(u
)->private_section
)
2718 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
2722 return unit_write_drop_in(u
, mode
, name
, ndata
);
2725 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
2726 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
2731 if (!(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
)))
2734 r
= drop_in_file(u
, mode
, name
, &p
, &q
);
2744 int unit_kill_context(
2750 bool main_pid_alien
) {
2752 int sig
, wait_for_exit
= 0, r
;
2757 if (c
->kill_mode
== KILL_NONE
)
2760 sig
= sigkill
? SIGKILL
: c
->kill_signal
;
2763 r
= kill_and_sigcont(main_pid
, sig
);
2765 if (r
< 0 && r
!= -ESRCH
) {
2766 _cleanup_free_
char *comm
= NULL
;
2767 get_process_comm(main_pid
, &comm
);
2769 log_warning_unit(u
->id
, "Failed to kill main process %li (%s): %s",
2770 (long) main_pid
, strna(comm
), strerror(-r
));
2772 wait_for_exit
= !main_pid_alien
;
2775 if (control_pid
> 0) {
2776 r
= kill_and_sigcont(control_pid
, sig
);
2778 if (r
< 0 && r
!= -ESRCH
) {
2779 _cleanup_free_
char *comm
= NULL
;
2780 get_process_comm(control_pid
, &comm
);
2782 log_warning_unit(u
->id
,
2783 "Failed to kill control process %li (%s): %s",
2784 (long) control_pid
, strna(comm
), strerror(-r
));
2786 wait_for_exit
= true;
2789 if (c
->kill_mode
== KILL_CONTROL_GROUP
&& u
->cgroup_path
) {
2790 _cleanup_set_free_ Set
*pid_set
= NULL
;
2792 pid_set
= set_new(trivial_hash_func
, trivial_compare_func
);
2796 /* Exclude the main/control pids from being killed via the cgroup */
2798 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
2803 if (control_pid
> 0) {
2804 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
2809 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, true, false, pid_set
);
2811 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
2812 log_warning_unit(u
->id
, "Failed to kill control group: %s", strerror(-r
));
2814 wait_for_exit
= true;
2817 return wait_for_exit
;
2820 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
2821 [UNIT_ACTIVE
] = "active",
2822 [UNIT_RELOADING
] = "reloading",
2823 [UNIT_INACTIVE
] = "inactive",
2824 [UNIT_FAILED
] = "failed",
2825 [UNIT_ACTIVATING
] = "activating",
2826 [UNIT_DEACTIVATING
] = "deactivating"
2829 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);
2831 static const char* const unit_dependency_table
[_UNIT_DEPENDENCY_MAX
] = {
2832 [UNIT_REQUIRES
] = "Requires",
2833 [UNIT_REQUIRES_OVERRIDABLE
] = "RequiresOverridable",
2834 [UNIT_REQUISITE
] = "Requisite",
2835 [UNIT_REQUISITE_OVERRIDABLE
] = "RequisiteOverridable",
2836 [UNIT_WANTS
] = "Wants",
2837 [UNIT_BINDS_TO
] = "BindsTo",
2838 [UNIT_PART_OF
] = "PartOf",
2839 [UNIT_REQUIRED_BY
] = "RequiredBy",
2840 [UNIT_REQUIRED_BY_OVERRIDABLE
] = "RequiredByOverridable",
2841 [UNIT_WANTED_BY
] = "WantedBy",
2842 [UNIT_BOUND_BY
] = "BoundBy",
2843 [UNIT_CONSISTS_OF
] = "ConsistsOf",
2844 [UNIT_CONFLICTS
] = "Conflicts",
2845 [UNIT_CONFLICTED_BY
] = "ConflictedBy",
2846 [UNIT_BEFORE
] = "Before",
2847 [UNIT_AFTER
] = "After",
2848 [UNIT_ON_FAILURE
] = "OnFailure",
2849 [UNIT_TRIGGERS
] = "Triggers",
2850 [UNIT_TRIGGERED_BY
] = "TriggeredBy",
2851 [UNIT_PROPAGATES_RELOAD_TO
] = "PropagatesReloadTo",
2852 [UNIT_RELOAD_PROPAGATED_FROM
] = "ReloadPropagatedFrom",
2853 [UNIT_REFERENCES
] = "References",
2854 [UNIT_REFERENCED_BY
] = "ReferencedBy",
2857 DEFINE_STRING_TABLE_LOOKUP(unit_dependency
, UnitDependency
);