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>
33 #include "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"
54 const UnitVTable
* const unit_vtable
[_UNIT_TYPE_MAX
] = {
55 [UNIT_SERVICE
] = &service_vtable
,
56 [UNIT_SOCKET
] = &socket_vtable
,
57 [UNIT_BUSNAME
] = &busname_vtable
,
58 [UNIT_TARGET
] = &target_vtable
,
59 [UNIT_SNAPSHOT
] = &snapshot_vtable
,
60 [UNIT_DEVICE
] = &device_vtable
,
61 [UNIT_MOUNT
] = &mount_vtable
,
62 [UNIT_AUTOMOUNT
] = &automount_vtable
,
63 [UNIT_SWAP
] = &swap_vtable
,
64 [UNIT_TIMER
] = &timer_vtable
,
65 [UNIT_PATH
] = &path_vtable
,
66 [UNIT_SLICE
] = &slice_vtable
,
67 [UNIT_SCOPE
] = &scope_vtable
70 Unit
*unit_new(Manager
*m
, size_t size
) {
74 assert(size
>= sizeof(Unit
));
80 u
->names
= set_new(string_hash_func
, string_compare_func
);
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
->on_failure_job_mode
= JOB_REPLACE
;
96 bool unit_has_name(Unit
*u
, const char *name
) {
100 return !!set_get(u
->names
, (char*) name
);
103 int unit_add_name(Unit
*u
, const char *text
) {
111 if (unit_name_is_template(text
)) {
115 s
= unit_name_replace_instance(text
, u
->instance
);
122 if (!unit_name_is_valid(s
, TEMPLATE_INVALID
)) {
127 assert_se((t
= unit_name_to_type(s
)) >= 0);
129 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
) {
134 r
= unit_name_to_instance(s
, &i
);
138 if (i
&& unit_vtable
[t
]->no_instances
) {
143 /* Ensure that this unit is either instanced or not instanced,
145 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
) {
150 if (unit_vtable
[t
]->no_alias
&&
151 !set_isempty(u
->names
) &&
152 !set_get(u
->names
, s
)) {
157 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
) {
162 r
= set_put(u
->names
, s
);
169 r
= hashmap_put(u
->manager
->units
, s
, u
);
171 set_remove(u
->names
, s
);
175 if (u
->type
== _UNIT_TYPE_INVALID
) {
181 LIST_PREPEND(units_by_type
, u
->manager
->units_by_type
[t
], u
);
183 if (UNIT_VTABLE(u
)->init
)
184 UNIT_VTABLE(u
)->init(u
);
188 unit_add_to_dbus_queue(u
);
198 int unit_choose_id(Unit
*u
, const char *name
) {
200 _cleanup_free_
char *t
= NULL
;
206 if (unit_name_is_template(name
)) {
211 t
= unit_name_replace_instance(name
, u
->instance
);
218 /* Selects one of the names of this unit as the id */
219 s
= set_get(u
->names
, (char*) name
);
224 r
= unit_name_to_instance(s
, &i
);
233 unit_add_to_dbus_queue(u
);
238 int unit_set_description(Unit
*u
, const char *description
) {
243 if (isempty(description
))
246 s
= strdup(description
);
251 free(u
->description
);
254 unit_add_to_dbus_queue(u
);
258 bool unit_check_gc(Unit
*u
) {
261 if (u
->load_state
== UNIT_STUB
)
264 if (UNIT_VTABLE(u
)->no_gc
)
276 if (unit_active_state(u
) != UNIT_INACTIVE
)
282 if (UNIT_VTABLE(u
)->check_gc
)
283 if (UNIT_VTABLE(u
)->check_gc(u
))
289 void unit_add_to_load_queue(Unit
*u
) {
291 assert(u
->type
!= _UNIT_TYPE_INVALID
);
293 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
296 LIST_PREPEND(load_queue
, u
->manager
->load_queue
, u
);
297 u
->in_load_queue
= true;
300 void unit_add_to_cleanup_queue(Unit
*u
) {
303 if (u
->in_cleanup_queue
)
306 LIST_PREPEND(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
307 u
->in_cleanup_queue
= true;
310 void unit_add_to_gc_queue(Unit
*u
) {
313 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
316 if (unit_check_gc(u
))
319 LIST_PREPEND(gc_queue
, u
->manager
->gc_queue
, u
);
320 u
->in_gc_queue
= true;
322 u
->manager
->n_in_gc_queue
++;
325 void unit_add_to_dbus_queue(Unit
*u
) {
327 assert(u
->type
!= _UNIT_TYPE_INVALID
);
329 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
332 /* Shortcut things if nobody cares */
333 if (set_isempty(u
->manager
->subscribed
)) {
334 u
->sent_dbus_new_signal
= true;
338 LIST_PREPEND(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
339 u
->in_dbus_queue
= true;
342 static void bidi_set_free(Unit
*u
, Set
*s
) {
348 /* Frees the set and makes sure we are dropped from the
349 * inverse pointers */
351 SET_FOREACH(other
, s
, i
) {
354 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
355 set_remove(other
->dependencies
[d
], u
);
357 unit_add_to_gc_queue(other
);
363 static void unit_remove_transient(Unit
*u
) {
371 if (u
->fragment_path
)
372 unlink(u
->fragment_path
);
374 STRV_FOREACH(i
, u
->dropin_paths
) {
375 _cleanup_free_
char *p
= NULL
;
380 r
= path_get_parent(*i
, &p
);
386 static void unit_free_requires_mounts_for(Unit
*u
) {
389 STRV_FOREACH(j
, u
->requires_mounts_for
) {
390 char s
[strlen(*j
) + 1];
392 PATH_FOREACH_PREFIX_MORE(s
, *j
) {
396 x
= hashmap_get2(u
->manager
->units_requiring_mounts_for
, s
, (void**) &y
);
402 if (set_isempty(x
)) {
403 hashmap_remove(u
->manager
->units_requiring_mounts_for
, y
);
410 strv_free(u
->requires_mounts_for
);
411 u
->requires_mounts_for
= NULL
;
414 void unit_free(Unit
*u
) {
421 if (u
->manager
->n_reloading
<= 0)
422 unit_remove_transient(u
);
424 bus_unit_send_removed_signal(u
);
426 if (u
->load_state
!= UNIT_STUB
)
427 if (UNIT_VTABLE(u
)->done
)
428 UNIT_VTABLE(u
)->done(u
);
430 unit_free_requires_mounts_for(u
);
432 SET_FOREACH(t
, u
->names
, i
)
433 hashmap_remove_value(u
->manager
->units
, t
, u
);
447 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
448 bidi_set_free(u
, u
->dependencies
[d
]);
450 if (u
->type
!= _UNIT_TYPE_INVALID
)
451 LIST_REMOVE(units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
453 if (u
->in_load_queue
)
454 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
456 if (u
->in_dbus_queue
)
457 LIST_REMOVE(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
459 if (u
->in_cleanup_queue
)
460 LIST_REMOVE(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
462 if (u
->in_gc_queue
) {
463 LIST_REMOVE(gc_queue
, u
->manager
->gc_queue
, u
);
464 u
->manager
->n_in_gc_queue
--;
467 if (u
->in_cgroup_queue
)
468 LIST_REMOVE(cgroup_queue
, u
->manager
->cgroup_queue
, u
);
470 if (u
->cgroup_path
) {
471 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
472 free(u
->cgroup_path
);
475 free(u
->description
);
476 strv_free(u
->documentation
);
477 free(u
->fragment_path
);
478 free(u
->source_path
);
479 strv_free(u
->dropin_paths
);
482 set_free_free(u
->names
);
484 condition_free_list(u
->conditions
);
486 unit_ref_unset(&u
->slice
);
489 unit_ref_unset(u
->refs
);
494 UnitActiveState
unit_active_state(Unit
*u
) {
497 if (u
->load_state
== UNIT_MERGED
)
498 return unit_active_state(unit_follow_merge(u
));
500 /* After a reload it might happen that a unit is not correctly
501 * loaded but still has a process around. That's why we won't
502 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
504 return UNIT_VTABLE(u
)->active_state(u
);
507 const char* unit_sub_state_to_string(Unit
*u
) {
510 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
513 static void complete_move(Set
**s
, Set
**other
) {
521 set_move(*s
, *other
);
528 static void merge_names(Unit
*u
, Unit
*other
) {
535 complete_move(&u
->names
, &other
->names
);
537 set_free_free(other
->names
);
541 SET_FOREACH(t
, u
->names
, i
)
542 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
545 static void merge_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
552 assert(d
< _UNIT_DEPENDENCY_MAX
);
554 /* Fix backwards pointers */
555 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
558 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++) {
559 r
= set_remove_and_put(back
->dependencies
[k
], other
, u
);
561 set_remove(back
->dependencies
[k
], other
);
563 assert(r
>= 0 || r
== -ENOENT
);
567 complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]);
569 set_free(other
->dependencies
[d
]);
570 other
->dependencies
[d
] = NULL
;
573 int unit_merge(Unit
*u
, Unit
*other
) {
578 assert(u
->manager
== other
->manager
);
579 assert(u
->type
!= _UNIT_TYPE_INVALID
);
581 other
= unit_follow_merge(other
);
586 if (u
->type
!= other
->type
)
589 if (!u
->instance
!= !other
->instance
)
592 if (other
->load_state
!= UNIT_STUB
&&
593 other
->load_state
!= UNIT_NOT_FOUND
)
602 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
606 merge_names(u
, other
);
608 /* Redirect all references */
610 unit_ref_set(other
->refs
, u
);
612 /* Merge dependencies */
613 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
614 merge_dependencies(u
, other
, d
);
616 other
->load_state
= UNIT_MERGED
;
617 other
->merged_into
= u
;
619 /* If there is still some data attached to the other node, we
620 * don't need it anymore, and can free it. */
621 if (other
->load_state
!= UNIT_STUB
)
622 if (UNIT_VTABLE(other
)->done
)
623 UNIT_VTABLE(other
)->done(other
);
625 unit_add_to_dbus_queue(u
);
626 unit_add_to_cleanup_queue(other
);
631 int unit_merge_by_name(Unit
*u
, const char *name
) {
634 _cleanup_free_
char *s
= NULL
;
639 if (unit_name_is_template(name
)) {
643 s
= unit_name_replace_instance(name
, u
->instance
);
650 other
= manager_get_unit(u
->manager
, name
);
652 r
= unit_add_name(u
, name
);
654 r
= unit_merge(u
, other
);
659 Unit
* unit_follow_merge(Unit
*u
) {
662 while (u
->load_state
== UNIT_MERGED
)
663 assert_se(u
= u
->merged_into
);
668 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
674 if (c
->working_directory
) {
675 r
= unit_require_mounts_for(u
, c
->working_directory
);
680 if (c
->root_directory
) {
681 r
= unit_require_mounts_for(u
, c
->root_directory
);
686 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
687 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
688 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
689 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
690 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
691 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
692 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
693 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
694 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
695 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
696 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
697 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
700 /* If syslog or kernel logging is requested, make sure our own
701 * logging daemon is run first. */
703 if (u
->manager
->running_as
== SYSTEMD_SYSTEM
) {
704 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
712 const char *unit_description(Unit
*u
) {
716 return u
->description
;
721 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
725 _cleanup_free_
char *p2
= NULL
;
728 timestamp1
[FORMAT_TIMESTAMP_MAX
],
729 timestamp2
[FORMAT_TIMESTAMP_MAX
],
730 timestamp3
[FORMAT_TIMESTAMP_MAX
],
731 timestamp4
[FORMAT_TIMESTAMP_MAX
],
732 timespan
[FORMAT_TIMESPAN_MAX
];
734 _cleanup_set_free_ Set
*following_set
= NULL
;
738 assert(u
->type
>= 0);
742 p2
= strappend(prefix
, "\t");
743 prefix2
= p2
? p2
: prefix
;
747 "%s\tDescription: %s\n"
749 "%s\tUnit Load State: %s\n"
750 "%s\tUnit Active State: %s\n"
751 "%s\tInactive Exit Timestamp: %s\n"
752 "%s\tActive Enter Timestamp: %s\n"
753 "%s\tActive Exit Timestamp: %s\n"
754 "%s\tInactive Enter Timestamp: %s\n"
755 "%s\tGC Check Good: %s\n"
756 "%s\tNeed Daemon Reload: %s\n"
757 "%s\tTransient: %s\n"
760 "%s\tCGroup realized: %s\n"
761 "%s\tCGroup mask: 0x%x\n"
762 "%s\tCGroup members mask: 0x%x\n",
764 prefix
, unit_description(u
),
765 prefix
, strna(u
->instance
),
766 prefix
, unit_load_state_to_string(u
->load_state
),
767 prefix
, unit_active_state_to_string(unit_active_state(u
)),
768 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
769 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
770 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
771 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
772 prefix
, yes_no(unit_check_gc(u
)),
773 prefix
, yes_no(unit_need_daemon_reload(u
)),
774 prefix
, yes_no(u
->transient
),
775 prefix
, strna(unit_slice_name(u
)),
776 prefix
, strna(u
->cgroup_path
),
777 prefix
, yes_no(u
->cgroup_realized
),
778 prefix
, u
->cgroup_mask
,
779 prefix
, u
->cgroup_members_mask
);
781 SET_FOREACH(t
, u
->names
, i
)
782 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
784 STRV_FOREACH(j
, u
->documentation
)
785 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
787 following
= unit_following(u
);
789 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
791 r
= unit_following_set(u
, &following_set
);
795 SET_FOREACH(other
, following_set
, i
)
796 fprintf(f
, "%s\tFollowing Set Member: %s\n", prefix
, other
->id
);
799 if (u
->fragment_path
)
800 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
803 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
805 STRV_FOREACH(j
, u
->dropin_paths
)
806 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
808 if (u
->job_timeout
> 0)
809 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
811 condition_dump_list(u
->conditions
, f
, prefix
);
813 if (dual_timestamp_is_set(&u
->condition_timestamp
))
815 "%s\tCondition Timestamp: %s\n"
816 "%s\tCondition Result: %s\n",
817 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
818 prefix
, yes_no(u
->condition_result
));
820 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
823 SET_FOREACH(other
, u
->dependencies
[d
], i
)
824 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
827 if (!strv_isempty(u
->requires_mounts_for
)) {
829 "%s\tRequiresMountsFor:", prefix
);
831 STRV_FOREACH(j
, u
->requires_mounts_for
)
832 fprintf(f
, " %s", *j
);
837 if (u
->load_state
== UNIT_LOADED
) {
840 "%s\tStopWhenUnneeded: %s\n"
841 "%s\tRefuseManualStart: %s\n"
842 "%s\tRefuseManualStop: %s\n"
843 "%s\tDefaultDependencies: %s\n"
844 "%s\tOnFailureJobMode: %s\n"
845 "%s\tIgnoreOnIsolate: %s\n"
846 "%s\tIgnoreOnSnapshot: %s\n",
847 prefix
, yes_no(u
->stop_when_unneeded
),
848 prefix
, yes_no(u
->refuse_manual_start
),
849 prefix
, yes_no(u
->refuse_manual_stop
),
850 prefix
, yes_no(u
->default_dependencies
),
851 prefix
, job_mode_to_string(u
->on_failure_job_mode
),
852 prefix
, yes_no(u
->ignore_on_isolate
),
853 prefix
, yes_no(u
->ignore_on_snapshot
));
855 if (UNIT_VTABLE(u
)->dump
)
856 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
858 } else if (u
->load_state
== UNIT_MERGED
)
860 "%s\tMerged into: %s\n",
861 prefix
, u
->merged_into
->id
);
862 else if (u
->load_state
== UNIT_ERROR
)
863 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
867 job_dump(u
->job
, f
, prefix2
);
870 job_dump(u
->nop_job
, f
, prefix2
);
874 /* Common implementation for multiple backends */
875 int unit_load_fragment_and_dropin(Unit
*u
) {
880 /* Load a .{service,socket,...} file */
881 r
= unit_load_fragment(u
);
885 if (u
->load_state
== UNIT_STUB
)
888 /* Load drop-in directory data */
889 r
= unit_load_dropin(unit_follow_merge(u
));
896 /* Common implementation for multiple backends */
897 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
902 /* Same as unit_load_fragment_and_dropin(), but whether
903 * something can be loaded or not doesn't matter. */
905 /* Load a .service file */
906 r
= unit_load_fragment(u
);
910 if (u
->load_state
== UNIT_STUB
)
911 u
->load_state
= UNIT_LOADED
;
913 /* Load drop-in directory data */
914 r
= unit_load_dropin(unit_follow_merge(u
));
921 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
925 if (target
->type
!= UNIT_TARGET
)
928 /* Only add the dependency if both units are loaded, so that
929 * that loop check below is reliable */
930 if (u
->load_state
!= UNIT_LOADED
||
931 target
->load_state
!= UNIT_LOADED
)
934 /* If either side wants no automatic dependencies, then let's
936 if (!u
->default_dependencies
||
937 !target
->default_dependencies
)
940 /* Don't create loops */
941 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
944 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
947 static int unit_add_default_dependencies(Unit
*u
) {
949 static const UnitDependency deps
[] = {
951 UNIT_REQUIRED_BY_OVERRIDABLE
,
963 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
964 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
965 r
= unit_add_default_target_dependency(u
, target
);
970 if (u
->default_dependencies
&& unit_get_cgroup_context(u
)) {
971 if (UNIT_ISSET(u
->slice
))
972 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_WANTS
, UNIT_DEREF(u
->slice
), true);
974 r
= unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_WANTS
, SPECIAL_ROOT_SLICE
, NULL
, true);
983 static int unit_add_mount_links(Unit
*u
) {
989 STRV_FOREACH(i
, u
->requires_mounts_for
) {
990 char prefix
[strlen(*i
) + 1];
992 PATH_FOREACH_PREFIX_MORE(prefix
, *i
) {
995 r
= manager_get_unit_by_path(u
->manager
, prefix
, ".mount", &m
);
1003 if (m
->load_state
!= UNIT_LOADED
)
1006 r
= unit_add_dependency(u
, UNIT_AFTER
, m
, true);
1010 if (m
->fragment_path
) {
1011 r
= unit_add_dependency(u
, UNIT_REQUIRES
, m
, true);
1021 int unit_load(Unit
*u
) {
1026 if (u
->in_load_queue
) {
1027 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
1028 u
->in_load_queue
= false;
1031 if (u
->type
== _UNIT_TYPE_INVALID
)
1034 if (u
->load_state
!= UNIT_STUB
)
1037 if (UNIT_VTABLE(u
)->load
) {
1038 r
= UNIT_VTABLE(u
)->load(u
);
1043 if (u
->load_state
== UNIT_STUB
) {
1048 if (u
->load_state
== UNIT_LOADED
) {
1050 if (u
->default_dependencies
) {
1051 r
= unit_add_default_dependencies(u
);
1056 unit_update_member_masks(u
);
1058 r
= unit_add_mount_links(u
);
1062 if (u
->on_failure_job_mode
== JOB_ISOLATE
&&
1063 set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
1065 log_error_unit(u
->id
,
1066 "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u
->id
);
1073 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
1075 unit_add_to_dbus_queue(unit_follow_merge(u
));
1076 unit_add_to_gc_queue(u
);
1081 u
->load_state
= u
->load_state
== UNIT_STUB
? UNIT_NOT_FOUND
: UNIT_ERROR
;
1083 unit_add_to_dbus_queue(u
);
1084 unit_add_to_gc_queue(u
);
1086 log_debug_unit(u
->id
, "Failed to load configuration for %s: %s",
1087 u
->id
, strerror(-r
));
1092 static bool unit_condition_test(Unit
*u
) {
1095 dual_timestamp_get(&u
->condition_timestamp
);
1096 u
->condition_result
= condition_test_list(u
->id
, u
->conditions
);
1098 return u
->condition_result
;
1101 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1102 const UnitStatusMessageFormats
*format_table
;
1106 assert(t
< _JOB_TYPE_MAX
);
1108 if (t
!= JOB_START
&& t
!= JOB_STOP
)
1111 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1115 return format_table
->starting_stopping
[t
== JOB_STOP
];
1118 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
1123 assert(t
< _JOB_TYPE_MAX
);
1125 format
= unit_get_status_message_format(u
, t
);
1129 /* Return generic strings */
1131 return "Starting %s.";
1132 else if (t
== JOB_STOP
)
1133 return "Stopping %s.";
1134 else if (t
== JOB_RELOAD
)
1135 return "Reloading %s.";
1140 #pragma GCC diagnostic push
1141 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
1142 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1147 /* We only print status messages for selected units on
1148 * selected operations. */
1150 format
= unit_get_status_message_format(u
, t
);
1154 unit_status_printf(u
, "", format
);
1156 #pragma GCC diagnostic pop
1158 #pragma GCC diagnostic push
1159 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
1160 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1167 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1170 if (log_on_console())
1173 /* We log status messages for all units and all operations. */
1175 format
= unit_get_status_message_format_try_harder(u
, t
);
1179 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1182 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1183 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1184 SD_MESSAGE_UNIT_RELOADING
;
1186 log_struct_unit(LOG_INFO
,
1192 #pragma GCC diagnostic pop
1195 * -EBADR: This unit type does not support starting.
1196 * -EALREADY: Unit is already started.
1197 * -EAGAIN: An operation is already in progress. Retry later.
1198 * -ECANCELED: Too many requests for now.
1200 int unit_start(Unit
*u
) {
1201 UnitActiveState state
;
1206 if (u
->load_state
!= UNIT_LOADED
)
1209 /* If this is already started, then this will succeed. Note
1210 * that this will even succeed if this unit is not startable
1211 * by the user. This is relied on to detect when we need to
1212 * wait for units and when waiting is finished. */
1213 state
= unit_active_state(u
);
1214 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1217 /* If the conditions failed, don't do anything at all. If we
1218 * already are activating this call might still be useful to
1219 * speed up activation in case there is some hold-off time,
1220 * but we don't want to recheck the condition in that case. */
1221 if (state
!= UNIT_ACTIVATING
&&
1222 !unit_condition_test(u
)) {
1223 log_debug_unit(u
->id
, "Starting of %s requested but condition failed. Ignoring.", u
->id
);
1227 /* Forward to the main object, if we aren't it. */
1228 following
= unit_following(u
);
1230 log_debug_unit(u
->id
, "Redirecting start request from %s to %s.",
1231 u
->id
, following
->id
);
1232 return unit_start(following
);
1235 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1236 unit_status_print_starting_stopping(u
, JOB_START
);
1238 /* If it is stopped, but we cannot start it, then fail */
1239 if (!UNIT_VTABLE(u
)->start
)
1242 /* We don't suppress calls to ->start() here when we are
1243 * already starting, to allow this request to be used as a
1244 * "hurry up" call, for example when the unit is in some "auto
1245 * restart" state where it waits for a holdoff timer to elapse
1246 * before it will start again. */
1248 unit_add_to_dbus_queue(u
);
1250 return UNIT_VTABLE(u
)->start(u
);
1253 bool unit_can_start(Unit
*u
) {
1256 return !!UNIT_VTABLE(u
)->start
;
1259 bool unit_can_isolate(Unit
*u
) {
1262 return unit_can_start(u
) &&
1267 * -EBADR: This unit type does not support stopping.
1268 * -EALREADY: Unit is already stopped.
1269 * -EAGAIN: An operation is already in progress. Retry later.
1271 int unit_stop(Unit
*u
) {
1272 UnitActiveState state
;
1277 state
= unit_active_state(u
);
1278 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1281 if ((following
= unit_following(u
))) {
1282 log_debug_unit(u
->id
, "Redirecting stop request from %s to %s.",
1283 u
->id
, following
->id
);
1284 return unit_stop(following
);
1287 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1288 unit_status_print_starting_stopping(u
, JOB_STOP
);
1290 if (!UNIT_VTABLE(u
)->stop
)
1293 unit_add_to_dbus_queue(u
);
1295 return UNIT_VTABLE(u
)->stop(u
);
1299 * -EBADR: This unit type does not support reloading.
1300 * -ENOEXEC: Unit is not started.
1301 * -EAGAIN: An operation is already in progress. Retry later.
1303 int unit_reload(Unit
*u
) {
1304 UnitActiveState state
;
1309 if (u
->load_state
!= UNIT_LOADED
)
1312 if (!unit_can_reload(u
))
1315 state
= unit_active_state(u
);
1316 if (state
== UNIT_RELOADING
)
1319 if (state
!= UNIT_ACTIVE
) {
1320 log_warning_unit(u
->id
, "Unit %s cannot be reloaded because it is inactive.",
1325 following
= unit_following(u
);
1327 log_debug_unit(u
->id
, "Redirecting reload request from %s to %s.",
1328 u
->id
, following
->id
);
1329 return unit_reload(following
);
1332 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1334 unit_add_to_dbus_queue(u
);
1335 return UNIT_VTABLE(u
)->reload(u
);
1338 bool unit_can_reload(Unit
*u
) {
1341 if (!UNIT_VTABLE(u
)->reload
)
1344 if (!UNIT_VTABLE(u
)->can_reload
)
1347 return UNIT_VTABLE(u
)->can_reload(u
);
1350 static void unit_check_unneeded(Unit
*u
) {
1356 /* If this service shall be shut down when unneeded then do
1359 if (!u
->stop_when_unneeded
)
1362 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1365 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY
], i
)
1366 if (unit_active_or_pending(other
))
1369 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY_OVERRIDABLE
], i
)
1370 if (unit_active_or_pending(other
))
1373 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTED_BY
], i
)
1374 if (unit_active_or_pending(other
))
1377 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1378 if (unit_active_or_pending(other
))
1381 log_info_unit(u
->id
, "Service %s is not needed anymore. Stopping.", u
->id
);
1383 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1384 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1387 static void retroactively_start_dependencies(Unit
*u
) {
1392 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1394 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1395 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1396 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1397 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1399 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1400 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1401 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1402 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1404 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1405 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1406 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1407 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1409 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1410 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1411 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1412 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1414 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1415 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1416 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1418 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1419 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1420 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1423 static void retroactively_stop_dependencies(Unit
*u
) {
1428 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1430 /* Pull down units which are bound to us recursively if enabled */
1431 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1432 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1433 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1436 static void check_unneeded_dependencies(Unit
*u
) {
1441 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1443 /* Garbage collect services that might not be needed anymore, if enabled */
1444 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1445 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1446 unit_check_unneeded(other
);
1447 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1448 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1449 unit_check_unneeded(other
);
1450 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1451 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1452 unit_check_unneeded(other
);
1453 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1454 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1455 unit_check_unneeded(other
);
1456 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1457 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1458 unit_check_unneeded(other
);
1459 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1460 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1461 unit_check_unneeded(other
);
1464 void unit_start_on_failure(Unit
*u
) {
1470 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1473 log_info_unit(u
->id
, "Triggering OnFailure= dependencies of %s.", u
->id
);
1475 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1478 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1480 log_error_unit(u
->id
, "Failed to enqueue OnFailure= job: %s", strerror(-r
));
1484 void unit_trigger_notify(Unit
*u
) {
1490 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1491 if (UNIT_VTABLE(other
)->trigger_notify
)
1492 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1495 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1500 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1501 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1503 /* Note that this is called for all low-level state changes,
1504 * even if they might map to the same high-level
1505 * UnitActiveState! That means that ns == os is OK an expected
1506 * behavior here. For example: if a mount point is remounted
1507 * this function will be called too! */
1511 if (m
->n_reloading
<= 0) {
1514 dual_timestamp_get(&ts
);
1516 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1517 u
->inactive_exit_timestamp
= ts
;
1518 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1519 u
->inactive_enter_timestamp
= ts
;
1521 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1522 u
->active_enter_timestamp
= ts
;
1523 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1524 u
->active_exit_timestamp
= ts
;
1527 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1528 unit_destroy_cgroup(u
);
1530 /* Note that this doesn't apply to RemainAfterExit services exiting
1531 * sucessfully, since there's no change of state in that case. Which is
1532 * why it is handled in service_set_state() */
1533 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1534 ExecContext
*ec
= unit_get_exec_context(u
);
1535 if (ec
&& exec_context_may_touch_console(ec
)) {
1536 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1539 if (m
->n_on_console
== 0)
1540 /* unset no_console_output flag, since the console is free */
1541 m
->no_console_output
= false;
1550 if (u
->job
->state
== JOB_WAITING
)
1552 /* So we reached a different state for this
1553 * job. Let's see if we can run it now if it
1554 * failed previously due to EAGAIN. */
1555 job_add_to_run_queue(u
->job
);
1557 /* Let's check whether this state change constitutes a
1558 * finished job, or maybe contradicts a running job and
1559 * hence needs to invalidate jobs. */
1561 switch (u
->job
->type
) {
1564 case JOB_VERIFY_ACTIVE
:
1566 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1567 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1568 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1571 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1572 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1578 case JOB_RELOAD_OR_START
:
1580 if (u
->job
->state
== JOB_RUNNING
) {
1581 if (ns
== UNIT_ACTIVE
)
1582 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1583 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1586 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1587 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1595 case JOB_TRY_RESTART
:
1597 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1598 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1599 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1601 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1607 assert_not_reached("Job type unknown");
1613 if (m
->n_reloading
<= 0) {
1615 /* If this state change happened without being
1616 * requested by a job, then let's retroactively start
1617 * or stop dependencies. We skip that step when
1618 * deserializing, since we don't want to create any
1619 * additional jobs just because something is already
1623 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1624 retroactively_start_dependencies(u
);
1625 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1626 retroactively_stop_dependencies(u
);
1629 /* stop unneeded units regardless if going down was expected or not */
1630 if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1631 check_unneeded_dependencies(u
);
1633 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1634 log_notice_unit(u
->id
,
1635 "Unit %s entered failed state.", u
->id
);
1636 unit_start_on_failure(u
);
1640 /* Some names are special */
1641 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1643 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1644 /* The bus just might have become available,
1645 * hence try to connect to it, if we aren't
1649 if (u
->type
== UNIT_SERVICE
&&
1650 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1651 m
->n_reloading
<= 0) {
1652 /* Write audit record if we have just finished starting up */
1653 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1657 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1658 manager_send_unit_plymouth(m
, u
);
1662 /* We don't care about D-Bus here, since we'll get an
1663 * asynchronous notification for it anyway. */
1665 if (u
->type
== UNIT_SERVICE
&&
1666 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1667 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1668 m
->n_reloading
<= 0) {
1670 /* Hmm, if there was no start record written
1671 * write it now, so that we always have a nice
1674 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1676 if (ns
== UNIT_INACTIVE
)
1677 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1679 /* Write audit record if we have just finished shutting down */
1680 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1682 u
->in_audit
= false;
1686 manager_recheck_journal(m
);
1687 unit_trigger_notify(u
);
1689 /* Maybe we finished startup and are now ready for being
1690 * stopped because unneeded? */
1691 if (u
->manager
->n_reloading
<= 0)
1692 unit_check_unneeded(u
);
1694 unit_add_to_dbus_queue(u
);
1695 unit_add_to_gc_queue(u
);
1698 int unit_watch_pid(Unit
*u
, pid_t pid
) {
1702 /* Watch a specific PID. We only support one unit watching
1703 * each PID for now. */
1705 return hashmap_put(u
->manager
->watch_pids
, LONG_TO_PTR(pid
), u
);
1708 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
1712 hashmap_remove_value(u
->manager
->watch_pids
, LONG_TO_PTR(pid
), u
);
1715 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
1717 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
1721 case JOB_VERIFY_ACTIVE
:
1728 case JOB_TRY_RESTART
:
1729 return unit_can_start(u
);
1732 return unit_can_reload(u
);
1734 case JOB_RELOAD_OR_START
:
1735 return unit_can_reload(u
) && unit_can_start(u
);
1738 assert_not_reached("Invalid job type");
1742 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
1744 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
1745 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
1746 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
1747 [UNIT_WANTS
] = UNIT_WANTED_BY
,
1748 [UNIT_REQUISITE
] = UNIT_REQUIRED_BY
,
1749 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
1750 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
1751 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
1752 [UNIT_REQUIRED_BY
] = _UNIT_DEPENDENCY_INVALID
,
1753 [UNIT_REQUIRED_BY_OVERRIDABLE
] = _UNIT_DEPENDENCY_INVALID
,
1754 [UNIT_WANTED_BY
] = _UNIT_DEPENDENCY_INVALID
,
1755 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
1756 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
1757 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
1758 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
1759 [UNIT_BEFORE
] = UNIT_AFTER
,
1760 [UNIT_AFTER
] = UNIT_BEFORE
,
1761 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
1762 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
1763 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
1764 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
1765 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
1766 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
1767 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
1768 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
1770 int r
, q
= 0, v
= 0, w
= 0;
1773 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
1776 u
= unit_follow_merge(u
);
1777 other
= unit_follow_merge(other
);
1779 /* We won't allow dependencies on ourselves. We will not
1780 * consider them an error however. */
1784 r
= set_ensure_allocated(&u
->dependencies
[d
], trivial_hash_func
, trivial_compare_func
);
1788 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
1789 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], trivial_hash_func
, trivial_compare_func
);
1794 if (add_reference
) {
1795 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], trivial_hash_func
, trivial_compare_func
);
1799 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], trivial_hash_func
, trivial_compare_func
);
1804 q
= set_put(u
->dependencies
[d
], other
);
1808 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
1809 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
1816 if (add_reference
) {
1817 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
1823 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
1828 unit_add_to_dbus_queue(u
);
1833 set_remove(u
->dependencies
[d
], other
);
1836 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
1839 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
1844 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
1849 if ((r
= unit_add_dependency(u
, d
, other
, add_reference
)) < 0)
1852 if ((r
= unit_add_dependency(u
, e
, other
, add_reference
)) < 0)
1858 static const char *resolve_template(Unit
*u
, const char *name
, const char*path
, char **p
) {
1862 assert(name
|| path
);
1866 name
= basename(path
);
1868 if (!unit_name_is_template(name
)) {
1874 s
= unit_name_replace_instance(name
, u
->instance
);
1876 _cleanup_free_
char *i
= NULL
;
1878 i
= unit_name_to_prefix(u
->id
);
1882 s
= unit_name_replace_instance(name
, i
);
1892 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
1895 _cleanup_free_
char *s
= NULL
;
1898 assert(name
|| path
);
1900 name
= resolve_template(u
, name
, path
, &s
);
1904 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
1908 return unit_add_dependency(u
, d
, other
, add_reference
);
1911 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
1914 _cleanup_free_
char *s
= NULL
;
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 r
= unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
1930 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
1933 _cleanup_free_
char *s
= NULL
;
1936 assert(name
|| path
);
1938 if (!(name
= resolve_template(u
, name
, path
, &s
)))
1941 if ((r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
)) < 0)
1944 r
= unit_add_dependency(other
, d
, u
, add_reference
);
1949 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
1952 _cleanup_free_
char *s
= NULL
;
1955 assert(name
|| path
);
1957 if (!(name
= resolve_template(u
, name
, path
, &s
)))
1960 if ((r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
)) < 0)
1963 if ((r
= unit_add_two_dependencies(other
, d
, e
, u
, add_reference
)) < 0)
1969 int set_unit_path(const char *p
) {
1970 _cleanup_free_
char *c
= NULL
;
1972 /* This is mostly for debug purposes */
1973 c
= path_make_absolute_cwd(p
);
1974 if (setenv("SYSTEMD_UNIT_PATH", c
, 0) < 0)
1980 char *unit_dbus_path(Unit
*u
) {
1986 return unit_dbus_path_from_name(u
->id
);
1989 char *unit_default_cgroup_path(Unit
*u
) {
1990 _cleanup_free_
char *escaped
= NULL
, *slice
= NULL
;
1995 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
1996 return strdup(u
->manager
->cgroup_root
);
1998 if (UNIT_ISSET(u
->slice
) && !unit_has_name(UNIT_DEREF(u
->slice
), SPECIAL_ROOT_SLICE
)) {
1999 r
= cg_slice_to_path(UNIT_DEREF(u
->slice
)->id
, &slice
);
2004 escaped
= cg_escape(u
->id
);
2009 return strjoin(u
->manager
->cgroup_root
, "/", slice
, "/", escaped
, NULL
);
2011 return strjoin(u
->manager
->cgroup_root
, "/", escaped
, NULL
);
2014 int unit_add_default_slice(Unit
*u
) {
2015 _cleanup_free_
char *b
= NULL
;
2016 const char *slice_name
;
2022 if (UNIT_ISSET(u
->slice
))
2025 if (!unit_get_cgroup_context(u
))
2029 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2031 /* Implicitly place all instantiated units in their
2032 * own per-template slice */
2034 prefix
= unit_name_to_prefix(u
->id
);
2038 /* The prefix is already escaped, but it might include
2039 * "-" which has a special meaning for slice units,
2040 * hence escape it here extra. */
2041 escaped
= strreplace(prefix
, "-", "\\x2d");
2045 if (u
->manager
->running_as
== SYSTEMD_SYSTEM
)
2046 b
= strjoin("system-", escaped
, ".slice", NULL
);
2048 b
= strappend(escaped
, ".slice");
2055 u
->manager
->running_as
== SYSTEMD_SYSTEM
2056 ? SPECIAL_SYSTEM_SLICE
2057 : SPECIAL_ROOT_SLICE
;
2059 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2063 unit_ref_set(&u
->slice
, slice
);
2067 const char *unit_slice_name(Unit
*u
) {
2070 if (!UNIT_ISSET(u
->slice
))
2073 return UNIT_DEREF(u
->slice
)->id
;
2076 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2077 _cleanup_free_
char *t
= NULL
;
2084 t
= unit_name_change_suffix(u
->id
, type
);
2088 assert(!unit_has_name(u
, t
));
2090 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2091 assert(r
< 0 || *_found
!= u
);
2095 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2099 /* Watch a specific name on the bus. We only support one unit
2100 * watching each name for now. */
2102 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2105 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2109 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2112 bool unit_can_serialize(Unit
*u
) {
2115 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2118 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2126 if (!unit_can_serialize(u
))
2129 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2133 rt
= unit_get_exec_runtime(u
);
2135 r
= exec_runtime_serialize(rt
, u
, f
, fds
);
2140 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2141 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2142 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2143 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2144 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2146 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2147 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2149 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2152 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2154 if (serialize_jobs
) {
2156 fprintf(f
, "job\n");
2157 job_serialize(u
->job
, f
, fds
);
2161 fprintf(f
, "job\n");
2162 job_serialize(u
->nop_job
, f
, fds
);
2171 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2182 va_start(ap
, format
);
2183 vfprintf(f
, format
, ap
);
2189 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2195 fprintf(f
, "%s=%s\n", key
, value
);
2198 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2200 ExecRuntime
**rt
= NULL
;
2207 if (!unit_can_serialize(u
))
2210 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2212 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2215 char line
[LINE_MAX
], *l
, *v
;
2218 if (!fgets(line
, sizeof(line
), f
)) {
2231 k
= strcspn(l
, "=");
2239 if (streq(l
, "job")) {
2241 /* new-style serialized job */
2242 Job
*j
= job_new_raw(u
);
2246 r
= job_deserialize(j
, f
, fds
);
2252 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2258 r
= job_install_deserialized(j
);
2260 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2265 if (j
->state
== JOB_RUNNING
)
2266 u
->manager
->n_running_jobs
++;
2269 JobType type
= job_type_from_string(v
);
2271 log_debug("Failed to parse job type value %s", v
);
2273 u
->deserialized_job
= type
;
2276 } else if (streq(l
, "inactive-exit-timestamp")) {
2277 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2279 } else if (streq(l
, "active-enter-timestamp")) {
2280 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2282 } else if (streq(l
, "active-exit-timestamp")) {
2283 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2285 } else if (streq(l
, "inactive-enter-timestamp")) {
2286 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2288 } else if (streq(l
, "condition-timestamp")) {
2289 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2291 } else if (streq(l
, "condition-result")) {
2294 b
= parse_boolean(v
);
2296 log_debug("Failed to parse condition result value %s", v
);
2298 u
->condition_result
= b
;
2302 } else if (streq(l
, "transient")) {
2305 b
= parse_boolean(v
);
2307 log_debug("Failed to parse transient bool %s", v
);
2312 } else if (streq(l
, "cgroup")) {
2319 free(u
->cgroup_path
);
2322 assert(hashmap_put(u
->manager
->cgroup_unit
, s
, u
) == 1);
2327 r
= exec_runtime_deserialize_item(rt
, u
, l
, v
, fds
);
2334 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2340 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2342 _cleanup_free_
char *e
= NULL
;
2350 /* Adds in links to the device node that this unit is based on */
2352 if (!is_device_path(what
))
2355 e
= unit_name_from_path(what
, ".device");
2359 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2364 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_BINDS_TO
, device
, true);
2369 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2377 int unit_coldplug(Unit
*u
) {
2382 if (UNIT_VTABLE(u
)->coldplug
)
2383 if ((r
= UNIT_VTABLE(u
)->coldplug(u
)) < 0)
2387 r
= job_coldplug(u
->job
);
2390 } else if (u
->deserialized_job
>= 0) {
2392 r
= manager_add_job(u
->manager
, u
->deserialized_job
, u
, JOB_IGNORE_REQUIREMENTS
, false, NULL
, NULL
);
2396 u
->deserialized_job
= _JOB_TYPE_INVALID
;
2402 #pragma GCC diagnostic push
2403 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
2404 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2405 manager_status_printf(u
->manager
, false, status
, unit_status_msg_format
, unit_description(u
));
2407 #pragma GCC diagnostic pop
2409 bool unit_need_daemon_reload(Unit
*u
) {
2410 _cleanup_strv_free_
char **t
= NULL
;
2413 unsigned loaded_cnt
, current_cnt
;
2417 if (u
->fragment_path
) {
2419 if (stat(u
->fragment_path
, &st
) < 0)
2420 /* What, cannot access this anymore? */
2423 if (u
->fragment_mtime
> 0 &&
2424 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2428 if (u
->source_path
) {
2430 if (stat(u
->source_path
, &st
) < 0)
2433 if (u
->source_mtime
> 0 &&
2434 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2438 t
= unit_find_dropin_paths(u
);
2439 loaded_cnt
= strv_length(t
);
2440 current_cnt
= strv_length(u
->dropin_paths
);
2442 if (loaded_cnt
== current_cnt
) {
2443 if (loaded_cnt
== 0)
2446 if (strv_overlap(u
->dropin_paths
, t
)) {
2447 STRV_FOREACH(path
, u
->dropin_paths
) {
2449 if (stat(*path
, &st
) < 0)
2452 if (u
->dropin_mtime
> 0 &&
2453 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2464 void unit_reset_failed(Unit
*u
) {
2467 if (UNIT_VTABLE(u
)->reset_failed
)
2468 UNIT_VTABLE(u
)->reset_failed(u
);
2471 Unit
*unit_following(Unit
*u
) {
2474 if (UNIT_VTABLE(u
)->following
)
2475 return UNIT_VTABLE(u
)->following(u
);
2480 bool unit_stop_pending(Unit
*u
) {
2483 /* This call does check the current state of the unit. It's
2484 * hence useful to be called from state change calls of the
2485 * unit itself, where the state isn't updated yet. This is
2486 * different from unit_inactive_or_pending() which checks both
2487 * the current state and for a queued job. */
2489 return u
->job
&& u
->job
->type
== JOB_STOP
;
2492 bool unit_inactive_or_pending(Unit
*u
) {
2495 /* Returns true if the unit is inactive or going down */
2497 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
2500 if (unit_stop_pending(u
))
2506 bool unit_active_or_pending(Unit
*u
) {
2509 /* Returns true if the unit is active or going up */
2511 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
2515 (u
->job
->type
== JOB_START
||
2516 u
->job
->type
== JOB_RELOAD_OR_START
||
2517 u
->job
->type
== JOB_RESTART
))
2523 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
2525 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
2527 assert(signo
< _NSIG
);
2529 if (!UNIT_VTABLE(u
)->kill
)
2532 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
2535 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
2539 pid_set
= set_new(trivial_hash_func
, trivial_compare_func
);
2543 /* Exclude the main/control pids from being killed via the cgroup */
2545 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
2550 if (control_pid
> 0) {
2551 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
2563 int unit_kill_common(
2569 sd_bus_error
*error
) {
2573 if (who
== KILL_MAIN
&& main_pid
<= 0) {
2575 sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
2577 sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
2581 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
2582 if (control_pid
< 0)
2583 sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
2585 sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
2589 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
2590 if (control_pid
> 0)
2591 if (kill(control_pid
, signo
) < 0)
2594 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
2596 if (kill(main_pid
, signo
) < 0)
2599 if (who
== KILL_ALL
&& u
->cgroup_path
) {
2600 _cleanup_set_free_ Set
*pid_set
= NULL
;
2603 /* Exclude the main/control pids from being killed via the cgroup */
2604 pid_set
= unit_pid_set(main_pid
, control_pid
);
2608 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, true, false, pid_set
);
2609 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
2616 int unit_following_set(Unit
*u
, Set
**s
) {
2620 if (UNIT_VTABLE(u
)->following_set
)
2621 return UNIT_VTABLE(u
)->following_set(u
, s
);
2627 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
2630 if (u
->unit_file_state
< 0 && u
->fragment_path
)
2631 u
->unit_file_state
= unit_file_get_state(
2632 u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
2633 NULL
, basename(u
->fragment_path
));
2635 return u
->unit_file_state
;
2638 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
2643 unit_ref_unset(ref
);
2646 LIST_PREPEND(refs
, u
->refs
, ref
);
2650 void unit_ref_unset(UnitRef
*ref
) {
2656 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
2660 int unit_exec_context_defaults(Unit
*u
, ExecContext
*c
) {
2667 /* This only copies in the ones that need memory */
2668 for (i
= 0; i
< RLIMIT_NLIMITS
; i
++)
2669 if (u
->manager
->rlimit
[i
] && !c
->rlimit
[i
]) {
2670 c
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
2675 if (u
->manager
->running_as
== SYSTEMD_USER
&&
2676 !c
->working_directory
) {
2678 r
= get_home_dir(&c
->working_directory
);
2686 ExecContext
*unit_get_exec_context(Unit
*u
) {
2690 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
2694 return (ExecContext
*) ((uint8_t*) u
+ offset
);
2697 KillContext
*unit_get_kill_context(Unit
*u
) {
2701 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
2705 return (KillContext
*) ((uint8_t*) u
+ offset
);
2708 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
2711 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
2715 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
2718 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
2721 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2725 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
2728 static int drop_in_file(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, char **_p
, char **_q
) {
2729 _cleanup_free_
char *b
= NULL
;
2737 assert(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
));
2739 b
= xescape(name
, "/.");
2743 if (!filename_is_safe(b
))
2746 if (u
->manager
->running_as
== SYSTEMD_USER
) {
2747 _cleanup_free_
char *c
= NULL
;
2749 r
= user_config_home(&c
);
2755 p
= strjoin(c
, "/", u
->id
, ".d", NULL
);
2756 } else if (mode
& UNIT_PERSISTENT
)
2757 p
= strjoin("/etc/systemd/system/", u
->id
, ".d", NULL
);
2759 p
= strjoin("/run/systemd/system/", u
->id
, ".d", NULL
);
2763 q
= strjoin(p
, "/90-", b
, ".conf", NULL
);
2774 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
2775 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
2782 if (!(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
)))
2785 r
= drop_in_file(u
, mode
, name
, &p
, &q
);
2790 return write_string_file_atomic_label(q
, data
);
2793 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
2794 _cleanup_free_
char *p
= NULL
;
2802 if (!(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
)))
2805 va_start(ap
, format
);
2806 r
= vasprintf(&p
, format
, ap
);
2812 return unit_write_drop_in(u
, mode
, name
, p
);
2815 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
2816 _cleanup_free_
char *ndata
= NULL
;
2822 if (!UNIT_VTABLE(u
)->private_section
)
2825 if (!(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
)))
2828 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
2832 return unit_write_drop_in(u
, mode
, name
, ndata
);
2835 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
2836 _cleanup_free_
char *p
= NULL
;
2844 if (!(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
)))
2847 va_start(ap
, format
);
2848 r
= vasprintf(&p
, format
, ap
);
2854 return unit_write_drop_in_private(u
, mode
, name
, p
);
2857 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
2858 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
2863 if (!(mode
& (UNIT_PERSISTENT
|UNIT_RUNTIME
)))
2866 r
= drop_in_file(u
, mode
, name
, &p
, &q
);
2871 r
= errno
== ENOENT
? 0 : -errno
;
2879 int unit_make_transient(Unit
*u
) {
2884 u
->load_state
= UNIT_STUB
;
2886 u
->transient
= true;
2888 free(u
->fragment_path
);
2889 u
->fragment_path
= NULL
;
2891 if (u
->manager
->running_as
== SYSTEMD_USER
) {
2892 _cleanup_free_
char *c
= NULL
;
2894 r
= user_config_home(&c
);
2900 u
->fragment_path
= strjoin(c
, "/", u
->id
, NULL
);
2901 if (!u
->fragment_path
)
2906 u
->fragment_path
= strappend("/run/systemd/system/", u
->id
);
2907 if (!u
->fragment_path
)
2910 mkdir_p("/run/systemd/system", 0755);
2913 return write_string_file_atomic_label(u
->fragment_path
, "# Transient stub");
2916 int unit_kill_context(
2922 bool main_pid_alien
) {
2924 int sig
, wait_for_exit
= 0, r
;
2929 if (c
->kill_mode
== KILL_NONE
)
2932 sig
= sigkill
? SIGKILL
: c
->kill_signal
;
2935 r
= kill_and_sigcont(main_pid
, sig
);
2937 if (r
< 0 && r
!= -ESRCH
) {
2938 _cleanup_free_
char *comm
= NULL
;
2939 get_process_comm(main_pid
, &comm
);
2941 log_warning_unit(u
->id
, "Failed to kill main process %li (%s): %s",
2942 (long) main_pid
, strna(comm
), strerror(-r
));
2944 wait_for_exit
= !main_pid_alien
;
2947 kill(main_pid
, SIGHUP
);
2951 if (control_pid
> 0) {
2952 r
= kill_and_sigcont(control_pid
, sig
);
2954 if (r
< 0 && r
!= -ESRCH
) {
2955 _cleanup_free_
char *comm
= NULL
;
2956 get_process_comm(control_pid
, &comm
);
2958 log_warning_unit(u
->id
,
2959 "Failed to kill control process %li (%s): %s",
2960 (long) control_pid
, strna(comm
), strerror(-r
));
2962 wait_for_exit
= true;
2965 kill(control_pid
, SIGHUP
);
2969 if ((c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& sigkill
)) && u
->cgroup_path
) {
2970 _cleanup_set_free_ Set
*pid_set
= NULL
;
2972 /* Exclude the main/control pids from being killed via the cgroup */
2973 pid_set
= unit_pid_set(main_pid
, control_pid
);
2977 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, true, false, pid_set
);
2979 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
2980 log_warning_unit(u
->id
, "Failed to kill control group: %s", strerror(-r
));
2982 wait_for_exit
= true;
2984 if (c
->send_sighup
) {
2987 pid_set
= unit_pid_set(main_pid
, control_pid
);
2991 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, true, true, false, pid_set
);
2996 return wait_for_exit
;
2999 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3000 char prefix
[strlen(path
) + 1], *p
;
3006 /* Registers a unit for requiring a certain path and all its
3007 * prefixes. We keep a simple array of these paths in the
3008 * unit, since its usually short. However, we build a prefix
3009 * table for all possible prefixes so that new appearing mount
3010 * units can easily determine which units to make themselves a
3013 if (!path_is_absolute(path
))
3020 path_kill_slashes(p
);
3022 if (!path_is_safe(p
)) {
3027 if (strv_contains(u
->requires_mounts_for
, p
)) {
3032 r
= strv_push(&u
->requires_mounts_for
, p
);
3038 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3041 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3045 if (!u
->manager
->units_requiring_mounts_for
) {
3046 u
->manager
->units_requiring_mounts_for
= hashmap_new(string_hash_func
, string_compare_func
);
3047 if (!u
->manager
->units_requiring_mounts_for
)
3055 x
= set_new(NULL
, NULL
);
3061 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3077 int unit_setup_exec_runtime(Unit
*u
) {
3083 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3086 /* Check if ther already is an ExecRuntime for this unit? */
3087 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3091 /* Try to get it from somebody else */
3092 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3094 *rt
= unit_get_exec_runtime(other
);
3096 exec_runtime_ref(*rt
);
3101 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3104 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3105 [UNIT_ACTIVE
] = "active",
3106 [UNIT_RELOADING
] = "reloading",
3107 [UNIT_INACTIVE
] = "inactive",
3108 [UNIT_FAILED
] = "failed",
3109 [UNIT_ACTIVATING
] = "activating",
3110 [UNIT_DEACTIVATING
] = "deactivating"
3113 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);
3115 static const char* const unit_dependency_table
[_UNIT_DEPENDENCY_MAX
] = {
3116 [UNIT_REQUIRES
] = "Requires",
3117 [UNIT_REQUIRES_OVERRIDABLE
] = "RequiresOverridable",
3118 [UNIT_REQUISITE
] = "Requisite",
3119 [UNIT_REQUISITE_OVERRIDABLE
] = "RequisiteOverridable",
3120 [UNIT_WANTS
] = "Wants",
3121 [UNIT_BINDS_TO
] = "BindsTo",
3122 [UNIT_PART_OF
] = "PartOf",
3123 [UNIT_REQUIRED_BY
] = "RequiredBy",
3124 [UNIT_REQUIRED_BY_OVERRIDABLE
] = "RequiredByOverridable",
3125 [UNIT_WANTED_BY
] = "WantedBy",
3126 [UNIT_BOUND_BY
] = "BoundBy",
3127 [UNIT_CONSISTS_OF
] = "ConsistsOf",
3128 [UNIT_CONFLICTS
] = "Conflicts",
3129 [UNIT_CONFLICTED_BY
] = "ConflictedBy",
3130 [UNIT_BEFORE
] = "Before",
3131 [UNIT_AFTER
] = "After",
3132 [UNIT_ON_FAILURE
] = "OnFailure",
3133 [UNIT_TRIGGERS
] = "Triggers",
3134 [UNIT_TRIGGERED_BY
] = "TriggeredBy",
3135 [UNIT_PROPAGATES_RELOAD_TO
] = "PropagatesReloadTo",
3136 [UNIT_RELOAD_PROPAGATED_FROM
] = "ReloadPropagatedFrom",
3137 [UNIT_REFERENCES
] = "References",
3138 [UNIT_REFERENCED_BY
] = "ReferencedBy",
3139 [UNIT_JOINS_NAMESPACE_OF
] = "JoinsNamespaceOf",
3142 DEFINE_STRING_TABLE_LOOKUP(unit_dependency
, UnitDependency
);