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"
56 const UnitVTable
* const unit_vtable
[_UNIT_TYPE_MAX
] = {
57 [UNIT_SERVICE
] = &service_vtable
,
58 [UNIT_SOCKET
] = &socket_vtable
,
59 [UNIT_BUSNAME
] = &busname_vtable
,
60 [UNIT_TARGET
] = &target_vtable
,
61 [UNIT_SNAPSHOT
] = &snapshot_vtable
,
62 [UNIT_DEVICE
] = &device_vtable
,
63 [UNIT_MOUNT
] = &mount_vtable
,
64 [UNIT_AUTOMOUNT
] = &automount_vtable
,
65 [UNIT_SWAP
] = &swap_vtable
,
66 [UNIT_TIMER
] = &timer_vtable
,
67 [UNIT_PATH
] = &path_vtable
,
68 [UNIT_SLICE
] = &slice_vtable
,
69 [UNIT_SCOPE
] = &scope_vtable
72 static int maybe_warn_about_dependency(const char *id
, const char *other
, UnitDependency dependency
);
74 Unit
*unit_new(Manager
*m
, size_t size
) {
78 assert(size
>= sizeof(Unit
));
84 u
->names
= set_new(&string_hash_ops
);
91 u
->type
= _UNIT_TYPE_INVALID
;
92 u
->deserialized_job
= _JOB_TYPE_INVALID
;
93 u
->default_dependencies
= true;
94 u
->unit_file_state
= _UNIT_FILE_STATE_INVALID
;
95 u
->on_failure_job_mode
= JOB_REPLACE
;
100 bool unit_has_name(Unit
*u
, const char *name
) {
104 return !!set_get(u
->names
, (char*) name
);
107 static void unit_init(Unit
*u
) {
114 assert(u
->type
>= 0);
116 cc
= unit_get_cgroup_context(u
);
118 cgroup_context_init(cc
);
120 /* Copy in the manager defaults into the cgroup
121 * context, _before_ the rest of the settings have
122 * been initialized */
124 cc
->cpu_accounting
= u
->manager
->default_cpu_accounting
;
125 cc
->blockio_accounting
= u
->manager
->default_blockio_accounting
;
126 cc
->memory_accounting
= u
->manager
->default_memory_accounting
;
129 ec
= unit_get_exec_context(u
);
131 exec_context_init(ec
);
133 kc
= unit_get_kill_context(u
);
135 kill_context_init(kc
);
137 if (UNIT_VTABLE(u
)->init
)
138 UNIT_VTABLE(u
)->init(u
);
141 int unit_add_name(Unit
*u
, const char *text
) {
142 _cleanup_free_
char *s
= NULL
, *i
= NULL
;
149 if (unit_name_is_template(text
)) {
154 s
= unit_name_replace_instance(text
, u
->instance
);
160 if (!unit_name_is_valid(s
, TEMPLATE_INVALID
))
163 assert_se((t
= unit_name_to_type(s
)) >= 0);
165 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
)
168 r
= unit_name_to_instance(s
, &i
);
172 if (i
&& unit_vtable
[t
]->no_instances
)
175 /* Ensure that this unit is either instanced or not instanced,
177 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
)
180 if (unit_vtable
[t
]->no_alias
&&
181 !set_isempty(u
->names
) &&
182 !set_get(u
->names
, s
))
185 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
)
188 r
= set_put(u
->names
, s
);
196 r
= hashmap_put(u
->manager
->units
, s
, u
);
198 set_remove(u
->names
, s
);
202 if (u
->type
== _UNIT_TYPE_INVALID
) {
207 LIST_PREPEND(units_by_type
, u
->manager
->units_by_type
[t
], u
);
216 unit_add_to_dbus_queue(u
);
220 int unit_choose_id(Unit
*u
, const char *name
) {
221 _cleanup_free_
char *t
= NULL
;
228 if (unit_name_is_template(name
)) {
233 t
= unit_name_replace_instance(name
, u
->instance
);
240 /* Selects one of the names of this unit as the id */
241 s
= set_get(u
->names
, (char*) name
);
245 r
= unit_name_to_instance(s
, &i
);
254 unit_add_to_dbus_queue(u
);
259 int unit_set_description(Unit
*u
, const char *description
) {
264 if (isempty(description
))
267 s
= strdup(description
);
272 free(u
->description
);
275 unit_add_to_dbus_queue(u
);
279 bool unit_check_gc(Unit
*u
) {
282 if (UNIT_VTABLE(u
)->no_gc
)
294 if (unit_active_state(u
) != UNIT_INACTIVE
)
300 if (UNIT_VTABLE(u
)->check_gc
)
301 if (UNIT_VTABLE(u
)->check_gc(u
))
307 void unit_add_to_load_queue(Unit
*u
) {
309 assert(u
->type
!= _UNIT_TYPE_INVALID
);
311 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
314 LIST_PREPEND(load_queue
, u
->manager
->load_queue
, u
);
315 u
->in_load_queue
= true;
318 void unit_add_to_cleanup_queue(Unit
*u
) {
321 if (u
->in_cleanup_queue
)
324 LIST_PREPEND(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
325 u
->in_cleanup_queue
= true;
328 void unit_add_to_gc_queue(Unit
*u
) {
331 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
334 if (unit_check_gc(u
))
337 LIST_PREPEND(gc_queue
, u
->manager
->gc_queue
, u
);
338 u
->in_gc_queue
= true;
340 u
->manager
->n_in_gc_queue
++;
343 void unit_add_to_dbus_queue(Unit
*u
) {
345 assert(u
->type
!= _UNIT_TYPE_INVALID
);
347 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
350 /* Shortcut things if nobody cares */
351 if (sd_bus_track_count(u
->manager
->subscribed
) <= 0 &&
352 set_isempty(u
->manager
->private_buses
)) {
353 u
->sent_dbus_new_signal
= true;
357 LIST_PREPEND(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
358 u
->in_dbus_queue
= true;
361 static void bidi_set_free(Unit
*u
, Set
*s
) {
367 /* Frees the set and makes sure we are dropped from the
368 * inverse pointers */
370 SET_FOREACH(other
, s
, i
) {
373 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
374 set_remove(other
->dependencies
[d
], u
);
376 unit_add_to_gc_queue(other
);
382 static void unit_remove_transient(Unit
*u
) {
390 if (u
->fragment_path
)
391 unlink(u
->fragment_path
);
393 STRV_FOREACH(i
, u
->dropin_paths
) {
394 _cleanup_free_
char *p
= NULL
;
399 r
= path_get_parent(*i
, &p
);
405 static void unit_free_requires_mounts_for(Unit
*u
) {
408 STRV_FOREACH(j
, u
->requires_mounts_for
) {
409 char s
[strlen(*j
) + 1];
411 PATH_FOREACH_PREFIX_MORE(s
, *j
) {
415 x
= hashmap_get2(u
->manager
->units_requiring_mounts_for
, s
, (void**) &y
);
421 if (set_isempty(x
)) {
422 hashmap_remove(u
->manager
->units_requiring_mounts_for
, y
);
429 strv_free(u
->requires_mounts_for
);
430 u
->requires_mounts_for
= NULL
;
433 static void unit_done(Unit
*u
) {
442 if (UNIT_VTABLE(u
)->done
)
443 UNIT_VTABLE(u
)->done(u
);
445 ec
= unit_get_exec_context(u
);
447 exec_context_done(ec
);
449 cc
= unit_get_cgroup_context(u
);
451 cgroup_context_done(cc
);
454 void unit_free(Unit
*u
) {
461 if (u
->manager
->n_reloading
<= 0)
462 unit_remove_transient(u
);
464 bus_unit_send_removed_signal(u
);
468 unit_free_requires_mounts_for(u
);
470 SET_FOREACH(t
, u
->names
, i
)
471 hashmap_remove_value(u
->manager
->units
, t
, u
);
485 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
486 bidi_set_free(u
, u
->dependencies
[d
]);
488 if (u
->type
!= _UNIT_TYPE_INVALID
)
489 LIST_REMOVE(units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
491 if (u
->in_load_queue
)
492 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
494 if (u
->in_dbus_queue
)
495 LIST_REMOVE(dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
497 if (u
->in_cleanup_queue
)
498 LIST_REMOVE(cleanup_queue
, u
->manager
->cleanup_queue
, u
);
500 if (u
->in_gc_queue
) {
501 LIST_REMOVE(gc_queue
, u
->manager
->gc_queue
, u
);
502 u
->manager
->n_in_gc_queue
--;
505 if (u
->in_cgroup_queue
)
506 LIST_REMOVE(cgroup_queue
, u
->manager
->cgroup_queue
, u
);
508 if (u
->cgroup_path
) {
509 hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
510 free(u
->cgroup_path
);
513 set_remove(u
->manager
->failed_units
, u
);
514 set_remove(u
->manager
->startup_units
, u
);
516 free(u
->description
);
517 strv_free(u
->documentation
);
518 free(u
->fragment_path
);
519 free(u
->source_path
);
520 strv_free(u
->dropin_paths
);
523 set_free_free(u
->names
);
525 unit_unwatch_all_pids(u
);
527 condition_free_list(u
->conditions
);
529 unit_ref_unset(&u
->slice
);
532 unit_ref_unset(u
->refs
);
537 UnitActiveState
unit_active_state(Unit
*u
) {
540 if (u
->load_state
== UNIT_MERGED
)
541 return unit_active_state(unit_follow_merge(u
));
543 /* After a reload it might happen that a unit is not correctly
544 * loaded but still has a process around. That's why we won't
545 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
547 return UNIT_VTABLE(u
)->active_state(u
);
550 const char* unit_sub_state_to_string(Unit
*u
) {
553 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
556 static int complete_move(Set
**s
, Set
**other
) {
566 r
= set_move(*s
, *other
);
577 static int merge_names(Unit
*u
, Unit
*other
) {
585 r
= complete_move(&u
->names
, &other
->names
);
589 set_free_free(other
->names
);
593 SET_FOREACH(t
, u
->names
, i
)
594 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
599 static int reserve_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
604 assert(d
< _UNIT_DEPENDENCY_MAX
);
607 * If u does not have this dependency set allocated, there is no need
608 * to reserve anything. In that case other's set will be transfered
609 * as a whole to u by complete_move().
611 if (!u
->dependencies
[d
])
614 /* merge_dependencies() will skip a u-on-u dependency */
615 n_reserve
= set_size(other
->dependencies
[d
]) - !!set_get(other
->dependencies
[d
], u
);
617 return set_reserve(u
->dependencies
[d
], n_reserve
);
620 static void merge_dependencies(Unit
*u
, Unit
*other
, const char *other_id
, UnitDependency d
) {
627 assert(d
< _UNIT_DEPENDENCY_MAX
);
629 /* Fix backwards pointers */
630 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
633 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++) {
634 /* Do not add dependencies between u and itself */
636 if (set_remove(back
->dependencies
[k
], other
))
637 maybe_warn_about_dependency(u
->id
, other_id
, k
);
639 r
= set_remove_and_put(back
->dependencies
[k
], other
, u
);
641 set_remove(back
->dependencies
[k
], other
);
643 assert(r
>= 0 || r
== -ENOENT
);
648 /* Also do not move dependencies on u to itself */
649 back
= set_remove(other
->dependencies
[d
], u
);
651 maybe_warn_about_dependency(u
->id
, other_id
, d
);
653 /* The move cannot fail. The caller must have performed a reservation. */
654 assert_se(complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]) == 0);
656 set_free(other
->dependencies
[d
]);
657 other
->dependencies
[d
] = NULL
;
660 int unit_merge(Unit
*u
, Unit
*other
) {
662 const char *other_id
= NULL
;
667 assert(u
->manager
== other
->manager
);
668 assert(u
->type
!= _UNIT_TYPE_INVALID
);
670 other
= unit_follow_merge(other
);
675 if (u
->type
!= other
->type
)
678 if (!u
->instance
!= !other
->instance
)
681 if (other
->load_state
!= UNIT_STUB
&&
682 other
->load_state
!= UNIT_NOT_FOUND
)
691 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
695 other_id
= strdupa(other
->id
);
697 /* Make reservations to ensure merge_dependencies() won't fail */
698 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
699 r
= reserve_dependencies(u
, other
, d
);
701 * We don't rollback reservations if we fail. We don't have
702 * a way to undo reservations. A reservation is not a leak.
709 r
= merge_names(u
, other
);
713 /* Redirect all references */
715 unit_ref_set(other
->refs
, u
);
717 /* Merge dependencies */
718 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
719 merge_dependencies(u
, other
, other_id
, d
);
721 other
->load_state
= UNIT_MERGED
;
722 other
->merged_into
= u
;
724 /* If there is still some data attached to the other node, we
725 * don't need it anymore, and can free it. */
726 if (other
->load_state
!= UNIT_STUB
)
727 if (UNIT_VTABLE(other
)->done
)
728 UNIT_VTABLE(other
)->done(other
);
730 unit_add_to_dbus_queue(u
);
731 unit_add_to_cleanup_queue(other
);
736 int unit_merge_by_name(Unit
*u
, const char *name
) {
739 _cleanup_free_
char *s
= NULL
;
744 if (unit_name_is_template(name
)) {
748 s
= unit_name_replace_instance(name
, u
->instance
);
755 other
= manager_get_unit(u
->manager
, name
);
757 r
= unit_add_name(u
, name
);
759 r
= unit_merge(u
, other
);
764 Unit
* unit_follow_merge(Unit
*u
) {
767 while (u
->load_state
== UNIT_MERGED
)
768 assert_se(u
= u
->merged_into
);
773 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
779 if (c
->working_directory
) {
780 r
= unit_require_mounts_for(u
, c
->working_directory
);
785 if (c
->root_directory
) {
786 r
= unit_require_mounts_for(u
, c
->root_directory
);
791 if (u
->manager
->running_as
!= SYSTEMD_SYSTEM
)
794 if (c
->private_tmp
) {
795 r
= unit_require_mounts_for(u
, "/tmp");
799 r
= unit_require_mounts_for(u
, "/var/tmp");
804 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
805 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
806 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
807 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
808 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
809 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
810 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
811 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
812 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
813 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
814 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
815 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
818 /* If syslog or kernel logging is requested, make sure our own
819 * logging daemon is run first. */
821 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
828 const char *unit_description(Unit
*u
) {
832 return u
->description
;
837 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
843 timestamp1
[FORMAT_TIMESTAMP_MAX
],
844 timestamp2
[FORMAT_TIMESTAMP_MAX
],
845 timestamp3
[FORMAT_TIMESTAMP_MAX
],
846 timestamp4
[FORMAT_TIMESTAMP_MAX
],
847 timespan
[FORMAT_TIMESPAN_MAX
];
849 _cleanup_set_free_ Set
*following_set
= NULL
;
853 assert(u
->type
>= 0);
855 prefix
= strempty(prefix
);
856 prefix2
= strappenda(prefix
, "\t");
860 "%s\tDescription: %s\n"
862 "%s\tUnit Load State: %s\n"
863 "%s\tUnit Active State: %s\n"
864 "%s\tInactive Exit Timestamp: %s\n"
865 "%s\tActive Enter Timestamp: %s\n"
866 "%s\tActive Exit Timestamp: %s\n"
867 "%s\tInactive Enter Timestamp: %s\n"
868 "%s\tGC Check Good: %s\n"
869 "%s\tNeed Daemon Reload: %s\n"
870 "%s\tTransient: %s\n"
873 "%s\tCGroup realized: %s\n"
874 "%s\tCGroup mask: 0x%x\n"
875 "%s\tCGroup members mask: 0x%x\n",
877 prefix
, unit_description(u
),
878 prefix
, strna(u
->instance
),
879 prefix
, unit_load_state_to_string(u
->load_state
),
880 prefix
, unit_active_state_to_string(unit_active_state(u
)),
881 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
882 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
883 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
884 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
885 prefix
, yes_no(unit_check_gc(u
)),
886 prefix
, yes_no(unit_need_daemon_reload(u
)),
887 prefix
, yes_no(u
->transient
),
888 prefix
, strna(unit_slice_name(u
)),
889 prefix
, strna(u
->cgroup_path
),
890 prefix
, yes_no(u
->cgroup_realized
),
891 prefix
, u
->cgroup_realized_mask
,
892 prefix
, u
->cgroup_members_mask
);
894 SET_FOREACH(t
, u
->names
, i
)
895 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
897 STRV_FOREACH(j
, u
->documentation
)
898 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
900 following
= unit_following(u
);
902 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
904 r
= unit_following_set(u
, &following_set
);
908 SET_FOREACH(other
, following_set
, i
)
909 fprintf(f
, "%s\tFollowing Set Member: %s\n", prefix
, other
->id
);
912 if (u
->fragment_path
)
913 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
916 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
918 STRV_FOREACH(j
, u
->dropin_paths
)
919 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
921 if (u
->job_timeout
> 0)
922 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
924 condition_dump_list(u
->conditions
, f
, prefix
);
926 if (dual_timestamp_is_set(&u
->condition_timestamp
))
928 "%s\tCondition Timestamp: %s\n"
929 "%s\tCondition Result: %s\n",
930 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
931 prefix
, yes_no(u
->condition_result
));
933 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
936 SET_FOREACH(other
, u
->dependencies
[d
], i
)
937 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
940 if (!strv_isempty(u
->requires_mounts_for
)) {
942 "%s\tRequiresMountsFor:", prefix
);
944 STRV_FOREACH(j
, u
->requires_mounts_for
)
945 fprintf(f
, " %s", *j
);
950 if (u
->load_state
== UNIT_LOADED
) {
953 "%s\tStopWhenUnneeded: %s\n"
954 "%s\tRefuseManualStart: %s\n"
955 "%s\tRefuseManualStop: %s\n"
956 "%s\tDefaultDependencies: %s\n"
957 "%s\tOnFailureJobMode: %s\n"
958 "%s\tIgnoreOnIsolate: %s\n"
959 "%s\tIgnoreOnSnapshot: %s\n",
960 prefix
, yes_no(u
->stop_when_unneeded
),
961 prefix
, yes_no(u
->refuse_manual_start
),
962 prefix
, yes_no(u
->refuse_manual_stop
),
963 prefix
, yes_no(u
->default_dependencies
),
964 prefix
, job_mode_to_string(u
->on_failure_job_mode
),
965 prefix
, yes_no(u
->ignore_on_isolate
),
966 prefix
, yes_no(u
->ignore_on_snapshot
));
968 if (UNIT_VTABLE(u
)->dump
)
969 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
971 } else if (u
->load_state
== UNIT_MERGED
)
973 "%s\tMerged into: %s\n",
974 prefix
, u
->merged_into
->id
);
975 else if (u
->load_state
== UNIT_ERROR
)
976 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
980 job_dump(u
->job
, f
, prefix2
);
983 job_dump(u
->nop_job
, f
, prefix2
);
987 /* Common implementation for multiple backends */
988 int unit_load_fragment_and_dropin(Unit
*u
) {
993 /* Load a .{service,socket,...} file */
994 r
= unit_load_fragment(u
);
998 if (u
->load_state
== UNIT_STUB
)
1001 /* Load drop-in directory data */
1002 r
= unit_load_dropin(unit_follow_merge(u
));
1009 /* Common implementation for multiple backends */
1010 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
1015 /* Same as unit_load_fragment_and_dropin(), but whether
1016 * something can be loaded or not doesn't matter. */
1018 /* Load a .service file */
1019 r
= unit_load_fragment(u
);
1023 if (u
->load_state
== UNIT_STUB
)
1024 u
->load_state
= UNIT_LOADED
;
1026 /* Load drop-in directory data */
1027 r
= unit_load_dropin(unit_follow_merge(u
));
1034 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
1038 if (target
->type
!= UNIT_TARGET
)
1041 /* Only add the dependency if both units are loaded, so that
1042 * that loop check below is reliable */
1043 if (u
->load_state
!= UNIT_LOADED
||
1044 target
->load_state
!= UNIT_LOADED
)
1047 /* If either side wants no automatic dependencies, then let's
1049 if (!u
->default_dependencies
||
1050 !target
->default_dependencies
)
1053 /* Don't create loops */
1054 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
1057 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
1060 static int unit_add_target_dependencies(Unit
*u
) {
1062 static const UnitDependency deps
[] = {
1064 UNIT_REQUIRED_BY_OVERRIDABLE
,
1076 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
1077 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
) {
1078 r
= unit_add_default_target_dependency(u
, target
);
1086 static int unit_add_slice_dependencies(Unit
*u
) {
1089 if (!unit_get_cgroup_context(u
))
1092 if (UNIT_ISSET(u
->slice
))
1093 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_WANTS
, UNIT_DEREF(u
->slice
), true);
1095 if (streq(u
->id
, SPECIAL_ROOT_SLICE
))
1098 return unit_add_two_dependencies_by_name(u
, UNIT_AFTER
, UNIT_WANTS
, SPECIAL_ROOT_SLICE
, NULL
, true);
1101 static int unit_add_mount_dependencies(Unit
*u
) {
1107 STRV_FOREACH(i
, u
->requires_mounts_for
) {
1108 char prefix
[strlen(*i
) + 1];
1110 PATH_FOREACH_PREFIX_MORE(prefix
, *i
) {
1113 r
= manager_get_unit_by_path(u
->manager
, prefix
, ".mount", &m
);
1121 if (m
->load_state
!= UNIT_LOADED
)
1124 r
= unit_add_dependency(u
, UNIT_AFTER
, m
, true);
1128 if (m
->fragment_path
) {
1129 r
= unit_add_dependency(u
, UNIT_REQUIRES
, m
, true);
1139 static int unit_add_startup_units(Unit
*u
) {
1143 c
= unit_get_cgroup_context(u
);
1147 if (c
->startup_cpu_shares
== (unsigned long) -1 &&
1148 c
->startup_blockio_weight
== (unsigned long) -1)
1151 r
= set_put(u
->manager
->startup_units
, u
);
1158 int unit_load(Unit
*u
) {
1163 if (u
->in_load_queue
) {
1164 LIST_REMOVE(load_queue
, u
->manager
->load_queue
, u
);
1165 u
->in_load_queue
= false;
1168 if (u
->type
== _UNIT_TYPE_INVALID
)
1171 if (u
->load_state
!= UNIT_STUB
)
1174 if (UNIT_VTABLE(u
)->load
) {
1175 r
= UNIT_VTABLE(u
)->load(u
);
1180 if (u
->load_state
== UNIT_STUB
) {
1185 if (u
->load_state
== UNIT_LOADED
) {
1187 r
= unit_add_target_dependencies(u
);
1191 r
= unit_add_slice_dependencies(u
);
1195 r
= unit_add_mount_dependencies(u
);
1199 r
= unit_add_startup_units(u
);
1203 if (u
->on_failure_job_mode
== JOB_ISOLATE
&& set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
1204 log_error_unit(u
->id
, "More than one OnFailure= dependencies specified for %s but OnFailureJobMode=isolate set. Refusing.", u
->id
);
1209 unit_update_cgroup_members_masks(u
);
1212 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
1214 unit_add_to_dbus_queue(unit_follow_merge(u
));
1215 unit_add_to_gc_queue(u
);
1220 u
->load_state
= u
->load_state
== UNIT_STUB
? UNIT_NOT_FOUND
: UNIT_ERROR
;
1222 unit_add_to_dbus_queue(u
);
1223 unit_add_to_gc_queue(u
);
1225 log_debug_unit(u
->id
, "Failed to load configuration for %s: %s",
1226 u
->id
, strerror(-r
));
1231 static bool unit_condition_test(Unit
*u
) {
1234 dual_timestamp_get(&u
->condition_timestamp
);
1235 u
->condition_result
= condition_test_list(u
->id
, u
->conditions
);
1237 return u
->condition_result
;
1240 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
1241 const UnitStatusMessageFormats
*format_table
;
1245 assert(t
< _JOB_TYPE_MAX
);
1247 if (t
!= JOB_START
&& t
!= JOB_STOP
)
1250 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
1254 return format_table
->starting_stopping
[t
== JOB_STOP
];
1257 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
1262 assert(t
< _JOB_TYPE_MAX
);
1264 format
= unit_get_status_message_format(u
, t
);
1268 /* Return generic strings */
1270 return "Starting %s.";
1271 else if (t
== JOB_STOP
)
1272 return "Stopping %s.";
1273 else if (t
== JOB_RELOAD
)
1274 return "Reloading %s.";
1279 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
1284 /* We only print status messages for selected units on
1285 * selected operations. */
1287 format
= unit_get_status_message_format(u
, t
);
1291 DISABLE_WARNING_FORMAT_NONLITERAL
;
1292 unit_status_printf(u
, "", format
);
1296 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1303 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1306 if (log_on_console())
1309 /* We log status messages for all units and all operations. */
1311 format
= unit_get_status_message_format_try_harder(u
, t
);
1315 DISABLE_WARNING_FORMAT_NONLITERAL
;
1316 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1320 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1321 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1322 SD_MESSAGE_UNIT_RELOADING
;
1324 log_struct_unit(LOG_INFO
,
1332 * -EBADR: This unit type does not support starting.
1333 * -EALREADY: Unit is already started.
1334 * -EAGAIN: An operation is already in progress. Retry later.
1335 * -ECANCELED: Too many requests for now.
1337 int unit_start(Unit
*u
) {
1338 UnitActiveState state
;
1343 if (u
->load_state
!= UNIT_LOADED
)
1346 /* If this is already started, then this will succeed. Note
1347 * that this will even succeed if this unit is not startable
1348 * by the user. This is relied on to detect when we need to
1349 * wait for units and when waiting is finished. */
1350 state
= unit_active_state(u
);
1351 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1354 /* If the conditions failed, don't do anything at all. If we
1355 * already are activating this call might still be useful to
1356 * speed up activation in case there is some hold-off time,
1357 * but we don't want to recheck the condition in that case. */
1358 if (state
!= UNIT_ACTIVATING
&&
1359 !unit_condition_test(u
)) {
1360 log_debug_unit(u
->id
, "Starting of %s requested but condition failed. Ignoring.", u
->id
);
1364 /* Forward to the main object, if we aren't it. */
1365 following
= unit_following(u
);
1367 log_debug_unit(u
->id
, "Redirecting start request from %s to %s.",
1368 u
->id
, following
->id
);
1369 return unit_start(following
);
1372 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1373 unit_status_print_starting_stopping(u
, JOB_START
);
1375 /* If it is stopped, but we cannot start it, then fail */
1376 if (!UNIT_VTABLE(u
)->start
)
1379 /* We don't suppress calls to ->start() here when we are
1380 * already starting, to allow this request to be used as a
1381 * "hurry up" call, for example when the unit is in some "auto
1382 * restart" state where it waits for a holdoff timer to elapse
1383 * before it will start again. */
1385 unit_add_to_dbus_queue(u
);
1387 return UNIT_VTABLE(u
)->start(u
);
1390 bool unit_can_start(Unit
*u
) {
1393 return !!UNIT_VTABLE(u
)->start
;
1396 bool unit_can_isolate(Unit
*u
) {
1399 return unit_can_start(u
) &&
1404 * -EBADR: This unit type does not support stopping.
1405 * -EALREADY: Unit is already stopped.
1406 * -EAGAIN: An operation is already in progress. Retry later.
1408 int unit_stop(Unit
*u
) {
1409 UnitActiveState state
;
1414 state
= unit_active_state(u
);
1415 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1418 if ((following
= unit_following(u
))) {
1419 log_debug_unit(u
->id
, "Redirecting stop request from %s to %s.",
1420 u
->id
, following
->id
);
1421 return unit_stop(following
);
1424 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1425 unit_status_print_starting_stopping(u
, JOB_STOP
);
1427 if (!UNIT_VTABLE(u
)->stop
)
1430 unit_add_to_dbus_queue(u
);
1432 return UNIT_VTABLE(u
)->stop(u
);
1436 * -EBADR: This unit type does not support reloading.
1437 * -ENOEXEC: Unit is not started.
1438 * -EAGAIN: An operation is already in progress. Retry later.
1440 int unit_reload(Unit
*u
) {
1441 UnitActiveState state
;
1446 if (u
->load_state
!= UNIT_LOADED
)
1449 if (!unit_can_reload(u
))
1452 state
= unit_active_state(u
);
1453 if (state
== UNIT_RELOADING
)
1456 if (state
!= UNIT_ACTIVE
) {
1457 log_warning_unit(u
->id
, "Unit %s cannot be reloaded because it is inactive.",
1462 following
= unit_following(u
);
1464 log_debug_unit(u
->id
, "Redirecting reload request from %s to %s.",
1465 u
->id
, following
->id
);
1466 return unit_reload(following
);
1469 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1471 unit_add_to_dbus_queue(u
);
1472 return UNIT_VTABLE(u
)->reload(u
);
1475 bool unit_can_reload(Unit
*u
) {
1478 if (!UNIT_VTABLE(u
)->reload
)
1481 if (!UNIT_VTABLE(u
)->can_reload
)
1484 return UNIT_VTABLE(u
)->can_reload(u
);
1487 static void unit_check_unneeded(Unit
*u
) {
1493 /* If this service shall be shut down when unneeded then do
1496 if (!u
->stop_when_unneeded
)
1499 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1502 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY
], i
)
1503 if (unit_active_or_pending(other
))
1506 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY_OVERRIDABLE
], i
)
1507 if (unit_active_or_pending(other
))
1510 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTED_BY
], i
)
1511 if (unit_active_or_pending(other
))
1514 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1515 if (unit_active_or_pending(other
))
1518 log_info_unit(u
->id
, "Unit %s is not needed anymore. Stopping.", u
->id
);
1520 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1521 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1524 static void unit_check_binds_to(Unit
*u
) {
1534 if (unit_active_state(u
) != UNIT_ACTIVE
)
1537 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
) {
1541 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
1550 log_info_unit(u
->id
, "Unit %s is bound to inactive service. Stopping, too.", u
->id
);
1552 /* A unit we need to run is gone. Sniff. Let's stop this. */
1553 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1556 static void retroactively_start_dependencies(Unit
*u
) {
1561 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1563 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1564 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1565 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1566 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1568 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1569 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1570 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1571 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1573 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1574 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1575 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1576 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1578 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1579 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1580 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1581 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1583 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1584 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1585 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1587 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1588 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1589 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1592 static void retroactively_stop_dependencies(Unit
*u
) {
1597 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1599 /* Pull down units which are bound to us recursively if enabled */
1600 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1601 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1602 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1605 static void check_unneeded_dependencies(Unit
*u
) {
1610 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1612 /* Garbage collect services that might not be needed anymore, if enabled */
1613 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1614 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1615 unit_check_unneeded(other
);
1616 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1617 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1618 unit_check_unneeded(other
);
1619 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1620 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1621 unit_check_unneeded(other
);
1622 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1623 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1624 unit_check_unneeded(other
);
1625 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1626 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1627 unit_check_unneeded(other
);
1628 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1629 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1630 unit_check_unneeded(other
);
1633 void unit_start_on_failure(Unit
*u
) {
1639 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1642 log_info_unit(u
->id
, "Triggering OnFailure= dependencies of %s.", u
->id
);
1644 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1647 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_job_mode
, true, NULL
, NULL
);
1649 log_error_unit(u
->id
, "Failed to enqueue OnFailure= job: %s", strerror(-r
));
1653 void unit_trigger_notify(Unit
*u
) {
1659 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1660 if (UNIT_VTABLE(other
)->trigger_notify
)
1661 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1664 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1669 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1670 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1672 /* Note that this is called for all low-level state changes,
1673 * even if they might map to the same high-level
1674 * UnitActiveState! That means that ns == os is an expected
1675 * behavior here. For example: if a mount point is remounted
1676 * this function will be called too! */
1680 /* Update timestamps for state changes */
1681 if (m
->n_reloading
<= 0) {
1684 dual_timestamp_get(&ts
);
1686 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1687 u
->inactive_exit_timestamp
= ts
;
1688 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1689 u
->inactive_enter_timestamp
= ts
;
1691 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1692 u
->active_enter_timestamp
= ts
;
1693 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1694 u
->active_exit_timestamp
= ts
;
1697 /* Keep track of failed units */
1698 if (ns
== UNIT_FAILED
)
1699 set_put(u
->manager
->failed_units
, u
);
1701 set_remove(u
->manager
->failed_units
, u
);
1703 /* Make sure the cgroup is always removed when we become inactive */
1704 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1705 unit_destroy_cgroup(u
);
1707 /* Note that this doesn't apply to RemainAfterExit services exiting
1708 * successfully, since there's no change of state in that case. Which is
1709 * why it is handled in service_set_state() */
1710 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1713 ec
= unit_get_exec_context(u
);
1714 if (ec
&& exec_context_may_touch_console(ec
)) {
1715 if (UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1718 if (m
->n_on_console
== 0)
1719 /* unset no_console_output flag, since the console is free */
1720 m
->no_console_output
= false;
1729 if (u
->job
->state
== JOB_WAITING
)
1731 /* So we reached a different state for this
1732 * job. Let's see if we can run it now if it
1733 * failed previously due to EAGAIN. */
1734 job_add_to_run_queue(u
->job
);
1736 /* Let's check whether this state change constitutes a
1737 * finished job, or maybe contradicts a running job and
1738 * hence needs to invalidate jobs. */
1740 switch (u
->job
->type
) {
1743 case JOB_VERIFY_ACTIVE
:
1745 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1746 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1747 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1750 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1751 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1757 case JOB_RELOAD_OR_START
:
1759 if (u
->job
->state
== JOB_RUNNING
) {
1760 if (ns
== UNIT_ACTIVE
)
1761 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1762 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1765 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1766 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1774 case JOB_TRY_RESTART
:
1776 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1777 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1778 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1780 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1786 assert_not_reached("Job type unknown");
1792 if (m
->n_reloading
<= 0) {
1794 /* If this state change happened without being
1795 * requested by a job, then let's retroactively start
1796 * or stop dependencies. We skip that step when
1797 * deserializing, since we don't want to create any
1798 * additional jobs just because something is already
1802 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1803 retroactively_start_dependencies(u
);
1804 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1805 retroactively_stop_dependencies(u
);
1808 /* stop unneeded units regardless if going down was expected or not */
1809 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1810 check_unneeded_dependencies(u
);
1812 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1813 log_notice_unit(u
->id
, "Unit %s entered failed state.", u
->id
);
1814 unit_start_on_failure(u
);
1818 /* Some names are special */
1819 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1821 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1822 /* The bus might have just become available,
1823 * hence try to connect to it, if we aren't
1827 if (u
->type
== UNIT_SERVICE
&&
1828 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1829 m
->n_reloading
<= 0) {
1830 /* Write audit record if we have just finished starting up */
1831 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1835 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1836 manager_send_unit_plymouth(m
, u
);
1840 /* We don't care about D-Bus here, since we'll get an
1841 * asynchronous notification for it anyway. */
1843 if (u
->type
== UNIT_SERVICE
&&
1844 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1845 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1846 m
->n_reloading
<= 0) {
1848 /* Hmm, if there was no start record written
1849 * write it now, so that we always have a nice
1852 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1854 if (ns
== UNIT_INACTIVE
)
1855 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1857 /* Write audit record if we have just finished shutting down */
1858 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1860 u
->in_audit
= false;
1864 manager_recheck_journal(m
);
1865 unit_trigger_notify(u
);
1867 if (u
->manager
->n_reloading
<= 0) {
1868 /* Maybe we finished startup and are now ready for
1869 * being stopped because unneeded? */
1870 unit_check_unneeded(u
);
1872 /* Maybe we finished startup, but something we needed
1873 * has vanished? Let's die then. (This happens when
1874 * something BindsTo= to a Type=oneshot unit, as these
1875 * units go directly from starting to inactive,
1876 * without ever entering started.) */
1877 unit_check_binds_to(u
);
1880 unit_add_to_dbus_queue(u
);
1881 unit_add_to_gc_queue(u
);
1884 int unit_watch_pid(Unit
*u
, pid_t pid
) {
1890 /* Watch a specific PID. We only support one or two units
1891 * watching each PID for now, not more. */
1893 r
= set_ensure_allocated(&u
->pids
, NULL
);
1897 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids1
, NULL
);
1901 r
= hashmap_put(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
1903 r
= hashmap_ensure_allocated(&u
->manager
->watch_pids2
, NULL
);
1907 r
= hashmap_put(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
1910 q
= set_put(u
->pids
, LONG_TO_PTR(pid
));
1917 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
1921 hashmap_remove_value(u
->manager
->watch_pids1
, LONG_TO_PTR(pid
), u
);
1922 hashmap_remove_value(u
->manager
->watch_pids2
, LONG_TO_PTR(pid
), u
);
1923 set_remove(u
->pids
, LONG_TO_PTR(pid
));
1926 void unit_unwatch_all_pids(Unit
*u
) {
1929 while (!set_isempty(u
->pids
))
1930 unit_unwatch_pid(u
, PTR_TO_LONG(set_first(u
->pids
)));
1936 static int unit_watch_pids_in_path(Unit
*u
, const char *path
) {
1937 _cleanup_closedir_
DIR *d
= NULL
;
1938 _cleanup_fclose_
FILE *f
= NULL
;
1944 /* Adds all PIDs from a specific cgroup path to the set of PIDs we watch. */
1946 r
= cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER
, path
, &f
);
1950 while ((r
= cg_read_pid(f
, &pid
)) > 0) {
1951 r
= unit_watch_pid(u
, pid
);
1952 if (r
< 0 && ret
>= 0)
1955 if (r
< 0 && ret
>= 0)
1958 } else if (ret
>= 0)
1961 r
= cg_enumerate_subgroups(SYSTEMD_CGROUP_CONTROLLER
, path
, &d
);
1965 while ((r
= cg_read_subgroup(d
, &fn
)) > 0) {
1966 _cleanup_free_
char *p
= NULL
;
1968 p
= strjoin(path
, "/", fn
, NULL
);
1974 r
= unit_watch_pids_in_path(u
, p
);
1975 if (r
< 0 && ret
>= 0)
1978 if (r
< 0 && ret
>= 0)
1981 } else if (ret
>= 0)
1987 int unit_watch_all_pids(Unit
*u
) {
1990 /* Adds all PIDs from our cgroup to the set of PIDs we watch */
1992 if (!u
->cgroup_path
)
1995 return unit_watch_pids_in_path(u
, u
->cgroup_path
);
1998 void unit_tidy_watch_pids(Unit
*u
, pid_t except1
, pid_t except2
) {
2004 /* Cleans dead PIDs from our list */
2006 SET_FOREACH(e
, u
->pids
, i
) {
2007 pid_t pid
= PTR_TO_LONG(e
);
2009 if (pid
== except1
|| pid
== except2
)
2012 if (!pid_is_unwaited(pid
))
2013 unit_unwatch_pid(u
, pid
);
2017 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
2019 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
2023 case JOB_VERIFY_ACTIVE
:
2030 case JOB_TRY_RESTART
:
2031 return unit_can_start(u
);
2034 return unit_can_reload(u
);
2036 case JOB_RELOAD_OR_START
:
2037 return unit_can_reload(u
) && unit_can_start(u
);
2040 assert_not_reached("Invalid job type");
2044 static int maybe_warn_about_dependency(const char *id
, const char *other
, UnitDependency dependency
) {
2047 switch (dependency
) {
2049 case UNIT_REQUIRES_OVERRIDABLE
:
2051 case UNIT_REQUISITE
:
2052 case UNIT_REQUISITE_OVERRIDABLE
:
2055 case UNIT_REQUIRED_BY
:
2056 case UNIT_REQUIRED_BY_OVERRIDABLE
:
2057 case UNIT_WANTED_BY
:
2059 case UNIT_CONSISTS_OF
:
2060 case UNIT_REFERENCES
:
2061 case UNIT_REFERENCED_BY
:
2062 case UNIT_PROPAGATES_RELOAD_TO
:
2063 case UNIT_RELOAD_PROPAGATED_FROM
:
2064 case UNIT_JOINS_NAMESPACE_OF
:
2067 case UNIT_CONFLICTS
:
2068 case UNIT_CONFLICTED_BY
:
2071 case UNIT_ON_FAILURE
:
2073 case UNIT_TRIGGERED_BY
:
2074 if (streq_ptr(id
, other
))
2075 log_warning_unit(id
, "Dependency %s=%s dropped from unit %s",
2076 unit_dependency_to_string(dependency
), id
, other
);
2078 log_warning_unit(id
, "Dependency %s=%s dropped from unit %s merged into %s",
2079 unit_dependency_to_string(dependency
), id
,
2083 case _UNIT_DEPENDENCY_MAX
:
2084 case _UNIT_DEPENDENCY_INVALID
:
2088 assert_not_reached("Invalid dependency type");
2091 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
2093 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
2094 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
2095 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2096 [UNIT_WANTS
] = UNIT_WANTED_BY
,
2097 [UNIT_REQUISITE
] = UNIT_REQUIRED_BY
,
2098 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
2099 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
2100 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
2101 [UNIT_REQUIRED_BY
] = _UNIT_DEPENDENCY_INVALID
,
2102 [UNIT_REQUIRED_BY_OVERRIDABLE
] = _UNIT_DEPENDENCY_INVALID
,
2103 [UNIT_WANTED_BY
] = _UNIT_DEPENDENCY_INVALID
,
2104 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
2105 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
2106 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
2107 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
2108 [UNIT_BEFORE
] = UNIT_AFTER
,
2109 [UNIT_AFTER
] = UNIT_BEFORE
,
2110 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
2111 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
2112 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
2113 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
2114 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
2115 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
2116 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
2117 [UNIT_JOINS_NAMESPACE_OF
] = UNIT_JOINS_NAMESPACE_OF
,
2119 int r
, q
= 0, v
= 0, w
= 0;
2120 Unit
*orig_u
= u
, *orig_other
= other
;
2123 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
2126 u
= unit_follow_merge(u
);
2127 other
= unit_follow_merge(other
);
2129 /* We won't allow dependencies on ourselves. We will not
2130 * consider them an error however. */
2132 maybe_warn_about_dependency(orig_u
->id
, orig_other
->id
, d
);
2136 r
= set_ensure_allocated(&u
->dependencies
[d
], NULL
);
2140 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
) {
2141 r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], NULL
);
2146 if (add_reference
) {
2147 r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], NULL
);
2151 r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], NULL
);
2156 q
= set_put(u
->dependencies
[d
], other
);
2160 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
&& inverse_table
[d
] != d
) {
2161 v
= set_put(other
->dependencies
[inverse_table
[d
]], u
);
2168 if (add_reference
) {
2169 w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
);
2175 r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
);
2180 unit_add_to_dbus_queue(u
);
2185 set_remove(u
->dependencies
[d
], other
);
2188 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
2191 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
2196 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
2201 r
= unit_add_dependency(u
, d
, other
, add_reference
);
2205 r
= unit_add_dependency(u
, e
, other
, add_reference
);
2212 static const char *resolve_template(Unit
*u
, const char *name
, const char*path
, char **p
) {
2216 assert(name
|| path
);
2220 name
= basename(path
);
2222 if (!unit_name_is_template(name
)) {
2228 s
= unit_name_replace_instance(name
, u
->instance
);
2230 _cleanup_free_
char *i
= NULL
;
2232 i
= unit_name_to_prefix(u
->id
);
2236 s
= unit_name_replace_instance(name
, i
);
2246 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2249 _cleanup_free_
char *s
= NULL
;
2252 assert(name
|| path
);
2254 name
= resolve_template(u
, name
, path
, &s
);
2258 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2262 return unit_add_dependency(u
, d
, other
, add_reference
);
2265 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2266 _cleanup_free_
char *s
= NULL
;
2271 assert(name
|| path
);
2273 name
= resolve_template(u
, name
, path
, &s
);
2277 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2281 return unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
2284 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
2287 _cleanup_free_
char *s
= NULL
;
2290 assert(name
|| path
);
2292 name
= resolve_template(u
, name
, path
, &s
);
2296 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2300 return unit_add_dependency(other
, d
, u
, add_reference
);
2303 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
2306 _cleanup_free_
char *s
= NULL
;
2309 assert(name
|| path
);
2311 name
= resolve_template(u
, name
, path
, &s
);
2315 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
2319 r
= unit_add_two_dependencies(other
, d
, e
, u
, add_reference
);
2326 int set_unit_path(const char *p
) {
2327 /* This is mostly for debug purposes */
2328 if (setenv("SYSTEMD_UNIT_PATH", p
, 0) < 0)
2334 char *unit_dbus_path(Unit
*u
) {
2340 return unit_dbus_path_from_name(u
->id
);
2343 char *unit_default_cgroup_path(Unit
*u
) {
2344 _cleanup_free_
char *escaped
= NULL
, *slice
= NULL
;
2349 if (unit_has_name(u
, SPECIAL_ROOT_SLICE
))
2350 return strdup(u
->manager
->cgroup_root
);
2352 if (UNIT_ISSET(u
->slice
) && !unit_has_name(UNIT_DEREF(u
->slice
), SPECIAL_ROOT_SLICE
)) {
2353 r
= cg_slice_to_path(UNIT_DEREF(u
->slice
)->id
, &slice
);
2358 escaped
= cg_escape(u
->id
);
2363 return strjoin(u
->manager
->cgroup_root
, "/", slice
, "/", escaped
, NULL
);
2365 return strjoin(u
->manager
->cgroup_root
, "/", escaped
, NULL
);
2368 int unit_add_default_slice(Unit
*u
, CGroupContext
*c
) {
2369 _cleanup_free_
char *b
= NULL
;
2370 const char *slice_name
;
2377 if (UNIT_ISSET(u
->slice
))
2381 _cleanup_free_
char *prefix
= NULL
, *escaped
= NULL
;
2383 /* Implicitly place all instantiated units in their
2384 * own per-template slice */
2386 prefix
= unit_name_to_prefix(u
->id
);
2390 /* The prefix is already escaped, but it might include
2391 * "-" which has a special meaning for slice units,
2392 * hence escape it here extra. */
2393 escaped
= strreplace(prefix
, "-", "\\x2d");
2397 if (u
->manager
->running_as
== SYSTEMD_SYSTEM
)
2398 b
= strjoin("system-", escaped
, ".slice", NULL
);
2400 b
= strappend(escaped
, ".slice");
2407 u
->manager
->running_as
== SYSTEMD_SYSTEM
2408 ? SPECIAL_SYSTEM_SLICE
2409 : SPECIAL_ROOT_SLICE
;
2411 r
= manager_load_unit(u
->manager
, slice_name
, NULL
, NULL
, &slice
);
2415 unit_ref_set(&u
->slice
, slice
);
2419 const char *unit_slice_name(Unit
*u
) {
2422 if (!UNIT_ISSET(u
->slice
))
2425 return UNIT_DEREF(u
->slice
)->id
;
2428 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2429 _cleanup_free_
char *t
= NULL
;
2436 t
= unit_name_change_suffix(u
->id
, type
);
2440 assert(!unit_has_name(u
, t
));
2442 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2443 assert(r
< 0 || *_found
!= u
);
2447 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2451 /* Watch a specific name on the bus. We only support one unit
2452 * watching each name for now. */
2454 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2457 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2461 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2464 bool unit_can_serialize(Unit
*u
) {
2467 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2470 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2477 if (unit_can_serialize(u
)) {
2480 r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
);
2484 rt
= unit_get_exec_runtime(u
);
2486 r
= exec_runtime_serialize(rt
, u
, f
, fds
);
2492 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2493 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2494 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2495 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2496 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2498 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2499 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2501 unit_serialize_item(u
, f
, "transient", yes_no(u
->transient
));
2504 unit_serialize_item(u
, f
, "cgroup", u
->cgroup_path
);
2506 if (serialize_jobs
) {
2508 fprintf(f
, "job\n");
2509 job_serialize(u
->job
, f
, fds
);
2513 fprintf(f
, "job\n");
2514 job_serialize(u
->nop_job
, f
, fds
);
2523 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2534 va_start(ap
, format
);
2535 vfprintf(f
, format
, ap
);
2541 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2547 fprintf(f
, "%s=%s\n", key
, value
);
2550 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2551 ExecRuntime
**rt
= NULL
;
2559 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
2561 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
2564 char line
[LINE_MAX
], *l
, *v
;
2567 if (!fgets(line
, sizeof(line
), f
)) {
2580 k
= strcspn(l
, "=");
2588 if (streq(l
, "job")) {
2590 /* new-style serialized job */
2591 Job
*j
= job_new_raw(u
);
2595 r
= job_deserialize(j
, f
, fds
);
2601 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2607 r
= job_install_deserialized(j
);
2609 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2614 if (j
->state
== JOB_RUNNING
)
2615 u
->manager
->n_running_jobs
++;
2618 JobType type
= job_type_from_string(v
);
2620 log_debug("Failed to parse job type value %s", v
);
2622 u
->deserialized_job
= type
;
2625 } else if (streq(l
, "inactive-exit-timestamp")) {
2626 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2628 } else if (streq(l
, "active-enter-timestamp")) {
2629 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2631 } else if (streq(l
, "active-exit-timestamp")) {
2632 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2634 } else if (streq(l
, "inactive-enter-timestamp")) {
2635 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2637 } else if (streq(l
, "condition-timestamp")) {
2638 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2640 } else if (streq(l
, "condition-result")) {
2643 b
= parse_boolean(v
);
2645 log_debug("Failed to parse condition result value %s", v
);
2647 u
->condition_result
= b
;
2651 } else if (streq(l
, "transient")) {
2654 b
= parse_boolean(v
);
2656 log_debug("Failed to parse transient bool %s", v
);
2661 } else if (streq(l
, "cgroup")) {
2668 if (u
->cgroup_path
) {
2671 p
= hashmap_remove(u
->manager
->cgroup_unit
, u
->cgroup_path
);
2672 log_info("Removing cgroup_path %s from hashmap (%p)",
2674 free(u
->cgroup_path
);
2678 assert(hashmap_put(u
->manager
->cgroup_unit
, s
, u
) == 1);
2683 if (unit_can_serialize(u
)) {
2685 r
= exec_runtime_deserialize_item(rt
, u
, l
, v
, fds
);
2692 r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
);
2699 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2701 _cleanup_free_
char *e
= NULL
;
2709 /* Adds in links to the device node that this unit is based on */
2711 if (!is_device_path(what
))
2714 e
= unit_name_from_path(what
, ".device");
2718 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2723 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_BINDS_TO
, device
, true);
2728 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2736 int unit_coldplug(Unit
*u
) {
2741 if (UNIT_VTABLE(u
)->coldplug
)
2742 if ((r
= UNIT_VTABLE(u
)->coldplug(u
)) < 0)
2746 r
= job_coldplug(u
->job
);
2749 } else if (u
->deserialized_job
>= 0) {
2751 r
= manager_add_job(u
->manager
, u
->deserialized_job
, u
, JOB_IGNORE_REQUIREMENTS
, false, NULL
, NULL
);
2755 u
->deserialized_job
= _JOB_TYPE_INVALID
;
2761 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2762 DISABLE_WARNING_FORMAT_NONLITERAL
;
2763 manager_status_printf(u
->manager
, false, status
, unit_status_msg_format
, unit_description(u
));
2767 bool unit_need_daemon_reload(Unit
*u
) {
2768 _cleanup_strv_free_
char **t
= NULL
;
2771 unsigned loaded_cnt
, current_cnt
;
2775 if (u
->fragment_path
) {
2777 if (stat(u
->fragment_path
, &st
) < 0)
2778 /* What, cannot access this anymore? */
2781 if (u
->fragment_mtime
> 0 &&
2782 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2786 if (u
->source_path
) {
2788 if (stat(u
->source_path
, &st
) < 0)
2791 if (u
->source_mtime
> 0 &&
2792 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2796 t
= unit_find_dropin_paths(u
);
2797 loaded_cnt
= strv_length(t
);
2798 current_cnt
= strv_length(u
->dropin_paths
);
2800 if (loaded_cnt
== current_cnt
) {
2801 if (loaded_cnt
== 0)
2804 if (strv_overlap(u
->dropin_paths
, t
)) {
2805 STRV_FOREACH(path
, u
->dropin_paths
) {
2807 if (stat(*path
, &st
) < 0)
2810 if (u
->dropin_mtime
> 0 &&
2811 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2822 void unit_reset_failed(Unit
*u
) {
2825 if (UNIT_VTABLE(u
)->reset_failed
)
2826 UNIT_VTABLE(u
)->reset_failed(u
);
2829 Unit
*unit_following(Unit
*u
) {
2832 if (UNIT_VTABLE(u
)->following
)
2833 return UNIT_VTABLE(u
)->following(u
);
2838 bool unit_stop_pending(Unit
*u
) {
2841 /* This call does check the current state of the unit. It's
2842 * hence useful to be called from state change calls of the
2843 * unit itself, where the state isn't updated yet. This is
2844 * different from unit_inactive_or_pending() which checks both
2845 * the current state and for a queued job. */
2847 return u
->job
&& u
->job
->type
== JOB_STOP
;
2850 bool unit_inactive_or_pending(Unit
*u
) {
2853 /* Returns true if the unit is inactive or going down */
2855 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)))
2858 if (unit_stop_pending(u
))
2864 bool unit_active_or_pending(Unit
*u
) {
2867 /* Returns true if the unit is active or going up */
2869 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
2873 (u
->job
->type
== JOB_START
||
2874 u
->job
->type
== JOB_RELOAD_OR_START
||
2875 u
->job
->type
== JOB_RESTART
))
2881 int unit_kill(Unit
*u
, KillWho w
, int signo
, sd_bus_error
*error
) {
2883 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
2885 assert(signo
< _NSIG
);
2887 if (!UNIT_VTABLE(u
)->kill
)
2890 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
2893 static Set
*unit_pid_set(pid_t main_pid
, pid_t control_pid
) {
2897 pid_set
= set_new(NULL
);
2901 /* Exclude the main/control pids from being killed via the cgroup */
2903 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
2908 if (control_pid
> 0) {
2909 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
2921 int unit_kill_common(
2927 sd_bus_error
*error
) {
2931 if (who
== KILL_MAIN
&& main_pid
<= 0) {
2933 sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
2935 sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
2939 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
2940 if (control_pid
< 0)
2941 sd_bus_error_setf(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
2943 sd_bus_error_set_const(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
2947 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
2948 if (control_pid
> 0)
2949 if (kill(control_pid
, signo
) < 0)
2952 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
2954 if (kill(main_pid
, signo
) < 0)
2957 if (who
== KILL_ALL
&& u
->cgroup_path
) {
2958 _cleanup_set_free_ Set
*pid_set
= NULL
;
2961 /* Exclude the main/control pids from being killed via the cgroup */
2962 pid_set
= unit_pid_set(main_pid
, control_pid
);
2966 q
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, signo
, false, true, false, pid_set
);
2967 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
2974 int unit_following_set(Unit
*u
, Set
**s
) {
2978 if (UNIT_VTABLE(u
)->following_set
)
2979 return UNIT_VTABLE(u
)->following_set(u
, s
);
2985 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
2988 if (u
->unit_file_state
< 0 && u
->fragment_path
)
2989 u
->unit_file_state
= unit_file_get_state(
2990 u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
2991 NULL
, basename(u
->fragment_path
));
2993 return u
->unit_file_state
;
2996 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
3001 unit_ref_unset(ref
);
3004 LIST_PREPEND(refs
, u
->refs
, ref
);
3008 void unit_ref_unset(UnitRef
*ref
) {
3014 LIST_REMOVE(refs
, ref
->unit
->refs
, ref
);
3018 int unit_patch_contexts(Unit
*u
) {
3026 /* Patch in the manager defaults into the exec and cgroup
3027 * contexts, _after_ the rest of the settings have been
3030 ec
= unit_get_exec_context(u
);
3032 /* This only copies in the ones that need memory */
3033 for (i
= 0; i
< _RLIMIT_MAX
; i
++)
3034 if (u
->manager
->rlimit
[i
] && !ec
->rlimit
[i
]) {
3035 ec
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
3040 if (u
->manager
->running_as
== SYSTEMD_USER
&&
3041 !ec
->working_directory
) {
3043 r
= get_home_dir(&ec
->working_directory
);
3048 if (u
->manager
->running_as
== SYSTEMD_USER
&&
3049 (ec
->syscall_whitelist
||
3050 !set_isempty(ec
->syscall_filter
) ||
3051 !set_isempty(ec
->syscall_archs
) ||
3052 ec
->address_families_whitelist
||
3053 !set_isempty(ec
->address_families
)))
3054 ec
->no_new_privileges
= true;
3056 if (ec
->private_devices
)
3057 ec
->capability_bounding_set_drop
|= (uint64_t) 1ULL << (uint64_t) CAP_MKNOD
;
3060 cc
= unit_get_cgroup_context(u
);
3064 ec
->private_devices
&&
3065 cc
->device_policy
== CGROUP_AUTO
)
3066 cc
->device_policy
= CGROUP_CLOSED
;
3072 ExecContext
*unit_get_exec_context(Unit
*u
) {
3079 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
3083 return (ExecContext
*) ((uint8_t*) u
+ offset
);
3086 KillContext
*unit_get_kill_context(Unit
*u
) {
3093 offset
= UNIT_VTABLE(u
)->kill_context_offset
;
3097 return (KillContext
*) ((uint8_t*) u
+ offset
);
3100 CGroupContext
*unit_get_cgroup_context(Unit
*u
) {
3106 offset
= UNIT_VTABLE(u
)->cgroup_context_offset
;
3110 return (CGroupContext
*) ((uint8_t*) u
+ offset
);
3113 ExecRuntime
*unit_get_exec_runtime(Unit
*u
) {
3119 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3123 return *(ExecRuntime
**) ((uint8_t*) u
+ offset
);
3126 static int unit_drop_in_dir(Unit
*u
, UnitSetPropertiesMode mode
, bool transient
, char **dir
) {
3127 if (u
->manager
->running_as
== SYSTEMD_USER
) {
3130 if (mode
== UNIT_PERSISTENT
&& !transient
)
3131 r
= user_config_home(dir
);
3133 r
= user_runtime_dir(dir
);
3140 if (mode
== UNIT_PERSISTENT
&& !transient
)
3141 *dir
= strdup("/etc/systemd/system");
3143 *dir
= strdup("/run/systemd/system");
3150 static int unit_drop_in_file(Unit
*u
,
3151 UnitSetPropertiesMode mode
, const char *name
, char **p
, char **q
) {
3152 _cleanup_free_
char *dir
= NULL
;
3157 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3161 return drop_in_file(dir
, u
->id
, 50, name
, p
, q
);
3164 int unit_write_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3166 _cleanup_free_
char *dir
= NULL
;
3171 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3174 r
= unit_drop_in_dir(u
, mode
, u
->transient
, &dir
);
3178 return write_drop_in(dir
, u
->id
, 50, name
, data
);
3181 int unit_write_drop_in_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3182 _cleanup_free_
char *p
= NULL
;
3190 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3193 va_start(ap
, format
);
3194 r
= vasprintf(&p
, format
, ap
);
3200 return unit_write_drop_in(u
, mode
, name
, p
);
3203 int unit_write_drop_in_private(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *data
) {
3204 _cleanup_free_
char *ndata
= NULL
;
3210 if (!UNIT_VTABLE(u
)->private_section
)
3213 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3216 ndata
= strjoin("[", UNIT_VTABLE(u
)->private_section
, "]\n", data
, NULL
);
3220 return unit_write_drop_in(u
, mode
, name
, ndata
);
3223 int unit_write_drop_in_private_format(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
, const char *format
, ...) {
3224 _cleanup_free_
char *p
= NULL
;
3232 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3235 va_start(ap
, format
);
3236 r
= vasprintf(&p
, format
, ap
);
3242 return unit_write_drop_in_private(u
, mode
, name
, p
);
3245 int unit_remove_drop_in(Unit
*u
, UnitSetPropertiesMode mode
, const char *name
) {
3246 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
3251 if (!IN_SET(mode
, UNIT_PERSISTENT
, UNIT_RUNTIME
))
3254 r
= unit_drop_in_file(u
, mode
, name
, &p
, &q
);
3259 r
= errno
== ENOENT
? 0 : -errno
;
3267 int unit_make_transient(Unit
*u
) {
3272 u
->load_state
= UNIT_STUB
;
3274 u
->transient
= true;
3276 free(u
->fragment_path
);
3277 u
->fragment_path
= NULL
;
3279 if (u
->manager
->running_as
== SYSTEMD_USER
) {
3280 _cleanup_free_
char *c
= NULL
;
3282 r
= user_runtime_dir(&c
);
3288 u
->fragment_path
= strjoin(c
, "/", u
->id
, NULL
);
3289 if (!u
->fragment_path
)
3294 u
->fragment_path
= strappend("/run/systemd/system/", u
->id
);
3295 if (!u
->fragment_path
)
3298 mkdir_p("/run/systemd/system", 0755);
3301 return write_string_file_atomic_label(u
->fragment_path
, "# Transient stub");
3304 int unit_kill_context(
3310 bool main_pid_alien
) {
3312 int sig
, wait_for_exit
= false, r
;
3317 if (c
->kill_mode
== KILL_NONE
)
3320 sig
= sigkill
? SIGKILL
: c
->kill_signal
;
3323 r
= kill_and_sigcont(main_pid
, sig
);
3325 if (r
< 0 && r
!= -ESRCH
) {
3326 _cleanup_free_
char *comm
= NULL
;
3327 get_process_comm(main_pid
, &comm
);
3329 log_warning_unit(u
->id
, "Failed to kill main process " PID_FMT
" (%s): %s", main_pid
, strna(comm
), strerror(-r
));
3331 if (!main_pid_alien
)
3332 wait_for_exit
= true;
3334 if (c
->send_sighup
&& !sigkill
)
3335 kill(main_pid
, SIGHUP
);
3339 if (control_pid
> 0) {
3340 r
= kill_and_sigcont(control_pid
, sig
);
3342 if (r
< 0 && r
!= -ESRCH
) {
3343 _cleanup_free_
char *comm
= NULL
;
3344 get_process_comm(control_pid
, &comm
);
3346 log_warning_unit(u
->id
, "Failed to kill control process " PID_FMT
" (%s): %s", control_pid
, strna(comm
), strerror(-r
));
3348 wait_for_exit
= true;
3350 if (c
->send_sighup
&& !sigkill
)
3351 kill(control_pid
, SIGHUP
);
3355 if ((c
->kill_mode
== KILL_CONTROL_GROUP
|| (c
->kill_mode
== KILL_MIXED
&& sigkill
)) && u
->cgroup_path
) {
3356 _cleanup_set_free_ Set
*pid_set
= NULL
;
3358 /* Exclude the main/control pids from being killed via the cgroup */
3359 pid_set
= unit_pid_set(main_pid
, control_pid
);
3363 r
= cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, sig
, true, true, false, pid_set
);
3365 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3366 log_warning_unit(u
->id
, "Failed to kill control group: %s", strerror(-r
));
3369 /* FIXME: For now, we will not wait for the
3370 * cgroup members to die, simply because
3371 * cgroup notification is unreliable. It
3372 * doesn't work at all in containers, and
3373 * outside of containers it can be confused
3374 * easily by leaving directories in the
3377 /* wait_for_exit = true; */
3379 if (c
->send_sighup
&& !sigkill
) {
3382 pid_set
= unit_pid_set(main_pid
, control_pid
);
3386 cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
, SIGHUP
, false, true, false, pid_set
);
3391 return wait_for_exit
;
3394 int unit_require_mounts_for(Unit
*u
, const char *path
) {
3395 char prefix
[strlen(path
) + 1], *p
;
3401 /* Registers a unit for requiring a certain path and all its
3402 * prefixes. We keep a simple array of these paths in the
3403 * unit, since its usually short. However, we build a prefix
3404 * table for all possible prefixes so that new appearing mount
3405 * units can easily determine which units to make themselves a
3408 if (!path_is_absolute(path
))
3415 path_kill_slashes(p
);
3417 if (!path_is_safe(p
)) {
3422 if (strv_contains(u
->requires_mounts_for
, p
)) {
3427 r
= strv_consume(&u
->requires_mounts_for
, p
);
3431 PATH_FOREACH_PREFIX_MORE(prefix
, p
) {
3434 x
= hashmap_get(u
->manager
->units_requiring_mounts_for
, prefix
);
3438 if (!u
->manager
->units_requiring_mounts_for
) {
3439 u
->manager
->units_requiring_mounts_for
= hashmap_new(&string_hash_ops
);
3440 if (!u
->manager
->units_requiring_mounts_for
)
3454 r
= hashmap_put(u
->manager
->units_requiring_mounts_for
, q
, x
);
3470 int unit_setup_exec_runtime(Unit
*u
) {
3476 offset
= UNIT_VTABLE(u
)->exec_runtime_offset
;
3479 /* Check if there already is an ExecRuntime for this unit? */
3480 rt
= (ExecRuntime
**) ((uint8_t*) u
+ offset
);
3484 /* Try to get it from somebody else */
3485 SET_FOREACH(other
, u
->dependencies
[UNIT_JOINS_NAMESPACE_OF
], i
) {
3487 *rt
= unit_get_exec_runtime(other
);
3489 exec_runtime_ref(*rt
);
3494 return exec_runtime_make(rt
, unit_get_exec_context(u
), u
->id
);
3497 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3498 [UNIT_ACTIVE
] = "active",
3499 [UNIT_RELOADING
] = "reloading",
3500 [UNIT_INACTIVE
] = "inactive",
3501 [UNIT_FAILED
] = "failed",
3502 [UNIT_ACTIVATING
] = "activating",
3503 [UNIT_DEACTIVATING
] = "deactivating"
3506 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);