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 "string-util.h"
57 #define log_debug_bus_message(m) \
59 sd_bus_message *_mm = (m); \
60 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", \
61 bus_message_type_to_string(_mm->header->type), \
62 strna(sd_bus_message_get_sender(_mm)), \
63 strna(sd_bus_message_get_destination(_mm)), \
64 strna(sd_bus_message_get_path(_mm)), \
65 strna(sd_bus_message_get_interface(_mm)), \
66 strna(sd_bus_message_get_member(_mm)), \
67 BUS_MESSAGE_COOKIE(_mm), \
69 strna(_mm->root_container.signature), \
70 strna(_mm->error.name), \
71 strna(_mm->error.message)); \
74 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
75 static void bus_detach_io_events(sd_bus
*b
);
76 static void bus_detach_inotify_event(sd_bus
*b
);
78 static thread_local sd_bus
*default_system_bus
= NULL
;
79 static thread_local sd_bus
*default_user_bus
= NULL
;
80 static thread_local sd_bus
*default_starter_bus
= NULL
;
82 void bus_close_io_fds(sd_bus
*b
) {
85 bus_detach_io_events(b
);
87 if (b
->input_fd
!= b
->output_fd
)
88 safe_close(b
->output_fd
);
89 b
->output_fd
= b
->input_fd
= safe_close(b
->input_fd
);
92 void bus_close_inotify_fd(sd_bus
*b
) {
95 bus_detach_inotify_event(b
);
97 b
->inotify_fd
= safe_close(b
->inotify_fd
);
98 b
->inotify_watches
= mfree(b
->inotify_watches
);
99 b
->n_inotify_watches
= 0;
102 static void bus_reset_queues(sd_bus
*b
) {
105 while (b
->rqueue_size
> 0)
106 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
108 b
->rqueue
= mfree(b
->rqueue
);
109 b
->rqueue_allocated
= 0;
111 while (b
->wqueue_size
> 0)
112 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
114 b
->wqueue
= mfree(b
->wqueue
);
115 b
->wqueue_allocated
= 0;
118 static void bus_free(sd_bus
*b
) {
122 assert(!b
->track_queue
);
125 b
->state
= BUS_CLOSED
;
127 sd_bus_detach_event(b
);
129 while ((s
= b
->slots
)) {
130 /* At this point only floating slots can still be
131 * around, because the non-floating ones keep a
132 * reference to the bus, and we thus couldn't be
133 * destructing right now... We forcibly disconnect the
134 * slots here, so that they still can be referenced by
135 * apps, but are dead. */
138 bus_slot_disconnect(s
);
139 sd_bus_slot_unref(s
);
142 if (b
->default_bus_ptr
)
143 *b
->default_bus_ptr
= NULL
;
146 bus_close_inotify_fd(b
);
151 free(b
->unique_name
);
152 free(b
->auth_buffer
);
155 free(b
->cgroup_root
);
156 free(b
->description
);
159 strv_free(b
->exec_argv
);
161 close_many(b
->fds
, b
->n_fds
);
166 ordered_hashmap_free_free(b
->reply_callbacks
);
167 prioq_free(b
->reply_callbacks_prioq
);
169 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
170 bus_match_free(&b
->match_callbacks
);
172 hashmap_free_free(b
->vtable_methods
);
173 hashmap_free_free(b
->vtable_properties
);
175 assert(hashmap_isempty(b
->nodes
));
176 hashmap_free(b
->nodes
);
180 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
185 _public_
int sd_bus_new(sd_bus
**ret
) {
188 assert_return(ret
, -EINVAL
);
194 r
->n_ref
= REFCNT_INIT
;
195 r
->input_fd
= r
->output_fd
= -1;
197 r
->message_version
= 1;
198 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
200 r
->original_pid
= getpid_cached();
201 r
->n_groups
= (size_t) -1;
203 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
205 /* We guarantee that wqueue always has space for at least one
207 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
216 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
219 assert_return(bus
, -EINVAL
);
220 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
221 assert_return(address
, -EINVAL
);
222 assert_return(!bus_pid_changed(bus
), -ECHILD
);
234 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
235 assert_return(bus
, -EINVAL
);
236 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
237 assert_return(input_fd
>= 0, -EBADF
);
238 assert_return(output_fd
>= 0, -EBADF
);
239 assert_return(!bus_pid_changed(bus
), -ECHILD
);
241 bus
->input_fd
= input_fd
;
242 bus
->output_fd
= output_fd
;
246 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
249 assert_return(bus
, -EINVAL
);
250 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
251 assert_return(path
, -EINVAL
);
252 assert_return(!strv_isempty(argv
), -EINVAL
);
253 assert_return(!bus_pid_changed(bus
), -ECHILD
);
265 free(bus
->exec_path
);
266 strv_free(bus
->exec_argv
);
274 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
275 assert_return(bus
, -EINVAL
);
276 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
277 assert_return(!bus_pid_changed(bus
), -ECHILD
);
279 bus
->bus_client
= !!b
;
283 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
284 assert_return(bus
, -EINVAL
);
285 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
286 assert_return(!bus_pid_changed(bus
), -ECHILD
);
292 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
293 assert_return(bus
, -EINVAL
);
294 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
295 assert_return(!bus_pid_changed(bus
), -ECHILD
);
301 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
302 assert_return(bus
, -EINVAL
);
303 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
304 assert_return(!bus_pid_changed(bus
), -ECHILD
);
306 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
307 * replies, and maybe one day classic D-Bus learns this too */
308 bus
->attach_timestamp
= b
;
313 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
314 assert_return(bus
, -EINVAL
);
315 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
316 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
317 assert_return(!bus_pid_changed(bus
), -ECHILD
);
319 SET_FLAG(bus
->creds_mask
, mask
, b
);
321 /* The well knowns we need unconditionally, so that matches can work */
322 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
327 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
328 assert_return(bus
, -EINVAL
);
329 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
330 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
331 assert_return(!bus_pid_changed(bus
), -ECHILD
);
333 bus
->is_server
= !!b
;
334 bus
->server_id
= server_id
;
338 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
339 assert_return(bus
, -EINVAL
);
340 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
341 assert_return(!bus_pid_changed(bus
), -ECHILD
);
343 bus
->anonymous_auth
= !!b
;
347 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
348 assert_return(bus
, -EINVAL
);
349 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
350 assert_return(!bus_pid_changed(bus
), -ECHILD
);
356 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
357 assert_return(bus
, -EINVAL
);
358 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
359 assert_return(!bus_pid_changed(bus
), -ECHILD
);
361 return free_and_strdup(&bus
->description
, description
);
364 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
365 assert_return(bus
, -EINVAL
);
366 assert_return(!bus_pid_changed(bus
), -ECHILD
);
368 bus
->allow_interactive_authorization
= !!b
;
372 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
373 assert_return(bus
, -EINVAL
);
374 assert_return(!bus_pid_changed(bus
), -ECHILD
);
376 return bus
->allow_interactive_authorization
;
379 _public_
int sd_bus_set_watch_bind(sd_bus
*bus
, int b
) {
380 assert_return(bus
, -EINVAL
);
381 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
382 assert_return(!bus_pid_changed(bus
), -ECHILD
);
388 _public_
int sd_bus_get_watch_bind(sd_bus
*bus
) {
389 assert_return(bus
, -EINVAL
);
390 assert_return(!bus_pid_changed(bus
), -ECHILD
);
392 return bus
->watch_bind
;
395 _public_
int sd_bus_set_connected_signal(sd_bus
*bus
, int b
) {
396 assert_return(bus
, -EINVAL
);
397 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
398 assert_return(!bus_pid_changed(bus
), -ECHILD
);
400 bus
->connected_signal
= b
;
404 _public_
int sd_bus_get_connected_signal(sd_bus
*bus
) {
405 assert_return(bus
, -EINVAL
);
406 assert_return(!bus_pid_changed(bus
), -ECHILD
);
408 return bus
->connected_signal
;
411 static int synthesize_connected_signal(sd_bus
*bus
) {
412 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
417 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
418 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
419 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
421 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
422 * that works independently from whether we connected to a full bus or just a direct connection. */
424 if (!bus
->connected_signal
)
427 r
= sd_bus_message_new_signal(
430 "/org/freedesktop/DBus/Local",
431 "org.freedesktop.DBus.Local",
436 bus_message_set_sender_local(bus
, m
);
438 r
= bus_seal_synthetic_message(bus
, m
);
442 r
= bus_rqueue_make_room(bus
);
446 /* Insert at the very front */
447 memmove(bus
->rqueue
+ 1, bus
->rqueue
, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
455 void bus_set_state(sd_bus
*bus
, enum bus_state state
) {
457 static const char * const table
[_BUS_STATE_MAX
] = {
458 [BUS_UNSET
] = "UNSET",
459 [BUS_WATCH_BIND
] = "WATCH_BIND",
460 [BUS_OPENING
] = "OPENING",
461 [BUS_AUTHENTICATING
] = "AUTHENTICATING",
462 [BUS_HELLO
] = "HELLO",
463 [BUS_RUNNING
] = "RUNNING",
464 [BUS_CLOSING
] = "CLOSING",
465 [BUS_CLOSED
] = "CLOSED",
469 assert(state
< _BUS_STATE_MAX
);
471 if (state
== bus
->state
)
474 log_debug("Bus %s: changing state %s → %s", strna(bus
->description
), table
[bus
->state
], table
[state
]);
478 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
486 assert(IN_SET(bus
->state
, BUS_HELLO
, BUS_CLOSING
));
488 r
= sd_bus_message_get_errno(reply
);
492 r
= sd_bus_message_read(reply
, "s", &s
);
496 if (!service_name_is_valid(s
) || s
[0] != ':')
499 bus
->unique_name
= strdup(s
);
500 if (!bus
->unique_name
)
503 if (bus
->state
== BUS_HELLO
) {
504 bus_set_state(bus
, BUS_RUNNING
);
506 r
= synthesize_connected_signal(bus
);
514 static int bus_send_hello(sd_bus
*bus
) {
515 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
520 if (!bus
->bus_client
)
523 r
= sd_bus_message_new_method_call(
526 "org.freedesktop.DBus",
527 "/org/freedesktop/DBus",
528 "org.freedesktop.DBus",
533 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
536 int bus_start_running(sd_bus
*bus
) {
537 struct reply_callback
*c
;
543 assert(bus
->state
< BUS_HELLO
);
545 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
546 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
547 * adding a fixed value to all entries should not alter the internal order. */
549 n
= now(CLOCK_MONOTONIC
);
550 ORDERED_HASHMAP_FOREACH(c
, bus
->reply_callbacks
, i
) {
551 if (c
->timeout_usec
== 0)
554 c
->timeout_usec
= usec_add(n
, c
->timeout_usec
);
557 if (bus
->bus_client
) {
558 bus_set_state(bus
, BUS_HELLO
);
562 bus_set_state(bus
, BUS_RUNNING
);
564 r
= synthesize_connected_signal(bus
);
571 static int parse_address_key(const char **p
, const char *key
, char **value
) {
572 size_t l
, n
= 0, allocated
= 0;
582 if (strncmp(*p
, key
, l
) != 0)
595 while (!IN_SET(*a
, ';', ',', 0)) {
613 c
= (char) ((x
<< 4) | y
);
620 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
644 static void skip_address_key(const char **p
) {
648 *p
+= strcspn(*p
, ",");
654 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
655 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
664 while (!IN_SET(**p
, 0, ';')) {
665 r
= parse_address_key(p
, "guid", guid
);
671 r
= parse_address_key(p
, "path", &path
);
677 r
= parse_address_key(p
, "abstract", &abstract
);
686 if (!path
&& !abstract
)
689 if (path
&& abstract
)
694 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
697 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
698 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
699 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
700 } else if (abstract
) {
701 l
= strlen(abstract
);
702 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
705 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
706 b
->sockaddr
.un
.sun_path
[0] = 0;
707 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
708 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
716 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
717 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
719 struct addrinfo
*result
, hints
= {
720 .ai_socktype
= SOCK_STREAM
,
721 .ai_flags
= AI_ADDRCONFIG
,
729 while (!IN_SET(**p
, 0, ';')) {
730 r
= parse_address_key(p
, "guid", guid
);
736 r
= parse_address_key(p
, "host", &host
);
742 r
= parse_address_key(p
, "port", &port
);
748 r
= parse_address_key(p
, "family", &family
);
761 if (streq(family
, "ipv4"))
762 hints
.ai_family
= AF_INET
;
763 else if (streq(family
, "ipv6"))
764 hints
.ai_family
= AF_INET6
;
769 r
= getaddrinfo(host
, port
, &hints
, &result
);
773 return -EADDRNOTAVAIL
;
775 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
776 b
->sockaddr_size
= result
->ai_addrlen
;
778 freeaddrinfo(result
);
785 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
787 unsigned n_argv
= 0, j
;
789 size_t allocated
= 0;
797 while (!IN_SET(**p
, 0, ';')) {
798 r
= parse_address_key(p
, "guid", guid
);
804 r
= parse_address_key(p
, "path", &path
);
810 if (startswith(*p
, "argv")) {
814 ul
= strtoul(*p
+ 4, (char**) p
, 10);
815 if (errno
> 0 || **p
!= '=' || ul
> 256) {
823 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
831 r
= parse_address_key(p
, NULL
, argv
+ ul
);
846 /* Make sure there are no holes in the array, with the
847 * exception of argv[0] */
848 for (j
= 1; j
< n_argv
; j
++)
854 if (argv
&& argv
[0] == NULL
) {
855 argv
[0] = strdup(path
);
870 for (j
= 0; j
< n_argv
; j
++)
878 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
879 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
887 while (!IN_SET(**p
, 0, ';')) {
888 r
= parse_address_key(p
, "guid", guid
);
894 r
= parse_address_key(p
, "machine", &machine
);
900 r
= parse_address_key(p
, "pid", &pid
);
909 if (!machine
== !pid
)
913 if (!machine_name_is_valid(machine
))
916 free_and_replace(b
->machine
, machine
);
918 b
->machine
= mfree(b
->machine
);
922 r
= parse_pid(pid
, &b
->nspid
);
928 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
929 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
930 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
931 b
->sockaddr_size
= SOCKADDR_UN_LEN(b
->sockaddr
.un
);
937 static void bus_reset_parsed_address(sd_bus
*b
) {
941 b
->sockaddr_size
= 0;
942 b
->exec_argv
= strv_free(b
->exec_argv
);
943 b
->exec_path
= mfree(b
->exec_path
);
944 b
->server_id
= SD_ID128_NULL
;
945 b
->machine
= mfree(b
->machine
);
949 static int bus_parse_next_address(sd_bus
*b
) {
950 _cleanup_free_
char *guid
= NULL
;
958 if (b
->address
[b
->address_index
] == 0)
961 bus_reset_parsed_address(b
);
963 a
= b
->address
+ b
->address_index
;
972 if (startswith(a
, "unix:")) {
975 r
= parse_unix_address(b
, &a
, &guid
);
980 } else if (startswith(a
, "tcp:")) {
983 r
= parse_tcp_address(b
, &a
, &guid
);
989 } else if (startswith(a
, "unixexec:")) {
992 r
= parse_exec_address(b
, &a
, &guid
);
998 } else if (startswith(a
, "x-machine-unix:")) {
1001 r
= parse_container_unix_address(b
, &a
, &guid
);
1014 r
= sd_id128_from_string(guid
, &b
->server_id
);
1019 b
->address_index
= a
- b
->address
;
1023 static int bus_start_address(sd_bus
*b
) {
1029 bus_close_io_fds(b
);
1030 bus_close_inotify_fd(b
);
1032 /* If you provide multiple different bus-addresses, we
1033 * try all of them in order and use the first one that
1037 r
= bus_socket_exec(b
);
1038 else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1039 r
= bus_container_connect_socket(b
);
1040 else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1041 r
= bus_socket_connect(b
);
1048 q
= bus_attach_io_events(b
);
1052 q
= bus_attach_inotify_event(b
);
1059 b
->last_connect_error
= -r
;
1062 r
= bus_parse_next_address(b
);
1066 return b
->last_connect_error
> 0 ? -b
->last_connect_error
: -ECONNREFUSED
;
1070 int bus_next_address(sd_bus
*b
) {
1073 bus_reset_parsed_address(b
);
1074 return bus_start_address(b
);
1077 static int bus_start_fd(sd_bus
*b
) {
1082 assert(b
->input_fd
>= 0);
1083 assert(b
->output_fd
>= 0);
1085 r
= fd_nonblock(b
->input_fd
, true);
1089 r
= fd_cloexec(b
->input_fd
, true);
1093 if (b
->input_fd
!= b
->output_fd
) {
1094 r
= fd_nonblock(b
->output_fd
, true);
1098 r
= fd_cloexec(b
->output_fd
, true);
1103 if (fstat(b
->input_fd
, &st
) < 0)
1106 return bus_socket_take_fd(b
);
1109 _public_
int sd_bus_start(sd_bus
*bus
) {
1112 assert_return(bus
, -EINVAL
);
1113 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1114 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1116 bus_set_state(bus
, BUS_OPENING
);
1118 if (bus
->is_server
&& bus
->bus_client
)
1121 if (bus
->input_fd
>= 0)
1122 r
= bus_start_fd(bus
);
1123 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->machine
)
1124 r
= bus_start_address(bus
);
1133 return bus_send_hello(bus
);
1136 _public_
int sd_bus_open(sd_bus
**ret
) {
1141 assert_return(ret
, -EINVAL
);
1143 /* Let's connect to the starter bus if it is set, and
1144 * otherwise to the bus that is appropropriate for the scope
1145 * we are running in */
1147 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1149 if (streq(e
, "system"))
1150 return sd_bus_open_system(ret
);
1151 else if (STR_IN_SET(e
, "session", "user"))
1152 return sd_bus_open_user(ret
);
1155 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1157 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1158 return sd_bus_open_user(ret
);
1160 return sd_bus_open_system(ret
);
1167 r
= sd_bus_set_address(b
, e
);
1171 b
->bus_client
= true;
1173 /* We don't know whether the bus is trusted or not, so better
1174 * be safe, and authenticate everything */
1176 b
->is_local
= false;
1177 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1179 r
= sd_bus_start(b
);
1191 int bus_set_address_system(sd_bus
*b
) {
1195 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1197 return sd_bus_set_address(b
, e
);
1199 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1202 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1206 assert_return(ret
, -EINVAL
);
1212 r
= bus_set_address_system(b
);
1216 b
->bus_client
= true;
1217 b
->is_system
= true;
1219 /* Let's do per-method access control on the system bus. We
1220 * need the caller's UID and capability set for that. */
1222 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1225 r
= sd_bus_start(b
);
1237 int bus_set_address_user(sd_bus
*b
) {
1239 _cleanup_free_
char *ee
= NULL
, *s
= NULL
;
1243 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1245 return sd_bus_set_address(b
, e
);
1247 e
= secure_getenv("XDG_RUNTIME_DIR");
1251 ee
= bus_address_escape(e
);
1255 if (asprintf(&s
, DEFAULT_USER_BUS_ADDRESS_FMT
, ee
) < 0)
1264 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1268 assert_return(ret
, -EINVAL
);
1274 r
= bus_set_address_user(b
);
1278 b
->bus_client
= true;
1281 /* We don't do any per-method access control on the user
1286 r
= sd_bus_start(b
);
1298 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1299 _cleanup_free_
char *e
= NULL
;
1300 char *m
= NULL
, *c
= NULL
;
1305 /* Let's see if we shall enter some container */
1306 m
= strchr(host
, ':');
1310 /* Let's make sure this is not a port of some kind,
1311 * and is a valid machine name. */
1312 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1315 /* Cut out the host part */
1316 t
= strndupa(host
, m
- host
- 1);
1317 e
= bus_address_escape(t
);
1321 c
= strjoina(",argv5=--machine=", m
);
1326 e
= bus_address_escape(host
);
1331 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e
, ",argv4=systemd-stdio-bridge", c
);
1338 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1342 assert_return(host
, -EINVAL
);
1343 assert_return(ret
, -EINVAL
);
1345 r
= sd_bus_new(&bus
);
1349 r
= bus_set_address_system_remote(bus
, host
);
1353 bus
->bus_client
= true;
1354 bus
->trusted
= false;
1355 bus
->is_system
= true;
1356 bus
->is_local
= false;
1358 r
= sd_bus_start(bus
);
1370 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1371 _cleanup_free_
char *e
= NULL
;
1376 e
= bus_address_escape(machine
);
1380 b
->address
= strjoin("x-machine-unix:machine=", e
);
1387 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1391 assert_return(machine
, -EINVAL
);
1392 assert_return(ret
, -EINVAL
);
1393 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1395 r
= sd_bus_new(&bus
);
1399 r
= bus_set_address_system_machine(bus
, machine
);
1403 bus
->bus_client
= true;
1404 bus
->trusted
= false;
1405 bus
->is_system
= true;
1406 bus
->is_local
= false;
1408 r
= sd_bus_start(bus
);
1420 _public_
void sd_bus_close(sd_bus
*bus
) {
1424 if (bus
->state
== BUS_CLOSED
)
1426 if (bus_pid_changed(bus
))
1429 bus_set_state(bus
, BUS_CLOSED
);
1431 sd_bus_detach_event(bus
);
1433 /* Drop all queued messages so that they drop references to
1434 * the bus object and the bus may be freed */
1435 bus_reset_queues(bus
);
1437 bus_close_io_fds(bus
);
1438 bus_close_inotify_fd(bus
);
1441 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1449 return sd_bus_unref(bus
);
1452 void bus_enter_closing(sd_bus
*bus
) {
1455 if (!IN_SET(bus
->state
, BUS_WATCH_BIND
, BUS_OPENING
, BUS_AUTHENTICATING
, BUS_HELLO
, BUS_RUNNING
))
1458 bus_set_state(bus
, BUS_CLOSING
);
1461 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1466 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1471 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1477 i
= REFCNT_DEC(bus
->n_ref
);
1485 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1487 assert_return(bus
, -EINVAL
);
1488 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1490 return BUS_IS_OPEN(bus
->state
);
1493 _public_
int sd_bus_is_ready(sd_bus
*bus
) {
1494 assert_return(bus
, -EINVAL
);
1495 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1497 return bus
->state
== BUS_RUNNING
;
1500 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1503 assert_return(bus
, -EINVAL
);
1504 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1505 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1507 if (bus
->is_monitor
)
1510 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1511 if (!bus
->accept_fd
)
1514 r
= bus_ensure_running(bus
);
1518 return bus
->can_fds
;
1521 return bus_type_is_valid(type
);
1524 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1527 assert_return(bus
, -EINVAL
);
1528 assert_return(id
, -EINVAL
);
1529 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1531 r
= bus_ensure_running(bus
);
1535 *id
= bus
->server_id
;
1539 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1544 /* If we copy the same message to multiple
1545 * destinations, avoid using the same cookie
1547 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1552 timeout
= BUS_DEFAULT_TIMEOUT
;
1554 return sd_bus_message_seal(m
, ++b
->cookie
, timeout
);
1557 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1558 bool remarshal
= false;
1562 /* wrong packet version */
1563 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1566 /* wrong packet endianness */
1567 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1570 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1573 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1577 /* Fake some timestamps, if they were requested, and not
1578 * already initialized */
1579 if (b
->attach_timestamp
) {
1580 if (m
->realtime
<= 0)
1581 m
->realtime
= now(CLOCK_REALTIME
);
1583 if (m
->monotonic
<= 0)
1584 m
->monotonic
= now(CLOCK_MONOTONIC
);
1587 /* The bus specification says the serial number cannot be 0,
1588 * hence let's fill something in for synthetic messages. Since
1589 * synthetic messages might have a fake sender and we don't
1590 * want to interfere with the real sender's serial numbers we
1591 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1592 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1593 * even though kdbus can do 64bit. */
1594 return sd_bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1597 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1603 r
= bus_socket_write_message(bus
, m
, idx
);
1607 if (*idx
>= BUS_MESSAGE_SIZE(m
))
1608 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",
1609 bus_message_type_to_string(m
->header
->type
),
1610 strna(sd_bus_message_get_sender(m
)),
1611 strna(sd_bus_message_get_destination(m
)),
1612 strna(sd_bus_message_get_path(m
)),
1613 strna(sd_bus_message_get_interface(m
)),
1614 strna(sd_bus_message_get_member(m
)),
1615 BUS_MESSAGE_COOKIE(m
),
1617 strna(m
->root_container
.signature
),
1618 strna(m
->error
.name
),
1619 strna(m
->error
.message
));
1624 static int dispatch_wqueue(sd_bus
*bus
) {
1628 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
1630 while (bus
->wqueue_size
> 0) {
1632 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1636 /* Didn't do anything this time */
1638 else if (bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1639 /* Fully written. Let's drop the entry from
1642 * This isn't particularly optimized, but
1643 * well, this is supposed to be our worst-case
1644 * buffer only, and the socket buffer is
1645 * supposed to be our primary buffer, and if
1646 * it got full, then all bets are off
1650 sd_bus_message_unref(bus
->wqueue
[0]);
1651 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1661 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1664 return bus_socket_read_message(bus
);
1667 int bus_rqueue_make_room(sd_bus
*bus
) {
1670 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1673 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1679 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1684 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
1686 /* Note that the priority logic is only available on kdbus,
1687 * where the rqueue is unused. We check the rqueue here
1688 * anyway, because it's simple... */
1691 if (bus
->rqueue_size
> 0) {
1692 /* Dispatch a queued message */
1694 *m
= bus
->rqueue
[0];
1696 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1700 /* Try to read a new message */
1701 r
= bus_read_message(bus
, hint_priority
, priority
);
1711 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1712 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
1715 assert_return(m
, -EINVAL
);
1720 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1722 if (!BUS_IS_OPEN(bus
->state
))
1726 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1733 /* If the cookie number isn't kept, then we know that no reply
1735 if (!cookie
&& !m
->sealed
)
1736 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1738 r
= bus_seal_message(bus
, m
, 0);
1742 /* Remarshall if we have to. This will possibly unref the
1743 * message and place a replacement in m */
1744 r
= bus_remarshal_message(bus
, &m
);
1748 /* If this is a reply and no reply was requested, then let's
1749 * suppress this, if we can */
1753 if (IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1756 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1758 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
1759 bus_enter_closing(bus
);
1766 if (idx
< BUS_MESSAGE_SIZE(m
)) {
1767 /* Wasn't fully written. So let's remember how
1768 * much was written. Note that the first entry
1769 * of the wqueue array is always allocated so
1770 * that we always can remember how much was
1772 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1773 bus
->wqueue_size
= 1;
1778 /* Just append it to the queue. */
1780 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1783 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1786 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1791 *cookie
= BUS_MESSAGE_COOKIE(m
);
1796 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1797 return bus_send_internal(bus
, m
, cookie
, false);
1800 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1803 assert_return(m
, -EINVAL
);
1808 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1810 if (!BUS_IS_OPEN(bus
->state
))
1813 if (!streq_ptr(m
->destination
, destination
)) {
1818 r
= sd_bus_message_set_destination(m
, destination
);
1823 return sd_bus_send(bus
, m
, cookie
);
1826 static usec_t
calc_elapse(sd_bus
*bus
, uint64_t usec
) {
1829 if (usec
== (uint64_t) -1)
1832 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1833 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1834 * relative timestamp, and afterwards the absolute one. */
1836 if (IN_SET(bus
->state
, BUS_WATCH_BIND
, BUS_OPENING
, BUS_AUTHENTICATING
))
1839 return now(CLOCK_MONOTONIC
) + usec
;
1842 static int timeout_compare(const void *a
, const void *b
) {
1843 const struct reply_callback
*x
= a
, *y
= b
;
1845 if (x
->timeout_usec
!= 0 && y
->timeout_usec
== 0)
1848 if (x
->timeout_usec
== 0 && y
->timeout_usec
!= 0)
1851 if (x
->timeout_usec
< y
->timeout_usec
)
1854 if (x
->timeout_usec
> y
->timeout_usec
)
1860 _public_
int sd_bus_call_async(
1864 sd_bus_message_handler_t callback
,
1868 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
1869 _cleanup_(sd_bus_slot_unrefp
) sd_bus_slot
*s
= NULL
;
1872 assert_return(m
, -EINVAL
);
1873 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1874 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1875 assert_return(callback
, -EINVAL
);
1880 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1882 if (!BUS_IS_OPEN(bus
->state
))
1885 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1889 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1893 r
= bus_seal_message(bus
, m
, usec
);
1897 r
= bus_remarshal_message(bus
, &m
);
1901 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1905 s
->reply_callback
.callback
= callback
;
1907 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1908 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1910 s
->reply_callback
.cookie
= 0;
1914 s
->reply_callback
.timeout_usec
= calc_elapse(bus
, m
->timeout
);
1915 if (s
->reply_callback
.timeout_usec
!= 0) {
1916 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1918 s
->reply_callback
.timeout_usec
= 0;
1923 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1934 int bus_ensure_running(sd_bus
*bus
) {
1939 if (IN_SET(bus
->state
, BUS_UNSET
, BUS_CLOSED
, BUS_CLOSING
))
1941 if (bus
->state
== BUS_RUNNING
)
1945 r
= sd_bus_process(bus
, NULL
);
1948 if (bus
->state
== BUS_RUNNING
)
1953 r
= sd_bus_wait(bus
, (uint64_t) -1);
1959 _public_
int sd_bus_call(
1963 sd_bus_error
*error
,
1964 sd_bus_message
**reply
) {
1966 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
1972 bus_assert_return(m
, -EINVAL
, error
);
1973 bus_assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
, error
);
1974 bus_assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
, error
);
1975 bus_assert_return(!bus_error_is_dirty(error
), -EINVAL
, error
);
1980 bus_assert_return(!bus_pid_changed(bus
), -ECHILD
, error
);
1982 if (!BUS_IS_OPEN(bus
->state
)) {
1987 r
= bus_ensure_running(bus
);
1991 i
= bus
->rqueue_size
;
1993 r
= bus_seal_message(bus
, m
, usec
);
1997 r
= bus_remarshal_message(bus
, &m
);
2001 r
= bus_send_internal(bus
, m
, &cookie
, true);
2005 timeout
= calc_elapse(bus
, m
->timeout
);
2010 while (i
< bus
->rqueue_size
) {
2011 sd_bus_message
*incoming
= NULL
;
2013 incoming
= bus
->rqueue
[i
];
2015 if (incoming
->reply_cookie
== cookie
) {
2016 /* Found a match! */
2018 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2020 log_debug_bus_message(incoming
);
2022 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2024 if (incoming
->n_fds
<= 0 || bus
->accept_fd
) {
2028 sd_bus_message_unref(incoming
);
2033 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2034 sd_bus_message_unref(incoming
);
2037 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
) {
2038 r
= sd_bus_error_copy(error
, &incoming
->error
);
2039 sd_bus_message_unref(incoming
);
2046 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2049 streq(bus
->unique_name
, incoming
->sender
)) {
2051 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2054 /* Our own message? Somebody is trying
2055 * to send its own client a message,
2056 * let's not dead-lock, let's fail
2059 sd_bus_message_unref(incoming
);
2064 /* Try to read more, right-away */
2068 r
= bus_read_message(bus
, false, 0);
2070 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2071 bus_enter_closing(bus
);
2083 n
= now(CLOCK_MONOTONIC
);
2091 left
= (uint64_t) -1;
2093 r
= bus_poll(bus
, true, left
);
2101 r
= dispatch_wqueue(bus
);
2103 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2104 bus_enter_closing(bus
);
2113 return sd_bus_error_set_errno(error
, r
);
2116 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2118 assert_return(bus
, -EINVAL
);
2119 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2120 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2122 if (bus
->state
== BUS_CLOSED
)
2125 if (bus
->inotify_fd
>= 0)
2126 return bus
->inotify_fd
;
2128 if (bus
->input_fd
>= 0)
2129 return bus
->input_fd
;
2134 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2137 assert_return(bus
, -EINVAL
);
2138 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2140 switch (bus
->state
) {
2146 case BUS_WATCH_BIND
:
2154 case BUS_AUTHENTICATING
:
2155 if (bus_socket_auth_needs_write(bus
))
2163 if (bus
->rqueue_size
<= 0)
2165 if (bus
->wqueue_size
> 0)
2173 assert_not_reached("Unknown state");
2179 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2180 struct reply_callback
*c
;
2182 assert_return(bus
, -EINVAL
);
2183 assert_return(timeout_usec
, -EINVAL
);
2184 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2186 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2189 if (bus
->track_queue
) {
2194 switch (bus
->state
) {
2196 case BUS_AUTHENTICATING
:
2197 *timeout_usec
= bus
->auth_timeout
;
2202 if (bus
->rqueue_size
> 0) {
2207 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2209 *timeout_usec
= (uint64_t) -1;
2213 if (c
->timeout_usec
== 0) {
2214 *timeout_usec
= (uint64_t) -1;
2218 *timeout_usec
= c
->timeout_usec
;
2225 case BUS_WATCH_BIND
:
2227 *timeout_usec
= (uint64_t) -1;
2231 assert_not_reached("Unknown or unexpected stat");
2235 static int process_timeout(sd_bus
*bus
) {
2236 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2237 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
* m
= NULL
;
2238 struct reply_callback
*c
;
2245 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
2247 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2251 n
= now(CLOCK_MONOTONIC
);
2252 if (c
->timeout_usec
> n
)
2255 r
= bus_message_new_synthetic_error(
2258 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2263 r
= bus_seal_synthetic_message(bus
, m
);
2267 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2268 c
->timeout_usec
= 0;
2270 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2273 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2275 bus
->iteration_counter
++;
2277 is_hello
= bus
->state
== BUS_HELLO
&& c
->callback
== hello_callback
;
2279 bus
->current_message
= m
;
2280 bus
->current_slot
= sd_bus_slot_ref(slot
);
2281 bus
->current_handler
= c
->callback
;
2282 bus
->current_userdata
= slot
->userdata
;
2283 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2284 bus
->current_userdata
= NULL
;
2285 bus
->current_handler
= NULL
;
2286 bus
->current_slot
= NULL
;
2287 bus
->current_message
= NULL
;
2289 if (slot
->floating
) {
2290 bus_slot_disconnect(slot
);
2291 sd_bus_slot_unref(slot
);
2294 sd_bus_slot_unref(slot
);
2296 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2297 * and ignore the callback handler's return value. */
2301 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2304 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2308 if (bus
->state
!= BUS_HELLO
)
2311 /* Let's make sure the first message on the bus is the HELLO
2312 * reply. But note that we don't actually parse the message
2313 * here (we leave that to the usual handling), we just verify
2314 * we don't let any earlier msg through. */
2316 if (!IN_SET(m
->header
->type
, SD_BUS_MESSAGE_METHOD_RETURN
, SD_BUS_MESSAGE_METHOD_ERROR
))
2319 if (m
->reply_cookie
!= 1)
2325 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2326 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*synthetic_reply
= NULL
;
2327 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2328 struct reply_callback
*c
;
2336 if (!IN_SET(m
->header
->type
, SD_BUS_MESSAGE_METHOD_RETURN
, SD_BUS_MESSAGE_METHOD_ERROR
))
2339 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2342 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2348 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2350 if (m
->n_fds
> 0 && !bus
->accept_fd
) {
2352 /* If the reply contained a file descriptor which we
2353 * didn't want we pass an error instead. */
2355 r
= bus_message_new_synthetic_error(
2358 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2363 /* Copy over original timestamp */
2364 synthetic_reply
->realtime
= m
->realtime
;
2365 synthetic_reply
->monotonic
= m
->monotonic
;
2366 synthetic_reply
->seqnum
= m
->seqnum
;
2368 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2372 m
= synthetic_reply
;
2374 r
= sd_bus_message_rewind(m
, true);
2379 if (c
->timeout_usec
!= 0) {
2380 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2381 c
->timeout_usec
= 0;
2384 is_hello
= bus
->state
== BUS_HELLO
&& c
->callback
== hello_callback
;
2386 bus
->current_slot
= sd_bus_slot_ref(slot
);
2387 bus
->current_handler
= c
->callback
;
2388 bus
->current_userdata
= slot
->userdata
;
2389 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2390 bus
->current_userdata
= NULL
;
2391 bus
->current_handler
= NULL
;
2392 bus
->current_slot
= NULL
;
2394 if (slot
->floating
) {
2395 bus_slot_disconnect(slot
);
2396 sd_bus_slot_unref(slot
);
2399 sd_bus_slot_unref(slot
);
2401 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2402 * ignore the callback handler's return value. */
2406 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2409 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2410 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2411 struct filter_callback
*l
;
2418 bus
->filter_callbacks_modified
= false;
2420 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2423 if (bus
->filter_callbacks_modified
)
2426 /* Don't run this more than once per iteration */
2427 if (l
->last_iteration
== bus
->iteration_counter
)
2430 l
->last_iteration
= bus
->iteration_counter
;
2432 r
= sd_bus_message_rewind(m
, true);
2436 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2438 bus
->current_slot
= sd_bus_slot_ref(slot
);
2439 bus
->current_handler
= l
->callback
;
2440 bus
->current_userdata
= slot
->userdata
;
2441 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2442 bus
->current_userdata
= NULL
;
2443 bus
->current_handler
= NULL
;
2444 bus
->current_slot
= sd_bus_slot_unref(slot
);
2446 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2452 } while (bus
->filter_callbacks_modified
);
2457 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2464 bus
->match_callbacks_modified
= false;
2466 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2470 } while (bus
->match_callbacks_modified
);
2475 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2476 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
2482 if (bus
->is_monitor
)
2485 if (bus
->manual_peer_interface
)
2488 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2491 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2494 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2497 if (streq_ptr(m
->member
, "Ping"))
2498 r
= sd_bus_message_new_method_return(m
, &reply
);
2499 else if (streq_ptr(m
->member
, "GetMachineId")) {
2503 r
= sd_id128_get_machine(&id
);
2507 r
= sd_bus_message_new_method_return(m
, &reply
);
2511 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2513 r
= sd_bus_message_new_method_errorf(
2515 SD_BUS_ERROR_UNKNOWN_METHOD
,
2516 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2522 r
= sd_bus_send(bus
, reply
, NULL
);
2529 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2533 /* If we got a message with a file descriptor which we didn't
2534 * want to accept, then let's drop it. How can this even
2535 * happen? For example, when the kernel queues a message into
2536 * an activatable names's queue which allows fds, and then is
2537 * delivered to us later even though we ourselves did not
2540 if (bus
->is_monitor
)
2549 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2550 return 1; /* just eat it up */
2552 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2555 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2561 bus
->current_message
= m
;
2562 bus
->iteration_counter
++;
2564 log_debug_bus_message(m
);
2566 r
= process_hello(bus
, m
);
2570 r
= process_reply(bus
, m
);
2574 r
= process_fd_check(bus
, m
);
2578 r
= process_filter(bus
, m
);
2582 r
= process_match(bus
, m
);
2586 r
= process_builtin(bus
, m
);
2590 r
= bus_process_object(bus
, m
);
2593 bus
->current_message
= NULL
;
2597 static int dispatch_track(sd_bus
*bus
) {
2600 if (!bus
->track_queue
)
2603 bus_track_dispatch(bus
->track_queue
);
2607 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2608 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2612 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
2614 r
= process_timeout(bus
);
2618 r
= dispatch_wqueue(bus
);
2622 r
= dispatch_track(bus
);
2626 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2632 r
= process_message(bus
, m
);
2637 r
= sd_bus_message_rewind(m
, true);
2646 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2648 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2649 strna(sd_bus_message_get_sender(m
)),
2650 strna(sd_bus_message_get_path(m
)),
2651 strna(sd_bus_message_get_interface(m
)),
2652 strna(sd_bus_message_get_member(m
)));
2654 r
= sd_bus_reply_method_errorf(
2656 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2657 "Unknown object '%s'.", m
->path
);
2671 static int bus_exit_now(sd_bus
*bus
) {
2674 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2675 * sd_event_exit(), otherwise invokes libc exit(). */
2677 if (bus
->exited
) /* did we already exit? */
2679 if (!bus
->exit_triggered
) /* was the exit condition triggered? */
2681 if (!bus
->exit_on_disconnect
) /* Shall we actually exit on disconnection? */
2684 bus
->exited
= true; /* never exit more than once */
2686 log_debug("Bus connection disconnected, exiting.");
2689 return sd_event_exit(bus
->event
, EXIT_FAILURE
);
2693 assert_not_reached("exit() didn't exit?");
2696 static int process_closing_reply_callback(sd_bus
*bus
, struct reply_callback
*c
) {
2697 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2698 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2705 r
= bus_message_new_synthetic_error(
2708 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2713 r
= bus_seal_synthetic_message(bus
, m
);
2717 if (c
->timeout_usec
!= 0) {
2718 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2719 c
->timeout_usec
= 0;
2722 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2725 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2727 bus
->iteration_counter
++;
2729 bus
->current_message
= m
;
2730 bus
->current_slot
= sd_bus_slot_ref(slot
);
2731 bus
->current_handler
= c
->callback
;
2732 bus
->current_userdata
= slot
->userdata
;
2733 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2734 bus
->current_userdata
= NULL
;
2735 bus
->current_handler
= NULL
;
2736 bus
->current_slot
= NULL
;
2737 bus
->current_message
= NULL
;
2739 if (slot
->floating
) {
2740 bus_slot_disconnect(slot
);
2741 sd_bus_slot_unref(slot
);
2744 sd_bus_slot_unref(slot
);
2746 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2749 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2750 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2751 struct reply_callback
*c
;
2755 assert(bus
->state
== BUS_CLOSING
);
2757 /* First, fail all outstanding method calls */
2758 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2760 return process_closing_reply_callback(bus
, c
);
2762 /* Then, fake-drop all remaining bus tracking references */
2764 bus_track_close(bus
->tracks
);
2768 /* Then, synthesize a Disconnected message */
2769 r
= sd_bus_message_new_signal(
2772 "/org/freedesktop/DBus/Local",
2773 "org.freedesktop.DBus.Local",
2778 bus_message_set_sender_local(bus
, m
);
2780 r
= bus_seal_synthetic_message(bus
, m
);
2786 bus
->current_message
= m
;
2787 bus
->iteration_counter
++;
2789 r
= process_filter(bus
, m
);
2793 r
= process_match(bus
, m
);
2797 /* Nothing else to do, exit now, if the condition holds */
2798 bus
->exit_triggered
= true;
2799 (void) bus_exit_now(bus
);
2809 bus
->current_message
= NULL
;
2814 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2815 BUS_DONT_DESTROY(bus
);
2818 /* Returns 0 when we didn't do anything. This should cause the
2819 * caller to invoke sd_bus_wait() before returning the next
2820 * time. Returns > 0 when we did something, which possibly
2821 * means *ret is filled in with an unprocessed message. */
2823 assert_return(bus
, -EINVAL
);
2824 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2826 /* We don't allow recursively invoking sd_bus_process(). */
2827 assert_return(!bus
->current_message
, -EBUSY
);
2828 assert(!bus
->current_slot
);
2830 switch (bus
->state
) {
2838 case BUS_WATCH_BIND
:
2839 r
= bus_socket_process_watch_bind(bus
);
2843 r
= bus_socket_process_opening(bus
);
2846 case BUS_AUTHENTICATING
:
2847 r
= bus_socket_process_authenticating(bus
);
2852 r
= process_running(bus
, hint_priority
, priority
, ret
);
2856 /* This branch initializes *ret, hence we don't use the generic error checking below */
2860 return process_closing(bus
, ret
);
2863 assert_not_reached("Unknown state");
2866 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2867 bus_enter_closing(bus
);
2878 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2879 return bus_process_internal(bus
, false, 0, ret
);
2882 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2883 return bus_process_internal(bus
, true, priority
, ret
);
2886 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2887 struct pollfd p
[2] = {};
2890 usec_t m
= USEC_INFINITY
;
2894 if (bus
->state
== BUS_CLOSING
)
2897 if (!BUS_IS_OPEN(bus
->state
))
2900 if (bus
->state
== BUS_WATCH_BIND
) {
2901 assert(bus
->inotify_fd
>= 0);
2903 p
[0].events
= POLLIN
;
2904 p
[0].fd
= bus
->inotify_fd
;
2909 e
= sd_bus_get_events(bus
);
2914 /* The caller really needs some more data, he doesn't
2915 * care about what's already read, or any timeouts
2916 * except its own. */
2920 /* The caller wants to process if there's something to
2921 * process, but doesn't care otherwise */
2923 r
= sd_bus_get_timeout(bus
, &until
);
2927 m
= usec_sub_unsigned(until
, now(CLOCK_MONOTONIC
));
2930 p
[0].fd
= bus
->input_fd
;
2931 if (bus
->output_fd
== bus
->input_fd
) {
2935 p
[0].events
= e
& POLLIN
;
2936 p
[1].fd
= bus
->output_fd
;
2937 p
[1].events
= e
& POLLOUT
;
2942 if (timeout_usec
!= (uint64_t) -1 && (m
== USEC_INFINITY
|| timeout_usec
< m
))
2945 r
= ppoll(p
, n
, m
== USEC_INFINITY
? NULL
: timespec_store(&ts
, m
), NULL
);
2949 return r
> 0 ? 1 : 0;
2952 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2954 assert_return(bus
, -EINVAL
);
2955 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2957 if (bus
->state
== BUS_CLOSING
)
2960 if (!BUS_IS_OPEN(bus
->state
))
2963 if (bus
->rqueue_size
> 0)
2966 return bus_poll(bus
, false, timeout_usec
);
2969 _public_
int sd_bus_flush(sd_bus
*bus
) {
2972 assert_return(bus
, -EINVAL
);
2973 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2975 if (bus
->state
== BUS_CLOSING
)
2978 if (!BUS_IS_OPEN(bus
->state
))
2981 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
2982 if (bus
->state
== BUS_WATCH_BIND
)
2985 r
= bus_ensure_running(bus
);
2989 if (bus
->wqueue_size
<= 0)
2993 r
= dispatch_wqueue(bus
);
2995 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2996 bus_enter_closing(bus
);
3003 if (bus
->wqueue_size
<= 0)
3006 r
= bus_poll(bus
, false, (uint64_t) -1);
3012 _public_
int sd_bus_add_filter(
3015 sd_bus_message_handler_t callback
,
3020 assert_return(bus
, -EINVAL
);
3021 assert_return(callback
, -EINVAL
);
3022 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3024 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
3028 s
->filter_callback
.callback
= callback
;
3030 bus
->filter_callbacks_modified
= true;
3031 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
3039 static int add_match_callback(
3042 sd_bus_error
*ret_error
) {
3044 sd_bus_slot
*match_slot
= userdata
;
3045 bool failed
= false;
3051 sd_bus_slot_ref(match_slot
);
3053 if (sd_bus_message_is_method_error(m
, NULL
)) {
3054 log_debug_errno(sd_bus_message_get_errno(m
),
3055 "Unable to add match %s, failing connection: %s",
3056 match_slot
->match_callback
.match_string
,
3057 sd_bus_message_get_error(m
)->message
);
3061 log_debug("Match %s successfully installed.", match_slot
->match_callback
.match_string
);
3063 if (match_slot
->match_callback
.install_callback
) {
3066 bus
= sd_bus_message_get_bus(m
);
3068 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3069 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3072 assert(bus
->current_slot
== match_slot
->match_callback
.install_slot
);
3073 assert(bus
->current_handler
== add_match_callback
);
3074 assert(bus
->current_userdata
== userdata
);
3076 bus
->current_slot
= match_slot
;
3077 bus
->current_handler
= match_slot
->match_callback
.install_callback
;
3078 bus
->current_userdata
= match_slot
->userdata
;
3080 r
= match_slot
->match_callback
.install_callback(m
, match_slot
->userdata
, ret_error
);
3082 bus
->current_slot
= match_slot
->match_callback
.install_slot
;
3083 bus
->current_handler
= add_match_callback
;
3084 bus
->current_userdata
= userdata
;
3086 match_slot
->match_callback
.install_slot
= sd_bus_slot_unref(match_slot
->match_callback
.install_slot
);
3088 if (failed
) /* Generic failure handling: destroy the connection */
3089 bus_enter_closing(sd_bus_message_get_bus(m
));
3094 if (failed
&& match_slot
->floating
) {
3095 bus_slot_disconnect(match_slot
);
3096 sd_bus_slot_unref(match_slot
);
3099 sd_bus_slot_unref(match_slot
);
3104 static int bus_add_match_full(
3109 sd_bus_message_handler_t callback
,
3110 sd_bus_message_handler_t install_callback
,
3113 struct bus_match_component
*components
= NULL
;
3114 unsigned n_components
= 0;
3115 sd_bus_slot
*s
= NULL
;
3118 assert_return(bus
, -EINVAL
);
3119 assert_return(match
, -EINVAL
);
3120 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3122 r
= bus_match_parse(match
, &components
, &n_components
);
3126 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
3132 s
->match_callback
.callback
= callback
;
3133 s
->match_callback
.install_callback
= install_callback
;
3135 if (bus
->bus_client
) {
3136 enum bus_match_scope scope
;
3138 scope
= bus_match_get_scope(components
, n_components
);
3140 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3141 if (scope
!= BUS_MATCH_LOCAL
) {
3143 /* We store the original match string, so that we can use it to remove the match again. */
3145 s
->match_callback
.match_string
= strdup(match
);
3146 if (!s
->match_callback
.match_string
) {
3152 r
= bus_add_match_internal_async(bus
,
3153 &s
->match_callback
.install_slot
,
3154 s
->match_callback
.match_string
,
3158 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
);
3162 s
->match_added
= true;
3166 bus
->match_callbacks_modified
= true;
3167 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
3176 bus_match_parse_free(components
, n_components
);
3177 sd_bus_slot_unref(s
);
3182 _public_
int sd_bus_add_match(
3186 sd_bus_message_handler_t callback
,
3189 return bus_add_match_full(bus
, slot
, false, match
, callback
, NULL
, userdata
);
3192 _public_
int sd_bus_add_match_async(
3196 sd_bus_message_handler_t callback
,
3197 sd_bus_message_handler_t install_callback
,
3200 return bus_add_match_full(bus
, slot
, true, match
, callback
, install_callback
, userdata
);
3203 bool bus_pid_changed(sd_bus
*bus
) {
3206 /* We don't support people creating a bus connection and
3207 * keeping it around over a fork(). Let's complain. */
3209 return bus
->original_pid
!= getpid_cached();
3212 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3213 sd_bus
*bus
= userdata
;
3218 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3220 r
= sd_bus_process(bus
, NULL
);
3222 log_debug_errno(r
, "Processing of bus failed, closing down: %m");
3223 bus_enter_closing(bus
);
3229 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3230 sd_bus
*bus
= userdata
;
3235 r
= sd_bus_process(bus
, NULL
);
3237 log_debug_errno(r
, "Processing of bus failed, closing down: %m");
3238 bus_enter_closing(bus
);
3244 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3245 sd_bus
*bus
= userdata
;
3252 e
= sd_bus_get_events(bus
);
3258 if (bus
->output_fd
!= bus
->input_fd
) {
3260 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3264 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3266 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3270 r
= sd_bus_get_timeout(bus
, &until
);
3276 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3283 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3290 log_debug_errno(r
, "Preparing of bus events failed, closing down: %m");
3291 bus_enter_closing(bus
);
3296 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3297 sd_bus
*bus
= userdata
;
3307 int bus_attach_io_events(sd_bus
*bus
) {
3312 if (bus
->input_fd
< 0)
3318 if (!bus
->input_io_event_source
) {
3319 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3323 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3327 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3331 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3333 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3338 if (bus
->output_fd
!= bus
->input_fd
) {
3339 assert(bus
->output_fd
>= 0);
3341 if (!bus
->output_io_event_source
) {
3342 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3346 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3350 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3352 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3361 static void bus_detach_io_events(sd_bus
*bus
) {
3364 if (bus
->input_io_event_source
) {
3365 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3366 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3369 if (bus
->output_io_event_source
) {
3370 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3371 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3375 int bus_attach_inotify_event(sd_bus
*bus
) {
3380 if (bus
->inotify_fd
< 0)
3386 if (!bus
->inotify_event_source
) {
3387 r
= sd_event_add_io(bus
->event
, &bus
->inotify_event_source
, bus
->inotify_fd
, EPOLLIN
, io_callback
, bus
);
3391 r
= sd_event_source_set_priority(bus
->inotify_event_source
, bus
->event_priority
);
3395 r
= sd_event_source_set_description(bus
->inotify_event_source
, "bus-inotify");
3397 r
= sd_event_source_set_io_fd(bus
->inotify_event_source
, bus
->inotify_fd
);
3404 static void bus_detach_inotify_event(sd_bus
*bus
) {
3407 if (bus
->inotify_event_source
) {
3408 sd_event_source_set_enabled(bus
->inotify_event_source
, SD_EVENT_OFF
);
3409 bus
->inotify_event_source
= sd_event_source_unref(bus
->inotify_event_source
);
3413 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3416 assert_return(bus
, -EINVAL
);
3417 assert_return(!bus
->event
, -EBUSY
);
3419 assert(!bus
->input_io_event_source
);
3420 assert(!bus
->output_io_event_source
);
3421 assert(!bus
->time_event_source
);
3424 bus
->event
= sd_event_ref(event
);
3426 r
= sd_event_default(&bus
->event
);
3431 bus
->event_priority
= priority
;
3433 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3437 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3441 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3445 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3449 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3453 r
= bus_attach_io_events(bus
);
3457 r
= bus_attach_inotify_event(bus
);
3464 sd_bus_detach_event(bus
);
3468 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3469 assert_return(bus
, -EINVAL
);
3474 bus_detach_io_events(bus
);
3475 bus_detach_inotify_event(bus
);
3477 if (bus
->time_event_source
) {
3478 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3479 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3482 if (bus
->quit_event_source
) {
3483 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3484 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3487 bus
->event
= sd_event_unref(bus
->event
);
3491 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3492 assert_return(bus
, NULL
);
3497 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3498 assert_return(bus
, NULL
);
3500 return bus
->current_message
;
3503 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3504 assert_return(bus
, NULL
);
3506 return bus
->current_slot
;
3509 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3510 assert_return(bus
, NULL
);
3512 return bus
->current_handler
;
3515 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3516 assert_return(bus
, NULL
);
3518 return bus
->current_userdata
;
3521 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3526 assert(default_bus
);
3529 return !!*default_bus
;
3532 *ret
= sd_bus_ref(*default_bus
);
3540 b
->default_bus_ptr
= default_bus
;
3548 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3549 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3553 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3554 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3557 _public_
int sd_bus_default(sd_bus
**ret
) {
3561 /* Let's try our best to reuse another cached connection. If
3562 * the starter bus type is set, connect via our normal
3563 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3564 * we can share the connection with the user/system default
3567 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3569 if (streq(e
, "system"))
3570 return sd_bus_default_system(ret
);
3571 else if (STR_IN_SET(e
, "user", "session"))
3572 return sd_bus_default_user(ret
);
3575 /* No type is specified, so we have not other option than to
3576 * use the starter address if it is set. */
3577 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3579 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3581 /* Finally, if nothing is set use the cached connection for
3582 * the right scope */
3584 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3585 return sd_bus_default_user(ret
);
3587 return sd_bus_default_system(ret
);
3590 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3591 assert_return(b
, -EINVAL
);
3592 assert_return(tid
, -EINVAL
);
3593 assert_return(!bus_pid_changed(b
), -ECHILD
);
3601 return sd_event_get_tid(b
->event
, tid
);
3606 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3607 _cleanup_free_
char *e
= NULL
;
3610 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3611 assert_return(external_id
, -EINVAL
);
3612 assert_return(ret_path
, -EINVAL
);
3614 e
= bus_label_escape(external_id
);
3618 ret
= strjoin(prefix
, "/", e
);
3626 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3630 assert_return(object_path_is_valid(path
), -EINVAL
);
3631 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3632 assert_return(external_id
, -EINVAL
);
3634 e
= object_path_startswith(path
, prefix
);
3636 *external_id
= NULL
;
3640 ret
= bus_label_unescape(e
);
3648 _public_
int sd_bus_path_encode_many(char **out
, const char *path_template
, ...) {
3649 _cleanup_strv_free_
char **labels
= NULL
;
3650 char *path
, *path_pos
, **label_pos
;
3651 const char *sep
, *template_pos
;
3656 assert_return(out
, -EINVAL
);
3657 assert_return(path_template
, -EINVAL
);
3659 path_length
= strlen(path_template
);
3661 va_start(list
, path_template
);
3662 for (sep
= strchr(path_template
, '%'); sep
; sep
= strchr(sep
+ 1, '%')) {
3666 arg
= va_arg(list
, const char *);
3672 label
= bus_label_escape(arg
);
3678 r
= strv_consume(&labels
, label
);
3684 /* add label length, but account for the format character */
3685 path_length
+= strlen(label
) - 1;
3689 path
= malloc(path_length
+ 1);
3696 for (template_pos
= path_template
; *template_pos
; ) {
3697 sep
= strchrnul(template_pos
, '%');
3698 path_pos
= mempcpy(path_pos
, template_pos
, sep
- template_pos
);
3702 path_pos
= stpcpy(path_pos
, *label_pos
++);
3703 template_pos
= sep
+ 1;
3711 _public_
int sd_bus_path_decode_many(const char *path
, const char *path_template
, ...) {
3712 _cleanup_strv_free_
char **labels
= NULL
;
3713 const char *template_pos
, *path_pos
;
3719 * This decodes an object-path based on a template argument. The
3720 * template consists of a verbatim path, optionally including special
3723 * - Each occurrence of '%' in the template matches an arbitrary
3724 * substring of a label in the given path. At most one such
3725 * directive is allowed per label. For each such directive, the
3726 * caller must provide an output parameter (char **) via va_arg. If
3727 * NULL is passed, the given label is verified, but not returned.
3728 * For each matched label, the *decoded* label is stored in the
3729 * passed output argument, and the caller is responsible to free
3730 * it. Note that the output arguments are only modified if the
3731 * actualy path matched the template. Otherwise, they're left
3734 * This function returns <0 on error, 0 if the path does not match the
3735 * template, 1 if it matched.
3738 assert_return(path
, -EINVAL
);
3739 assert_return(path_template
, -EINVAL
);
3743 for (template_pos
= path_template
; *template_pos
; ) {
3748 /* verify everything until the next '%' matches verbatim */
3749 sep
= strchrnul(template_pos
, '%');
3750 length
= sep
- template_pos
;
3751 if (strncmp(path_pos
, template_pos
, length
))
3755 template_pos
+= length
;
3760 /* We found the next '%' character. Everything up until here
3761 * matched. We now skip ahead to the end of this label and make
3762 * sure it matches the tail of the label in the path. Then we
3763 * decode the string in-between and save it for later use. */
3765 ++template_pos
; /* skip over '%' */
3767 sep
= strchrnul(template_pos
, '/');
3768 length
= sep
- template_pos
; /* length of suffix to match verbatim */
3770 /* verify the suffixes match */
3771 sep
= strchrnul(path_pos
, '/');
3772 if (sep
- path_pos
< (ssize_t
)length
||
3773 strncmp(sep
- length
, template_pos
, length
))
3776 template_pos
+= length
; /* skip over matched label */
3777 length
= sep
- path_pos
- length
; /* length of sub-label to decode */
3779 /* store unescaped label for later use */
3780 label
= bus_label_unescape_n(path_pos
, length
);
3784 r
= strv_consume(&labels
, label
);
3788 path_pos
= sep
; /* skip decoded label and suffix */
3791 /* end of template must match end of path */
3795 /* copy the labels over to the caller */
3796 va_start(list
, path_template
);
3797 for (label_pos
= labels
; label_pos
&& *label_pos
; ++label_pos
) {
3800 arg
= va_arg(list
, char **);
3808 labels
= mfree(labels
);
3812 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3813 assert_return(bus
, -EINVAL
);
3814 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3819 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3820 assert_return(bus
, -EINVAL
);
3821 assert_return(description
, -EINVAL
);
3822 assert_return(bus
->description
, -ENXIO
);
3823 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3825 *description
= bus
->description
;
3829 int bus_get_root_path(sd_bus
*bus
) {
3832 if (bus
->cgroup_root
)
3835 r
= cg_get_root_path(&bus
->cgroup_root
);
3837 bus
->cgroup_root
= strdup("/");
3838 if (!bus
->cgroup_root
)
3847 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3848 assert_return(bus
, -EINVAL
);
3849 assert_return(scope
, -EINVAL
);
3850 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3857 if (bus
->is_system
) {
3865 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3867 assert_return(bus
, -EINVAL
);
3868 assert_return(address
, -EINVAL
);
3869 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3872 *address
= bus
->address
;
3879 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3880 assert_return(bus
, -EINVAL
);
3881 assert_return(mask
, -EINVAL
);
3882 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3884 *mask
= bus
->creds_mask
;
3888 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3889 assert_return(bus
, -EINVAL
);
3890 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3892 return bus
->bus_client
;
3895 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3896 assert_return(bus
, -EINVAL
);
3897 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3899 return bus
->is_server
;
3902 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3903 assert_return(bus
, -EINVAL
);
3904 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3906 return bus
->anonymous_auth
;
3909 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3910 assert_return(bus
, -EINVAL
);
3911 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3913 return bus
->trusted
;
3916 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3917 assert_return(bus
, -EINVAL
);
3918 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3920 return bus
->is_monitor
;
3923 static void flush_close(sd_bus
*bus
) {
3927 /* Flushes and closes the specified bus. We take a ref before,
3928 * to ensure the flushing does not cause the bus to be
3931 sd_bus_flush_close_unref(sd_bus_ref(bus
));
3934 _public_
void sd_bus_default_flush_close(void) {
3935 flush_close(default_starter_bus
);
3936 flush_close(default_user_bus
);
3937 flush_close(default_system_bus
);
3940 _public_
int sd_bus_set_exit_on_disconnect(sd_bus
*bus
, int b
) {
3941 assert_return(bus
, -EINVAL
);
3943 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3944 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3945 * from the client side. */
3946 bus
->exit_on_disconnect
= b
;
3948 /* If the exit condition was triggered already, exit immediately. */
3949 return bus_exit_now(bus
);
3952 _public_
int sd_bus_get_exit_on_disconnect(sd_bus
*bus
) {
3953 assert_return(bus
, -EINVAL
);
3955 return bus
->exit_on_disconnect
;