1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 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/>.
24 #include "alloc-util.h"
25 #include "bus-internal.h"
26 #include "bus-kernel.h"
27 #include "bus-policy.h"
30 #include "dbus-busname.h"
32 #include "formats-util.h"
34 #include "parse-util.h"
36 #include "signal-util.h"
38 #include "string-table.h"
39 #include "string-util.h"
41 static const UnitActiveState state_translation_table
[_BUSNAME_STATE_MAX
] = {
42 [BUSNAME_DEAD
] = UNIT_INACTIVE
,
43 [BUSNAME_MAKING
] = UNIT_ACTIVATING
,
44 [BUSNAME_REGISTERED
] = UNIT_ACTIVE
,
45 [BUSNAME_LISTENING
] = UNIT_ACTIVE
,
46 [BUSNAME_RUNNING
] = UNIT_ACTIVE
,
47 [BUSNAME_SIGTERM
] = UNIT_DEACTIVATING
,
48 [BUSNAME_SIGKILL
] = UNIT_DEACTIVATING
,
49 [BUSNAME_FAILED
] = UNIT_FAILED
52 static int busname_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
53 static int busname_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
55 static void busname_init(Unit
*u
) {
56 BusName
*n
= BUSNAME(u
);
59 assert(u
->load_state
== UNIT_STUB
);
65 n
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
68 static void busname_unwatch_control_pid(BusName
*n
) {
71 if (n
->control_pid
<= 0)
74 unit_unwatch_pid(UNIT(n
), n
->control_pid
);
78 static void busname_free_policy(BusName
*n
) {
83 while ((p
= n
->policy
)) {
84 LIST_REMOVE(policy
, n
->policy
, p
);
91 static void busname_close_fd(BusName
*n
) {
94 n
->starter_event_source
= sd_event_source_unref(n
->starter_event_source
);
95 n
->starter_fd
= safe_close(n
->starter_fd
);
98 static void busname_done(Unit
*u
) {
99 BusName
*n
= BUSNAME(u
);
103 n
->name
= mfree(n
->name
);
105 busname_free_policy(n
);
106 busname_unwatch_control_pid(n
);
109 unit_ref_unset(&n
->service
);
111 n
->timer_event_source
= sd_event_source_unref(n
->timer_event_source
);
114 static int busname_arm_timer(BusName
*n
) {
119 if (n
->timeout_usec
<= 0) {
120 n
->timer_event_source
= sd_event_source_unref(n
->timer_event_source
);
124 if (n
->timer_event_source
) {
125 r
= sd_event_source_set_time(n
->timer_event_source
, now(CLOCK_MONOTONIC
) + n
->timeout_usec
);
129 return sd_event_source_set_enabled(n
->timer_event_source
, SD_EVENT_ONESHOT
);
132 r
= sd_event_add_time(
133 UNIT(n
)->manager
->event
,
134 &n
->timer_event_source
,
136 now(CLOCK_MONOTONIC
) + n
->timeout_usec
, 0,
137 busname_dispatch_timer
, n
);
141 (void) sd_event_source_set_description(n
->timer_event_source
, "busname-timer");
146 static int busname_add_default_default_dependencies(BusName
*n
) {
151 r
= unit_add_dependency_by_name(UNIT(n
), UNIT_BEFORE
, SPECIAL_BUSNAMES_TARGET
, NULL
, true);
155 if (UNIT(n
)->manager
->running_as
== MANAGER_SYSTEM
) {
156 r
= unit_add_two_dependencies_by_name(UNIT(n
), UNIT_AFTER
, UNIT_REQUIRES
, SPECIAL_SYSINIT_TARGET
, NULL
, true);
161 return unit_add_two_dependencies_by_name(UNIT(n
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_SHUTDOWN_TARGET
, NULL
, true);
164 static int busname_add_extras(BusName
*n
) {
171 r
= unit_name_to_prefix(u
->id
, &n
->name
);
176 if (!u
->description
) {
177 r
= unit_set_description(u
, n
->name
);
183 if (!UNIT_DEREF(n
->service
)) {
186 r
= unit_load_related_unit(u
, ".service", &x
);
190 unit_ref_set(&n
->service
, x
);
193 r
= unit_add_two_dependencies(u
, UNIT_BEFORE
, UNIT_TRIGGERS
, UNIT_DEREF(n
->service
), true);
198 if (u
->default_dependencies
) {
199 r
= busname_add_default_default_dependencies(n
);
207 static int busname_verify(BusName
*n
) {
212 if (UNIT(n
)->load_state
!= UNIT_LOADED
)
215 if (!service_name_is_valid(n
->name
)) {
216 log_unit_error(UNIT(n
), "Name= setting is not a valid service name Refusing.");
220 e
= strjoina(n
->name
, ".busname");
221 if (!unit_has_name(UNIT(n
), e
)) {
222 log_unit_error(UNIT(n
), "Name= setting doesn't match unit name. Refusing.");
229 static int busname_load(Unit
*u
) {
230 BusName
*n
= BUSNAME(u
);
234 assert(u
->load_state
== UNIT_STUB
);
236 r
= unit_load_fragment_and_dropin(u
);
240 if (u
->load_state
== UNIT_LOADED
) {
241 /* This is a new unit? Then let's add in some extras */
242 r
= busname_add_extras(n
);
247 return busname_verify(n
);
250 static void busname_dump(Unit
*u
, FILE *f
, const char *prefix
) {
251 BusName
*n
= BUSNAME(u
);
257 "%sBus Name State: %s\n"
262 prefix
, busname_state_to_string(n
->state
),
263 prefix
, busname_result_to_string(n
->result
),
265 prefix
, yes_no(n
->activating
),
266 prefix
, yes_no(n
->accept_fd
));
268 if (n
->control_pid
> 0)
270 "%sControl PID: "PID_FMT
"\n",
271 prefix
, n
->control_pid
);
274 static void busname_unwatch_fd(BusName
*n
) {
279 if (!n
->starter_event_source
)
282 r
= sd_event_source_set_enabled(n
->starter_event_source
, SD_EVENT_OFF
);
284 log_unit_debug_errno(UNIT(n
), r
, "Failed to disable event source: %m");
287 static int busname_watch_fd(BusName
*n
) {
292 if (n
->starter_fd
< 0)
295 if (n
->starter_event_source
) {
296 r
= sd_event_source_set_enabled(n
->starter_event_source
, SD_EVENT_ON
);
300 r
= sd_event_add_io(UNIT(n
)->manager
->event
, &n
->starter_event_source
, n
->starter_fd
, EPOLLIN
, busname_dispatch_io
, n
);
304 (void) sd_event_source_set_description(n
->starter_event_source
, "busname-starter");
310 log_unit_warning_errno(UNIT(n
), r
, "Failed to watch starter fd: %m");
311 busname_unwatch_fd(n
);
315 static int busname_open_fd(BusName
*n
) {
316 _cleanup_free_
char *path
= NULL
;
321 if (n
->starter_fd
>= 0)
324 mode
= UNIT(n
)->manager
->running_as
== MANAGER_SYSTEM
? "system" : "user";
325 n
->starter_fd
= bus_kernel_open_bus_fd(mode
, &path
);
326 if (n
->starter_fd
< 0)
327 return log_unit_warning_errno(UNIT(n
), n
->starter_fd
, "Failed to open %s: %m", path
?: "kdbus");
332 static void busname_set_state(BusName
*n
, BusNameState state
) {
333 BusNameState old_state
;
336 old_state
= n
->state
;
339 if (!IN_SET(state
, BUSNAME_MAKING
, BUSNAME_SIGTERM
, BUSNAME_SIGKILL
)) {
340 n
->timer_event_source
= sd_event_source_unref(n
->timer_event_source
);
341 busname_unwatch_control_pid(n
);
344 if (state
!= BUSNAME_LISTENING
)
345 busname_unwatch_fd(n
);
347 if (!IN_SET(state
, BUSNAME_LISTENING
, BUSNAME_MAKING
, BUSNAME_REGISTERED
, BUSNAME_RUNNING
))
350 if (state
!= old_state
)
351 log_unit_debug(UNIT(n
), "Changed %s -> %s", busname_state_to_string(old_state
), busname_state_to_string(state
));
353 unit_notify(UNIT(n
), state_translation_table
[old_state
], state_translation_table
[state
], true);
356 static int busname_coldplug(Unit
*u
) {
357 BusName
*n
= BUSNAME(u
);
361 assert(n
->state
== BUSNAME_DEAD
);
363 if (n
->deserialized_state
== n
->state
)
366 if (IN_SET(n
->deserialized_state
, BUSNAME_MAKING
, BUSNAME_SIGTERM
, BUSNAME_SIGKILL
)) {
368 if (n
->control_pid
<= 0)
371 r
= unit_watch_pid(UNIT(n
), n
->control_pid
);
375 r
= busname_arm_timer(n
);
380 if (IN_SET(n
->deserialized_state
, BUSNAME_MAKING
, BUSNAME_LISTENING
, BUSNAME_REGISTERED
, BUSNAME_RUNNING
)) {
381 r
= busname_open_fd(n
);
386 if (n
->deserialized_state
== BUSNAME_LISTENING
) {
387 r
= busname_watch_fd(n
);
392 busname_set_state(n
, n
->deserialized_state
);
396 static int busname_make_starter(BusName
*n
, pid_t
*_pid
) {
400 r
= busname_arm_timer(n
);
404 /* We have to resolve the user/group names out-of-process,
405 * hence let's fork here. It's messy, but well, what can we
415 (void) default_signals(SIGNALS_CRASH_HANDLER
, SIGNALS_IGNORE
, -1);
416 (void) ignore_signals(SIGPIPE
, -1);
419 r
= bus_kernel_make_starter(n
->starter_fd
, n
->name
, n
->activating
, n
->accept_fd
, n
->policy
, n
->policy_world
);
421 ret
= EXIT_MAKE_STARTER
;
429 log_error_errno(r
, "Failed to create starter connection at step %s: %m", exit_status_to_string(ret
, EXIT_STATUS_SYSTEMD
));
434 r
= unit_watch_pid(UNIT(n
), pid
);
442 n
->timer_event_source
= sd_event_source_unref(n
->timer_event_source
);
446 static void busname_enter_dead(BusName
*n
, BusNameResult f
) {
449 if (f
!= BUSNAME_SUCCESS
)
452 busname_set_state(n
, n
->result
!= BUSNAME_SUCCESS
? BUSNAME_FAILED
: BUSNAME_DEAD
);
455 static void busname_enter_signal(BusName
*n
, BusNameState state
, BusNameResult f
) {
456 KillContext kill_context
= {};
461 if (f
!= BUSNAME_SUCCESS
)
464 kill_context_init(&kill_context
);
466 r
= unit_kill_context(UNIT(n
),
468 state
!= BUSNAME_SIGTERM
? KILL_KILL
: KILL_TERMINATE
,
473 log_unit_warning_errno(UNIT(n
), r
, "Failed to kill control process: %m");
478 r
= busname_arm_timer(n
);
480 log_unit_warning_errno(UNIT(n
), r
, "Failed to arm timer: %m");
484 busname_set_state(n
, state
);
485 } else if (state
== BUSNAME_SIGTERM
)
486 busname_enter_signal(n
, BUSNAME_SIGKILL
, BUSNAME_SUCCESS
);
488 busname_enter_dead(n
, BUSNAME_SUCCESS
);
493 busname_enter_dead(n
, BUSNAME_FAILURE_RESOURCES
);
496 static void busname_enter_listening(BusName
*n
) {
502 r
= busname_watch_fd(n
);
504 log_unit_warning_errno(UNIT(n
), r
, "Failed to watch names: %m");
508 busname_set_state(n
, BUSNAME_LISTENING
);
510 busname_set_state(n
, BUSNAME_REGISTERED
);
515 busname_enter_signal(n
, BUSNAME_SIGTERM
, BUSNAME_FAILURE_RESOURCES
);
518 static void busname_enter_making(BusName
*n
) {
523 r
= busname_open_fd(n
);
528 /* If there is a policy, we need to resolve user/group
529 * names, which we can't do from PID1, hence let's
531 busname_unwatch_control_pid(n
);
533 r
= busname_make_starter(n
, &n
->control_pid
);
535 log_unit_warning_errno(UNIT(n
), r
, "Failed to fork 'making' task: %m");
539 busname_set_state(n
, BUSNAME_MAKING
);
541 /* If there is no policy, we can do everything
542 * directly from PID 1, hence do so. */
544 r
= bus_kernel_make_starter(n
->starter_fd
, n
->name
, n
->activating
, n
->accept_fd
, NULL
, n
->policy_world
);
546 log_unit_warning_errno(UNIT(n
), r
, "Failed to make starter: %m");
550 busname_enter_listening(n
);
556 busname_enter_dead(n
, BUSNAME_FAILURE_RESOURCES
);
559 static void busname_enter_running(BusName
*n
) {
560 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
561 bool pending
= false;
571 /* We don't take connections anymore if we are supposed to
572 * shut down anyway */
574 if (unit_stop_pending(UNIT(n
))) {
575 log_unit_debug(UNIT(n
), "Suppressing activation request since unit stop is scheduled.");
577 /* Flush all queued activation reqeuest by closing and reopening the connection */
578 bus_kernel_drop_one(n
->starter_fd
);
580 busname_enter_listening(n
);
584 /* If there's already a start pending don't bother to do
586 SET_FOREACH(other
, UNIT(n
)->dependencies
[UNIT_TRIGGERS
], i
)
587 if (unit_active_or_pending(other
)) {
593 if (!UNIT_ISSET(n
->service
)) {
594 log_unit_error(UNIT(n
), "Service to activate vanished, refusing activation.");
599 r
= manager_add_job(UNIT(n
)->manager
, JOB_START
, UNIT_DEREF(n
->service
), JOB_REPLACE
, true, &error
, NULL
);
604 busname_set_state(n
, BUSNAME_RUNNING
);
608 log_unit_warning(UNIT(n
), "Failed to queue service startup job: %s", bus_error_message(&error
, r
));
609 busname_enter_dead(n
, BUSNAME_FAILURE_RESOURCES
);
612 static int busname_start(Unit
*u
) {
613 BusName
*n
= BUSNAME(u
);
617 /* We cannot fulfill this request right now, try again later
619 if (IN_SET(n
->state
, BUSNAME_SIGTERM
, BUSNAME_SIGKILL
))
623 if (n
->state
== BUSNAME_MAKING
)
626 if (n
->activating
&& UNIT_ISSET(n
->service
)) {
629 service
= SERVICE(UNIT_DEREF(n
->service
));
631 if (UNIT(service
)->load_state
!= UNIT_LOADED
) {
632 log_unit_error(u
, "Bus service %s not loaded, refusing.", UNIT(service
)->id
);
637 assert(IN_SET(n
->state
, BUSNAME_DEAD
, BUSNAME_FAILED
));
639 n
->result
= BUSNAME_SUCCESS
;
640 busname_enter_making(n
);
645 static int busname_stop(Unit
*u
) {
646 BusName
*n
= BUSNAME(u
);
651 if (IN_SET(n
->state
, BUSNAME_SIGTERM
, BUSNAME_SIGKILL
))
654 /* If there's already something running, we go directly into
657 if (n
->state
== BUSNAME_MAKING
) {
658 busname_enter_signal(n
, BUSNAME_SIGTERM
, BUSNAME_SUCCESS
);
662 assert(IN_SET(n
->state
, BUSNAME_REGISTERED
, BUSNAME_LISTENING
, BUSNAME_RUNNING
));
664 busname_enter_dead(n
, BUSNAME_SUCCESS
);
668 static int busname_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
669 BusName
*n
= BUSNAME(u
);
676 unit_serialize_item(u
, f
, "state", busname_state_to_string(n
->state
));
677 unit_serialize_item(u
, f
, "result", busname_result_to_string(n
->result
));
679 if (n
->control_pid
> 0)
680 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, n
->control_pid
);
682 r
= unit_serialize_item_fd(u
, f
, fds
, "starter-fd", n
->starter_fd
);
689 static int busname_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
690 BusName
*n
= BUSNAME(u
);
696 if (streq(key
, "state")) {
699 state
= busname_state_from_string(value
);
701 log_unit_debug(u
, "Failed to parse state value: %s", value
);
703 n
->deserialized_state
= state
;
705 } else if (streq(key
, "result")) {
708 f
= busname_result_from_string(value
);
710 log_unit_debug(u
, "Failed to parse result value: %s", value
);
711 else if (f
!= BUSNAME_SUCCESS
)
714 } else if (streq(key
, "control-pid")) {
717 if (parse_pid(value
, &pid
) < 0)
718 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
720 n
->control_pid
= pid
;
721 } else if (streq(key
, "starter-fd")) {
724 if (safe_atoi(value
, &fd
) < 0 || fd
< 0 || !fdset_contains(fds
, fd
))
725 log_unit_debug(u
, "Failed to parse starter fd value: %s", value
);
727 safe_close(n
->starter_fd
);
728 n
->starter_fd
= fdset_remove(fds
, fd
);
731 log_unit_debug(u
, "Unknown serialization key: %s", key
);
736 _pure_
static UnitActiveState
busname_active_state(Unit
*u
) {
739 return state_translation_table
[BUSNAME(u
)->state
];
742 _pure_
static const char *busname_sub_state_to_string(Unit
*u
) {
745 return busname_state_to_string(BUSNAME(u
)->state
);
748 static int busname_peek_message(BusName
*n
) {
749 struct kdbus_cmd_recv cmd_recv
= {
750 .size
= sizeof(cmd_recv
),
751 .flags
= KDBUS_RECV_PEEK
,
753 struct kdbus_cmd_free cmd_free
= {
754 .size
= sizeof(cmd_free
),
756 const char *comm
= NULL
;
757 struct kdbus_item
*d
;
759 size_t start
, ps
, sz
, delta
;
764 /* Generate a friendly debug log message about which process
765 * caused triggering of this bus name. This simply peeks the
766 * metadata of the first queued message and logs it. */
770 /* Let's shortcut things a bit, if debug logging is turned off
773 if (log_get_max_level() < LOG_DEBUG
)
776 r
= ioctl(n
->starter_fd
, KDBUS_CMD_RECV
, &cmd_recv
);
778 if (errno
== EINTR
|| errno
== EAGAIN
)
781 return log_unit_error_errno(UNIT(n
), errno
, "Failed to query activation message: %m");
784 /* We map as late as possible, and unmap imemdiately after
785 * use. On 32bit address space is scarce and we want to be
786 * able to handle a lot of activator connections at the same
787 * time, and hence shouldn't keep the mmap()s around for
788 * longer than necessary. */
791 start
= (cmd_recv
.msg
.offset
/ ps
) * ps
;
792 delta
= cmd_recv
.msg
.offset
- start
;
793 sz
= PAGE_ALIGN(delta
+ cmd_recv
.msg
.msg_size
);
795 p
= mmap(NULL
, sz
, PROT_READ
, MAP_SHARED
, n
->starter_fd
, start
);
796 if (p
== MAP_FAILED
) {
797 r
= log_unit_error_errno(UNIT(n
), errno
, "Failed to map activation message: %m");
801 k
= (struct kdbus_msg
*) ((uint8_t *) p
+ delta
);
802 KDBUS_ITEM_FOREACH(d
, k
, items
) {
805 case KDBUS_ITEM_PIDS
:
809 case KDBUS_ITEM_PID_COMM
:
816 log_unit_debug(UNIT(n
), "Activation triggered by process " PID_FMT
" (%s)", pid
, strna(comm
));
822 (void) munmap(p
, sz
);
824 cmd_free
.offset
= cmd_recv
.msg
.offset
;
825 if (ioctl(n
->starter_fd
, KDBUS_CMD_FREE
, &cmd_free
) < 0)
826 log_unit_warning(UNIT(n
), "Failed to free peeked message, ignoring: %m");
831 static int busname_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
832 BusName
*n
= userdata
;
837 if (n
->state
!= BUSNAME_LISTENING
)
840 log_unit_debug(UNIT(n
), "Activation request");
842 if (revents
!= EPOLLIN
) {
843 log_unit_error(UNIT(n
), "Got unexpected poll event (0x%x) on starter fd.", revents
);
847 busname_peek_message(n
);
848 busname_enter_running(n
);
852 busname_enter_dead(n
, BUSNAME_FAILURE_RESOURCES
);
856 static void busname_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
857 BusName
*n
= BUSNAME(u
);
863 if (pid
!= n
->control_pid
)
868 if (is_clean_exit(code
, status
, NULL
))
870 else if (code
== CLD_EXITED
)
871 f
= BUSNAME_FAILURE_EXIT_CODE
;
872 else if (code
== CLD_KILLED
)
873 f
= BUSNAME_FAILURE_SIGNAL
;
874 else if (code
== CLD_DUMPED
)
875 f
= BUSNAME_FAILURE_CORE_DUMP
;
877 assert_not_reached("Unknown sigchld code");
879 log_unit_full(u
, f
== BUSNAME_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
880 "Control process exited, code=%s status=%i", sigchld_code_to_string(code
), status
);
882 if (f
!= BUSNAME_SUCCESS
)
888 if (f
== BUSNAME_SUCCESS
)
889 busname_enter_listening(n
);
891 busname_enter_signal(n
, BUSNAME_SIGTERM
, f
);
894 case BUSNAME_SIGTERM
:
895 case BUSNAME_SIGKILL
:
896 busname_enter_dead(n
, f
);
900 assert_not_reached("Uh, control process died at wrong time.");
903 /* Notify clients about changed exit status */
904 unit_add_to_dbus_queue(u
);
907 static int busname_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
908 BusName
*n
= BUSNAME(userdata
);
911 assert(n
->timer_event_source
== source
);
916 log_unit_warning(UNIT(n
), "Making timed out. Terminating.");
917 busname_enter_signal(n
, BUSNAME_SIGTERM
, BUSNAME_FAILURE_TIMEOUT
);
920 case BUSNAME_SIGTERM
:
921 log_unit_warning(UNIT(n
), "Stopping timed out. Killing.");
922 busname_enter_signal(n
, BUSNAME_SIGKILL
, BUSNAME_FAILURE_TIMEOUT
);
925 case BUSNAME_SIGKILL
:
926 log_unit_warning(UNIT(n
), "Processes still around after SIGKILL. Ignoring.");
927 busname_enter_dead(n
, BUSNAME_FAILURE_TIMEOUT
);
931 assert_not_reached("Timeout at wrong time.");
937 static void busname_reset_failed(Unit
*u
) {
938 BusName
*n
= BUSNAME(u
);
942 if (n
->state
== BUSNAME_FAILED
)
943 busname_set_state(n
, BUSNAME_DEAD
);
945 n
->result
= BUSNAME_SUCCESS
;
948 static void busname_trigger_notify(Unit
*u
, Unit
*other
) {
949 BusName
*n
= BUSNAME(u
);
955 if (!IN_SET(n
->state
, BUSNAME_RUNNING
, BUSNAME_LISTENING
))
958 if (other
->load_state
!= UNIT_LOADED
|| other
->type
!= UNIT_SERVICE
)
963 if (s
->state
== SERVICE_FAILED
&& s
->result
== SERVICE_FAILURE_START_LIMIT
)
964 busname_enter_dead(n
, BUSNAME_FAILURE_SERVICE_FAILED_PERMANENT
);
965 else if (IN_SET(s
->state
,
966 SERVICE_DEAD
, SERVICE_FAILED
,
967 SERVICE_STOP
, SERVICE_STOP_SIGTERM
, SERVICE_STOP_SIGKILL
,
968 SERVICE_STOP_POST
, SERVICE_FINAL_SIGTERM
, SERVICE_FINAL_SIGKILL
,
969 SERVICE_AUTO_RESTART
))
970 busname_enter_listening(n
);
973 static int busname_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
974 return unit_kill_common(u
, who
, signo
, -1, BUSNAME(u
)->control_pid
, error
);
977 static int busname_get_timeout(Unit
*u
, uint64_t *timeout
) {
978 BusName
*n
= BUSNAME(u
);
981 if (!n
->timer_event_source
)
984 r
= sd_event_source_get_time(n
->timer_event_source
, timeout
);
991 static bool busname_supported(void) {
992 static int supported
= -1;
995 supported
= is_kdbus_available();
1000 static const char* const busname_result_table
[_BUSNAME_RESULT_MAX
] = {
1001 [BUSNAME_SUCCESS
] = "success",
1002 [BUSNAME_FAILURE_RESOURCES
] = "resources",
1003 [BUSNAME_FAILURE_TIMEOUT
] = "timeout",
1004 [BUSNAME_FAILURE_EXIT_CODE
] = "exit-code",
1005 [BUSNAME_FAILURE_SIGNAL
] = "signal",
1006 [BUSNAME_FAILURE_CORE_DUMP
] = "core-dump",
1007 [BUSNAME_FAILURE_SERVICE_FAILED_PERMANENT
] = "service-failed-permanent",
1010 DEFINE_STRING_TABLE_LOOKUP(busname_result
, BusNameResult
);
1012 const UnitVTable busname_vtable
= {
1013 .object_size
= sizeof(BusName
),
1019 .private_section
= "BusName",
1022 .no_instances
= true,
1024 .init
= busname_init
,
1025 .done
= busname_done
,
1026 .load
= busname_load
,
1028 .coldplug
= busname_coldplug
,
1030 .dump
= busname_dump
,
1032 .start
= busname_start
,
1033 .stop
= busname_stop
,
1035 .kill
= busname_kill
,
1037 .get_timeout
= busname_get_timeout
,
1039 .serialize
= busname_serialize
,
1040 .deserialize_item
= busname_deserialize_item
,
1042 .active_state
= busname_active_state
,
1043 .sub_state_to_string
= busname_sub_state_to_string
,
1045 .sigchld_event
= busname_sigchld_event
,
1047 .trigger_notify
= busname_trigger_notify
,
1049 .reset_failed
= busname_reset_failed
,
1051 .supported
= busname_supported
,
1053 .bus_vtable
= bus_busname_vtable
,
1055 .status_message_formats
= {
1056 .finished_start_job
= {
1057 [JOB_DONE
] = "Listening on %s.",
1058 [JOB_FAILED
] = "Failed to listen on %s.",
1060 .finished_stop_job
= {
1061 [JOB_DONE
] = "Closed %s.",
1062 [JOB_FAILED
] = "Failed stopping %s.",