1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include <sys/epoll.h>
26 #include <sys/timerfd.h>
32 #include "systemd/sd-id128.h"
33 #include "systemd/sd-messages.h"
38 #include "path-util.h"
39 #include "load-fragment.h"
40 #include "load-dropin.h"
42 #include "unit-name.h"
43 #include "dbus-unit.h"
45 #include "cgroup-util.h"
47 #include "cgroup-attr.h"
50 #include "fileio-label.h"
51 #include "bus-errors.h"
53 const UnitVTable
* const unit_vtable
[_UNIT_TYPE_MAX
] = {
54 [UNIT_SERVICE
] = &service_vtable
,
55 [UNIT_TIMER
] = &timer_vtable
,
56 [UNIT_SOCKET
] = &socket_vtable
,
57 [UNIT_TARGET
] = &target_vtable
,
58 [UNIT_DEVICE
] = &device_vtable
,
59 [UNIT_MOUNT
] = &mount_vtable
,
60 [UNIT_AUTOMOUNT
] = &automount_vtable
,
61 [UNIT_SNAPSHOT
] = &snapshot_vtable
,
62 [UNIT_SWAP
] = &swap_vtable
,
63 [UNIT_PATH
] = &path_vtable
66 Unit
*unit_new(Manager
*m
, size_t size
) {
70 assert(size
>= sizeof(Unit
));
76 u
->names
= set_new(string_hash_func
, string_compare_func
);
83 u
->type
= _UNIT_TYPE_INVALID
;
84 u
->deserialized_job
= _JOB_TYPE_INVALID
;
85 u
->default_dependencies
= true;
86 u
->unit_file_state
= _UNIT_FILE_STATE_INVALID
;
91 bool unit_has_name(Unit
*u
, const char *name
) {
95 return !!set_get(u
->names
, (char*) name
);
98 int unit_add_name(Unit
*u
, const char *text
) {
106 if (unit_name_is_template(text
)) {
110 s
= unit_name_replace_instance(text
, u
->instance
);
117 if (!unit_name_is_valid(s
, false)) {
122 assert_se((t
= unit_name_to_type(s
)) >= 0);
124 if (u
->type
!= _UNIT_TYPE_INVALID
&& t
!= u
->type
) {
129 if ((r
= unit_name_to_instance(s
, &i
)) < 0)
132 if (i
&& unit_vtable
[t
]->no_instances
) {
137 /* Ensure that this unit is either instanced or not instanced,
139 if (u
->type
!= _UNIT_TYPE_INVALID
&& !u
->instance
!= !i
) {
144 if (unit_vtable
[t
]->no_alias
&&
145 !set_isempty(u
->names
) &&
146 !set_get(u
->names
, s
)) {
151 if (hashmap_size(u
->manager
->units
) >= MANAGER_MAX_NAMES
) {
156 if ((r
= set_put(u
->names
, s
)) < 0) {
162 if ((r
= hashmap_put(u
->manager
->units
, s
, u
)) < 0) {
163 set_remove(u
->names
, s
);
167 if (u
->type
== _UNIT_TYPE_INVALID
) {
173 LIST_PREPEND(Unit
, units_by_type
, u
->manager
->units_by_type
[t
], u
);
175 if (UNIT_VTABLE(u
)->init
)
176 UNIT_VTABLE(u
)->init(u
);
180 unit_add_to_dbus_queue(u
);
190 int unit_choose_id(Unit
*u
, const char *name
) {
191 char *s
, *t
= NULL
, *i
;
197 if (unit_name_is_template(name
)) {
202 if (!(t
= unit_name_replace_instance(name
, u
->instance
)))
208 /* Selects one of the names of this unit as the id */
209 s
= set_get(u
->names
, (char*) name
);
215 if ((r
= unit_name_to_instance(s
, &i
)) < 0)
223 unit_add_to_dbus_queue(u
);
228 int unit_set_description(Unit
*u
, const char *description
) {
233 if (!(s
= strdup(description
)))
236 free(u
->description
);
239 unit_add_to_dbus_queue(u
);
243 bool unit_check_gc(Unit
*u
) {
246 if (u
->load_state
== UNIT_STUB
)
249 if (UNIT_VTABLE(u
)->no_gc
)
261 if (unit_active_state(u
) != UNIT_INACTIVE
)
267 if (UNIT_VTABLE(u
)->check_gc
)
268 if (UNIT_VTABLE(u
)->check_gc(u
))
274 void unit_add_to_load_queue(Unit
*u
) {
276 assert(u
->type
!= _UNIT_TYPE_INVALID
);
278 if (u
->load_state
!= UNIT_STUB
|| u
->in_load_queue
)
281 LIST_PREPEND(Unit
, load_queue
, u
->manager
->load_queue
, u
);
282 u
->in_load_queue
= true;
285 void unit_add_to_cleanup_queue(Unit
*u
) {
288 if (u
->in_cleanup_queue
)
291 LIST_PREPEND(Unit
, cleanup_queue
, u
->manager
->cleanup_queue
, u
);
292 u
->in_cleanup_queue
= true;
295 void unit_add_to_gc_queue(Unit
*u
) {
298 if (u
->in_gc_queue
|| u
->in_cleanup_queue
)
301 if (unit_check_gc(u
))
304 LIST_PREPEND(Unit
, gc_queue
, u
->manager
->gc_queue
, u
);
305 u
->in_gc_queue
= true;
307 u
->manager
->n_in_gc_queue
++;
309 if (u
->manager
->gc_queue_timestamp
<= 0)
310 u
->manager
->gc_queue_timestamp
= now(CLOCK_MONOTONIC
);
313 void unit_add_to_dbus_queue(Unit
*u
) {
315 assert(u
->type
!= _UNIT_TYPE_INVALID
);
317 if (u
->load_state
== UNIT_STUB
|| u
->in_dbus_queue
)
320 /* Shortcut things if nobody cares */
321 if (!bus_has_subscriber(u
->manager
)) {
322 u
->sent_dbus_new_signal
= true;
326 LIST_PREPEND(Unit
, dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
327 u
->in_dbus_queue
= true;
330 static void bidi_set_free(Unit
*u
, Set
*s
) {
336 /* Frees the set and makes sure we are dropped from the
337 * inverse pointers */
339 SET_FOREACH(other
, s
, i
) {
342 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
343 set_remove(other
->dependencies
[d
], u
);
345 unit_add_to_gc_queue(other
);
351 void unit_free(Unit
*u
) {
358 bus_unit_send_removed_signal(u
);
360 if (u
->load_state
!= UNIT_STUB
)
361 if (UNIT_VTABLE(u
)->done
)
362 UNIT_VTABLE(u
)->done(u
);
364 SET_FOREACH(t
, u
->names
, i
)
365 hashmap_remove_value(u
->manager
->units
, t
, u
);
379 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
380 bidi_set_free(u
, u
->dependencies
[d
]);
382 if (u
->requires_mounts_for
) {
383 LIST_REMOVE(Unit
, has_requires_mounts_for
, u
->manager
->has_requires_mounts_for
, u
);
384 strv_free(u
->requires_mounts_for
);
387 if (u
->type
!= _UNIT_TYPE_INVALID
)
388 LIST_REMOVE(Unit
, units_by_type
, u
->manager
->units_by_type
[u
->type
], u
);
390 if (u
->in_load_queue
)
391 LIST_REMOVE(Unit
, load_queue
, u
->manager
->load_queue
, u
);
393 if (u
->in_dbus_queue
)
394 LIST_REMOVE(Unit
, dbus_queue
, u
->manager
->dbus_unit_queue
, u
);
396 if (u
->in_cleanup_queue
)
397 LIST_REMOVE(Unit
, cleanup_queue
, u
->manager
->cleanup_queue
, u
);
399 if (u
->in_gc_queue
) {
400 LIST_REMOVE(Unit
, gc_queue
, u
->manager
->gc_queue
, u
);
401 u
->manager
->n_in_gc_queue
--;
404 cgroup_bonding_free_list(u
->cgroup_bondings
, u
->manager
->n_reloading
<= 0);
405 cgroup_attribute_free_list(u
->cgroup_attributes
);
407 free(u
->description
);
408 strv_free(u
->documentation
);
409 free(u
->fragment_path
);
410 free(u
->source_path
);
411 strv_free(u
->dropin_paths
);
414 set_free_free(u
->names
);
416 condition_free_list(u
->conditions
);
419 unit_ref_unset(u
->refs
);
424 UnitActiveState
unit_active_state(Unit
*u
) {
427 if (u
->load_state
== UNIT_MERGED
)
428 return unit_active_state(unit_follow_merge(u
));
430 /* After a reload it might happen that a unit is not correctly
431 * loaded but still has a process around. That's why we won't
432 * shortcut failed loading to UNIT_INACTIVE_FAILED. */
434 return UNIT_VTABLE(u
)->active_state(u
);
437 const char* unit_sub_state_to_string(Unit
*u
) {
440 return UNIT_VTABLE(u
)->sub_state_to_string(u
);
443 static void complete_move(Set
**s
, Set
**other
) {
451 set_move(*s
, *other
);
458 static void merge_names(Unit
*u
, Unit
*other
) {
465 complete_move(&u
->names
, &other
->names
);
467 set_free_free(other
->names
);
471 SET_FOREACH(t
, u
->names
, i
)
472 assert_se(hashmap_replace(u
->manager
->units
, t
, u
) == 0);
475 static void merge_dependencies(Unit
*u
, Unit
*other
, UnitDependency d
) {
482 assert(d
< _UNIT_DEPENDENCY_MAX
);
484 /* Fix backwards pointers */
485 SET_FOREACH(back
, other
->dependencies
[d
], i
) {
488 for (k
= 0; k
< _UNIT_DEPENDENCY_MAX
; k
++)
489 if ((r
= set_remove_and_put(back
->dependencies
[k
], other
, u
)) < 0) {
492 set_remove(back
->dependencies
[k
], other
);
494 assert(r
== -ENOENT
);
498 complete_move(&u
->dependencies
[d
], &other
->dependencies
[d
]);
500 set_free(other
->dependencies
[d
]);
501 other
->dependencies
[d
] = NULL
;
504 int unit_merge(Unit
*u
, Unit
*other
) {
509 assert(u
->manager
== other
->manager
);
510 assert(u
->type
!= _UNIT_TYPE_INVALID
);
512 other
= unit_follow_merge(other
);
517 if (u
->type
!= other
->type
)
520 if (!u
->instance
!= !other
->instance
)
523 if (other
->load_state
!= UNIT_STUB
&&
524 other
->load_state
!= UNIT_ERROR
)
533 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other
)))
537 merge_names(u
, other
);
539 /* Redirect all references */
541 unit_ref_set(other
->refs
, u
);
543 /* Merge dependencies */
544 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++)
545 merge_dependencies(u
, other
, d
);
547 other
->load_state
= UNIT_MERGED
;
548 other
->merged_into
= u
;
550 /* If there is still some data attached to the other node, we
551 * don't need it anymore, and can free it. */
552 if (other
->load_state
!= UNIT_STUB
)
553 if (UNIT_VTABLE(other
)->done
)
554 UNIT_VTABLE(other
)->done(other
);
556 unit_add_to_dbus_queue(u
);
557 unit_add_to_cleanup_queue(other
);
562 int unit_merge_by_name(Unit
*u
, const char *name
) {
570 if (unit_name_is_template(name
)) {
574 if (!(s
= unit_name_replace_instance(name
, u
->instance
)))
580 if (!(other
= manager_get_unit(u
->manager
, name
)))
581 r
= unit_add_name(u
, name
);
583 r
= unit_merge(u
, other
);
589 Unit
* unit_follow_merge(Unit
*u
) {
592 while (u
->load_state
== UNIT_MERGED
)
593 assert_se(u
= u
->merged_into
);
598 int unit_add_exec_dependencies(Unit
*u
, ExecContext
*c
) {
604 if (c
->std_output
!= EXEC_OUTPUT_KMSG
&&
605 c
->std_output
!= EXEC_OUTPUT_SYSLOG
&&
606 c
->std_output
!= EXEC_OUTPUT_JOURNAL
&&
607 c
->std_output
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
608 c
->std_output
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
&&
609 c
->std_output
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
610 c
->std_error
!= EXEC_OUTPUT_KMSG
&&
611 c
->std_error
!= EXEC_OUTPUT_SYSLOG
&&
612 c
->std_error
!= EXEC_OUTPUT_JOURNAL
&&
613 c
->std_error
!= EXEC_OUTPUT_KMSG_AND_CONSOLE
&&
614 c
->std_error
!= EXEC_OUTPUT_JOURNAL_AND_CONSOLE
&&
615 c
->std_error
!= EXEC_OUTPUT_SYSLOG_AND_CONSOLE
)
618 /* If syslog or kernel logging is requested, make sure our own
619 * logging daemon is run first. */
621 if (u
->manager
->running_as
== SYSTEMD_SYSTEM
) {
622 r
= unit_add_dependency_by_name(u
, UNIT_AFTER
, SPECIAL_JOURNALD_SOCKET
, NULL
, true);
630 const char *unit_description(Unit
*u
) {
634 return u
->description
;
639 void unit_dump(Unit
*u
, FILE *f
, const char *prefix
) {
646 timestamp1
[FORMAT_TIMESTAMP_MAX
],
647 timestamp2
[FORMAT_TIMESTAMP_MAX
],
648 timestamp3
[FORMAT_TIMESTAMP_MAX
],
649 timestamp4
[FORMAT_TIMESTAMP_MAX
],
650 timespan
[FORMAT_TIMESPAN_MAX
];
654 assert(u
->type
>= 0);
658 p2
= strappend(prefix
, "\t");
659 prefix2
= p2
? p2
: prefix
;
663 "%s\tDescription: %s\n"
665 "%s\tUnit Load State: %s\n"
666 "%s\tUnit Active State: %s\n"
667 "%s\tInactive Exit Timestamp: %s\n"
668 "%s\tActive Enter Timestamp: %s\n"
669 "%s\tActive Exit Timestamp: %s\n"
670 "%s\tInactive Enter Timestamp: %s\n"
671 "%s\tGC Check Good: %s\n"
672 "%s\tNeed Daemon Reload: %s\n",
674 prefix
, unit_description(u
),
675 prefix
, strna(u
->instance
),
676 prefix
, unit_load_state_to_string(u
->load_state
),
677 prefix
, unit_active_state_to_string(unit_active_state(u
)),
678 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->inactive_exit_timestamp
.realtime
)),
679 prefix
, strna(format_timestamp(timestamp2
, sizeof(timestamp2
), u
->active_enter_timestamp
.realtime
)),
680 prefix
, strna(format_timestamp(timestamp3
, sizeof(timestamp3
), u
->active_exit_timestamp
.realtime
)),
681 prefix
, strna(format_timestamp(timestamp4
, sizeof(timestamp4
), u
->inactive_enter_timestamp
.realtime
)),
682 prefix
, yes_no(unit_check_gc(u
)),
683 prefix
, yes_no(unit_need_daemon_reload(u
)));
685 SET_FOREACH(t
, u
->names
, i
)
686 fprintf(f
, "%s\tName: %s\n", prefix
, t
);
688 STRV_FOREACH(j
, u
->documentation
)
689 fprintf(f
, "%s\tDocumentation: %s\n", prefix
, *j
);
691 if ((following
= unit_following(u
)))
692 fprintf(f
, "%s\tFollowing: %s\n", prefix
, following
->id
);
694 if (u
->fragment_path
)
695 fprintf(f
, "%s\tFragment Path: %s\n", prefix
, u
->fragment_path
);
698 fprintf(f
, "%s\tSource Path: %s\n", prefix
, u
->source_path
);
700 STRV_FOREACH(j
, u
->dropin_paths
)
701 fprintf(f
, "%s\tDropIn Path: %s\n", prefix
, *j
);
703 if (u
->job_timeout
> 0)
704 fprintf(f
, "%s\tJob Timeout: %s\n", prefix
, format_timespan(timespan
, sizeof(timespan
), u
->job_timeout
, 0));
706 condition_dump_list(u
->conditions
, f
, prefix
);
708 if (dual_timestamp_is_set(&u
->condition_timestamp
))
710 "%s\tCondition Timestamp: %s\n"
711 "%s\tCondition Result: %s\n",
712 prefix
, strna(format_timestamp(timestamp1
, sizeof(timestamp1
), u
->condition_timestamp
.realtime
)),
713 prefix
, yes_no(u
->condition_result
));
715 for (d
= 0; d
< _UNIT_DEPENDENCY_MAX
; d
++) {
718 SET_FOREACH(other
, u
->dependencies
[d
], i
)
719 fprintf(f
, "%s\t%s: %s\n", prefix
, unit_dependency_to_string(d
), other
->id
);
722 if (!strv_isempty(u
->requires_mounts_for
)) {
724 "%s\tRequiresMountsFor:", prefix
);
726 STRV_FOREACH(j
, u
->requires_mounts_for
)
727 fprintf(f
, " %s", *j
);
732 if (u
->load_state
== UNIT_LOADED
) {
737 "%s\tStopWhenUnneeded: %s\n"
738 "%s\tRefuseManualStart: %s\n"
739 "%s\tRefuseManualStop: %s\n"
740 "%s\tDefaultDependencies: %s\n"
741 "%s\tOnFailureIsolate: %s\n"
742 "%s\tIgnoreOnIsolate: %s\n"
743 "%s\tIgnoreOnSnapshot: %s\n",
744 prefix
, yes_no(u
->stop_when_unneeded
),
745 prefix
, yes_no(u
->refuse_manual_start
),
746 prefix
, yes_no(u
->refuse_manual_stop
),
747 prefix
, yes_no(u
->default_dependencies
),
748 prefix
, yes_no(u
->on_failure_isolate
),
749 prefix
, yes_no(u
->ignore_on_isolate
),
750 prefix
, yes_no(u
->ignore_on_snapshot
));
752 LIST_FOREACH(by_unit
, b
, u
->cgroup_bondings
)
753 fprintf(f
, "%s\tControlGroup: %s:%s\n",
754 prefix
, b
->controller
, b
->path
);
756 LIST_FOREACH(by_unit
, a
, u
->cgroup_attributes
) {
757 _cleanup_free_
char *v
= NULL
;
759 if (a
->semantics
&& a
->semantics
->map_write
)
760 a
->semantics
->map_write(a
->semantics
, a
->value
, &v
);
762 fprintf(f
, "%s\tControlGroupAttribute: %s %s \"%s\"\n",
763 prefix
, a
->controller
, a
->name
, v
? v
: a
->value
);
766 if (UNIT_VTABLE(u
)->dump
)
767 UNIT_VTABLE(u
)->dump(u
, f
, prefix2
);
769 } else if (u
->load_state
== UNIT_MERGED
)
771 "%s\tMerged into: %s\n",
772 prefix
, u
->merged_into
->id
);
773 else if (u
->load_state
== UNIT_ERROR
)
774 fprintf(f
, "%s\tLoad Error Code: %s\n", prefix
, strerror(-u
->load_error
));
778 job_dump(u
->job
, f
, prefix2
);
781 job_dump(u
->nop_job
, f
, prefix2
);
786 /* Common implementation for multiple backends */
787 int unit_load_fragment_and_dropin(Unit
*u
) {
792 /* Load a .service file */
793 if ((r
= unit_load_fragment(u
)) < 0)
796 if (u
->load_state
== UNIT_STUB
)
799 /* Load drop-in directory data */
800 if ((r
= unit_load_dropin(unit_follow_merge(u
))) < 0)
806 /* Common implementation for multiple backends */
807 int unit_load_fragment_and_dropin_optional(Unit
*u
) {
812 /* Same as unit_load_fragment_and_dropin(), but whether
813 * something can be loaded or not doesn't matter. */
815 /* Load a .service file */
816 if ((r
= unit_load_fragment(u
)) < 0)
819 if (u
->load_state
== UNIT_STUB
)
820 u
->load_state
= UNIT_LOADED
;
822 /* Load drop-in directory data */
823 if ((r
= unit_load_dropin(unit_follow_merge(u
))) < 0)
829 int unit_add_default_target_dependency(Unit
*u
, Unit
*target
) {
833 if (target
->type
!= UNIT_TARGET
)
836 /* Only add the dependency if both units are loaded, so that
837 * that loop check below is reliable */
838 if (u
->load_state
!= UNIT_LOADED
||
839 target
->load_state
!= UNIT_LOADED
)
842 /* If either side wants no automatic dependencies, then let's
844 if (!u
->default_dependencies
||
845 !target
->default_dependencies
)
848 /* Don't create loops */
849 if (set_get(target
->dependencies
[UNIT_BEFORE
], u
))
852 return unit_add_dependency(target
, UNIT_AFTER
, u
, true);
855 static int unit_add_default_dependencies(Unit
*u
) {
856 static const UnitDependency deps
[] = {
858 UNIT_REQUIRED_BY_OVERRIDABLE
,
870 for (k
= 0; k
< ELEMENTSOF(deps
); k
++)
871 SET_FOREACH(target
, u
->dependencies
[deps
[k
]], i
)
872 if ((r
= unit_add_default_target_dependency(u
, target
)) < 0)
878 int unit_load(Unit
*u
) {
883 if (u
->in_load_queue
) {
884 LIST_REMOVE(Unit
, load_queue
, u
->manager
->load_queue
, u
);
885 u
->in_load_queue
= false;
888 if (u
->type
== _UNIT_TYPE_INVALID
)
891 if (u
->load_state
!= UNIT_STUB
)
894 if (UNIT_VTABLE(u
)->load
)
895 if ((r
= UNIT_VTABLE(u
)->load(u
)) < 0)
898 if (u
->load_state
== UNIT_STUB
) {
903 if (u
->load_state
== UNIT_LOADED
&&
904 u
->default_dependencies
)
905 if ((r
= unit_add_default_dependencies(u
)) < 0)
908 if (u
->load_state
== UNIT_LOADED
) {
909 r
= unit_add_mount_links(u
);
914 if (u
->on_failure_isolate
&&
915 set_size(u
->dependencies
[UNIT_ON_FAILURE
]) > 1) {
917 log_error_unit(u
->id
,
918 "More than one OnFailure= dependencies specified for %s but OnFailureIsolate= enabled. Refusing.", u
->id
);
924 assert((u
->load_state
!= UNIT_MERGED
) == !u
->merged_into
);
926 unit_add_to_dbus_queue(unit_follow_merge(u
));
927 unit_add_to_gc_queue(u
);
932 u
->load_state
= UNIT_ERROR
;
934 unit_add_to_dbus_queue(u
);
935 unit_add_to_gc_queue(u
);
937 log_debug_unit(u
->id
, "Failed to load configuration for %s: %s",
938 u
->id
, strerror(-r
));
943 bool unit_condition_test(Unit
*u
) {
946 dual_timestamp_get(&u
->condition_timestamp
);
947 u
->condition_result
= condition_test_list(u
->conditions
);
949 return u
->condition_result
;
952 _pure_
static const char* unit_get_status_message_format(Unit
*u
, JobType t
) {
953 const UnitStatusMessageFormats
*format_table
;
957 assert(t
< _JOB_TYPE_MAX
);
959 if (t
!= JOB_START
&& t
!= JOB_STOP
)
962 format_table
= &UNIT_VTABLE(u
)->status_message_formats
;
966 return format_table
->starting_stopping
[t
== JOB_STOP
];
969 _pure_
static const char *unit_get_status_message_format_try_harder(Unit
*u
, JobType t
) {
974 assert(t
< _JOB_TYPE_MAX
);
976 format
= unit_get_status_message_format(u
, t
);
980 /* Return generic strings */
982 return "Starting %s.";
983 else if (t
== JOB_STOP
)
984 return "Stopping %s.";
985 else if (t
== JOB_RELOAD
)
986 return "Reloading %s.";
991 static void unit_status_print_starting_stopping(Unit
*u
, JobType t
) {
996 /* We only print status messages for selected units on
997 * selected operations. */
999 format
= unit_get_status_message_format(u
, t
);
1003 unit_status_printf(u
, "", format
);
1006 #pragma GCC diagnostic push
1007 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
1008 static void unit_status_log_starting_stopping_reloading(Unit
*u
, JobType t
) {
1015 if (t
!= JOB_START
&& t
!= JOB_STOP
&& t
!= JOB_RELOAD
)
1018 if (log_on_console())
1021 /* We log status messages for all units and all operations. */
1023 format
= unit_get_status_message_format_try_harder(u
, t
);
1027 snprintf(buf
, sizeof(buf
), format
, unit_description(u
));
1030 mid
= t
== JOB_START
? SD_MESSAGE_UNIT_STARTING
:
1031 t
== JOB_STOP
? SD_MESSAGE_UNIT_STOPPING
:
1032 SD_MESSAGE_UNIT_RELOADING
;
1034 log_struct_unit(LOG_INFO
,
1040 #pragma GCC diagnostic pop
1043 * -EBADR: This unit type does not support starting.
1044 * -EALREADY: Unit is already started.
1045 * -EAGAIN: An operation is already in progress. Retry later.
1046 * -ECANCELED: Too many requests for now.
1048 int unit_start(Unit
*u
) {
1049 UnitActiveState state
;
1054 if (u
->load_state
!= UNIT_LOADED
)
1057 /* If this is already started, then this will succeed. Note
1058 * that this will even succeed if this unit is not startable
1059 * by the user. This is relied on to detect when we need to
1060 * wait for units and when waiting is finished. */
1061 state
= unit_active_state(u
);
1062 if (UNIT_IS_ACTIVE_OR_RELOADING(state
))
1065 /* If the conditions failed, don't do anything at all. If we
1066 * already are activating this call might still be useful to
1067 * speed up activation in case there is some hold-off time,
1068 * but we don't want to recheck the condition in that case. */
1069 if (state
!= UNIT_ACTIVATING
&&
1070 !unit_condition_test(u
)) {
1071 log_debug_unit(u
->id
, "Starting of %s requested but condition failed. Ignoring.", u
->id
);
1075 /* Forward to the main object, if we aren't it. */
1076 if ((following
= unit_following(u
))) {
1077 log_debug_unit(u
->id
, "Redirecting start request from %s to %s.",
1078 u
->id
, following
->id
);
1079 return unit_start(following
);
1082 unit_status_log_starting_stopping_reloading(u
, JOB_START
);
1083 unit_status_print_starting_stopping(u
, JOB_START
);
1085 /* If it is stopped, but we cannot start it, then fail */
1086 if (!UNIT_VTABLE(u
)->start
)
1089 /* We don't suppress calls to ->start() here when we are
1090 * already starting, to allow this request to be used as a
1091 * "hurry up" call, for example when the unit is in some "auto
1092 * restart" state where it waits for a holdoff timer to elapse
1093 * before it will start again. */
1095 unit_add_to_dbus_queue(u
);
1097 return UNIT_VTABLE(u
)->start(u
);
1100 bool unit_can_start(Unit
*u
) {
1103 return !!UNIT_VTABLE(u
)->start
;
1106 bool unit_can_isolate(Unit
*u
) {
1109 return unit_can_start(u
) &&
1114 * -EBADR: This unit type does not support stopping.
1115 * -EALREADY: Unit is already stopped.
1116 * -EAGAIN: An operation is already in progress. Retry later.
1118 int unit_stop(Unit
*u
) {
1119 UnitActiveState state
;
1124 state
= unit_active_state(u
);
1125 if (UNIT_IS_INACTIVE_OR_FAILED(state
))
1128 if ((following
= unit_following(u
))) {
1129 log_debug_unit(u
->id
, "Redirecting stop request from %s to %s.",
1130 u
->id
, following
->id
);
1131 return unit_stop(following
);
1134 unit_status_log_starting_stopping_reloading(u
, JOB_STOP
);
1135 unit_status_print_starting_stopping(u
, JOB_STOP
);
1137 if (!UNIT_VTABLE(u
)->stop
)
1140 unit_add_to_dbus_queue(u
);
1142 return UNIT_VTABLE(u
)->stop(u
);
1146 * -EBADR: This unit type does not support reloading.
1147 * -ENOEXEC: Unit is not started.
1148 * -EAGAIN: An operation is already in progress. Retry later.
1150 int unit_reload(Unit
*u
) {
1151 UnitActiveState state
;
1156 if (u
->load_state
!= UNIT_LOADED
)
1159 if (!unit_can_reload(u
))
1162 state
= unit_active_state(u
);
1163 if (state
== UNIT_RELOADING
)
1166 if (state
!= UNIT_ACTIVE
)
1169 if ((following
= unit_following(u
))) {
1170 log_debug_unit(u
->id
, "Redirecting reload request from %s to %s.",
1171 u
->id
, following
->id
);
1172 return unit_reload(following
);
1175 unit_status_log_starting_stopping_reloading(u
, JOB_RELOAD
);
1177 unit_add_to_dbus_queue(u
);
1178 return UNIT_VTABLE(u
)->reload(u
);
1181 bool unit_can_reload(Unit
*u
) {
1184 if (!UNIT_VTABLE(u
)->reload
)
1187 if (!UNIT_VTABLE(u
)->can_reload
)
1190 return UNIT_VTABLE(u
)->can_reload(u
);
1193 static void unit_check_unneeded(Unit
*u
) {
1199 /* If this service shall be shut down when unneeded then do
1202 if (!u
->stop_when_unneeded
)
1205 if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
1208 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY
], i
)
1209 if (unit_active_or_pending(other
))
1212 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRED_BY_OVERRIDABLE
], i
)
1213 if (unit_active_or_pending(other
))
1216 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTED_BY
], i
)
1217 if (unit_active_or_pending(other
))
1220 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1221 if (unit_active_or_pending(other
))
1224 log_info_unit(u
->id
, "Service %s is not needed anymore. Stopping.", u
->id
);
1226 /* Ok, nobody needs us anymore. Sniff. Then let's commit suicide */
1227 manager_add_job(u
->manager
, JOB_STOP
, u
, JOB_FAIL
, true, NULL
, NULL
);
1230 static void retroactively_start_dependencies(Unit
*u
) {
1235 assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)));
1237 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1238 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1239 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1240 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1242 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1243 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1244 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1245 manager_add_job(u
->manager
, JOB_START
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1247 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1248 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1249 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1250 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1252 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1253 if (!set_get(u
->dependencies
[UNIT_AFTER
], other
) &&
1254 !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other
)))
1255 manager_add_job(u
->manager
, JOB_START
, other
, JOB_FAIL
, false, NULL
, NULL
);
1257 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTS
], i
)
1258 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1259 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1261 SET_FOREACH(other
, u
->dependencies
[UNIT_CONFLICTED_BY
], i
)
1262 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1263 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1266 static void retroactively_stop_dependencies(Unit
*u
) {
1271 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1273 /* Pull down units which are bound to us recursively if enabled */
1274 SET_FOREACH(other
, u
->dependencies
[UNIT_BOUND_BY
], i
)
1275 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1276 manager_add_job(u
->manager
, JOB_STOP
, other
, JOB_REPLACE
, true, NULL
, NULL
);
1279 static void check_unneeded_dependencies(Unit
*u
) {
1284 assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u
)));
1286 /* Garbage collect services that might not be needed anymore, if enabled */
1287 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES
], i
)
1288 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1289 unit_check_unneeded(other
);
1290 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUIRES_OVERRIDABLE
], i
)
1291 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1292 unit_check_unneeded(other
);
1293 SET_FOREACH(other
, u
->dependencies
[UNIT_WANTS
], i
)
1294 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1295 unit_check_unneeded(other
);
1296 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE
], i
)
1297 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1298 unit_check_unneeded(other
);
1299 SET_FOREACH(other
, u
->dependencies
[UNIT_REQUISITE_OVERRIDABLE
], i
)
1300 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1301 unit_check_unneeded(other
);
1302 SET_FOREACH(other
, u
->dependencies
[UNIT_BINDS_TO
], i
)
1303 if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other
)))
1304 unit_check_unneeded(other
);
1307 void unit_start_on_failure(Unit
*u
) {
1313 if (set_size(u
->dependencies
[UNIT_ON_FAILURE
]) <= 0)
1316 log_info_unit(u
->id
, "Triggering OnFailure= dependencies of %s.", u
->id
);
1318 SET_FOREACH(other
, u
->dependencies
[UNIT_ON_FAILURE
], i
) {
1321 r
= manager_add_job(u
->manager
, JOB_START
, other
, u
->on_failure_isolate
? JOB_ISOLATE
: JOB_REPLACE
, true, NULL
, NULL
);
1323 log_error_unit(u
->id
, "Failed to enqueue OnFailure= job: %s", strerror(-r
));
1327 void unit_trigger_notify(Unit
*u
) {
1333 SET_FOREACH(other
, u
->dependencies
[UNIT_TRIGGERED_BY
], i
)
1334 if (UNIT_VTABLE(other
)->trigger_notify
)
1335 UNIT_VTABLE(other
)->trigger_notify(other
, u
);
1338 void unit_notify(Unit
*u
, UnitActiveState os
, UnitActiveState ns
, bool reload_success
) {
1343 assert(os
< _UNIT_ACTIVE_STATE_MAX
);
1344 assert(ns
< _UNIT_ACTIVE_STATE_MAX
);
1346 /* Note that this is called for all low-level state changes,
1347 * even if they might map to the same high-level
1348 * UnitActiveState! That means that ns == os is OK an expected
1349 * behavior here. For example: if a mount point is remounted
1350 * this function will be called too! */
1354 if (m
->n_reloading
<= 0) {
1357 dual_timestamp_get(&ts
);
1359 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && !UNIT_IS_INACTIVE_OR_FAILED(ns
))
1360 u
->inactive_exit_timestamp
= ts
;
1361 else if (!UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_INACTIVE_OR_FAILED(ns
))
1362 u
->inactive_enter_timestamp
= ts
;
1364 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
) && UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1365 u
->active_enter_timestamp
= ts
;
1366 else if (UNIT_IS_ACTIVE_OR_RELOADING(os
) && !UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1367 u
->active_exit_timestamp
= ts
;
1370 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1371 cgroup_bonding_trim_list(u
->cgroup_bondings
, true);
1373 if (UNIT_IS_INACTIVE_OR_FAILED(os
) != UNIT_IS_INACTIVE_OR_FAILED(ns
)) {
1374 ExecContext
*ec
= unit_get_exec_context(u
);
1375 if (ec
&& exec_context_may_touch_console(ec
)) {
1376 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1386 if (u
->job
->state
== JOB_WAITING
)
1388 /* So we reached a different state for this
1389 * job. Let's see if we can run it now if it
1390 * failed previously due to EAGAIN. */
1391 job_add_to_run_queue(u
->job
);
1393 /* Let's check whether this state change constitutes a
1394 * finished job, or maybe contradicts a running job and
1395 * hence needs to invalidate jobs. */
1397 switch (u
->job
->type
) {
1400 case JOB_VERIFY_ACTIVE
:
1402 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
))
1403 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1404 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_ACTIVATING
) {
1407 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1408 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1414 case JOB_RELOAD_OR_START
:
1416 if (u
->job
->state
== JOB_RUNNING
) {
1417 if (ns
== UNIT_ACTIVE
)
1418 job_finish_and_invalidate(u
->job
, reload_success
? JOB_DONE
: JOB_FAILED
, true);
1419 else if (ns
!= UNIT_ACTIVATING
&& ns
!= UNIT_RELOADING
) {
1422 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1423 job_finish_and_invalidate(u
->job
, ns
== UNIT_FAILED
? JOB_FAILED
: JOB_DONE
, true);
1431 case JOB_TRY_RESTART
:
1433 if (UNIT_IS_INACTIVE_OR_FAILED(ns
))
1434 job_finish_and_invalidate(u
->job
, JOB_DONE
, true);
1435 else if (u
->job
->state
== JOB_RUNNING
&& ns
!= UNIT_DEACTIVATING
) {
1437 job_finish_and_invalidate(u
->job
, JOB_FAILED
, true);
1443 assert_not_reached("Job type unknown");
1449 if (m
->n_reloading
<= 0) {
1451 /* If this state change happened without being
1452 * requested by a job, then let's retroactively start
1453 * or stop dependencies. We skip that step when
1454 * deserializing, since we don't want to create any
1455 * additional jobs just because something is already
1459 if (UNIT_IS_INACTIVE_OR_FAILED(os
) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns
))
1460 retroactively_start_dependencies(u
);
1461 else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1462 retroactively_stop_dependencies(u
);
1465 /* stop unneeded units regardless if going down was expected or not */
1466 if (UNIT_IS_ACTIVE_OR_ACTIVATING(os
) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns
))
1467 check_unneeded_dependencies(u
);
1469 if (ns
!= os
&& ns
== UNIT_FAILED
) {
1470 log_notice_unit(u
->id
,
1471 "Unit %s entered failed state.", u
->id
);
1472 unit_start_on_failure(u
);
1476 /* Some names are special */
1477 if (UNIT_IS_ACTIVE_OR_RELOADING(ns
)) {
1479 if (unit_has_name(u
, SPECIAL_DBUS_SERVICE
))
1480 /* The bus just might have become available,
1481 * hence try to connect to it, if we aren't
1485 if (u
->type
== UNIT_SERVICE
&&
1486 !UNIT_IS_ACTIVE_OR_RELOADING(os
) &&
1487 m
->n_reloading
<= 0) {
1488 /* Write audit record if we have just finished starting up */
1489 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, true);
1493 if (!UNIT_IS_ACTIVE_OR_RELOADING(os
))
1494 manager_send_unit_plymouth(m
, u
);
1498 /* We don't care about D-Bus here, since we'll get an
1499 * asynchronous notification for it anyway. */
1501 if (u
->type
== UNIT_SERVICE
&&
1502 UNIT_IS_INACTIVE_OR_FAILED(ns
) &&
1503 !UNIT_IS_INACTIVE_OR_FAILED(os
) &&
1504 m
->n_reloading
<= 0) {
1506 /* Hmm, if there was no start record written
1507 * write it now, so that we always have a nice
1510 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_START
, ns
== UNIT_INACTIVE
);
1512 if (ns
== UNIT_INACTIVE
)
1513 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, true);
1515 /* Write audit record if we have just finished shutting down */
1516 manager_send_unit_audit(m
, u
, AUDIT_SERVICE_STOP
, ns
== UNIT_INACTIVE
);
1518 u
->in_audit
= false;
1522 manager_recheck_journal(m
);
1523 unit_trigger_notify(u
);
1525 /* Maybe we finished startup and are now ready for being
1526 * stopped because unneeded? */
1527 if (u
->manager
->n_reloading
<= 0)
1528 unit_check_unneeded(u
);
1530 unit_add_to_dbus_queue(u
);
1531 unit_add_to_gc_queue(u
);
1534 int unit_watch_fd(Unit
*u
, int fd
, uint32_t events
, Watch
*w
) {
1535 struct epoll_event ev
= {
1543 assert(w
->type
== WATCH_INVALID
|| (w
->type
== WATCH_FD
&& w
->fd
== fd
&& w
->data
.unit
== u
));
1545 if (epoll_ctl(u
->manager
->epoll_fd
,
1546 w
->type
== WATCH_INVALID
? EPOLL_CTL_ADD
: EPOLL_CTL_MOD
,
1558 void unit_unwatch_fd(Unit
*u
, Watch
*w
) {
1562 if (w
->type
== WATCH_INVALID
)
1565 assert(w
->type
== WATCH_FD
);
1566 assert(w
->data
.unit
== u
);
1567 assert_se(epoll_ctl(u
->manager
->epoll_fd
, EPOLL_CTL_DEL
, w
->fd
, NULL
) >= 0);
1570 w
->type
= WATCH_INVALID
;
1571 w
->data
.unit
= NULL
;
1574 int unit_watch_pid(Unit
*u
, pid_t pid
) {
1578 /* Watch a specific PID. We only support one unit watching
1579 * each PID for now. */
1581 return hashmap_put(u
->manager
->watch_pids
, LONG_TO_PTR(pid
), u
);
1584 void unit_unwatch_pid(Unit
*u
, pid_t pid
) {
1588 hashmap_remove_value(u
->manager
->watch_pids
, LONG_TO_PTR(pid
), u
);
1591 int unit_watch_timer(Unit
*u
, clockid_t clock_id
, bool relative
, usec_t usec
, Watch
*w
) {
1592 struct itimerspec its
= {};
1598 assert(w
->type
== WATCH_INVALID
|| (w
->type
== WATCH_UNIT_TIMER
&& w
->data
.unit
== u
));
1600 /* This will try to reuse the old timer if there is one */
1602 if (w
->type
== WATCH_UNIT_TIMER
) {
1603 assert(w
->data
.unit
== u
);
1608 } else if (w
->type
== WATCH_INVALID
) {
1611 fd
= timerfd_create(clock_id
, TFD_NONBLOCK
|TFD_CLOEXEC
);
1615 assert_not_reached("Invalid watch type");
1618 /* Set absolute time in the past, but not 0, since we
1619 * don't want to disarm the timer */
1620 its
.it_value
.tv_sec
= 0;
1621 its
.it_value
.tv_nsec
= 1;
1623 flags
= TFD_TIMER_ABSTIME
;
1625 timespec_store(&its
.it_value
, usec
);
1626 flags
= relative
? 0 : TFD_TIMER_ABSTIME
;
1629 /* This will also flush the elapse counter */
1630 if (timerfd_settime(fd
, flags
, &its
, NULL
) < 0)
1633 if (w
->type
== WATCH_INVALID
) {
1634 struct epoll_event ev
= {
1639 if (epoll_ctl(u
->manager
->epoll_fd
, EPOLL_CTL_ADD
, fd
, &ev
) < 0)
1643 w
->type
= WATCH_UNIT_TIMER
;
1651 close_nointr_nofail(fd
);
1656 void unit_unwatch_timer(Unit
*u
, Watch
*w
) {
1660 if (w
->type
== WATCH_INVALID
)
1663 assert(w
->type
== WATCH_UNIT_TIMER
);
1664 assert(w
->data
.unit
== u
);
1667 assert_se(epoll_ctl(u
->manager
->epoll_fd
, EPOLL_CTL_DEL
, w
->fd
, NULL
) >= 0);
1668 close_nointr_nofail(w
->fd
);
1671 w
->type
= WATCH_INVALID
;
1672 w
->data
.unit
= NULL
;
1675 bool unit_job_is_applicable(Unit
*u
, JobType j
) {
1677 assert(j
>= 0 && j
< _JOB_TYPE_MAX
);
1681 case JOB_VERIFY_ACTIVE
:
1688 case JOB_TRY_RESTART
:
1689 return unit_can_start(u
);
1692 return unit_can_reload(u
);
1694 case JOB_RELOAD_OR_START
:
1695 return unit_can_reload(u
) && unit_can_start(u
);
1698 assert_not_reached("Invalid job type");
1702 int unit_add_dependency(Unit
*u
, UnitDependency d
, Unit
*other
, bool add_reference
) {
1704 static const UnitDependency inverse_table
[_UNIT_DEPENDENCY_MAX
] = {
1705 [UNIT_REQUIRES
] = UNIT_REQUIRED_BY
,
1706 [UNIT_REQUIRES_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
1707 [UNIT_WANTS
] = UNIT_WANTED_BY
,
1708 [UNIT_REQUISITE
] = UNIT_REQUIRED_BY
,
1709 [UNIT_REQUISITE_OVERRIDABLE
] = UNIT_REQUIRED_BY_OVERRIDABLE
,
1710 [UNIT_BINDS_TO
] = UNIT_BOUND_BY
,
1711 [UNIT_PART_OF
] = UNIT_CONSISTS_OF
,
1712 [UNIT_REQUIRED_BY
] = _UNIT_DEPENDENCY_INVALID
,
1713 [UNIT_REQUIRED_BY_OVERRIDABLE
] = _UNIT_DEPENDENCY_INVALID
,
1714 [UNIT_WANTED_BY
] = _UNIT_DEPENDENCY_INVALID
,
1715 [UNIT_BOUND_BY
] = UNIT_BINDS_TO
,
1716 [UNIT_CONSISTS_OF
] = UNIT_PART_OF
,
1717 [UNIT_CONFLICTS
] = UNIT_CONFLICTED_BY
,
1718 [UNIT_CONFLICTED_BY
] = UNIT_CONFLICTS
,
1719 [UNIT_BEFORE
] = UNIT_AFTER
,
1720 [UNIT_AFTER
] = UNIT_BEFORE
,
1721 [UNIT_ON_FAILURE
] = _UNIT_DEPENDENCY_INVALID
,
1722 [UNIT_REFERENCES
] = UNIT_REFERENCED_BY
,
1723 [UNIT_REFERENCED_BY
] = UNIT_REFERENCES
,
1724 [UNIT_TRIGGERS
] = UNIT_TRIGGERED_BY
,
1725 [UNIT_TRIGGERED_BY
] = UNIT_TRIGGERS
,
1726 [UNIT_PROPAGATES_RELOAD_TO
] = UNIT_RELOAD_PROPAGATED_FROM
,
1727 [UNIT_RELOAD_PROPAGATED_FROM
] = UNIT_PROPAGATES_RELOAD_TO
,
1729 int r
, q
= 0, v
= 0, w
= 0;
1732 assert(d
>= 0 && d
< _UNIT_DEPENDENCY_MAX
);
1735 u
= unit_follow_merge(u
);
1736 other
= unit_follow_merge(other
);
1738 /* We won't allow dependencies on ourselves. We will not
1739 * consider them an error however. */
1743 if ((r
= set_ensure_allocated(&u
->dependencies
[d
], trivial_hash_func
, trivial_compare_func
)) < 0)
1746 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
)
1747 if ((r
= set_ensure_allocated(&other
->dependencies
[inverse_table
[d
]], trivial_hash_func
, trivial_compare_func
)) < 0)
1751 if ((r
= set_ensure_allocated(&u
->dependencies
[UNIT_REFERENCES
], trivial_hash_func
, trivial_compare_func
)) < 0 ||
1752 (r
= set_ensure_allocated(&other
->dependencies
[UNIT_REFERENCED_BY
], trivial_hash_func
, trivial_compare_func
)) < 0)
1755 if ((q
= set_put(u
->dependencies
[d
], other
)) < 0)
1758 if (inverse_table
[d
] != _UNIT_DEPENDENCY_INVALID
)
1759 if ((v
= set_put(other
->dependencies
[inverse_table
[d
]], u
)) < 0) {
1764 if (add_reference
) {
1765 if ((w
= set_put(u
->dependencies
[UNIT_REFERENCES
], other
)) < 0) {
1770 if ((r
= set_put(other
->dependencies
[UNIT_REFERENCED_BY
], u
)) < 0)
1774 unit_add_to_dbus_queue(u
);
1779 set_remove(u
->dependencies
[d
], other
);
1782 set_remove(other
->dependencies
[inverse_table
[d
]], u
);
1785 set_remove(u
->dependencies
[UNIT_REFERENCES
], other
);
1790 int unit_add_two_dependencies(Unit
*u
, UnitDependency d
, UnitDependency e
, Unit
*other
, bool add_reference
) {
1795 if ((r
= unit_add_dependency(u
, d
, other
, add_reference
)) < 0)
1798 if ((r
= unit_add_dependency(u
, e
, other
, add_reference
)) < 0)
1804 static const char *resolve_template(Unit
*u
, const char *name
, const char*path
, char **p
) {
1808 assert(name
|| path
);
1812 name
= path_get_file_name(path
);
1814 if (!unit_name_is_template(name
)) {
1820 s
= unit_name_replace_instance(name
, u
->instance
);
1822 _cleanup_free_
char *i
= NULL
;
1824 i
= unit_name_to_prefix(u
->id
);
1828 s
= unit_name_replace_instance(name
, i
);
1838 int unit_add_dependency_by_name(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
1841 _cleanup_free_
char *s
= NULL
;
1844 assert(name
|| path
);
1846 name
= resolve_template(u
, name
, path
, &s
);
1850 r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
);
1854 return unit_add_dependency(u
, d
, other
, add_reference
);
1857 int unit_add_two_dependencies_by_name(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
1863 assert(name
|| path
);
1865 if (!(name
= resolve_template(u
, name
, path
, &s
)))
1868 if ((r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
)) < 0)
1871 r
= unit_add_two_dependencies(u
, d
, e
, other
, add_reference
);
1878 int unit_add_dependency_by_name_inverse(Unit
*u
, UnitDependency d
, const char *name
, const char *path
, bool add_reference
) {
1884 assert(name
|| path
);
1886 if (!(name
= resolve_template(u
, name
, path
, &s
)))
1889 if ((r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
)) < 0)
1892 r
= unit_add_dependency(other
, d
, u
, add_reference
);
1899 int unit_add_two_dependencies_by_name_inverse(Unit
*u
, UnitDependency d
, UnitDependency e
, const char *name
, const char *path
, bool add_reference
) {
1905 assert(name
|| path
);
1907 if (!(name
= resolve_template(u
, name
, path
, &s
)))
1910 if ((r
= manager_load_unit(u
->manager
, name
, path
, NULL
, &other
)) < 0)
1913 if ((r
= unit_add_two_dependencies(other
, d
, e
, u
, add_reference
)) < 0)
1921 int set_unit_path(const char *p
) {
1922 _cleanup_free_
char *c
= NULL
;
1924 /* This is mostly for debug purposes */
1925 c
= path_make_absolute_cwd(p
);
1926 if (setenv("SYSTEMD_UNIT_PATH", c
, 0) < 0)
1932 char *unit_dbus_path(Unit
*u
) {
1938 return unit_dbus_path_from_name(u
->id
);
1941 static int unit_add_cgroup(Unit
*u
, CGroupBonding
*b
) {
1949 if (!b
->controller
) {
1950 b
->controller
= strdup(SYSTEMD_CGROUP_CONTROLLER
);
1957 /* Ensure this hasn't been added yet */
1960 if (streq(b
->controller
, SYSTEMD_CGROUP_CONTROLLER
)) {
1963 l
= hashmap_get(u
->manager
->cgroup_bondings
, b
->path
);
1964 LIST_PREPEND(CGroupBonding
, by_path
, l
, b
);
1966 r
= hashmap_replace(u
->manager
->cgroup_bondings
, b
->path
, l
);
1968 LIST_REMOVE(CGroupBonding
, by_path
, l
, b
);
1973 LIST_PREPEND(CGroupBonding
, by_unit
, u
->cgroup_bondings
, b
);
1979 char *unit_default_cgroup_path(Unit
*u
) {
1980 _cleanup_free_
char *escaped_instance
= NULL
;
1984 escaped_instance
= cg_escape(u
->id
);
1985 if (!escaped_instance
)
1989 _cleanup_free_
char *t
= NULL
, *escaped_template
= NULL
;
1991 t
= unit_name_template(u
->id
);
1995 escaped_template
= cg_escape(t
);
1996 if (!escaped_template
)
1999 return strjoin(u
->manager
->cgroup_hierarchy
, "/", escaped_template
, "/", escaped_instance
, NULL
);
2001 return strjoin(u
->manager
->cgroup_hierarchy
, "/", escaped_instance
, NULL
);
2004 int unit_add_cgroup_from_text(Unit
*u
, const char *name
, bool overwrite
, CGroupBonding
**ret
) {
2005 char *controller
= NULL
, *path
= NULL
;
2006 CGroupBonding
*b
= NULL
;
2013 r
= cg_split_spec(name
, &controller
, &path
);
2018 path
= unit_default_cgroup_path(u
);
2023 controller
= strdup("systemd");
2027 if (!path
|| !controller
) {
2033 if (streq(controller
, "systemd")) {
2034 /* Within the systemd unit hierarchy we do not allow changes. */
2035 if (path_startswith(path
, "/system")) {
2036 log_warning_unit(u
->id
, "Manipulating the systemd:/system cgroup hierarchy is not permitted.");
2043 b
= cgroup_bonding_find_list(u
->cgroup_bondings
, controller
);
2045 if (streq(path
, b
->path
)) {
2054 if (overwrite
&& !b
->essential
) {
2061 b
->realized
= false;
2074 b
= new0(CGroupBonding
, 1);
2080 b
->controller
= controller
;
2083 b
->essential
= streq(controller
, SYSTEMD_CGROUP_CONTROLLER
);
2085 r
= unit_add_cgroup(u
, b
);
2102 static int unit_add_one_default_cgroup(Unit
*u
, const char *controller
) {
2103 CGroupBonding
*b
= NULL
;
2108 if (controller
&& !cg_controller_is_valid(controller
, true))
2112 controller
= SYSTEMD_CGROUP_CONTROLLER
;
2114 if (cgroup_bonding_find_list(u
->cgroup_bondings
, controller
))
2117 b
= new0(CGroupBonding
, 1);
2121 b
->controller
= strdup(controller
);
2125 b
->path
= unit_default_cgroup_path(u
);
2130 b
->essential
= streq(controller
, SYSTEMD_CGROUP_CONTROLLER
);
2132 r
= unit_add_cgroup(u
, b
);
2140 free(b
->controller
);
2146 int unit_add_default_cgroups(Unit
*u
) {
2153 /* Adds in the default cgroups, if they weren't specified
2156 if (!u
->manager
->cgroup_hierarchy
)
2159 r
= unit_add_one_default_cgroup(u
, NULL
);
2163 STRV_FOREACH(c
, u
->manager
->default_controllers
)
2164 unit_add_one_default_cgroup(u
, *c
);
2166 LIST_FOREACH(by_unit
, a
, u
->cgroup_attributes
)
2167 unit_add_one_default_cgroup(u
, a
->controller
);
2172 CGroupBonding
* unit_get_default_cgroup(Unit
*u
) {
2175 return cgroup_bonding_find_list(u
->cgroup_bondings
, NULL
);
2178 int unit_add_cgroup_attribute(
2180 const CGroupSemantics
*semantics
,
2181 const char *controller
,
2184 CGroupAttribute
**ret
) {
2186 _cleanup_free_
char *c
= NULL
;
2194 /* Semantics always take precedence */
2195 if (semantics
->name
)
2196 name
= semantics
->name
;
2198 if (semantics
->controller
)
2199 controller
= semantics
->controller
;
2206 r
= cg_controller_from_attr(name
, &c
);
2214 streq(controller
, SYSTEMD_CGROUP_CONTROLLER
) ||
2215 streq(controller
, "systemd"))
2218 if (!filename_is_safe(name
))
2221 if (!cg_controller_is_valid(controller
, false))
2224 /* Check if this attribute already exists. Note that we will
2225 * explicitly check for the value here too, as there are
2226 * attributes which accept multiple values. */
2227 a
= cgroup_attribute_find_list(u
->cgroup_attributes
, controller
, name
);
2229 if (streq(value
, a
->value
)) {
2230 /* Exactly the same value is always OK, let's ignore this */
2237 if (semantics
&& !semantics
->multiple
) {
2240 /* If this is a single-item entry, we can
2241 * simply patch the existing attribute */
2256 a
= new0(CGroupAttribute
, 1);
2264 a
->controller
= strdup(controller
);
2266 a
->name
= strdup(name
);
2267 a
->value
= strdup(value
);
2269 if (!a
->controller
|| !a
->name
|| !a
->value
) {
2270 free(a
->controller
);
2277 a
->semantics
= semantics
;
2280 LIST_PREPEND(CGroupAttribute
, by_unit
, u
->cgroup_attributes
, a
);
2288 int unit_load_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2289 _cleanup_free_
char *t
= NULL
;
2296 t
= unit_name_change_suffix(u
->id
, type
);
2300 assert(!unit_has_name(u
, t
));
2302 r
= manager_load_unit(u
->manager
, t
, NULL
, NULL
, _found
);
2303 assert(r
< 0 || *_found
!= u
);
2307 int unit_get_related_unit(Unit
*u
, const char *type
, Unit
**_found
) {
2308 _cleanup_free_
char *t
= NULL
;
2315 t
= unit_name_change_suffix(u
->id
, type
);
2319 assert(!unit_has_name(u
, t
));
2321 found
= manager_get_unit(u
->manager
, t
);
2329 int unit_watch_bus_name(Unit
*u
, const char *name
) {
2333 /* Watch a specific name on the bus. We only support one unit
2334 * watching each name for now. */
2336 return hashmap_put(u
->manager
->watch_bus
, name
, u
);
2339 void unit_unwatch_bus_name(Unit
*u
, const char *name
) {
2343 hashmap_remove_value(u
->manager
->watch_bus
, name
, u
);
2346 bool unit_can_serialize(Unit
*u
) {
2349 return UNIT_VTABLE(u
)->serialize
&& UNIT_VTABLE(u
)->deserialize_item
;
2352 int unit_serialize(Unit
*u
, FILE *f
, FDSet
*fds
, bool serialize_jobs
) {
2359 if (!unit_can_serialize(u
))
2362 if ((r
= UNIT_VTABLE(u
)->serialize(u
, f
, fds
)) < 0)
2366 if (serialize_jobs
) {
2368 fprintf(f
, "job\n");
2369 job_serialize(u
->job
, f
, fds
);
2373 fprintf(f
, "job\n");
2374 job_serialize(u
->nop_job
, f
, fds
);
2378 dual_timestamp_serialize(f
, "inactive-exit-timestamp", &u
->inactive_exit_timestamp
);
2379 dual_timestamp_serialize(f
, "active-enter-timestamp", &u
->active_enter_timestamp
);
2380 dual_timestamp_serialize(f
, "active-exit-timestamp", &u
->active_exit_timestamp
);
2381 dual_timestamp_serialize(f
, "inactive-enter-timestamp", &u
->inactive_enter_timestamp
);
2382 dual_timestamp_serialize(f
, "condition-timestamp", &u
->condition_timestamp
);
2384 if (dual_timestamp_is_set(&u
->condition_timestamp
))
2385 unit_serialize_item(u
, f
, "condition-result", yes_no(u
->condition_result
));
2392 void unit_serialize_item_format(Unit
*u
, FILE *f
, const char *key
, const char *format
, ...) {
2403 va_start(ap
, format
);
2404 vfprintf(f
, format
, ap
);
2410 void unit_serialize_item(Unit
*u
, FILE *f
, const char *key
, const char *value
) {
2416 fprintf(f
, "%s=%s\n", key
, value
);
2419 int unit_deserialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
2426 if (!unit_can_serialize(u
))
2430 char line
[LINE_MAX
], *l
, *v
;
2433 if (!fgets(line
, sizeof(line
), f
)) {
2446 k
= strcspn(l
, "=");
2454 if (streq(l
, "job")) {
2456 /* new-style serialized job */
2457 Job
*j
= job_new_raw(u
);
2461 r
= job_deserialize(j
, f
, fds
);
2467 r
= hashmap_put(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
), j
);
2473 r
= job_install_deserialized(j
);
2475 hashmap_remove(u
->manager
->jobs
, UINT32_TO_PTR(j
->id
));
2480 if (j
->state
== JOB_RUNNING
)
2481 u
->manager
->n_running_jobs
++;
2484 JobType type
= job_type_from_string(v
);
2486 log_debug("Failed to parse job type value %s", v
);
2488 u
->deserialized_job
= type
;
2491 } else if (streq(l
, "inactive-exit-timestamp")) {
2492 dual_timestamp_deserialize(v
, &u
->inactive_exit_timestamp
);
2494 } else if (streq(l
, "active-enter-timestamp")) {
2495 dual_timestamp_deserialize(v
, &u
->active_enter_timestamp
);
2497 } else if (streq(l
, "active-exit-timestamp")) {
2498 dual_timestamp_deserialize(v
, &u
->active_exit_timestamp
);
2500 } else if (streq(l
, "inactive-enter-timestamp")) {
2501 dual_timestamp_deserialize(v
, &u
->inactive_enter_timestamp
);
2503 } else if (streq(l
, "condition-timestamp")) {
2504 dual_timestamp_deserialize(v
, &u
->condition_timestamp
);
2506 } else if (streq(l
, "condition-result")) {
2509 if ((b
= parse_boolean(v
)) < 0)
2510 log_debug("Failed to parse condition result value %s", v
);
2512 u
->condition_result
= b
;
2517 if ((r
= UNIT_VTABLE(u
)->deserialize_item(u
, l
, v
, fds
)) < 0)
2522 int unit_add_node_link(Unit
*u
, const char *what
, bool wants
) {
2532 /* Adds in links to the device node that this unit is based on */
2534 if (!is_device_path(what
))
2537 e
= unit_name_from_path(what
, ".device");
2541 r
= manager_load_unit(u
->manager
, e
, NULL
, NULL
, &device
);
2546 r
= unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_BINDS_TO
, device
, true);
2551 r
= unit_add_dependency(device
, UNIT_WANTS
, u
, false);
2559 int unit_coldplug(Unit
*u
) {
2564 if (UNIT_VTABLE(u
)->coldplug
)
2565 if ((r
= UNIT_VTABLE(u
)->coldplug(u
)) < 0)
2569 r
= job_coldplug(u
->job
);
2572 } else if (u
->deserialized_job
>= 0) {
2574 r
= manager_add_job(u
->manager
, u
->deserialized_job
, u
, JOB_IGNORE_REQUIREMENTS
, false, NULL
, NULL
);
2578 u
->deserialized_job
= _JOB_TYPE_INVALID
;
2584 #pragma GCC diagnostic push
2585 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
2586 void unit_status_printf(Unit
*u
, const char *status
, const char *unit_status_msg_format
) {
2587 manager_status_printf(u
->manager
, false, status
, unit_status_msg_format
, unit_description(u
));
2589 #pragma GCC diagnostic pop
2591 bool unit_need_daemon_reload(Unit
*u
) {
2592 _cleanup_strv_free_
char **t
= NULL
;
2595 unsigned loaded_cnt
, current_cnt
;
2599 if (u
->fragment_path
) {
2601 if (stat(u
->fragment_path
, &st
) < 0)
2602 /* What, cannot access this anymore? */
2605 if (u
->fragment_mtime
> 0 &&
2606 timespec_load(&st
.st_mtim
) != u
->fragment_mtime
)
2610 if (u
->source_path
) {
2612 if (stat(u
->source_path
, &st
) < 0)
2615 if (u
->source_mtime
> 0 &&
2616 timespec_load(&st
.st_mtim
) != u
->source_mtime
)
2620 t
= unit_find_dropin_paths(u
);
2621 loaded_cnt
= strv_length(t
);
2622 current_cnt
= strv_length(u
->dropin_paths
);
2624 if (loaded_cnt
== current_cnt
) {
2625 if (loaded_cnt
== 0)
2628 if (strv_overlap(u
->dropin_paths
, t
)) {
2629 STRV_FOREACH(path
, u
->dropin_paths
) {
2631 if (stat(*path
, &st
) < 0)
2634 if (u
->dropin_mtime
> 0 &&
2635 timespec_load(&st
.st_mtim
) > u
->dropin_mtime
)
2646 void unit_reset_failed(Unit
*u
) {
2649 if (UNIT_VTABLE(u
)->reset_failed
)
2650 UNIT_VTABLE(u
)->reset_failed(u
);
2653 Unit
*unit_following(Unit
*u
) {
2656 if (UNIT_VTABLE(u
)->following
)
2657 return UNIT_VTABLE(u
)->following(u
);
2662 bool unit_stop_pending(Unit
*u
) {
2665 /* This call does check the current state of the unit. It's
2666 * hence useful to be called from state change calls of the
2667 * unit itself, where the state isn't updated yet. This is
2668 * different from unit_inactive_or_pending() which checks both
2669 * the current state and for a queued job. */
2671 return u
->job
&& u
->job
->type
== JOB_STOP
;
2674 bool unit_inactive_or_pending(Unit
*u
) {
2677 /* Returns true if the unit is inactive or going down */
2679 if (unit_stop_pending(u
))
2685 bool unit_active_or_pending(Unit
*u
) {
2688 /* Returns true if the unit is active or going up */
2690 if (UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u
)))
2694 (u
->job
->type
== JOB_START
||
2695 u
->job
->type
== JOB_RELOAD_OR_START
||
2696 u
->job
->type
== JOB_RESTART
))
2702 int unit_kill(Unit
*u
, KillWho w
, int signo
, DBusError
*error
) {
2704 assert(w
>= 0 && w
< _KILL_WHO_MAX
);
2706 assert(signo
< _NSIG
);
2708 if (!UNIT_VTABLE(u
)->kill
)
2711 return UNIT_VTABLE(u
)->kill(u
, w
, signo
, error
);
2714 int unit_kill_common(
2724 if (who
== KILL_MAIN
&& main_pid
<= 0) {
2726 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no main processes", unit_type_to_string(u
->type
));
2728 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No main process to kill");
2732 if (who
== KILL_CONTROL
&& control_pid
<= 0) {
2733 if (control_pid
< 0)
2734 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "%s units have no control processes", unit_type_to_string(u
->type
));
2736 dbus_set_error(error
, BUS_ERROR_NO_SUCH_PROCESS
, "No control process to kill");
2740 if (who
== KILL_CONTROL
|| who
== KILL_ALL
)
2741 if (control_pid
> 0)
2742 if (kill(control_pid
, signo
) < 0)
2745 if (who
== KILL_MAIN
|| who
== KILL_ALL
)
2747 if (kill(main_pid
, signo
) < 0)
2750 if (who
== KILL_ALL
) {
2751 _cleanup_set_free_ Set
*pid_set
= NULL
;
2754 pid_set
= set_new(trivial_hash_func
, trivial_compare_func
);
2758 /* Exclude the control/main pid from being killed via the cgroup */
2759 if (control_pid
> 0) {
2760 q
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
2766 q
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
2771 q
= cgroup_bonding_kill_list(u
->cgroup_bondings
, signo
, false, false, pid_set
, NULL
);
2772 if (q
< 0 && q
!= -EAGAIN
&& q
!= -ESRCH
&& q
!= -ENOENT
)
2779 int unit_following_set(Unit
*u
, Set
**s
) {
2783 if (UNIT_VTABLE(u
)->following_set
)
2784 return UNIT_VTABLE(u
)->following_set(u
, s
);
2790 UnitFileState
unit_get_unit_file_state(Unit
*u
) {
2793 if (u
->unit_file_state
< 0 && u
->fragment_path
)
2794 u
->unit_file_state
= unit_file_get_state(
2795 u
->manager
->running_as
== SYSTEMD_SYSTEM
? UNIT_FILE_SYSTEM
: UNIT_FILE_USER
,
2796 NULL
, path_get_file_name(u
->fragment_path
));
2798 return u
->unit_file_state
;
2801 Unit
* unit_ref_set(UnitRef
*ref
, Unit
*u
) {
2806 unit_ref_unset(ref
);
2809 LIST_PREPEND(UnitRef
, refs
, u
->refs
, ref
);
2813 void unit_ref_unset(UnitRef
*ref
) {
2819 LIST_REMOVE(UnitRef
, refs
, ref
->unit
->refs
, ref
);
2823 int unit_add_one_mount_link(Unit
*u
, Mount
*m
) {
2829 if (u
->load_state
!= UNIT_LOADED
||
2830 UNIT(m
)->load_state
!= UNIT_LOADED
)
2833 STRV_FOREACH(i
, u
->requires_mounts_for
) {
2838 if (!path_startswith(*i
, m
->where
))
2841 return unit_add_two_dependencies(u
, UNIT_AFTER
, UNIT_REQUIRES
, UNIT(m
), true);
2847 int unit_add_mount_links(Unit
*u
) {
2853 LIST_FOREACH(units_by_type
, other
, u
->manager
->units_by_type
[UNIT_MOUNT
]) {
2854 r
= unit_add_one_mount_link(u
, MOUNT(other
));
2862 int unit_exec_context_defaults(Unit
*u
, ExecContext
*c
) {
2869 /* This only copies in the ones that need memory */
2871 for (i
= 0; i
< RLIMIT_NLIMITS
; i
++)
2872 if (u
->manager
->rlimit
[i
] && !c
->rlimit
[i
]) {
2873 c
->rlimit
[i
] = newdup(struct rlimit
, u
->manager
->rlimit
[i
], 1);
2878 if (u
->manager
->running_as
== SYSTEMD_USER
&&
2879 !c
->working_directory
) {
2881 r
= get_home_dir(&c
->working_directory
);
2889 ExecContext
*unit_get_exec_context(Unit
*u
) {
2893 offset
= UNIT_VTABLE(u
)->exec_context_offset
;
2897 return (ExecContext
*) ((uint8_t*) u
+ offset
);
2900 static int drop_in_file(Unit
*u
, bool runtime
, const char *name
, char **_p
, char **_q
) {
2909 if (u
->manager
->running_as
== SYSTEMD_USER
&& runtime
)
2912 if (!filename_is_safe(name
))
2915 if (u
->manager
->running_as
== SYSTEMD_USER
) {
2916 _cleanup_free_
char *c
= NULL
;
2918 r
= user_config_home(&c
);
2924 p
= strjoin(c
, "/", u
->id
, ".d", NULL
);
2926 p
= strjoin("/run/systemd/system/", u
->id
, ".d", NULL
);
2928 p
= strjoin("/etc/systemd/system/", u
->id
, ".d", NULL
);
2932 q
= strjoin(p
, "/50-", name
, ".conf", NULL
);
2943 int unit_write_drop_in(Unit
*u
, bool runtime
, const char *name
, const char *data
) {
2944 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
2949 r
= drop_in_file(u
, runtime
, name
, &p
, &q
);
2954 return write_string_file_atomic_label(q
, data
);
2957 int unit_remove_drop_in(Unit
*u
, bool runtime
, const char *name
) {
2958 _cleanup_free_
char *p
= NULL
, *q
= NULL
;
2963 r
= drop_in_file(u
, runtime
, name
, &p
, &q
);
2973 int unit_kill_context(
2979 bool main_pid_alien
) {
2981 int sig
, wait_for_exit
= 0, r
;
2986 if (c
->kill_mode
== KILL_NONE
)
2989 sig
= sigkill
? SIGKILL
: c
->kill_signal
;
2992 r
= kill_and_sigcont(main_pid
, sig
);
2994 if (r
< 0 && r
!= -ESRCH
) {
2995 _cleanup_free_
char *comm
= NULL
;
2996 get_process_comm(main_pid
, &comm
);
2998 log_warning_unit(u
->id
, "Failed to kill main process %li (%s): %s",
2999 (long) main_pid
, strna(comm
), strerror(-r
));
3001 wait_for_exit
= !main_pid_alien
;
3004 if (control_pid
> 0) {
3005 r
= kill_and_sigcont(control_pid
, sig
);
3007 if (r
< 0 && r
!= -ESRCH
) {
3008 _cleanup_free_
char *comm
= NULL
;
3009 get_process_comm(control_pid
, &comm
);
3011 log_warning_unit(u
->id
,
3012 "Failed to kill control process %li (%s): %s",
3013 (long) control_pid
, strna(comm
), strerror(-r
));
3015 wait_for_exit
= true;
3018 if (c
->kill_mode
== KILL_CONTROL_GROUP
) {
3019 _cleanup_set_free_ Set
*pid_set
= NULL
;
3021 pid_set
= set_new(trivial_hash_func
, trivial_compare_func
);
3025 /* Exclude the main/control pids from being killed via the cgroup */
3027 r
= set_put(pid_set
, LONG_TO_PTR(main_pid
));
3032 if (control_pid
> 0) {
3033 r
= set_put(pid_set
, LONG_TO_PTR(control_pid
));
3038 r
= cgroup_bonding_kill_list(u
->cgroup_bondings
, sig
, true, false, pid_set
, NULL
);
3040 if (r
!= -EAGAIN
&& r
!= -ESRCH
&& r
!= -ENOENT
)
3041 log_warning_unit(u
->id
, "Failed to kill control group: %s", strerror(-r
));
3043 wait_for_exit
= true;
3046 return wait_for_exit
;
3049 static const char* const unit_active_state_table
[_UNIT_ACTIVE_STATE_MAX
] = {
3050 [UNIT_ACTIVE
] = "active",
3051 [UNIT_RELOADING
] = "reloading",
3052 [UNIT_INACTIVE
] = "inactive",
3053 [UNIT_FAILED
] = "failed",
3054 [UNIT_ACTIVATING
] = "activating",
3055 [UNIT_DEACTIVATING
] = "deactivating"
3058 DEFINE_STRING_TABLE_LOOKUP(unit_active_state
, UnitActiveState
);
3060 static const char* const unit_dependency_table
[_UNIT_DEPENDENCY_MAX
] = {
3061 [UNIT_REQUIRES
] = "Requires",
3062 [UNIT_REQUIRES_OVERRIDABLE
] = "RequiresOverridable",
3063 [UNIT_REQUISITE
] = "Requisite",
3064 [UNIT_REQUISITE_OVERRIDABLE
] = "RequisiteOverridable",
3065 [UNIT_WANTS
] = "Wants",
3066 [UNIT_BINDS_TO
] = "BindsTo",
3067 [UNIT_PART_OF
] = "PartOf",
3068 [UNIT_REQUIRED_BY
] = "RequiredBy",
3069 [UNIT_REQUIRED_BY_OVERRIDABLE
] = "RequiredByOverridable",
3070 [UNIT_WANTED_BY
] = "WantedBy",
3071 [UNIT_BOUND_BY
] = "BoundBy",
3072 [UNIT_CONSISTS_OF
] = "ConsistsOf",
3073 [UNIT_CONFLICTS
] = "Conflicts",
3074 [UNIT_CONFLICTED_BY
] = "ConflictedBy",
3075 [UNIT_BEFORE
] = "Before",
3076 [UNIT_AFTER
] = "After",
3077 [UNIT_ON_FAILURE
] = "OnFailure",
3078 [UNIT_TRIGGERS
] = "Triggers",
3079 [UNIT_TRIGGERED_BY
] = "TriggeredBy",
3080 [UNIT_PROPAGATES_RELOAD_TO
] = "PropagatesReloadTo",
3081 [UNIT_RELOAD_PROPAGATED_FROM
] = "ReloadPropagatedFrom",
3082 [UNIT_REFERENCES
] = "References",
3083 [UNIT_REFERENCED_BY
] = "ReferencedBy",
3086 DEFINE_STRING_TABLE_LOOKUP(unit_dependency
, UnitDependency
);