1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
31 #include "alloc-util.h"
32 #include "bus-container.h"
33 #include "bus-control.h"
34 #include "bus-internal.h"
35 #include "bus-kernel.h"
36 #include "bus-label.h"
37 #include "bus-message.h"
38 #include "bus-objects.h"
39 #include "bus-protocol.h"
41 #include "bus-socket.h"
42 #include "bus-track.h"
45 #include "cgroup-util.h"
48 #include "hexdecoct.h"
49 #include "hostname-util.h"
52 #include "parse-util.h"
53 #include "process-util.h"
54 #include "string-util.h"
58 #define log_debug_bus_message(m) \
60 sd_bus_message *_mm = (m); \
61 log_debug("Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " signature=%s error-name=%s error-message=%s", \
62 bus_message_type_to_string(_mm->header->type), \
63 strna(sd_bus_message_get_sender(_mm)), \
64 strna(sd_bus_message_get_destination(_mm)), \
65 strna(sd_bus_message_get_path(_mm)), \
66 strna(sd_bus_message_get_interface(_mm)), \
67 strna(sd_bus_message_get_member(_mm)), \
68 BUS_MESSAGE_COOKIE(_mm), \
70 strna(_mm->root_container.signature), \
71 strna(_mm->error.name), \
72 strna(_mm->error.message)); \
75 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
76 static void bus_detach_io_events(sd_bus
*b
);
77 static void bus_detach_inotify_event(sd_bus
*b
);
79 static thread_local sd_bus
*default_system_bus
= NULL
;
80 static thread_local sd_bus
*default_user_bus
= NULL
;
81 static thread_local sd_bus
*default_starter_bus
= NULL
;
83 static sd_bus
**bus_choose_default(int (**bus_open
)(sd_bus
**)) {
86 /* Let's try our best to reuse another cached connection. If
87 * the starter bus type is set, connect via our normal
88 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
89 * we can share the connection with the user/system default
92 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
94 if (streq(e
, "system")) {
96 *bus_open
= sd_bus_open_system
;
97 return &default_system_bus
;
98 } else if (STR_IN_SET(e
, "user", "session")) {
100 *bus_open
= sd_bus_open_user
;
101 return &default_user_bus
;
105 /* No type is specified, so we have not other option than to
106 * use the starter address if it is set. */
107 e
= secure_getenv("DBUS_STARTER_ADDRESS");
110 *bus_open
= sd_bus_open
;
111 return &default_starter_bus
;
114 /* Finally, if nothing is set use the cached connection for
117 if (cg_pid_get_owner_uid(0, NULL
) >= 0) {
119 *bus_open
= sd_bus_open_user
;
120 return &default_user_bus
;
123 *bus_open
= sd_bus_open_system
;
124 return &default_system_bus
;
128 sd_bus
*bus_resolve(sd_bus
*bus
) {
129 switch ((uintptr_t) bus
) {
130 case (uintptr_t) SD_BUS_DEFAULT
:
131 return *(bus_choose_default(NULL
));
132 case (uintptr_t) SD_BUS_DEFAULT_USER
:
133 return default_user_bus
;
134 case (uintptr_t) SD_BUS_DEFAULT_SYSTEM
:
135 return default_system_bus
;
141 void bus_close_io_fds(sd_bus
*b
) {
144 bus_detach_io_events(b
);
146 if (b
->input_fd
!= b
->output_fd
)
147 safe_close(b
->output_fd
);
148 b
->output_fd
= b
->input_fd
= safe_close(b
->input_fd
);
151 void bus_close_inotify_fd(sd_bus
*b
) {
154 bus_detach_inotify_event(b
);
156 b
->inotify_fd
= safe_close(b
->inotify_fd
);
157 b
->inotify_watches
= mfree(b
->inotify_watches
);
158 b
->n_inotify_watches
= 0;
161 static void bus_reset_queues(sd_bus
*b
) {
164 while (b
->rqueue_size
> 0)
165 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
167 b
->rqueue
= mfree(b
->rqueue
);
168 b
->rqueue_allocated
= 0;
170 while (b
->wqueue_size
> 0)
171 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
173 b
->wqueue
= mfree(b
->wqueue
);
174 b
->wqueue_allocated
= 0;
177 static void bus_free(sd_bus
*b
) {
181 assert(!b
->track_queue
);
184 b
->state
= BUS_CLOSED
;
186 sd_bus_detach_event(b
);
188 while ((s
= b
->slots
)) {
189 /* At this point only floating slots can still be
190 * around, because the non-floating ones keep a
191 * reference to the bus, and we thus couldn't be
192 * destructing right now... We forcibly disconnect the
193 * slots here, so that they still can be referenced by
194 * apps, but are dead. */
197 bus_slot_disconnect(s
);
198 sd_bus_slot_unref(s
);
201 if (b
->default_bus_ptr
)
202 *b
->default_bus_ptr
= NULL
;
205 bus_close_inotify_fd(b
);
210 free(b
->unique_name
);
211 free(b
->auth_buffer
);
214 free(b
->cgroup_root
);
215 free(b
->description
);
216 free(b
->patch_sender
);
219 strv_free(b
->exec_argv
);
221 close_many(b
->fds
, b
->n_fds
);
226 ordered_hashmap_free_free(b
->reply_callbacks
);
227 prioq_free(b
->reply_callbacks_prioq
);
229 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
230 bus_match_free(&b
->match_callbacks
);
232 hashmap_free_free(b
->vtable_methods
);
233 hashmap_free_free(b
->vtable_properties
);
235 assert(hashmap_isempty(b
->nodes
));
236 hashmap_free(b
->nodes
);
240 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
245 _public_
int sd_bus_new(sd_bus
**ret
) {
248 assert_return(ret
, -EINVAL
);
254 r
->n_ref
= REFCNT_INIT
;
255 r
->input_fd
= r
->output_fd
= -1;
257 r
->message_version
= 1;
258 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
260 r
->original_pid
= getpid_cached();
261 r
->n_groups
= (size_t) -1;
263 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
265 /* We guarantee that wqueue always has space for at least one
267 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
276 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
279 assert_return(bus
, -EINVAL
);
280 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
281 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
282 assert_return(address
, -EINVAL
);
283 assert_return(!bus_pid_changed(bus
), -ECHILD
);
289 free_and_replace(bus
->address
, a
);
294 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
295 assert_return(bus
, -EINVAL
);
296 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
297 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
298 assert_return(input_fd
>= 0, -EBADF
);
299 assert_return(output_fd
>= 0, -EBADF
);
300 assert_return(!bus_pid_changed(bus
), -ECHILD
);
302 bus
->input_fd
= input_fd
;
303 bus
->output_fd
= output_fd
;
307 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
310 assert_return(bus
, -EINVAL
);
311 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
312 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
313 assert_return(path
, -EINVAL
);
314 assert_return(!strv_isempty(argv
), -EINVAL
);
315 assert_return(!bus_pid_changed(bus
), -ECHILD
);
327 free_and_replace(bus
->exec_path
, p
);
329 strv_free(bus
->exec_argv
);
335 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
336 assert_return(bus
, -EINVAL
);
337 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
338 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
339 assert_return(!bus
->patch_sender
, -EPERM
);
340 assert_return(!bus_pid_changed(bus
), -ECHILD
);
342 bus
->bus_client
= !!b
;
346 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
347 assert_return(bus
, -EINVAL
);
348 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
349 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
350 assert_return(!bus_pid_changed(bus
), -ECHILD
);
352 bus
->is_monitor
= !!b
;
356 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
357 assert_return(bus
, -EINVAL
);
358 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
359 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
360 assert_return(!bus_pid_changed(bus
), -ECHILD
);
362 bus
->accept_fd
= !!b
;
366 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
367 assert_return(bus
, -EINVAL
);
368 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
369 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
370 assert_return(!bus_pid_changed(bus
), -ECHILD
);
372 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
373 * replies, and maybe one day classic D-Bus learns this too */
374 bus
->attach_timestamp
= !!b
;
379 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
380 assert_return(bus
, -EINVAL
);
381 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
382 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
383 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
384 assert_return(!bus_pid_changed(bus
), -ECHILD
);
386 SET_FLAG(bus
->creds_mask
, mask
, b
);
388 /* The well knowns we need unconditionally, so that matches can work */
389 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
394 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
395 assert_return(bus
, -EINVAL
);
396 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
397 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
398 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
399 assert_return(!bus_pid_changed(bus
), -ECHILD
);
401 bus
->is_server
= !!b
;
402 bus
->server_id
= server_id
;
406 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
407 assert_return(bus
, -EINVAL
);
408 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
409 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
410 assert_return(!bus_pid_changed(bus
), -ECHILD
);
412 bus
->anonymous_auth
= !!b
;
416 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
417 assert_return(bus
, -EINVAL
);
418 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
419 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
420 assert_return(!bus_pid_changed(bus
), -ECHILD
);
426 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
427 assert_return(bus
, -EINVAL
);
428 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
429 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
430 assert_return(!bus_pid_changed(bus
), -ECHILD
);
432 return free_and_strdup(&bus
->description
, description
);
435 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
436 assert_return(bus
, -EINVAL
);
437 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
438 assert_return(!bus_pid_changed(bus
), -ECHILD
);
440 bus
->allow_interactive_authorization
= !!b
;
444 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
445 assert_return(bus
, -EINVAL
);
446 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
447 assert_return(!bus_pid_changed(bus
), -ECHILD
);
449 return bus
->allow_interactive_authorization
;
452 _public_
int sd_bus_set_watch_bind(sd_bus
*bus
, int b
) {
453 assert_return(bus
, -EINVAL
);
454 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
455 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
456 assert_return(!bus_pid_changed(bus
), -ECHILD
);
458 bus
->watch_bind
= !!b
;
462 _public_
int sd_bus_get_watch_bind(sd_bus
*bus
) {
463 assert_return(bus
, -EINVAL
);
464 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
465 assert_return(!bus_pid_changed(bus
), -ECHILD
);
467 return bus
->watch_bind
;
470 _public_
int sd_bus_set_connected_signal(sd_bus
*bus
, int b
) {
471 assert_return(bus
, -EINVAL
);
472 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
473 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
474 assert_return(!bus_pid_changed(bus
), -ECHILD
);
476 bus
->connected_signal
= !!b
;
480 _public_
int sd_bus_get_connected_signal(sd_bus
*bus
) {
481 assert_return(bus
, -EINVAL
);
482 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
483 assert_return(!bus_pid_changed(bus
), -ECHILD
);
485 return bus
->connected_signal
;
488 static int synthesize_connected_signal(sd_bus
*bus
) {
489 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
494 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
495 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
496 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
498 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
499 * that works independently from whether we connected to a full bus or just a direct connection. */
501 if (!bus
->connected_signal
)
504 r
= sd_bus_message_new_signal(
507 "/org/freedesktop/DBus/Local",
508 "org.freedesktop.DBus.Local",
513 bus_message_set_sender_local(bus
, m
);
515 r
= bus_seal_synthetic_message(bus
, m
);
519 r
= bus_rqueue_make_room(bus
);
523 /* Insert at the very front */
524 memmove(bus
->rqueue
+ 1, bus
->rqueue
, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
532 void bus_set_state(sd_bus
*bus
, enum bus_state state
) {
534 static const char * const table
[_BUS_STATE_MAX
] = {
535 [BUS_UNSET
] = "UNSET",
536 [BUS_WATCH_BIND
] = "WATCH_BIND",
537 [BUS_OPENING
] = "OPENING",
538 [BUS_AUTHENTICATING
] = "AUTHENTICATING",
539 [BUS_HELLO
] = "HELLO",
540 [BUS_RUNNING
] = "RUNNING",
541 [BUS_CLOSING
] = "CLOSING",
542 [BUS_CLOSED
] = "CLOSED",
546 assert(state
< _BUS_STATE_MAX
);
548 if (state
== bus
->state
)
551 log_debug("Bus %s: changing state %s → %s", strna(bus
->description
), table
[bus
->state
], table
[state
]);
555 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
564 assert(IN_SET(bus
->state
, BUS_HELLO
, BUS_CLOSING
));
566 r
= sd_bus_message_get_errno(reply
);
570 r
= sd_bus_message_read(reply
, "s", &s
);
574 if (!service_name_is_valid(s
) || s
[0] != ':')
581 free_and_replace(bus
->unique_name
, t
);
583 if (bus
->state
== BUS_HELLO
) {
584 bus_set_state(bus
, BUS_RUNNING
);
586 r
= synthesize_connected_signal(bus
);
594 static int bus_send_hello(sd_bus
*bus
) {
595 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
600 if (!bus
->bus_client
)
603 r
= sd_bus_message_new_method_call(
606 "org.freedesktop.DBus",
607 "/org/freedesktop/DBus",
608 "org.freedesktop.DBus",
613 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
616 int bus_start_running(sd_bus
*bus
) {
617 struct reply_callback
*c
;
623 assert(bus
->state
< BUS_HELLO
);
625 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
626 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
627 * adding a fixed value to all entries should not alter the internal order. */
629 n
= now(CLOCK_MONOTONIC
);
630 ORDERED_HASHMAP_FOREACH(c
, bus
->reply_callbacks
, i
) {
631 if (c
->timeout_usec
== 0)
634 c
->timeout_usec
= usec_add(n
, c
->timeout_usec
);
637 if (bus
->bus_client
) {
638 bus_set_state(bus
, BUS_HELLO
);
642 bus_set_state(bus
, BUS_RUNNING
);
644 r
= synthesize_connected_signal(bus
);
651 static int parse_address_key(const char **p
, const char *key
, char **value
) {
652 size_t l
, n
= 0, allocated
= 0;
653 _cleanup_free_
char *r
= NULL
;
662 if (strncmp(*p
, key
, l
) != 0)
675 while (!IN_SET(*a
, ';', ',', 0)) {
689 c
= (char) ((x
<< 4) | y
);
696 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
714 free_and_replace(*value
, r
);
719 static void skip_address_key(const char **p
) {
723 *p
+= strcspn(*p
, ",");
729 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
730 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
739 while (!IN_SET(**p
, 0, ';')) {
740 r
= parse_address_key(p
, "guid", guid
);
746 r
= parse_address_key(p
, "path", &path
);
752 r
= parse_address_key(p
, "abstract", &abstract
);
761 if (!path
&& !abstract
)
764 if (path
&& abstract
)
769 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
772 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
773 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
774 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
775 } else if (abstract
) {
776 l
= strlen(abstract
);
777 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
780 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
781 b
->sockaddr
.un
.sun_path
[0] = 0;
782 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
783 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
791 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
792 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
794 struct addrinfo
*result
, hints
= {
795 .ai_socktype
= SOCK_STREAM
,
796 .ai_flags
= AI_ADDRCONFIG
,
804 while (!IN_SET(**p
, 0, ';')) {
805 r
= parse_address_key(p
, "guid", guid
);
811 r
= parse_address_key(p
, "host", &host
);
817 r
= parse_address_key(p
, "port", &port
);
823 r
= parse_address_key(p
, "family", &family
);
836 if (streq(family
, "ipv4"))
837 hints
.ai_family
= AF_INET
;
838 else if (streq(family
, "ipv6"))
839 hints
.ai_family
= AF_INET6
;
844 r
= getaddrinfo(host
, port
, &hints
, &result
);
848 return -EADDRNOTAVAIL
;
850 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
851 b
->sockaddr_size
= result
->ai_addrlen
;
853 freeaddrinfo(result
);
860 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
862 unsigned n_argv
= 0, j
;
864 size_t allocated
= 0;
872 while (!IN_SET(**p
, 0, ';')) {
873 r
= parse_address_key(p
, "guid", guid
);
879 r
= parse_address_key(p
, "path", &path
);
885 if (startswith(*p
, "argv")) {
889 ul
= strtoul(*p
+ 4, (char**) p
, 10);
890 if (errno
> 0 || **p
!= '=' || ul
> 256) {
898 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
906 r
= parse_address_key(p
, NULL
, argv
+ ul
);
921 /* Make sure there are no holes in the array, with the
922 * exception of argv[0] */
923 for (j
= 1; j
< n_argv
; j
++)
929 if (argv
&& argv
[0] == NULL
) {
930 argv
[0] = strdup(path
);
945 for (j
= 0; j
< n_argv
; j
++)
953 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
954 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
962 while (!IN_SET(**p
, 0, ';')) {
963 r
= parse_address_key(p
, "guid", guid
);
969 r
= parse_address_key(p
, "machine", &machine
);
975 r
= parse_address_key(p
, "pid", &pid
);
984 if (!machine
== !pid
)
988 if (!machine_name_is_valid(machine
))
991 free_and_replace(b
->machine
, machine
);
993 b
->machine
= mfree(b
->machine
);
997 r
= parse_pid(pid
, &b
->nspid
);
1003 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
1004 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
1005 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
1006 b
->sockaddr_size
= SOCKADDR_UN_LEN(b
->sockaddr
.un
);
1007 b
->is_local
= false;
1012 static void bus_reset_parsed_address(sd_bus
*b
) {
1016 b
->sockaddr_size
= 0;
1017 b
->exec_argv
= strv_free(b
->exec_argv
);
1018 b
->exec_path
= mfree(b
->exec_path
);
1019 b
->server_id
= SD_ID128_NULL
;
1020 b
->machine
= mfree(b
->machine
);
1024 static int bus_parse_next_address(sd_bus
*b
) {
1025 _cleanup_free_
char *guid
= NULL
;
1033 if (b
->address
[b
->address_index
] == 0)
1036 bus_reset_parsed_address(b
);
1038 a
= b
->address
+ b
->address_index
;
1047 if (startswith(a
, "unix:")) {
1050 r
= parse_unix_address(b
, &a
, &guid
);
1055 } else if (startswith(a
, "tcp:")) {
1058 r
= parse_tcp_address(b
, &a
, &guid
);
1064 } else if (startswith(a
, "unixexec:")) {
1067 r
= parse_exec_address(b
, &a
, &guid
);
1073 } else if (startswith(a
, "x-machine-unix:")) {
1076 r
= parse_container_unix_address(b
, &a
, &guid
);
1089 r
= sd_id128_from_string(guid
, &b
->server_id
);
1094 b
->address_index
= a
- b
->address
;
1098 static int bus_start_address(sd_bus
*b
) {
1104 bus_close_io_fds(b
);
1105 bus_close_inotify_fd(b
);
1107 /* If you provide multiple different bus-addresses, we
1108 * try all of them in order and use the first one that
1112 r
= bus_socket_exec(b
);
1113 else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1114 r
= bus_container_connect_socket(b
);
1115 else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1116 r
= bus_socket_connect(b
);
1123 q
= bus_attach_io_events(b
);
1127 q
= bus_attach_inotify_event(b
);
1134 b
->last_connect_error
= -r
;
1137 r
= bus_parse_next_address(b
);
1141 return b
->last_connect_error
> 0 ? -b
->last_connect_error
: -ECONNREFUSED
;
1145 int bus_next_address(sd_bus
*b
) {
1148 bus_reset_parsed_address(b
);
1149 return bus_start_address(b
);
1152 static int bus_start_fd(sd_bus
*b
) {
1157 assert(b
->input_fd
>= 0);
1158 assert(b
->output_fd
>= 0);
1160 r
= fd_nonblock(b
->input_fd
, true);
1164 r
= fd_cloexec(b
->input_fd
, true);
1168 if (b
->input_fd
!= b
->output_fd
) {
1169 r
= fd_nonblock(b
->output_fd
, true);
1173 r
= fd_cloexec(b
->output_fd
, true);
1178 if (fstat(b
->input_fd
, &st
) < 0)
1181 return bus_socket_take_fd(b
);
1184 _public_
int sd_bus_start(sd_bus
*bus
) {
1187 assert_return(bus
, -EINVAL
);
1188 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
1189 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1190 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1192 bus_set_state(bus
, BUS_OPENING
);
1194 if (bus
->is_server
&& bus
->bus_client
)
1197 if (bus
->input_fd
>= 0)
1198 r
= bus_start_fd(bus
);
1199 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->machine
)
1200 r
= bus_start_address(bus
);
1209 return bus_send_hello(bus
);
1212 _public_
int sd_bus_open(sd_bus
**ret
) {
1217 assert_return(ret
, -EINVAL
);
1219 /* Let's connect to the starter bus if it is set, and
1220 * otherwise to the bus that is appropropriate for the scope
1221 * we are running in */
1223 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1225 if (streq(e
, "system"))
1226 return sd_bus_open_system(ret
);
1227 else if (STR_IN_SET(e
, "session", "user"))
1228 return sd_bus_open_user(ret
);
1231 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1233 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1234 return sd_bus_open_user(ret
);
1236 return sd_bus_open_system(ret
);
1243 r
= sd_bus_set_address(b
, e
);
1247 b
->bus_client
= true;
1249 /* We don't know whether the bus is trusted or not, so better
1250 * be safe, and authenticate everything */
1252 b
->is_local
= false;
1253 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1255 r
= sd_bus_start(b
);
1267 int bus_set_address_system(sd_bus
*b
) {
1271 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1273 return sd_bus_set_address(b
, e
);
1275 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1278 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1282 assert_return(ret
, -EINVAL
);
1288 r
= bus_set_address_system(b
);
1292 b
->bus_client
= true;
1293 b
->is_system
= true;
1295 /* Let's do per-method access control on the system bus. We
1296 * need the caller's UID and capability set for that. */
1298 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1301 r
= sd_bus_start(b
);
1313 int bus_set_address_user(sd_bus
*b
) {
1315 _cleanup_free_
char *ee
= NULL
, *s
= NULL
;
1319 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1321 return sd_bus_set_address(b
, e
);
1323 e
= secure_getenv("XDG_RUNTIME_DIR");
1327 ee
= bus_address_escape(e
);
1331 if (asprintf(&s
, DEFAULT_USER_BUS_ADDRESS_FMT
, ee
) < 0)
1340 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1344 assert_return(ret
, -EINVAL
);
1350 r
= bus_set_address_user(b
);
1354 b
->bus_client
= true;
1357 /* We don't do any per-method access control on the user
1362 r
= sd_bus_start(b
);
1374 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1375 _cleanup_free_
char *e
= NULL
;
1376 char *m
= NULL
, *c
= NULL
, *a
;
1381 /* Let's see if we shall enter some container */
1382 m
= strchr(host
, ':');
1386 /* Let's make sure this is not a port of some kind,
1387 * and is a valid machine name. */
1388 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1391 /* Cut out the host part */
1392 t
= strndupa(host
, m
- host
- 1);
1393 e
= bus_address_escape(t
);
1397 c
= strjoina(",argv5=--machine=", m
);
1402 e
= bus_address_escape(host
);
1407 a
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e
, ",argv4=systemd-stdio-bridge", c
);
1411 free_and_replace(b
->address
, a
);
1416 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1420 assert_return(host
, -EINVAL
);
1421 assert_return(ret
, -EINVAL
);
1423 r
= sd_bus_new(&bus
);
1427 r
= bus_set_address_system_remote(bus
, host
);
1431 bus
->bus_client
= true;
1432 bus
->trusted
= false;
1433 bus
->is_system
= true;
1434 bus
->is_local
= false;
1436 r
= sd_bus_start(bus
);
1448 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1449 _cleanup_free_
char *e
= NULL
;
1455 e
= bus_address_escape(machine
);
1459 a
= strjoin("x-machine-unix:machine=", e
);
1463 free_and_replace(b
->address
, a
);
1468 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1472 assert_return(machine
, -EINVAL
);
1473 assert_return(ret
, -EINVAL
);
1474 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1476 r
= sd_bus_new(&bus
);
1480 r
= bus_set_address_system_machine(bus
, machine
);
1484 bus
->bus_client
= true;
1485 bus
->trusted
= false;
1486 bus
->is_system
= true;
1487 bus
->is_local
= false;
1489 r
= sd_bus_start(bus
);
1501 _public_
void sd_bus_close(sd_bus
*bus
) {
1505 if (bus
->state
== BUS_CLOSED
)
1507 if (bus_pid_changed(bus
))
1510 bus_set_state(bus
, BUS_CLOSED
);
1512 sd_bus_detach_event(bus
);
1514 /* Drop all queued messages so that they drop references to
1515 * the bus object and the bus may be freed */
1516 bus_reset_queues(bus
);
1518 bus_close_io_fds(bus
);
1519 bus_close_inotify_fd(bus
);
1522 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1530 return sd_bus_unref(bus
);
1533 void bus_enter_closing(sd_bus
*bus
) {
1536 if (!IN_SET(bus
->state
, BUS_WATCH_BIND
, BUS_OPENING
, BUS_AUTHENTICATING
, BUS_HELLO
, BUS_RUNNING
))
1539 bus_set_state(bus
, BUS_CLOSING
);
1542 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1547 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1552 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1558 i
= REFCNT_DEC(bus
->n_ref
);
1566 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1568 assert_return(bus
, -EINVAL
);
1569 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
1570 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1572 return BUS_IS_OPEN(bus
->state
);
1575 _public_
int sd_bus_is_ready(sd_bus
*bus
) {
1576 assert_return(bus
, -EINVAL
);
1577 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
1578 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1580 return bus
->state
== BUS_RUNNING
;
1583 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1586 assert_return(bus
, -EINVAL
);
1587 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
1588 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1589 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1591 if (bus
->is_monitor
)
1594 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1595 if (!bus
->accept_fd
)
1598 r
= bus_ensure_running(bus
);
1602 return bus
->can_fds
;
1605 return bus_type_is_valid(type
);
1608 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1611 assert_return(bus
, -EINVAL
);
1612 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
1613 assert_return(id
, -EINVAL
);
1614 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1616 r
= bus_ensure_running(bus
);
1620 *id
= bus
->server_id
;
1624 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1631 /* If we copy the same message to multiple
1632 * destinations, avoid using the same cookie
1634 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1639 timeout
= BUS_DEFAULT_TIMEOUT
;
1641 if (!m
->sender
&& b
->patch_sender
) {
1642 r
= sd_bus_message_set_sender(m
, b
->patch_sender
);
1647 return sd_bus_message_seal(m
, ++b
->cookie
, timeout
);
1650 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1651 bool remarshal
= false;
1655 /* wrong packet version */
1656 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1659 /* wrong packet endianness */
1660 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1663 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1666 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1670 /* Fake some timestamps, if they were requested, and not
1671 * already initialized */
1672 if (b
->attach_timestamp
) {
1673 if (m
->realtime
<= 0)
1674 m
->realtime
= now(CLOCK_REALTIME
);
1676 if (m
->monotonic
<= 0)
1677 m
->monotonic
= now(CLOCK_MONOTONIC
);
1680 /* The bus specification says the serial number cannot be 0,
1681 * hence let's fill something in for synthetic messages. Since
1682 * synthetic messages might have a fake sender and we don't
1683 * want to interfere with the real sender's serial numbers we
1684 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1685 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1686 * even though kdbus can do 64bit. */
1687 return sd_bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1690 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, size_t *idx
) {
1696 r
= bus_socket_write_message(bus
, m
, idx
);
1700 if (*idx
>= BUS_MESSAGE_SIZE(m
))
1701 log_debug("Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" signature=%s error-name=%s error-message=%s",
1702 bus_message_type_to_string(m
->header
->type
),
1703 strna(sd_bus_message_get_sender(m
)),
1704 strna(sd_bus_message_get_destination(m
)),
1705 strna(sd_bus_message_get_path(m
)),
1706 strna(sd_bus_message_get_interface(m
)),
1707 strna(sd_bus_message_get_member(m
)),
1708 BUS_MESSAGE_COOKIE(m
),
1710 strna(m
->root_container
.signature
),
1711 strna(m
->error
.name
),
1712 strna(m
->error
.message
));
1717 static int dispatch_wqueue(sd_bus
*bus
) {
1721 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
1723 while (bus
->wqueue_size
> 0) {
1725 r
= bus_write_message(bus
, bus
->wqueue
[0], &bus
->windex
);
1729 /* Didn't do anything this time */
1731 else if (bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1732 /* Fully written. Let's drop the entry from
1735 * This isn't particularly optimized, but
1736 * well, this is supposed to be our worst-case
1737 * buffer only, and the socket buffer is
1738 * supposed to be our primary buffer, and if
1739 * it got full, then all bets are off
1743 sd_bus_message_unref(bus
->wqueue
[0]);
1744 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1754 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1757 return bus_socket_read_message(bus
);
1760 int bus_rqueue_make_room(sd_bus
*bus
) {
1763 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1766 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1772 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1777 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
1779 /* Note that the priority logic is only available on kdbus,
1780 * where the rqueue is unused. We check the rqueue here
1781 * anyway, because it's simple... */
1784 if (bus
->rqueue_size
> 0) {
1785 /* Dispatch a queued message */
1787 *m
= bus
->rqueue
[0];
1789 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1793 /* Try to read a new message */
1794 r
= bus_read_message(bus
, hint_priority
, priority
);
1804 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
) {
1805 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
1808 assert_return(m
, -EINVAL
);
1813 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1815 if (!BUS_IS_OPEN(bus
->state
))
1819 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1826 /* If the cookie number isn't kept, then we know that no reply
1828 if (!cookie
&& !m
->sealed
)
1829 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1831 r
= bus_seal_message(bus
, m
, 0);
1835 /* Remarshall if we have to. This will possibly unref the
1836 * message and place a replacement in m */
1837 r
= bus_remarshal_message(bus
, &m
);
1841 /* If this is a reply and no reply was requested, then let's
1842 * suppress this, if we can */
1846 if (IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1849 r
= bus_write_message(bus
, m
, &idx
);
1851 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
1852 bus_enter_closing(bus
);
1859 if (idx
< BUS_MESSAGE_SIZE(m
)) {
1860 /* Wasn't fully written. So let's remember how
1861 * much was written. Note that the first entry
1862 * of the wqueue array is always allocated so
1863 * that we always can remember how much was
1865 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1866 bus
->wqueue_size
= 1;
1871 /* Just append it to the queue. */
1873 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1876 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1879 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1884 *cookie
= BUS_MESSAGE_COOKIE(m
);
1889 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1892 assert_return(m
, -EINVAL
);
1897 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1899 if (!BUS_IS_OPEN(bus
->state
))
1902 if (!streq_ptr(m
->destination
, destination
)) {
1907 r
= sd_bus_message_set_destination(m
, destination
);
1912 return sd_bus_send(bus
, m
, cookie
);
1915 static usec_t
calc_elapse(sd_bus
*bus
, uint64_t usec
) {
1918 if (usec
== (uint64_t) -1)
1921 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1922 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1923 * relative timestamp, and afterwards the absolute one. */
1925 if (IN_SET(bus
->state
, BUS_WATCH_BIND
, BUS_OPENING
, BUS_AUTHENTICATING
))
1928 return now(CLOCK_MONOTONIC
) + usec
;
1931 static int timeout_compare(const void *a
, const void *b
) {
1932 const struct reply_callback
*x
= a
, *y
= b
;
1934 if (x
->timeout_usec
!= 0 && y
->timeout_usec
== 0)
1937 if (x
->timeout_usec
== 0 && y
->timeout_usec
!= 0)
1940 if (x
->timeout_usec
< y
->timeout_usec
)
1943 if (x
->timeout_usec
> y
->timeout_usec
)
1949 _public_
int sd_bus_call_async(
1953 sd_bus_message_handler_t callback
,
1957 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
1958 _cleanup_(sd_bus_slot_unrefp
) sd_bus_slot
*s
= NULL
;
1961 assert_return(m
, -EINVAL
);
1962 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1963 assert_return(!m
->sealed
|| (!!callback
== !(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)), -EINVAL
);
1968 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1970 if (!BUS_IS_OPEN(bus
->state
))
1973 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
1974 if (!callback
&& !slot
&& !m
->sealed
)
1975 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1977 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1981 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1985 r
= bus_seal_message(bus
, m
, usec
);
1989 r
= bus_remarshal_message(bus
, &m
);
1993 if (slot
|| callback
) {
1994 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1998 s
->reply_callback
.callback
= callback
;
2000 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
2001 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
2003 s
->reply_callback
.cookie
= 0;
2007 s
->reply_callback
.timeout_usec
= calc_elapse(bus
, m
->timeout
);
2008 if (s
->reply_callback
.timeout_usec
!= 0) {
2009 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
2011 s
->reply_callback
.timeout_usec
= 0;
2017 r
= sd_bus_send(bus
, m
, s
? &s
->reply_callback
.cookie
: NULL
);
2028 int bus_ensure_running(sd_bus
*bus
) {
2033 if (IN_SET(bus
->state
, BUS_UNSET
, BUS_CLOSED
, BUS_CLOSING
))
2035 if (bus
->state
== BUS_RUNNING
)
2039 r
= sd_bus_process(bus
, NULL
);
2042 if (bus
->state
== BUS_RUNNING
)
2047 r
= sd_bus_wait(bus
, (uint64_t) -1);
2053 _public_
int sd_bus_call(
2057 sd_bus_error
*error
,
2058 sd_bus_message
**reply
) {
2060 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
2066 bus_assert_return(m
, -EINVAL
, error
);
2067 bus_assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
, error
);
2068 bus_assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
, error
);
2069 bus_assert_return(!bus_error_is_dirty(error
), -EINVAL
, error
);
2074 bus_assert_return(!bus_pid_changed(bus
), -ECHILD
, error
);
2076 if (!BUS_IS_OPEN(bus
->state
)) {
2081 r
= bus_ensure_running(bus
);
2085 i
= bus
->rqueue_size
;
2087 r
= bus_seal_message(bus
, m
, usec
);
2091 r
= bus_remarshal_message(bus
, &m
);
2095 r
= sd_bus_send(bus
, m
, &cookie
);
2099 timeout
= calc_elapse(bus
, m
->timeout
);
2104 while (i
< bus
->rqueue_size
) {
2105 sd_bus_message
*incoming
= NULL
;
2107 incoming
= bus
->rqueue
[i
];
2109 if (incoming
->reply_cookie
== cookie
) {
2110 /* Found a match! */
2112 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2114 log_debug_bus_message(incoming
);
2116 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2118 if (incoming
->n_fds
<= 0 || bus
->accept_fd
) {
2122 sd_bus_message_unref(incoming
);
2127 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2128 sd_bus_message_unref(incoming
);
2131 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
) {
2132 r
= sd_bus_error_copy(error
, &incoming
->error
);
2133 sd_bus_message_unref(incoming
);
2140 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2143 streq(bus
->unique_name
, incoming
->sender
)) {
2145 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2148 /* Our own message? Somebody is trying
2149 * to send its own client a message,
2150 * let's not dead-lock, let's fail
2153 sd_bus_message_unref(incoming
);
2158 /* Try to read more, right-away */
2162 r
= bus_read_message(bus
, false, 0);
2164 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2165 bus_enter_closing(bus
);
2177 n
= now(CLOCK_MONOTONIC
);
2185 left
= (uint64_t) -1;
2187 r
= bus_poll(bus
, true, left
);
2195 r
= dispatch_wqueue(bus
);
2197 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2198 bus_enter_closing(bus
);
2207 return sd_bus_error_set_errno(error
, r
);
2210 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2212 assert_return(bus
, -EINVAL
);
2213 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
2214 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2215 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2217 if (bus
->state
== BUS_CLOSED
)
2220 if (bus
->inotify_fd
>= 0)
2221 return bus
->inotify_fd
;
2223 if (bus
->input_fd
>= 0)
2224 return bus
->input_fd
;
2229 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2232 assert_return(bus
, -EINVAL
);
2233 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
2234 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2236 switch (bus
->state
) {
2242 case BUS_WATCH_BIND
:
2250 case BUS_AUTHENTICATING
:
2251 if (bus_socket_auth_needs_write(bus
))
2259 if (bus
->rqueue_size
<= 0)
2261 if (bus
->wqueue_size
> 0)
2269 assert_not_reached("Unknown state");
2275 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2276 struct reply_callback
*c
;
2278 assert_return(bus
, -EINVAL
);
2279 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
2280 assert_return(timeout_usec
, -EINVAL
);
2281 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2283 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2286 if (bus
->track_queue
) {
2291 switch (bus
->state
) {
2293 case BUS_AUTHENTICATING
:
2294 *timeout_usec
= bus
->auth_timeout
;
2299 if (bus
->rqueue_size
> 0) {
2304 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2306 *timeout_usec
= (uint64_t) -1;
2310 if (c
->timeout_usec
== 0) {
2311 *timeout_usec
= (uint64_t) -1;
2315 *timeout_usec
= c
->timeout_usec
;
2322 case BUS_WATCH_BIND
:
2324 *timeout_usec
= (uint64_t) -1;
2328 assert_not_reached("Unknown or unexpected stat");
2332 static int process_timeout(sd_bus
*bus
) {
2333 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2334 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
* m
= NULL
;
2335 struct reply_callback
*c
;
2342 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
2344 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2348 n
= now(CLOCK_MONOTONIC
);
2349 if (c
->timeout_usec
> n
)
2352 r
= bus_message_new_synthetic_error(
2355 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2360 r
= bus_seal_synthetic_message(bus
, m
);
2364 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2365 c
->timeout_usec
= 0;
2367 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2370 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2372 bus
->iteration_counter
++;
2374 is_hello
= bus
->state
== BUS_HELLO
&& c
->callback
== hello_callback
;
2376 bus
->current_message
= m
;
2377 bus
->current_slot
= sd_bus_slot_ref(slot
);
2378 bus
->current_handler
= c
->callback
;
2379 bus
->current_userdata
= slot
->userdata
;
2380 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2381 bus
->current_userdata
= NULL
;
2382 bus
->current_handler
= NULL
;
2383 bus
->current_slot
= NULL
;
2384 bus
->current_message
= NULL
;
2386 if (slot
->floating
) {
2387 bus_slot_disconnect(slot
);
2388 sd_bus_slot_unref(slot
);
2391 sd_bus_slot_unref(slot
);
2393 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2394 * and ignore the callback handler's return value. */
2398 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2401 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2405 if (bus
->state
!= BUS_HELLO
)
2408 /* Let's make sure the first message on the bus is the HELLO
2409 * reply. But note that we don't actually parse the message
2410 * here (we leave that to the usual handling), we just verify
2411 * we don't let any earlier msg through. */
2413 if (!IN_SET(m
->header
->type
, SD_BUS_MESSAGE_METHOD_RETURN
, SD_BUS_MESSAGE_METHOD_ERROR
))
2416 if (m
->reply_cookie
!= 1)
2422 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2423 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*synthetic_reply
= NULL
;
2424 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2425 struct reply_callback
*c
;
2433 if (!IN_SET(m
->header
->type
, SD_BUS_MESSAGE_METHOD_RETURN
, SD_BUS_MESSAGE_METHOD_ERROR
))
2436 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2439 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2445 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2447 if (m
->n_fds
> 0 && !bus
->accept_fd
) {
2449 /* If the reply contained a file descriptor which we
2450 * didn't want we pass an error instead. */
2452 r
= bus_message_new_synthetic_error(
2455 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2460 /* Copy over original timestamp */
2461 synthetic_reply
->realtime
= m
->realtime
;
2462 synthetic_reply
->monotonic
= m
->monotonic
;
2463 synthetic_reply
->seqnum
= m
->seqnum
;
2465 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2469 m
= synthetic_reply
;
2471 r
= sd_bus_message_rewind(m
, true);
2476 if (c
->timeout_usec
!= 0) {
2477 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2478 c
->timeout_usec
= 0;
2481 is_hello
= bus
->state
== BUS_HELLO
&& c
->callback
== hello_callback
;
2483 bus
->current_slot
= sd_bus_slot_ref(slot
);
2484 bus
->current_handler
= c
->callback
;
2485 bus
->current_userdata
= slot
->userdata
;
2486 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2487 bus
->current_userdata
= NULL
;
2488 bus
->current_handler
= NULL
;
2489 bus
->current_slot
= NULL
;
2491 if (slot
->floating
) {
2492 bus_slot_disconnect(slot
);
2493 sd_bus_slot_unref(slot
);
2496 sd_bus_slot_unref(slot
);
2498 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2499 * ignore the callback handler's return value. */
2503 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2506 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2507 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2508 struct filter_callback
*l
;
2515 bus
->filter_callbacks_modified
= false;
2517 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2520 if (bus
->filter_callbacks_modified
)
2523 /* Don't run this more than once per iteration */
2524 if (l
->last_iteration
== bus
->iteration_counter
)
2527 l
->last_iteration
= bus
->iteration_counter
;
2529 r
= sd_bus_message_rewind(m
, true);
2533 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2535 bus
->current_slot
= sd_bus_slot_ref(slot
);
2536 bus
->current_handler
= l
->callback
;
2537 bus
->current_userdata
= slot
->userdata
;
2538 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2539 bus
->current_userdata
= NULL
;
2540 bus
->current_handler
= NULL
;
2541 bus
->current_slot
= sd_bus_slot_unref(slot
);
2543 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2549 } while (bus
->filter_callbacks_modified
);
2554 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2561 bus
->match_callbacks_modified
= false;
2563 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2567 } while (bus
->match_callbacks_modified
);
2572 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2573 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
2579 if (bus
->is_monitor
)
2582 if (bus
->manual_peer_interface
)
2585 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2588 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2591 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2594 if (streq_ptr(m
->member
, "Ping"))
2595 r
= sd_bus_message_new_method_return(m
, &reply
);
2596 else if (streq_ptr(m
->member
, "GetMachineId")) {
2600 r
= sd_id128_get_machine(&id
);
2604 r
= sd_bus_message_new_method_return(m
, &reply
);
2608 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2610 r
= sd_bus_message_new_method_errorf(
2612 SD_BUS_ERROR_UNKNOWN_METHOD
,
2613 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2619 r
= sd_bus_send(bus
, reply
, NULL
);
2626 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2630 /* If we got a message with a file descriptor which we didn't
2631 * want to accept, then let's drop it. How can this even
2632 * happen? For example, when the kernel queues a message into
2633 * an activatable names's queue which allows fds, and then is
2634 * delivered to us later even though we ourselves did not
2637 if (bus
->is_monitor
)
2646 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2647 return 1; /* just eat it up */
2649 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2652 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2658 bus
->current_message
= m
;
2659 bus
->iteration_counter
++;
2661 log_debug_bus_message(m
);
2663 r
= process_hello(bus
, m
);
2667 r
= process_reply(bus
, m
);
2671 r
= process_fd_check(bus
, m
);
2675 r
= process_filter(bus
, m
);
2679 r
= process_match(bus
, m
);
2683 r
= process_builtin(bus
, m
);
2687 r
= bus_process_object(bus
, m
);
2690 bus
->current_message
= NULL
;
2694 static int dispatch_track(sd_bus
*bus
) {
2697 if (!bus
->track_queue
)
2700 bus_track_dispatch(bus
->track_queue
);
2704 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2705 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2709 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
2711 r
= process_timeout(bus
);
2715 r
= dispatch_wqueue(bus
);
2719 r
= dispatch_track(bus
);
2723 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2729 r
= process_message(bus
, m
);
2734 r
= sd_bus_message_rewind(m
, true);
2743 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2745 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2746 strna(sd_bus_message_get_sender(m
)),
2747 strna(sd_bus_message_get_path(m
)),
2748 strna(sd_bus_message_get_interface(m
)),
2749 strna(sd_bus_message_get_member(m
)));
2751 r
= sd_bus_reply_method_errorf(
2753 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2754 "Unknown object '%s'.", m
->path
);
2768 static int bus_exit_now(sd_bus
*bus
) {
2771 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2772 * sd_event_exit(), otherwise invokes libc exit(). */
2774 if (bus
->exited
) /* did we already exit? */
2776 if (!bus
->exit_triggered
) /* was the exit condition triggered? */
2778 if (!bus
->exit_on_disconnect
) /* Shall we actually exit on disconnection? */
2781 bus
->exited
= true; /* never exit more than once */
2783 log_debug("Bus connection disconnected, exiting.");
2786 return sd_event_exit(bus
->event
, EXIT_FAILURE
);
2790 assert_not_reached("exit() didn't exit?");
2793 static int process_closing_reply_callback(sd_bus
*bus
, struct reply_callback
*c
) {
2794 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2795 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2802 r
= bus_message_new_synthetic_error(
2805 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2810 r
= bus_seal_synthetic_message(bus
, m
);
2814 if (c
->timeout_usec
!= 0) {
2815 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2816 c
->timeout_usec
= 0;
2819 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2822 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2824 bus
->iteration_counter
++;
2826 bus
->current_message
= m
;
2827 bus
->current_slot
= sd_bus_slot_ref(slot
);
2828 bus
->current_handler
= c
->callback
;
2829 bus
->current_userdata
= slot
->userdata
;
2830 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2831 bus
->current_userdata
= NULL
;
2832 bus
->current_handler
= NULL
;
2833 bus
->current_slot
= NULL
;
2834 bus
->current_message
= NULL
;
2836 if (slot
->floating
) {
2837 bus_slot_disconnect(slot
);
2838 sd_bus_slot_unref(slot
);
2841 sd_bus_slot_unref(slot
);
2843 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2846 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2847 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2848 struct reply_callback
*c
;
2852 assert(bus
->state
== BUS_CLOSING
);
2854 /* First, fail all outstanding method calls */
2855 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2857 return process_closing_reply_callback(bus
, c
);
2859 /* Then, fake-drop all remaining bus tracking references */
2861 bus_track_close(bus
->tracks
);
2865 /* Then, synthesize a Disconnected message */
2866 r
= sd_bus_message_new_signal(
2869 "/org/freedesktop/DBus/Local",
2870 "org.freedesktop.DBus.Local",
2875 bus_message_set_sender_local(bus
, m
);
2877 r
= bus_seal_synthetic_message(bus
, m
);
2883 bus
->current_message
= m
;
2884 bus
->iteration_counter
++;
2886 r
= process_filter(bus
, m
);
2890 r
= process_match(bus
, m
);
2894 /* Nothing else to do, exit now, if the condition holds */
2895 bus
->exit_triggered
= true;
2896 (void) bus_exit_now(bus
);
2906 bus
->current_message
= NULL
;
2911 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2912 BUS_DONT_DESTROY(bus
);
2915 /* Returns 0 when we didn't do anything. This should cause the
2916 * caller to invoke sd_bus_wait() before returning the next
2917 * time. Returns > 0 when we did something, which possibly
2918 * means *ret is filled in with an unprocessed message. */
2920 assert_return(bus
, -EINVAL
);
2921 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
2922 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2924 /* We don't allow recursively invoking sd_bus_process(). */
2925 assert_return(!bus
->current_message
, -EBUSY
);
2926 assert(!bus
->current_slot
);
2928 switch (bus
->state
) {
2936 case BUS_WATCH_BIND
:
2937 r
= bus_socket_process_watch_bind(bus
);
2941 r
= bus_socket_process_opening(bus
);
2944 case BUS_AUTHENTICATING
:
2945 r
= bus_socket_process_authenticating(bus
);
2950 r
= process_running(bus
, hint_priority
, priority
, ret
);
2954 /* This branch initializes *ret, hence we don't use the generic error checking below */
2958 return process_closing(bus
, ret
);
2961 assert_not_reached("Unknown state");
2964 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2965 bus_enter_closing(bus
);
2976 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2977 return bus_process_internal(bus
, false, 0, ret
);
2980 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2981 return bus_process_internal(bus
, true, priority
, ret
);
2984 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2985 struct pollfd p
[2] = {};
2988 usec_t m
= USEC_INFINITY
;
2992 if (bus
->state
== BUS_CLOSING
)
2995 if (!BUS_IS_OPEN(bus
->state
))
2998 if (bus
->state
== BUS_WATCH_BIND
) {
2999 assert(bus
->inotify_fd
>= 0);
3001 p
[0].events
= POLLIN
;
3002 p
[0].fd
= bus
->inotify_fd
;
3007 e
= sd_bus_get_events(bus
);
3012 /* The caller really needs some more data, he doesn't
3013 * care about what's already read, or any timeouts
3014 * except its own. */
3018 /* The caller wants to process if there's something to
3019 * process, but doesn't care otherwise */
3021 r
= sd_bus_get_timeout(bus
, &until
);
3025 m
= usec_sub_unsigned(until
, now(CLOCK_MONOTONIC
));
3028 p
[0].fd
= bus
->input_fd
;
3029 if (bus
->output_fd
== bus
->input_fd
) {
3033 p
[0].events
= e
& POLLIN
;
3034 p
[1].fd
= bus
->output_fd
;
3035 p
[1].events
= e
& POLLOUT
;
3040 if (timeout_usec
!= (uint64_t) -1 && (m
== USEC_INFINITY
|| timeout_usec
< m
))
3043 r
= ppoll(p
, n
, m
== USEC_INFINITY
? NULL
: timespec_store(&ts
, m
), NULL
);
3047 return r
> 0 ? 1 : 0;
3050 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
3052 assert_return(bus
, -EINVAL
);
3053 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3054 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3056 if (bus
->state
== BUS_CLOSING
)
3059 if (!BUS_IS_OPEN(bus
->state
))
3062 if (bus
->rqueue_size
> 0)
3065 return bus_poll(bus
, false, timeout_usec
);
3068 _public_
int sd_bus_flush(sd_bus
*bus
) {
3071 assert_return(bus
, -EINVAL
);
3072 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3073 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3075 if (bus
->state
== BUS_CLOSING
)
3078 if (!BUS_IS_OPEN(bus
->state
))
3081 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3082 if (bus
->state
== BUS_WATCH_BIND
)
3085 r
= bus_ensure_running(bus
);
3089 if (bus
->wqueue_size
<= 0)
3093 r
= dispatch_wqueue(bus
);
3095 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
3096 bus_enter_closing(bus
);
3103 if (bus
->wqueue_size
<= 0)
3106 r
= bus_poll(bus
, false, (uint64_t) -1);
3112 _public_
int sd_bus_add_filter(
3115 sd_bus_message_handler_t callback
,
3120 assert_return(bus
, -EINVAL
);
3121 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3122 assert_return(callback
, -EINVAL
);
3123 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3125 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
3129 s
->filter_callback
.callback
= callback
;
3131 bus
->filter_callbacks_modified
= true;
3132 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
3140 static int add_match_callback(
3143 sd_bus_error
*ret_error
) {
3145 sd_bus_slot
*match_slot
= userdata
;
3146 bool failed
= false;
3152 sd_bus_slot_ref(match_slot
);
3154 if (sd_bus_message_is_method_error(m
, NULL
)) {
3155 log_debug_errno(sd_bus_message_get_errno(m
),
3156 "Unable to add match %s, failing connection: %s",
3157 match_slot
->match_callback
.match_string
,
3158 sd_bus_message_get_error(m
)->message
);
3162 log_debug("Match %s successfully installed.", match_slot
->match_callback
.match_string
);
3164 if (match_slot
->match_callback
.install_callback
) {
3167 bus
= sd_bus_message_get_bus(m
);
3169 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3170 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3173 assert(bus
->current_slot
== match_slot
->match_callback
.install_slot
);
3174 assert(bus
->current_handler
== add_match_callback
);
3175 assert(bus
->current_userdata
== userdata
);
3177 bus
->current_slot
= match_slot
;
3178 bus
->current_handler
= match_slot
->match_callback
.install_callback
;
3179 bus
->current_userdata
= match_slot
->userdata
;
3181 r
= match_slot
->match_callback
.install_callback(m
, match_slot
->userdata
, ret_error
);
3183 bus
->current_slot
= match_slot
->match_callback
.install_slot
;
3184 bus
->current_handler
= add_match_callback
;
3185 bus
->current_userdata
= userdata
;
3187 match_slot
->match_callback
.install_slot
= sd_bus_slot_unref(match_slot
->match_callback
.install_slot
);
3189 if (failed
) /* Generic failure handling: destroy the connection */
3190 bus_enter_closing(sd_bus_message_get_bus(m
));
3195 if (failed
&& match_slot
->floating
) {
3196 bus_slot_disconnect(match_slot
);
3197 sd_bus_slot_unref(match_slot
);
3200 sd_bus_slot_unref(match_slot
);
3205 static int bus_add_match_full(
3210 sd_bus_message_handler_t callback
,
3211 sd_bus_message_handler_t install_callback
,
3214 struct bus_match_component
*components
= NULL
;
3215 unsigned n_components
= 0;
3216 sd_bus_slot
*s
= NULL
;
3219 assert_return(bus
, -EINVAL
);
3220 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3221 assert_return(match
, -EINVAL
);
3222 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3224 r
= bus_match_parse(match
, &components
, &n_components
);
3228 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
3234 s
->match_callback
.callback
= callback
;
3235 s
->match_callback
.install_callback
= install_callback
;
3237 if (bus
->bus_client
) {
3238 enum bus_match_scope scope
;
3240 scope
= bus_match_get_scope(components
, n_components
);
3242 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3243 if (scope
!= BUS_MATCH_LOCAL
) {
3245 /* We store the original match string, so that we can use it to remove the match again. */
3247 s
->match_callback
.match_string
= strdup(match
);
3248 if (!s
->match_callback
.match_string
) {
3254 r
= bus_add_match_internal_async(bus
,
3255 &s
->match_callback
.install_slot
,
3256 s
->match_callback
.match_string
,
3260 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
);
3264 s
->match_added
= true;
3268 bus
->match_callbacks_modified
= true;
3269 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
3278 bus_match_parse_free(components
, n_components
);
3279 sd_bus_slot_unref(s
);
3284 _public_
int sd_bus_add_match(
3288 sd_bus_message_handler_t callback
,
3291 return bus_add_match_full(bus
, slot
, false, match
, callback
, NULL
, userdata
);
3294 _public_
int sd_bus_add_match_async(
3298 sd_bus_message_handler_t callback
,
3299 sd_bus_message_handler_t install_callback
,
3302 return bus_add_match_full(bus
, slot
, true, match
, callback
, install_callback
, userdata
);
3305 bool bus_pid_changed(sd_bus
*bus
) {
3308 /* We don't support people creating a bus connection and
3309 * keeping it around over a fork(). Let's complain. */
3311 return bus
->original_pid
!= getpid_cached();
3314 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3315 sd_bus
*bus
= userdata
;
3320 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3322 r
= sd_bus_process(bus
, NULL
);
3324 log_debug_errno(r
, "Processing of bus failed, closing down: %m");
3325 bus_enter_closing(bus
);
3331 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3332 sd_bus
*bus
= userdata
;
3337 r
= sd_bus_process(bus
, NULL
);
3339 log_debug_errno(r
, "Processing of bus failed, closing down: %m");
3340 bus_enter_closing(bus
);
3346 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3347 sd_bus
*bus
= userdata
;
3354 e
= sd_bus_get_events(bus
);
3360 if (bus
->output_fd
!= bus
->input_fd
) {
3362 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3366 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3368 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3372 r
= sd_bus_get_timeout(bus
, &until
);
3378 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3385 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3392 log_debug_errno(r
, "Preparing of bus events failed, closing down: %m");
3393 bus_enter_closing(bus
);
3398 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3399 sd_bus
*bus
= userdata
;
3409 int bus_attach_io_events(sd_bus
*bus
) {
3414 if (bus
->input_fd
< 0)
3420 if (!bus
->input_io_event_source
) {
3421 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3425 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3429 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3433 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3435 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3440 if (bus
->output_fd
!= bus
->input_fd
) {
3441 assert(bus
->output_fd
>= 0);
3443 if (!bus
->output_io_event_source
) {
3444 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3448 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3452 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3454 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3463 static void bus_detach_io_events(sd_bus
*bus
) {
3466 if (bus
->input_io_event_source
) {
3467 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3468 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3471 if (bus
->output_io_event_source
) {
3472 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3473 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3477 int bus_attach_inotify_event(sd_bus
*bus
) {
3482 if (bus
->inotify_fd
< 0)
3488 if (!bus
->inotify_event_source
) {
3489 r
= sd_event_add_io(bus
->event
, &bus
->inotify_event_source
, bus
->inotify_fd
, EPOLLIN
, io_callback
, bus
);
3493 r
= sd_event_source_set_priority(bus
->inotify_event_source
, bus
->event_priority
);
3497 r
= sd_event_source_set_description(bus
->inotify_event_source
, "bus-inotify");
3499 r
= sd_event_source_set_io_fd(bus
->inotify_event_source
, bus
->inotify_fd
);
3506 static void bus_detach_inotify_event(sd_bus
*bus
) {
3509 if (bus
->inotify_event_source
) {
3510 sd_event_source_set_enabled(bus
->inotify_event_source
, SD_EVENT_OFF
);
3511 bus
->inotify_event_source
= sd_event_source_unref(bus
->inotify_event_source
);
3515 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3518 assert_return(bus
, -EINVAL
);
3519 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3520 assert_return(!bus
->event
, -EBUSY
);
3522 assert(!bus
->input_io_event_source
);
3523 assert(!bus
->output_io_event_source
);
3524 assert(!bus
->time_event_source
);
3527 bus
->event
= sd_event_ref(event
);
3529 r
= sd_event_default(&bus
->event
);
3534 bus
->event_priority
= priority
;
3536 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3540 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3544 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3548 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3552 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3556 r
= bus_attach_io_events(bus
);
3560 r
= bus_attach_inotify_event(bus
);
3567 sd_bus_detach_event(bus
);
3571 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3572 assert_return(bus
, -EINVAL
);
3573 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3578 bus_detach_io_events(bus
);
3579 bus_detach_inotify_event(bus
);
3581 if (bus
->time_event_source
) {
3582 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3583 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3586 if (bus
->quit_event_source
) {
3587 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3588 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3591 bus
->event
= sd_event_unref(bus
->event
);
3595 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3596 assert_return(bus
, NULL
);
3601 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3602 assert_return(bus
, NULL
);
3604 return bus
->current_message
;
3607 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3608 assert_return(bus
, NULL
);
3610 return bus
->current_slot
;
3613 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3614 assert_return(bus
, NULL
);
3616 return bus
->current_handler
;
3619 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3620 assert_return(bus
, NULL
);
3622 return bus
->current_userdata
;
3625 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3630 assert(default_bus
);
3633 return !!*default_bus
;
3636 *ret
= sd_bus_ref(*default_bus
);
3644 b
->default_bus_ptr
= default_bus
;
3652 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3653 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3657 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3658 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3661 _public_
int sd_bus_default(sd_bus
**ret
) {
3662 int (*bus_open
)(sd_bus
**) = NULL
;
3665 busp
= bus_choose_default(&bus_open
);
3666 return bus_default(bus_open
, busp
, ret
);
3669 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3670 assert_return(b
, -EINVAL
);
3671 assert_return(tid
, -EINVAL
);
3672 assert_return(!bus_pid_changed(b
), -ECHILD
);
3680 return sd_event_get_tid(b
->event
, tid
);
3685 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3686 _cleanup_free_
char *e
= NULL
;
3689 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3690 assert_return(external_id
, -EINVAL
);
3691 assert_return(ret_path
, -EINVAL
);
3693 e
= bus_label_escape(external_id
);
3697 ret
= strjoin(prefix
, "/", e
);
3705 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3709 assert_return(object_path_is_valid(path
), -EINVAL
);
3710 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3711 assert_return(external_id
, -EINVAL
);
3713 e
= object_path_startswith(path
, prefix
);
3715 *external_id
= NULL
;
3719 ret
= bus_label_unescape(e
);
3727 _public_
int sd_bus_path_encode_many(char **out
, const char *path_template
, ...) {
3728 _cleanup_strv_free_
char **labels
= NULL
;
3729 char *path
, *path_pos
, **label_pos
;
3730 const char *sep
, *template_pos
;
3735 assert_return(out
, -EINVAL
);
3736 assert_return(path_template
, -EINVAL
);
3738 path_length
= strlen(path_template
);
3740 va_start(list
, path_template
);
3741 for (sep
= strchr(path_template
, '%'); sep
; sep
= strchr(sep
+ 1, '%')) {
3745 arg
= va_arg(list
, const char *);
3751 label
= bus_label_escape(arg
);
3757 r
= strv_consume(&labels
, label
);
3763 /* add label length, but account for the format character */
3764 path_length
+= strlen(label
) - 1;
3768 path
= malloc(path_length
+ 1);
3775 for (template_pos
= path_template
; *template_pos
; ) {
3776 sep
= strchrnul(template_pos
, '%');
3777 path_pos
= mempcpy(path_pos
, template_pos
, sep
- template_pos
);
3781 path_pos
= stpcpy(path_pos
, *label_pos
++);
3782 template_pos
= sep
+ 1;
3790 _public_
int sd_bus_path_decode_many(const char *path
, const char *path_template
, ...) {
3791 _cleanup_strv_free_
char **labels
= NULL
;
3792 const char *template_pos
, *path_pos
;
3798 * This decodes an object-path based on a template argument. The
3799 * template consists of a verbatim path, optionally including special
3802 * - Each occurrence of '%' in the template matches an arbitrary
3803 * substring of a label in the given path. At most one such
3804 * directive is allowed per label. For each such directive, the
3805 * caller must provide an output parameter (char **) via va_arg. If
3806 * NULL is passed, the given label is verified, but not returned.
3807 * For each matched label, the *decoded* label is stored in the
3808 * passed output argument, and the caller is responsible to free
3809 * it. Note that the output arguments are only modified if the
3810 * actualy path matched the template. Otherwise, they're left
3813 * This function returns <0 on error, 0 if the path does not match the
3814 * template, 1 if it matched.
3817 assert_return(path
, -EINVAL
);
3818 assert_return(path_template
, -EINVAL
);
3822 for (template_pos
= path_template
; *template_pos
; ) {
3827 /* verify everything until the next '%' matches verbatim */
3828 sep
= strchrnul(template_pos
, '%');
3829 length
= sep
- template_pos
;
3830 if (strncmp(path_pos
, template_pos
, length
))
3834 template_pos
+= length
;
3839 /* We found the next '%' character. Everything up until here
3840 * matched. We now skip ahead to the end of this label and make
3841 * sure it matches the tail of the label in the path. Then we
3842 * decode the string in-between and save it for later use. */
3844 ++template_pos
; /* skip over '%' */
3846 sep
= strchrnul(template_pos
, '/');
3847 length
= sep
- template_pos
; /* length of suffix to match verbatim */
3849 /* verify the suffixes match */
3850 sep
= strchrnul(path_pos
, '/');
3851 if (sep
- path_pos
< (ssize_t
)length
||
3852 strncmp(sep
- length
, template_pos
, length
))
3855 template_pos
+= length
; /* skip over matched label */
3856 length
= sep
- path_pos
- length
; /* length of sub-label to decode */
3858 /* store unescaped label for later use */
3859 label
= bus_label_unescape_n(path_pos
, length
);
3863 r
= strv_consume(&labels
, label
);
3867 path_pos
= sep
; /* skip decoded label and suffix */
3870 /* end of template must match end of path */
3874 /* copy the labels over to the caller */
3875 va_start(list
, path_template
);
3876 for (label_pos
= labels
; label_pos
&& *label_pos
; ++label_pos
) {
3879 arg
= va_arg(list
, char **);
3887 labels
= mfree(labels
);
3891 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3892 assert_return(bus
, -EINVAL
);
3893 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3894 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3899 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3900 assert_return(bus
, -EINVAL
);
3901 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3902 assert_return(description
, -EINVAL
);
3903 assert_return(bus
->description
, -ENXIO
);
3904 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3906 *description
= bus
->description
;
3910 int bus_get_root_path(sd_bus
*bus
) {
3913 if (bus
->cgroup_root
)
3916 r
= cg_get_root_path(&bus
->cgroup_root
);
3918 bus
->cgroup_root
= strdup("/");
3919 if (!bus
->cgroup_root
)
3928 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3929 assert_return(bus
, -EINVAL
);
3930 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3931 assert_return(scope
, -EINVAL
);
3932 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3939 if (bus
->is_system
) {
3947 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3949 assert_return(bus
, -EINVAL
);
3950 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3951 assert_return(address
, -EINVAL
);
3952 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3955 *address
= bus
->address
;
3962 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3963 assert_return(bus
, -EINVAL
);
3964 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3965 assert_return(mask
, -EINVAL
);
3966 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3968 *mask
= bus
->creds_mask
;
3972 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3973 assert_return(bus
, -EINVAL
);
3974 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3975 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3977 return bus
->bus_client
;
3980 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3981 assert_return(bus
, -EINVAL
);
3982 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3983 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3985 return bus
->is_server
;
3988 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3989 assert_return(bus
, -EINVAL
);
3990 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3991 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3993 return bus
->anonymous_auth
;
3996 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3997 assert_return(bus
, -EINVAL
);
3998 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
3999 assert_return(!bus_pid_changed(bus
), -ECHILD
);
4001 return bus
->trusted
;
4004 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
4005 assert_return(bus
, -EINVAL
);
4006 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
4007 assert_return(!bus_pid_changed(bus
), -ECHILD
);
4009 return bus
->is_monitor
;
4012 static void flush_close(sd_bus
*bus
) {
4016 /* Flushes and closes the specified bus. We take a ref before,
4017 * to ensure the flushing does not cause the bus to be
4020 sd_bus_flush_close_unref(sd_bus_ref(bus
));
4023 _public_
void sd_bus_default_flush_close(void) {
4024 flush_close(default_starter_bus
);
4025 flush_close(default_user_bus
);
4026 flush_close(default_system_bus
);
4029 _public_
int sd_bus_set_exit_on_disconnect(sd_bus
*bus
, int b
) {
4030 assert_return(bus
, -EINVAL
);
4031 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
4033 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4034 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4035 * from the client side. */
4036 bus
->exit_on_disconnect
= b
;
4038 /* If the exit condition was triggered already, exit immediately. */
4039 return bus_exit_now(bus
);
4042 _public_
int sd_bus_get_exit_on_disconnect(sd_bus
*bus
) {
4043 assert_return(bus
, -EINVAL
);
4044 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
4046 return bus
->exit_on_disconnect
;
4049 _public_
int sd_bus_set_sender(sd_bus
*bus
, const char *sender
) {
4050 assert_return(bus
, -EINVAL
);
4051 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
4052 assert_return(!bus
->bus_client
, -EPERM
);
4053 assert_return(!sender
|| service_name_is_valid(sender
), -EINVAL
);
4055 return free_and_strdup(&bus
->patch_sender
, sender
);
4058 _public_
int sd_bus_get_sender(sd_bus
*bus
, const char **ret
) {
4059 assert_return(bus
, -EINVAL
);
4060 assert_return(bus
= bus_resolve(bus
), -ENOPKG
);
4061 assert_return(ret
, -EINVAL
);
4063 if (!bus
->patch_sender
)
4066 *ret
= bus
->patch_sender
;