1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
35 #include "cgroup-util.h"
36 #include "hostname-util.h"
37 #include "bus-label.h"
40 #include "bus-internal.h"
41 #include "bus-message.h"
43 #include "bus-socket.h"
44 #include "bus-kernel.h"
45 #include "bus-control.h"
46 #include "bus-objects.h"
48 #include "bus-container.h"
49 #include "bus-protocol.h"
50 #include "bus-track.h"
53 #define log_debug_bus_message(m) \
55 sd_bus_message *_mm = (m); \
56 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
57 bus_message_type_to_string(_mm->header->type), \
58 strna(sd_bus_message_get_sender(_mm)), \
59 strna(sd_bus_message_get_destination(_mm)), \
60 strna(sd_bus_message_get_path(_mm)), \
61 strna(sd_bus_message_get_interface(_mm)), \
62 strna(sd_bus_message_get_member(_mm)), \
63 BUS_MESSAGE_COOKIE(_mm), \
65 strna(_mm->error.message)); \
68 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
69 static int attach_io_events(sd_bus
*b
);
70 static void detach_io_events(sd_bus
*b
);
72 static void bus_close_fds(sd_bus
*b
) {
77 if (b
->input_fd
!= b
->output_fd
)
78 safe_close(b
->output_fd
);
79 b
->output_fd
= b
->input_fd
= safe_close(b
->input_fd
);
82 static void bus_reset_queues(sd_bus
*b
) {
85 while (b
->rqueue_size
> 0)
86 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
88 b
->rqueue
= mfree(b
->rqueue
);
89 b
->rqueue_allocated
= 0;
91 while (b
->wqueue_size
> 0)
92 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
94 b
->wqueue
= mfree(b
->wqueue
);
95 b
->wqueue_allocated
= 0;
98 static void bus_free(sd_bus
*b
) {
102 assert(!b
->track_queue
);
104 b
->state
= BUS_CLOSED
;
106 sd_bus_detach_event(b
);
108 while ((s
= b
->slots
)) {
109 /* At this point only floating slots can still be
110 * around, because the non-floating ones keep a
111 * reference to the bus, and we thus couldn't be
112 * destructing right now... We forcibly disconnect the
113 * slots here, so that they still can be referenced by
114 * apps, but are dead. */
117 bus_slot_disconnect(s
);
118 sd_bus_slot_unref(s
);
121 if (b
->default_bus_ptr
)
122 *b
->default_bus_ptr
= NULL
;
127 munmap(b
->kdbus_buffer
, KDBUS_POOL_SIZE
);
131 free(b
->unique_name
);
132 free(b
->auth_buffer
);
137 free(b
->cgroup_root
);
138 free(b
->description
);
141 strv_free(b
->exec_argv
);
143 close_many(b
->fds
, b
->n_fds
);
148 ordered_hashmap_free_free(b
->reply_callbacks
);
149 prioq_free(b
->reply_callbacks_prioq
);
151 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
152 bus_match_free(&b
->match_callbacks
);
154 hashmap_free_free(b
->vtable_methods
);
155 hashmap_free_free(b
->vtable_properties
);
157 assert(hashmap_isempty(b
->nodes
));
158 hashmap_free(b
->nodes
);
160 bus_kernel_flush_memfd(b
);
162 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
167 _public_
int sd_bus_new(sd_bus
**ret
) {
170 assert_return(ret
, -EINVAL
);
176 r
->n_ref
= REFCNT_INIT
;
177 r
->input_fd
= r
->output_fd
= -1;
178 r
->message_version
= 1;
179 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
180 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
181 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
182 r
->original_pid
= getpid();
184 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
186 /* We guarantee that wqueue always has space for at least one
188 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
197 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
200 assert_return(bus
, -EINVAL
);
201 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
202 assert_return(address
, -EINVAL
);
203 assert_return(!bus_pid_changed(bus
), -ECHILD
);
215 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
216 assert_return(bus
, -EINVAL
);
217 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
218 assert_return(input_fd
>= 0, -EBADF
);
219 assert_return(output_fd
>= 0, -EBADF
);
220 assert_return(!bus_pid_changed(bus
), -ECHILD
);
222 bus
->input_fd
= input_fd
;
223 bus
->output_fd
= output_fd
;
227 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
230 assert_return(bus
, -EINVAL
);
231 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
232 assert_return(path
, -EINVAL
);
233 assert_return(!strv_isempty(argv
), -EINVAL
);
234 assert_return(!bus_pid_changed(bus
), -ECHILD
);
246 free(bus
->exec_path
);
247 strv_free(bus
->exec_argv
);
255 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
256 assert_return(bus
, -EINVAL
);
257 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
258 assert_return(!bus_pid_changed(bus
), -ECHILD
);
260 bus
->bus_client
= !!b
;
264 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
265 assert_return(bus
, -EINVAL
);
266 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
267 assert_return(!bus_pid_changed(bus
), -ECHILD
);
269 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_MONITOR
, b
);
273 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
274 assert_return(bus
, -EINVAL
);
275 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
276 assert_return(!bus_pid_changed(bus
), -ECHILD
);
278 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
282 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
284 assert_return(bus
, -EINVAL
);
285 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
286 assert_return(!bus_pid_changed(bus
), -ECHILD
);
288 new_flags
= bus
->attach_flags
;
289 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
291 if (bus
->attach_flags
== new_flags
)
294 bus
->attach_flags
= new_flags
;
295 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
296 bus_kernel_realize_attach_flags(bus
);
301 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
304 assert_return(bus
, -EINVAL
);
305 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
306 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
307 assert_return(!bus_pid_changed(bus
), -ECHILD
);
310 bus
->creds_mask
|= mask
;
312 bus
->creds_mask
&= ~mask
;
314 /* The well knowns we need unconditionally, so that matches can work */
315 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
317 /* Make sure we don't lose the timestamp flag */
318 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
319 if (bus
->attach_flags
== new_flags
)
322 bus
->attach_flags
= new_flags
;
323 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
324 bus_kernel_realize_attach_flags(bus
);
329 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
330 assert_return(bus
, -EINVAL
);
331 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
332 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
333 assert_return(!bus_pid_changed(bus
), -ECHILD
);
335 bus
->is_server
= !!b
;
336 bus
->server_id
= server_id
;
340 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
341 assert_return(bus
, -EINVAL
);
342 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
343 assert_return(!bus_pid_changed(bus
), -ECHILD
);
345 bus
->anonymous_auth
= !!b
;
349 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
350 assert_return(bus
, -EINVAL
);
351 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
352 assert_return(!bus_pid_changed(bus
), -ECHILD
);
358 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
359 assert_return(bus
, -EINVAL
);
360 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
361 assert_return(!bus_pid_changed(bus
), -ECHILD
);
363 return free_and_strdup(&bus
->description
, description
);
366 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
367 assert_return(bus
, -EINVAL
);
368 assert_return(!bus_pid_changed(bus
), -ECHILD
);
370 bus
->allow_interactive_authorization
= !!b
;
374 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
375 assert_return(bus
, -EINVAL
);
376 assert_return(!bus_pid_changed(bus
), -ECHILD
);
378 return bus
->allow_interactive_authorization
;
381 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
389 assert(bus
->state
== BUS_HELLO
|| bus
->state
== BUS_CLOSING
);
391 r
= sd_bus_message_get_errno(reply
);
395 r
= sd_bus_message_read(reply
, "s", &s
);
399 if (!service_name_is_valid(s
) || s
[0] != ':')
402 bus
->unique_name
= strdup(s
);
403 if (!bus
->unique_name
)
406 if (bus
->state
== BUS_HELLO
)
407 bus
->state
= BUS_RUNNING
;
412 static int bus_send_hello(sd_bus
*bus
) {
413 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
418 if (!bus
->bus_client
|| bus
->is_kernel
)
421 r
= sd_bus_message_new_method_call(
424 "org.freedesktop.DBus",
425 "/org/freedesktop/DBus",
426 "org.freedesktop.DBus",
431 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
434 int bus_start_running(sd_bus
*bus
) {
437 if (bus
->bus_client
&& !bus
->is_kernel
) {
438 bus
->state
= BUS_HELLO
;
442 bus
->state
= BUS_RUNNING
;
446 static int parse_address_key(const char **p
, const char *key
, char **value
) {
447 size_t l
, n
= 0, allocated
= 0;
457 if (strncmp(*p
, key
, l
) != 0)
470 while (*a
!= ';' && *a
!= ',' && *a
!= 0) {
488 c
= (char) ((x
<< 4) | y
);
495 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
519 static void skip_address_key(const char **p
) {
523 *p
+= strcspn(*p
, ",");
529 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
530 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
539 while (**p
!= 0 && **p
!= ';') {
540 r
= parse_address_key(p
, "guid", guid
);
546 r
= parse_address_key(p
, "path", &path
);
552 r
= parse_address_key(p
, "abstract", &abstract
);
561 if (!path
&& !abstract
)
564 if (path
&& abstract
)
569 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
572 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
573 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
574 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
575 } else if (abstract
) {
576 l
= strlen(abstract
);
577 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
580 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
581 b
->sockaddr
.un
.sun_path
[0] = 0;
582 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
583 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
589 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
590 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
592 struct addrinfo
*result
, hints
= {
593 .ai_socktype
= SOCK_STREAM
,
594 .ai_flags
= AI_ADDRCONFIG
,
602 while (**p
!= 0 && **p
!= ';') {
603 r
= parse_address_key(p
, "guid", guid
);
609 r
= parse_address_key(p
, "host", &host
);
615 r
= parse_address_key(p
, "port", &port
);
621 r
= parse_address_key(p
, "family", &family
);
634 if (streq(family
, "ipv4"))
635 hints
.ai_family
= AF_INET
;
636 else if (streq(family
, "ipv6"))
637 hints
.ai_family
= AF_INET6
;
642 r
= getaddrinfo(host
, port
, &hints
, &result
);
646 return -EADDRNOTAVAIL
;
648 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
649 b
->sockaddr_size
= result
->ai_addrlen
;
651 freeaddrinfo(result
);
656 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
658 unsigned n_argv
= 0, j
;
660 size_t allocated
= 0;
668 while (**p
!= 0 && **p
!= ';') {
669 r
= parse_address_key(p
, "guid", guid
);
675 r
= parse_address_key(p
, "path", &path
);
681 if (startswith(*p
, "argv")) {
685 ul
= strtoul(*p
+ 4, (char**) p
, 10);
686 if (errno
> 0 || **p
!= '=' || ul
> 256) {
694 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
702 r
= parse_address_key(p
, NULL
, argv
+ ul
);
717 /* Make sure there are no holes in the array, with the
718 * exception of argv[0] */
719 for (j
= 1; j
< n_argv
; j
++)
725 if (argv
&& argv
[0] == NULL
) {
726 argv
[0] = strdup(path
);
738 for (j
= 0; j
< n_argv
; j
++)
746 static int parse_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
747 _cleanup_free_
char *path
= NULL
;
755 while (**p
!= 0 && **p
!= ';') {
756 r
= parse_address_key(p
, "guid", guid
);
762 r
= parse_address_key(p
, "path", &path
);
781 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
782 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
790 while (**p
!= 0 && **p
!= ';') {
791 r
= parse_address_key(p
, "guid", guid
);
797 r
= parse_address_key(p
, "machine", &machine
);
803 r
= parse_address_key(p
, "pid", &pid
);
812 if (!machine
== !pid
)
816 if (!machine_name_is_valid(machine
))
820 b
->machine
= machine
;
823 b
->machine
= mfree(b
->machine
);
827 r
= parse_pid(pid
, &b
->nspid
);
833 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
834 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
835 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + strlen("/var/run/dbus/system_bus_socket");
840 static int parse_container_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
841 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
849 while (**p
!= 0 && **p
!= ';') {
850 r
= parse_address_key(p
, "guid", guid
);
856 r
= parse_address_key(p
, "machine", &machine
);
862 r
= parse_address_key(p
, "pid", &pid
);
871 if (!machine
== !pid
)
875 if (!machine_name_is_valid(machine
))
879 b
->machine
= machine
;
882 b
->machine
= mfree(b
->machine
);
886 r
= parse_pid(pid
, &b
->nspid
);
892 r
= free_and_strdup(&b
->kernel
, "/sys/fs/kdbus/0-system/bus");
899 static void bus_reset_parsed_address(sd_bus
*b
) {
903 b
->sockaddr_size
= 0;
904 b
->exec_argv
= strv_free(b
->exec_argv
);
905 b
->exec_path
= mfree(b
->exec_path
);
906 b
->server_id
= SD_ID128_NULL
;
907 b
->kernel
= mfree(b
->kernel
);
908 b
->machine
= mfree(b
->machine
);
912 static int bus_parse_next_address(sd_bus
*b
) {
913 _cleanup_free_
char *guid
= NULL
;
921 if (b
->address
[b
->address_index
] == 0)
924 bus_reset_parsed_address(b
);
926 a
= b
->address
+ b
->address_index
;
935 if (startswith(a
, "unix:")) {
938 r
= parse_unix_address(b
, &a
, &guid
);
943 } else if (startswith(a
, "tcp:")) {
946 r
= parse_tcp_address(b
, &a
, &guid
);
952 } else if (startswith(a
, "unixexec:")) {
955 r
= parse_exec_address(b
, &a
, &guid
);
961 } else if (startswith(a
, "kernel:")) {
964 r
= parse_kernel_address(b
, &a
, &guid
);
969 } else if (startswith(a
, "x-machine-unix:")) {
972 r
= parse_container_unix_address(b
, &a
, &guid
);
977 } else if (startswith(a
, "x-machine-kernel:")) {
980 r
= parse_container_kernel_address(b
, &a
, &guid
);
993 r
= sd_id128_from_string(guid
, &b
->server_id
);
998 b
->address_index
= a
- b
->address
;
1002 static int bus_start_address(sd_bus
*b
) {
1003 bool container_kdbus_available
= false;
1004 bool kdbus_available
= false;
1010 bool skipped
= false;
1015 * Usually, if you provide multiple different bus-addresses, we
1016 * try all of them in order. We use the first one that
1017 * succeeds. However, if you mix kernel and unix addresses, we
1018 * never try unix-addresses if a previous kernel address was
1019 * tried and kdbus was available. This is required to prevent
1020 * clients to fallback to the bus-proxy if kdbus is available
1021 * but failed (eg., too many connections).
1025 r
= bus_socket_exec(b
);
1026 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
) {
1027 r
= bus_container_connect_kernel(b
);
1028 if (r
< 0 && !IN_SET(r
, -ENOENT
, -ESOCKTNOSUPPORT
))
1029 container_kdbus_available
= true;
1031 } else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
) {
1032 if (!container_kdbus_available
)
1033 r
= bus_container_connect_socket(b
);
1037 } else if (b
->kernel
) {
1038 r
= bus_kernel_connect(b
);
1039 if (r
< 0 && !IN_SET(r
, -ENOENT
, -ESOCKTNOSUPPORT
))
1040 kdbus_available
= true;
1042 } else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
) {
1043 if (!kdbus_available
)
1044 r
= bus_socket_connect(b
);
1052 r
= attach_io_events(b
);
1057 b
->last_connect_error
= -r
;
1060 r
= bus_parse_next_address(b
);
1064 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1068 int bus_next_address(sd_bus
*b
) {
1071 bus_reset_parsed_address(b
);
1072 return bus_start_address(b
);
1075 static int bus_start_fd(sd_bus
*b
) {
1080 assert(b
->input_fd
>= 0);
1081 assert(b
->output_fd
>= 0);
1083 r
= fd_nonblock(b
->input_fd
, true);
1087 r
= fd_cloexec(b
->input_fd
, true);
1091 if (b
->input_fd
!= b
->output_fd
) {
1092 r
= fd_nonblock(b
->output_fd
, true);
1096 r
= fd_cloexec(b
->output_fd
, true);
1101 if (fstat(b
->input_fd
, &st
) < 0)
1104 if (S_ISCHR(b
->input_fd
))
1105 return bus_kernel_take_fd(b
);
1107 return bus_socket_take_fd(b
);
1110 _public_
int sd_bus_start(sd_bus
*bus
) {
1113 assert_return(bus
, -EINVAL
);
1114 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1115 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1117 bus
->state
= BUS_OPENING
;
1119 if (bus
->is_server
&& bus
->bus_client
)
1122 if (bus
->input_fd
>= 0)
1123 r
= bus_start_fd(bus
);
1124 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1125 r
= bus_start_address(bus
);
1134 return bus_send_hello(bus
);
1137 _public_
int sd_bus_open(sd_bus
**ret
) {
1142 assert_return(ret
, -EINVAL
);
1144 /* Let's connect to the starter bus if it is set, and
1145 * otherwise to the bus that is appropropriate for the scope
1146 * we are running in */
1148 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1150 if (streq(e
, "system"))
1151 return sd_bus_open_system(ret
);
1152 else if (STR_IN_SET(e
, "session", "user"))
1153 return sd_bus_open_user(ret
);
1156 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1158 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1159 return sd_bus_open_user(ret
);
1161 return sd_bus_open_system(ret
);
1168 r
= sd_bus_set_address(b
, e
);
1172 b
->bus_client
= true;
1174 /* We don't know whether the bus is trusted or not, so better
1175 * be safe, and authenticate everything */
1177 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1178 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1180 r
= sd_bus_start(b
);
1192 int bus_set_address_system(sd_bus
*b
) {
1196 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1198 return sd_bus_set_address(b
, e
);
1200 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1203 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1207 assert_return(ret
, -EINVAL
);
1213 r
= bus_set_address_system(b
);
1217 b
->bus_client
= true;
1218 b
->is_system
= true;
1220 /* Let's do per-method access control on the system bus. We
1221 * need the caller's UID and capability set for that. */
1223 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1224 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1226 r
= sd_bus_start(b
);
1238 int bus_set_address_user(sd_bus
*b
) {
1245 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1247 return sd_bus_set_address(b
, e
);
1249 r
= cg_pid_get_owner_uid(0, &uid
);
1253 e
= secure_getenv("XDG_RUNTIME_DIR");
1255 _cleanup_free_
char *ee
= NULL
;
1257 ee
= bus_address_escape(e
);
1261 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, uid
, ee
);
1263 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, uid
);
1271 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1275 assert_return(ret
, -EINVAL
);
1281 r
= bus_set_address_user(b
);
1285 b
->bus_client
= true;
1288 /* We don't do any per-method access control on the user
1292 r
= sd_bus_start(b
);
1304 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1305 _cleanup_free_
char *e
= NULL
;
1306 char *m
= NULL
, *c
= NULL
;
1311 /* Let's see if we shall enter some container */
1312 m
= strchr(host
, ':');
1316 /* Let's make sure this is not a port of some kind,
1317 * and is a valid machine name. */
1318 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1321 /* Cut out the host part */
1322 t
= strndupa(host
, m
- host
- 1);
1323 e
= bus_address_escape(t
);
1327 c
= strjoina(",argv4=--machine=", m
);
1332 e
= bus_address_escape(host
);
1337 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1344 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1348 assert_return(host
, -EINVAL
);
1349 assert_return(ret
, -EINVAL
);
1351 r
= sd_bus_new(&bus
);
1355 r
= bus_set_address_system_remote(bus
, host
);
1359 bus
->bus_client
= true;
1360 bus
->trusted
= false;
1361 bus
->is_system
= true;
1363 r
= sd_bus_start(bus
);
1375 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1376 _cleanup_free_
char *e
= NULL
;
1381 e
= bus_address_escape(machine
);
1385 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1392 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1396 assert_return(machine
, -EINVAL
);
1397 assert_return(ret
, -EINVAL
);
1398 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1400 r
= sd_bus_new(&bus
);
1404 r
= bus_set_address_system_machine(bus
, machine
);
1408 bus
->bus_client
= true;
1409 bus
->trusted
= false;
1410 bus
->is_system
= true;
1412 r
= sd_bus_start(bus
);
1424 _public_
void sd_bus_close(sd_bus
*bus
) {
1428 if (bus
->state
== BUS_CLOSED
)
1430 if (bus_pid_changed(bus
))
1433 bus
->state
= BUS_CLOSED
;
1435 sd_bus_detach_event(bus
);
1437 /* Drop all queued messages so that they drop references to
1438 * the bus object and the bus may be freed */
1439 bus_reset_queues(bus
);
1441 if (!bus
->is_kernel
)
1444 /* We'll leave the fd open in case this is a kernel bus, since
1445 * there might still be memblocks around that reference this
1446 * bus, and they might need to invoke the KDBUS_CMD_FREE
1447 * ioctl on the fd when they are freed. */
1450 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1458 return sd_bus_unref(bus
);
1461 static void bus_enter_closing(sd_bus
*bus
) {
1464 if (bus
->state
!= BUS_OPENING
&&
1465 bus
->state
!= BUS_AUTHENTICATING
&&
1466 bus
->state
!= BUS_HELLO
&&
1467 bus
->state
!= BUS_RUNNING
)
1470 bus
->state
= BUS_CLOSING
;
1473 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1474 assert_return(bus
, NULL
);
1476 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1481 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1487 i
= REFCNT_DEC(bus
->n_ref
);
1495 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1497 assert_return(bus
, -EINVAL
);
1498 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1500 return BUS_IS_OPEN(bus
->state
);
1503 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1506 assert_return(bus
, -EINVAL
);
1507 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1508 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1510 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1513 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1514 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1517 r
= bus_ensure_running(bus
);
1521 return bus
->can_fds
;
1524 return bus_type_is_valid(type
);
1527 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1530 assert_return(bus
, -EINVAL
);
1531 assert_return(id
, -EINVAL
);
1532 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1534 r
= bus_ensure_running(bus
);
1538 *id
= bus
->server_id
;
1542 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1547 /* If we copy the same message to multiple
1548 * destinations, avoid using the same cookie
1550 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1555 timeout
= BUS_DEFAULT_TIMEOUT
;
1557 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1560 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1561 bool remarshal
= false;
1565 /* wrong packet version */
1566 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1569 /* wrong packet endianness */
1570 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1573 /* TODO: kdbus-messages received from the kernel contain data which is
1574 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1575 * force remarshaling of the message. Technically, we could just
1576 * recreate the kdbus message, but that is non-trivial as other parts of
1577 * the message refer to m->kdbus already. This should be fixed! */
1578 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1581 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1584 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1588 /* Fake some timestamps, if they were requested, and not
1589 * already initialized */
1590 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1591 if (m
->realtime
<= 0)
1592 m
->realtime
= now(CLOCK_REALTIME
);
1594 if (m
->monotonic
<= 0)
1595 m
->monotonic
= now(CLOCK_MONOTONIC
);
1598 /* The bus specification says the serial number cannot be 0,
1599 * hence let's fill something in for synthetic messages. Since
1600 * synthetic messages might have a fake sender and we don't
1601 * want to interfere with the real sender's serial numbers we
1602 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1603 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1604 * even though kdbus can do 64bit. */
1605 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1608 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1615 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1617 r
= bus_socket_write_message(bus
, m
, idx
);
1622 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1623 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1624 bus_message_type_to_string(m
->header
->type
),
1625 strna(sd_bus_message_get_sender(m
)),
1626 strna(sd_bus_message_get_destination(m
)),
1627 strna(sd_bus_message_get_path(m
)),
1628 strna(sd_bus_message_get_interface(m
)),
1629 strna(sd_bus_message_get_member(m
)),
1630 BUS_MESSAGE_COOKIE(m
),
1632 strna(m
->error
.message
));
1637 static int dispatch_wqueue(sd_bus
*bus
) {
1641 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1643 while (bus
->wqueue_size
> 0) {
1645 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1649 /* Didn't do anything this time */
1651 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1652 /* Fully written. Let's drop the entry from
1655 * This isn't particularly optimized, but
1656 * well, this is supposed to be our worst-case
1657 * buffer only, and the socket buffer is
1658 * supposed to be our primary buffer, and if
1659 * it got full, then all bets are off
1662 bus
->wqueue_size
--;
1663 sd_bus_message_unref(bus
->wqueue
[0]);
1664 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1674 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1678 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1680 return bus_socket_read_message(bus
);
1683 int bus_rqueue_make_room(sd_bus
*bus
) {
1686 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1689 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1695 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1700 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1702 /* Note that the priority logic is only available on kdbus,
1703 * where the rqueue is unused. We check the rqueue here
1704 * anyway, because it's simple... */
1707 if (bus
->rqueue_size
> 0) {
1708 /* Dispatch a queued message */
1710 *m
= bus
->rqueue
[0];
1711 bus
->rqueue_size
--;
1712 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1716 /* Try to read a new message */
1717 r
= bus_read_message(bus
, hint_priority
, priority
);
1727 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1728 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1731 assert_return(m
, -EINVAL
);
1736 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1737 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1739 if (!BUS_IS_OPEN(bus
->state
))
1743 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1750 /* If the cookie number isn't kept, then we know that no reply
1752 if (!cookie
&& !m
->sealed
)
1753 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1755 r
= bus_seal_message(bus
, m
, 0);
1759 /* Remarshall if we have to. This will possibly unref the
1760 * message and place a replacement in m */
1761 r
= bus_remarshal_message(bus
, &m
);
1765 /* If this is a reply and no reply was requested, then let's
1766 * suppress this, if we can */
1770 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1773 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1775 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1776 bus_enter_closing(bus
);
1783 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1784 /* Wasn't fully written. So let's remember how
1785 * much was written. Note that the first entry
1786 * of the wqueue array is always allocated so
1787 * that we always can remember how much was
1789 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1790 bus
->wqueue_size
= 1;
1795 /* Just append it to the queue. */
1797 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1800 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1803 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1808 *cookie
= BUS_MESSAGE_COOKIE(m
);
1813 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1814 return bus_send_internal(bus
, m
, cookie
, false);
1817 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1820 assert_return(m
, -EINVAL
);
1825 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1827 if (!BUS_IS_OPEN(bus
->state
))
1830 if (!streq_ptr(m
->destination
, destination
)) {
1835 r
= sd_bus_message_set_destination(m
, destination
);
1840 return sd_bus_send(bus
, m
, cookie
);
1843 static usec_t
calc_elapse(uint64_t usec
) {
1844 if (usec
== (uint64_t) -1)
1847 return now(CLOCK_MONOTONIC
) + usec
;
1850 static int timeout_compare(const void *a
, const void *b
) {
1851 const struct reply_callback
*x
= a
, *y
= b
;
1853 if (x
->timeout
!= 0 && y
->timeout
== 0)
1856 if (x
->timeout
== 0 && y
->timeout
!= 0)
1859 if (x
->timeout
< y
->timeout
)
1862 if (x
->timeout
> y
->timeout
)
1868 _public_
int sd_bus_call_async(
1872 sd_bus_message_handler_t callback
,
1876 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1877 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1880 assert_return(m
, -EINVAL
);
1881 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1882 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1883 assert_return(callback
, -EINVAL
);
1888 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1889 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1891 if (!BUS_IS_OPEN(bus
->state
))
1894 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1898 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1902 r
= bus_seal_message(bus
, m
, usec
);
1906 r
= bus_remarshal_message(bus
, &m
);
1910 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1914 s
->reply_callback
.callback
= callback
;
1916 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1917 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1919 s
->reply_callback
.cookie
= 0;
1923 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1924 if (s
->reply_callback
.timeout
!= 0) {
1925 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1927 s
->reply_callback
.timeout
= 0;
1932 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1943 int bus_ensure_running(sd_bus
*bus
) {
1948 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1950 if (bus
->state
== BUS_RUNNING
)
1954 r
= sd_bus_process(bus
, NULL
);
1957 if (bus
->state
== BUS_RUNNING
)
1962 r
= sd_bus_wait(bus
, (uint64_t) -1);
1968 _public_
int sd_bus_call(
1972 sd_bus_error
*error
,
1973 sd_bus_message
**reply
) {
1975 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1981 bus_assert_return(m
, -EINVAL
, error
);
1982 bus_assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
, error
);
1983 bus_assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
, error
);
1984 bus_assert_return(!bus_error_is_dirty(error
), -EINVAL
, error
);
1989 bus_assert_return(!bus_pid_changed(bus
), -ECHILD
, error
);
1990 bus_assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
, error
);
1992 if (!BUS_IS_OPEN(bus
->state
)) {
1997 r
= bus_ensure_running(bus
);
2001 i
= bus
->rqueue_size
;
2003 r
= bus_seal_message(bus
, m
, usec
);
2007 r
= bus_remarshal_message(bus
, &m
);
2011 r
= bus_send_internal(bus
, m
, &cookie
, true);
2015 timeout
= calc_elapse(m
->timeout
);
2020 while (i
< bus
->rqueue_size
) {
2021 sd_bus_message
*incoming
= NULL
;
2023 incoming
= bus
->rqueue
[i
];
2025 if (incoming
->reply_cookie
== cookie
) {
2026 /* Found a match! */
2028 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2030 log_debug_bus_message(incoming
);
2032 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2034 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2038 sd_bus_message_unref(incoming
);
2043 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2044 sd_bus_message_unref(incoming
);
2047 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
) {
2048 r
= sd_bus_error_copy(error
, &incoming
->error
);
2049 sd_bus_message_unref(incoming
);
2056 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2059 streq(bus
->unique_name
, incoming
->sender
)) {
2061 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2064 /* Our own message? Somebody is trying
2065 * to send its own client a message,
2066 * let's not dead-lock, let's fail
2069 sd_bus_message_unref(incoming
);
2074 /* Try to read more, right-away */
2078 r
= bus_read_message(bus
, false, 0);
2080 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2081 bus_enter_closing(bus
);
2093 n
= now(CLOCK_MONOTONIC
);
2101 left
= (uint64_t) -1;
2103 r
= bus_poll(bus
, true, left
);
2111 r
= dispatch_wqueue(bus
);
2113 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2114 bus_enter_closing(bus
);
2123 return sd_bus_error_set_errno(error
, r
);
2126 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2128 assert_return(bus
, -EINVAL
);
2129 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2130 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2132 return bus
->input_fd
;
2135 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2138 assert_return(bus
, -EINVAL
);
2139 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2141 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2144 if (bus
->state
== BUS_OPENING
)
2146 else if (bus
->state
== BUS_AUTHENTICATING
) {
2148 if (bus_socket_auth_needs_write(bus
))
2153 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2154 if (bus
->rqueue_size
<= 0)
2156 if (bus
->wqueue_size
> 0)
2163 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2164 struct reply_callback
*c
;
2166 assert_return(bus
, -EINVAL
);
2167 assert_return(timeout_usec
, -EINVAL
);
2168 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2170 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2173 if (bus
->track_queue
) {
2178 if (bus
->state
== BUS_CLOSING
) {
2183 if (bus
->state
== BUS_AUTHENTICATING
) {
2184 *timeout_usec
= bus
->auth_timeout
;
2188 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2189 *timeout_usec
= (uint64_t) -1;
2193 if (bus
->rqueue_size
> 0) {
2198 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2200 *timeout_usec
= (uint64_t) -1;
2204 if (c
->timeout
== 0) {
2205 *timeout_usec
= (uint64_t) -1;
2209 *timeout_usec
= c
->timeout
;
2213 static int process_timeout(sd_bus
*bus
) {
2214 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2215 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2216 struct reply_callback
*c
;
2223 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2227 n
= now(CLOCK_MONOTONIC
);
2231 r
= bus_message_new_synthetic_error(
2234 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2239 r
= bus_seal_synthetic_message(bus
, m
);
2243 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2246 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2249 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2251 bus
->iteration_counter
++;
2253 bus
->current_message
= m
;
2254 bus
->current_slot
= sd_bus_slot_ref(slot
);
2255 bus
->current_handler
= c
->callback
;
2256 bus
->current_userdata
= slot
->userdata
;
2257 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2258 bus
->current_userdata
= NULL
;
2259 bus
->current_handler
= NULL
;
2260 bus
->current_slot
= NULL
;
2261 bus
->current_message
= NULL
;
2263 if (slot
->floating
) {
2264 bus_slot_disconnect(slot
);
2265 sd_bus_slot_unref(slot
);
2268 sd_bus_slot_unref(slot
);
2270 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2273 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2277 if (bus
->state
!= BUS_HELLO
)
2280 /* Let's make sure the first message on the bus is the HELLO
2281 * reply. But note that we don't actually parse the message
2282 * here (we leave that to the usual handling), we just verify
2283 * we don't let any earlier msg through. */
2285 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2286 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2289 if (m
->reply_cookie
!= 1)
2295 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2296 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2297 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2298 struct reply_callback
*c
;
2305 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2306 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2309 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2312 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2315 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2321 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2323 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2325 /* If the reply contained a file descriptor which we
2326 * didn't want we pass an error instead. */
2328 r
= bus_message_new_synthetic_error(
2331 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2336 /* Copy over original timestamp */
2337 synthetic_reply
->realtime
= m
->realtime
;
2338 synthetic_reply
->monotonic
= m
->monotonic
;
2339 synthetic_reply
->seqnum
= m
->seqnum
;
2341 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2345 m
= synthetic_reply
;
2347 r
= sd_bus_message_rewind(m
, true);
2352 if (c
->timeout
!= 0) {
2353 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2357 bus
->current_slot
= sd_bus_slot_ref(slot
);
2358 bus
->current_handler
= c
->callback
;
2359 bus
->current_userdata
= slot
->userdata
;
2360 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2361 bus
->current_userdata
= NULL
;
2362 bus
->current_handler
= NULL
;
2363 bus
->current_slot
= NULL
;
2365 if (slot
->floating
) {
2366 bus_slot_disconnect(slot
);
2367 sd_bus_slot_unref(slot
);
2370 sd_bus_slot_unref(slot
);
2372 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2375 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2376 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2377 struct filter_callback
*l
;
2384 bus
->filter_callbacks_modified
= false;
2386 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2389 if (bus
->filter_callbacks_modified
)
2392 /* Don't run this more than once per iteration */
2393 if (l
->last_iteration
== bus
->iteration_counter
)
2396 l
->last_iteration
= bus
->iteration_counter
;
2398 r
= sd_bus_message_rewind(m
, true);
2402 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2404 bus
->current_slot
= sd_bus_slot_ref(slot
);
2405 bus
->current_handler
= l
->callback
;
2406 bus
->current_userdata
= slot
->userdata
;
2407 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2408 bus
->current_userdata
= NULL
;
2409 bus
->current_handler
= NULL
;
2410 bus
->current_slot
= sd_bus_slot_unref(slot
);
2412 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2418 } while (bus
->filter_callbacks_modified
);
2423 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2430 bus
->match_callbacks_modified
= false;
2432 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2436 } while (bus
->match_callbacks_modified
);
2441 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2442 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2448 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2451 if (bus
->manual_peer_interface
)
2454 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2457 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2460 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2463 if (streq_ptr(m
->member
, "Ping"))
2464 r
= sd_bus_message_new_method_return(m
, &reply
);
2465 else if (streq_ptr(m
->member
, "GetMachineId")) {
2469 r
= sd_id128_get_machine(&id
);
2473 r
= sd_bus_message_new_method_return(m
, &reply
);
2477 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2479 r
= sd_bus_message_new_method_errorf(
2481 SD_BUS_ERROR_UNKNOWN_METHOD
,
2482 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2488 r
= sd_bus_send(bus
, reply
, NULL
);
2495 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2499 /* If we got a message with a file descriptor which we didn't
2500 * want to accept, then let's drop it. How can this even
2501 * happen? For example, when the kernel queues a message into
2502 * an activatable names's queue which allows fds, and then is
2503 * delivered to us later even though we ourselves did not
2506 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2512 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2515 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2516 return 1; /* just eat it up */
2518 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2521 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2527 bus
->current_message
= m
;
2528 bus
->iteration_counter
++;
2530 log_debug_bus_message(m
);
2532 r
= process_hello(bus
, m
);
2536 r
= process_reply(bus
, m
);
2540 r
= process_fd_check(bus
, m
);
2544 r
= process_filter(bus
, m
);
2548 r
= process_match(bus
, m
);
2552 r
= process_builtin(bus
, m
);
2556 r
= bus_process_object(bus
, m
);
2559 bus
->current_message
= NULL
;
2563 static int dispatch_track(sd_bus
*bus
) {
2566 if (!bus
->track_queue
)
2569 bus_track_dispatch(bus
->track_queue
);
2573 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2574 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2578 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2580 r
= process_timeout(bus
);
2584 r
= dispatch_wqueue(bus
);
2588 r
= dispatch_track(bus
);
2592 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2598 r
= process_message(bus
, m
);
2603 r
= sd_bus_message_rewind(m
, true);
2612 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2614 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2615 strna(sd_bus_message_get_sender(m
)),
2616 strna(sd_bus_message_get_path(m
)),
2617 strna(sd_bus_message_get_interface(m
)),
2618 strna(sd_bus_message_get_member(m
)));
2620 r
= sd_bus_reply_method_errorf(
2622 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2623 "Unknown object '%s'.", m
->path
);
2637 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2638 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2639 struct reply_callback
*c
;
2643 assert(bus
->state
== BUS_CLOSING
);
2645 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2647 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2650 /* First, fail all outstanding method calls */
2651 r
= bus_message_new_synthetic_error(
2654 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2659 r
= bus_seal_synthetic_message(bus
, m
);
2663 if (c
->timeout
!= 0) {
2664 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2668 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2671 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2673 bus
->iteration_counter
++;
2675 bus
->current_message
= m
;
2676 bus
->current_slot
= sd_bus_slot_ref(slot
);
2677 bus
->current_handler
= c
->callback
;
2678 bus
->current_userdata
= slot
->userdata
;
2679 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2680 bus
->current_userdata
= NULL
;
2681 bus
->current_handler
= NULL
;
2682 bus
->current_slot
= NULL
;
2683 bus
->current_message
= NULL
;
2685 if (slot
->floating
) {
2686 bus_slot_disconnect(slot
);
2687 sd_bus_slot_unref(slot
);
2690 sd_bus_slot_unref(slot
);
2692 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2695 /* Then, synthesize a Disconnected message */
2696 r
= sd_bus_message_new_signal(
2699 "/org/freedesktop/DBus/Local",
2700 "org.freedesktop.DBus.Local",
2705 bus_message_set_sender_local(bus
, m
);
2707 r
= bus_seal_synthetic_message(bus
, m
);
2713 bus
->current_message
= m
;
2714 bus
->iteration_counter
++;
2716 r
= process_filter(bus
, m
);
2720 r
= process_match(bus
, m
);
2732 bus
->current_message
= NULL
;
2737 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2738 BUS_DONT_DESTROY(bus
);
2741 /* Returns 0 when we didn't do anything. This should cause the
2742 * caller to invoke sd_bus_wait() before returning the next
2743 * time. Returns > 0 when we did something, which possibly
2744 * means *ret is filled in with an unprocessed message. */
2746 assert_return(bus
, -EINVAL
);
2747 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2749 /* We don't allow recursively invoking sd_bus_process(). */
2750 assert_return(!bus
->current_message
, -EBUSY
);
2751 assert(!bus
->current_slot
);
2753 switch (bus
->state
) {
2762 r
= bus_socket_process_opening(bus
);
2763 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2764 bus_enter_closing(bus
);
2772 case BUS_AUTHENTICATING
:
2773 r
= bus_socket_process_authenticating(bus
);
2774 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2775 bus_enter_closing(bus
);
2787 r
= process_running(bus
, hint_priority
, priority
, ret
);
2788 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2789 bus_enter_closing(bus
);
2799 return process_closing(bus
, ret
);
2802 assert_not_reached("Unknown state");
2805 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2806 return bus_process_internal(bus
, false, 0, ret
);
2809 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2810 return bus_process_internal(bus
, true, priority
, ret
);
2813 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2814 struct pollfd p
[2] = {};
2817 usec_t m
= USEC_INFINITY
;
2821 if (bus
->state
== BUS_CLOSING
)
2824 if (!BUS_IS_OPEN(bus
->state
))
2827 e
= sd_bus_get_events(bus
);
2832 /* The caller really needs some more data, he doesn't
2833 * care about what's already read, or any timeouts
2834 * except its own. */
2838 /* The caller wants to process if there's something to
2839 * process, but doesn't care otherwise */
2841 r
= sd_bus_get_timeout(bus
, &until
);
2846 nw
= now(CLOCK_MONOTONIC
);
2847 m
= until
> nw
? until
- nw
: 0;
2851 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2854 p
[0].fd
= bus
->input_fd
;
2855 if (bus
->output_fd
== bus
->input_fd
) {
2859 p
[0].events
= e
& POLLIN
;
2860 p
[1].fd
= bus
->output_fd
;
2861 p
[1].events
= e
& POLLOUT
;
2865 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2869 return r
> 0 ? 1 : 0;
2872 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2874 assert_return(bus
, -EINVAL
);
2875 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2877 if (bus
->state
== BUS_CLOSING
)
2880 if (!BUS_IS_OPEN(bus
->state
))
2883 if (bus
->rqueue_size
> 0)
2886 return bus_poll(bus
, false, timeout_usec
);
2889 _public_
int sd_bus_flush(sd_bus
*bus
) {
2892 assert_return(bus
, -EINVAL
);
2893 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2895 if (bus
->state
== BUS_CLOSING
)
2898 if (!BUS_IS_OPEN(bus
->state
))
2901 r
= bus_ensure_running(bus
);
2905 if (bus
->wqueue_size
<= 0)
2909 r
= dispatch_wqueue(bus
);
2911 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2912 bus_enter_closing(bus
);
2919 if (bus
->wqueue_size
<= 0)
2922 r
= bus_poll(bus
, false, (uint64_t) -1);
2928 _public_
int sd_bus_add_filter(
2931 sd_bus_message_handler_t callback
,
2936 assert_return(bus
, -EINVAL
);
2937 assert_return(callback
, -EINVAL
);
2938 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2940 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2944 s
->filter_callback
.callback
= callback
;
2946 bus
->filter_callbacks_modified
= true;
2947 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2955 _public_
int sd_bus_add_match(
2959 sd_bus_message_handler_t callback
,
2962 struct bus_match_component
*components
= NULL
;
2963 unsigned n_components
= 0;
2964 sd_bus_slot
*s
= NULL
;
2967 assert_return(bus
, -EINVAL
);
2968 assert_return(match
, -EINVAL
);
2969 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2971 r
= bus_match_parse(match
, &components
, &n_components
);
2975 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2981 s
->match_callback
.callback
= callback
;
2982 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2984 if (bus
->bus_client
) {
2985 enum bus_match_scope scope
;
2987 scope
= bus_match_get_scope(components
, n_components
);
2989 /* Do not install server-side matches for matches
2990 * against the local service, interface or bus
2992 if (scope
!= BUS_MATCH_LOCAL
) {
2994 if (!bus
->is_kernel
) {
2995 /* When this is not a kernel transport, we
2996 * store the original match string, so that we
2997 * can use it to remove the match again */
2999 s
->match_callback
.match_string
= strdup(match
);
3000 if (!s
->match_callback
.match_string
) {
3006 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
3010 s
->match_added
= true;
3014 bus
->match_callbacks_modified
= true;
3015 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
3024 bus_match_parse_free(components
, n_components
);
3025 sd_bus_slot_unref(s
);
3030 int bus_remove_match_by_string(
3033 sd_bus_message_handler_t callback
,
3036 struct bus_match_component
*components
= NULL
;
3037 unsigned n_components
= 0;
3038 struct match_callback
*c
;
3041 assert_return(bus
, -EINVAL
);
3042 assert_return(match
, -EINVAL
);
3043 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3045 r
= bus_match_parse(match
, &components
, &n_components
);
3049 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3053 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3056 bus_match_parse_free(components
, n_components
);
3061 bool bus_pid_changed(sd_bus
*bus
) {
3064 /* We don't support people creating a bus connection and
3065 * keeping it around over a fork(). Let's complain. */
3067 return bus
->original_pid
!= getpid();
3070 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3071 sd_bus
*bus
= userdata
;
3076 r
= sd_bus_process(bus
, NULL
);
3083 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3084 sd_bus
*bus
= userdata
;
3089 r
= sd_bus_process(bus
, NULL
);
3096 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3097 sd_bus
*bus
= userdata
;
3104 e
= sd_bus_get_events(bus
);
3108 if (bus
->output_fd
!= bus
->input_fd
) {
3110 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3114 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3118 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3123 r
= sd_bus_get_timeout(bus
, &until
);
3129 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3134 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3141 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3142 sd_bus
*bus
= userdata
;
3152 static int attach_io_events(sd_bus
*bus
) {
3157 if (bus
->input_fd
< 0)
3163 if (!bus
->input_io_event_source
) {
3164 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3168 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3172 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3176 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3178 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3183 if (bus
->output_fd
!= bus
->input_fd
) {
3184 assert(bus
->output_fd
>= 0);
3186 if (!bus
->output_io_event_source
) {
3187 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3191 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3195 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3197 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3206 static void detach_io_events(sd_bus
*bus
) {
3209 if (bus
->input_io_event_source
) {
3210 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3211 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3214 if (bus
->output_io_event_source
) {
3215 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3216 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3220 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3223 assert_return(bus
, -EINVAL
);
3224 assert_return(!bus
->event
, -EBUSY
);
3226 assert(!bus
->input_io_event_source
);
3227 assert(!bus
->output_io_event_source
);
3228 assert(!bus
->time_event_source
);
3231 bus
->event
= sd_event_ref(event
);
3233 r
= sd_event_default(&bus
->event
);
3238 bus
->event_priority
= priority
;
3240 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3244 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3248 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3252 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3256 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3260 r
= attach_io_events(bus
);
3267 sd_bus_detach_event(bus
);
3271 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3272 assert_return(bus
, -EINVAL
);
3277 detach_io_events(bus
);
3279 if (bus
->time_event_source
) {
3280 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3281 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3284 if (bus
->quit_event_source
) {
3285 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3286 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3289 bus
->event
= sd_event_unref(bus
->event
);
3293 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3294 assert_return(bus
, NULL
);
3299 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3300 assert_return(bus
, NULL
);
3302 return bus
->current_message
;
3305 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3306 assert_return(bus
, NULL
);
3308 return bus
->current_slot
;
3311 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3312 assert_return(bus
, NULL
);
3314 return bus
->current_handler
;
3317 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3318 assert_return(bus
, NULL
);
3320 return bus
->current_userdata
;
3323 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3328 assert(default_bus
);
3331 return !!*default_bus
;
3334 *ret
= sd_bus_ref(*default_bus
);
3342 b
->default_bus_ptr
= default_bus
;
3350 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3351 static thread_local sd_bus
*default_system_bus
= NULL
;
3353 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3356 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3357 static thread_local sd_bus
*default_user_bus
= NULL
;
3359 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3362 _public_
int sd_bus_default(sd_bus
**ret
) {
3366 /* Let's try our best to reuse another cached connection. If
3367 * the starter bus type is set, connect via our normal
3368 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3369 * we can share the connection with the user/system default
3372 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3374 if (streq(e
, "system"))
3375 return sd_bus_default_system(ret
);
3376 else if (STR_IN_SET(e
, "user", "session"))
3377 return sd_bus_default_user(ret
);
3380 /* No type is specified, so we have not other option than to
3381 * use the starter address if it is set. */
3383 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3385 static thread_local sd_bus
*default_starter_bus
= NULL
;
3387 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3390 /* Finally, if nothing is set use the cached connection for
3391 * the right scope */
3393 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3394 return sd_bus_default_user(ret
);
3396 return sd_bus_default_system(ret
);
3399 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3400 assert_return(b
, -EINVAL
);
3401 assert_return(tid
, -EINVAL
);
3402 assert_return(!bus_pid_changed(b
), -ECHILD
);
3410 return sd_event_get_tid(b
->event
, tid
);
3415 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3416 _cleanup_free_
char *e
= NULL
;
3419 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3420 assert_return(external_id
, -EINVAL
);
3421 assert_return(ret_path
, -EINVAL
);
3423 e
= bus_label_escape(external_id
);
3427 ret
= strjoin(prefix
, "/", e
, NULL
);
3435 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3439 assert_return(object_path_is_valid(path
), -EINVAL
);
3440 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3441 assert_return(external_id
, -EINVAL
);
3443 e
= object_path_startswith(path
, prefix
);
3445 *external_id
= NULL
;
3449 ret
= bus_label_unescape(e
);
3457 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3460 assert_return(bus
, -EINVAL
);
3461 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3463 if (!bus
->is_kernel
)
3466 if (!BUS_IS_OPEN(bus
->state
))
3469 if (bus
->rqueue_size
> 0)
3472 if (bus
->wqueue_size
> 0)
3475 r
= bus_kernel_try_close(bus
);
3483 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3484 assert_return(bus
, -EINVAL
);
3485 assert_return(description
, -EINVAL
);
3486 assert_return(bus
->description
, -ENXIO
);
3487 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3489 *description
= bus
->description
;
3493 int bus_get_root_path(sd_bus
*bus
) {
3496 if (bus
->cgroup_root
)
3499 r
= cg_get_root_path(&bus
->cgroup_root
);
3501 bus
->cgroup_root
= strdup("/");
3502 if (!bus
->cgroup_root
)
3511 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3514 assert_return(bus
, -EINVAL
);
3515 assert_return(scope
, -EINVAL
);
3516 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3518 if (bus
->is_kernel
) {
3519 _cleanup_free_
char *n
= NULL
;
3522 r
= bus_kernel_get_bus_name(bus
, &n
);
3526 if (streq(n
, "0-system")) {
3531 dash
= strchr(n
, '-');
3532 if (streq_ptr(dash
, "-user")) {
3543 if (bus
->is_system
) {
3551 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3553 assert_return(bus
, -EINVAL
);
3554 assert_return(address
, -EINVAL
);
3555 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3558 *address
= bus
->address
;
3565 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3566 assert_return(bus
, -EINVAL
);
3567 assert_return(mask
, -EINVAL
);
3568 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3570 *mask
= bus
->creds_mask
;
3574 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3575 assert_return(bus
, -EINVAL
);
3576 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3578 return bus
->bus_client
;
3581 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3582 assert_return(bus
, -EINVAL
);
3583 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3585 return bus
->is_server
;
3588 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3589 assert_return(bus
, -EINVAL
);
3590 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3592 return bus
->anonymous_auth
;
3595 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3596 assert_return(bus
, -EINVAL
);
3597 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3599 return bus
->trusted
;
3602 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3603 assert_return(bus
, -EINVAL
);
3604 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3606 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);