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
;
828 r
= parse_pid(pid
, &b
->nspid
);
834 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
835 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
836 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + strlen("/var/run/dbus/system_bus_socket");
841 static int parse_container_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
842 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
850 while (**p
!= 0 && **p
!= ';') {
851 r
= parse_address_key(p
, "guid", guid
);
857 r
= parse_address_key(p
, "machine", &machine
);
863 r
= parse_address_key(p
, "pid", &pid
);
872 if (!machine
== !pid
)
876 if (!machine_name_is_valid(machine
))
880 b
->machine
= machine
;
888 r
= parse_pid(pid
, &b
->nspid
);
894 r
= free_and_strdup(&b
->kernel
, "/sys/fs/kdbus/0-system/bus");
901 static void bus_reset_parsed_address(sd_bus
*b
) {
905 b
->sockaddr_size
= 0;
906 b
->exec_argv
= strv_free(b
->exec_argv
);
907 b
->exec_path
= mfree(b
->exec_path
);
908 b
->server_id
= SD_ID128_NULL
;
909 b
->kernel
= mfree(b
->kernel
);
910 b
->machine
= mfree(b
->machine
);
914 static int bus_parse_next_address(sd_bus
*b
) {
915 _cleanup_free_
char *guid
= NULL
;
923 if (b
->address
[b
->address_index
] == 0)
926 bus_reset_parsed_address(b
);
928 a
= b
->address
+ b
->address_index
;
937 if (startswith(a
, "unix:")) {
940 r
= parse_unix_address(b
, &a
, &guid
);
945 } else if (startswith(a
, "tcp:")) {
948 r
= parse_tcp_address(b
, &a
, &guid
);
954 } else if (startswith(a
, "unixexec:")) {
957 r
= parse_exec_address(b
, &a
, &guid
);
963 } else if (startswith(a
, "kernel:")) {
966 r
= parse_kernel_address(b
, &a
, &guid
);
971 } else if (startswith(a
, "x-machine-unix:")) {
974 r
= parse_container_unix_address(b
, &a
, &guid
);
979 } else if (startswith(a
, "x-machine-kernel:")) {
982 r
= parse_container_kernel_address(b
, &a
, &guid
);
995 r
= sd_id128_from_string(guid
, &b
->server_id
);
1000 b
->address_index
= a
- b
->address
;
1004 static int bus_start_address(sd_bus
*b
) {
1010 bool skipped
= false;
1015 r
= bus_socket_exec(b
);
1016 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
)
1017 r
= bus_container_connect_kernel(b
);
1018 else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1019 r
= bus_container_connect_socket(b
);
1021 r
= bus_kernel_connect(b
);
1022 else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1023 r
= bus_socket_connect(b
);
1029 r
= attach_io_events(b
);
1034 b
->last_connect_error
= -r
;
1037 r
= bus_parse_next_address(b
);
1041 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1045 int bus_next_address(sd_bus
*b
) {
1048 bus_reset_parsed_address(b
);
1049 return bus_start_address(b
);
1052 static int bus_start_fd(sd_bus
*b
) {
1057 assert(b
->input_fd
>= 0);
1058 assert(b
->output_fd
>= 0);
1060 r
= fd_nonblock(b
->input_fd
, true);
1064 r
= fd_cloexec(b
->input_fd
, true);
1068 if (b
->input_fd
!= b
->output_fd
) {
1069 r
= fd_nonblock(b
->output_fd
, true);
1073 r
= fd_cloexec(b
->output_fd
, true);
1078 if (fstat(b
->input_fd
, &st
) < 0)
1081 if (S_ISCHR(b
->input_fd
))
1082 return bus_kernel_take_fd(b
);
1084 return bus_socket_take_fd(b
);
1087 _public_
int sd_bus_start(sd_bus
*bus
) {
1090 assert_return(bus
, -EINVAL
);
1091 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1092 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1094 bus
->state
= BUS_OPENING
;
1096 if (bus
->is_server
&& bus
->bus_client
)
1099 if (bus
->input_fd
>= 0)
1100 r
= bus_start_fd(bus
);
1101 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1102 r
= bus_start_address(bus
);
1111 return bus_send_hello(bus
);
1114 _public_
int sd_bus_open(sd_bus
**ret
) {
1119 assert_return(ret
, -EINVAL
);
1121 /* Let's connect to the starter bus if it is set, and
1122 * otherwise to the bus that is appropropriate for the scope
1123 * we are running in */
1125 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1127 if (streq(e
, "system"))
1128 return sd_bus_open_system(ret
);
1129 else if (STR_IN_SET(e
, "session", "user"))
1130 return sd_bus_open_user(ret
);
1133 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1135 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1136 return sd_bus_open_user(ret
);
1138 return sd_bus_open_system(ret
);
1145 r
= sd_bus_set_address(b
, e
);
1149 b
->bus_client
= true;
1151 /* We don't know whether the bus is trusted or not, so better
1152 * be safe, and authenticate everything */
1154 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1155 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1157 r
= sd_bus_start(b
);
1169 int bus_set_address_system(sd_bus
*b
) {
1173 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1175 return sd_bus_set_address(b
, e
);
1177 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1180 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1184 assert_return(ret
, -EINVAL
);
1190 r
= bus_set_address_system(b
);
1194 b
->bus_client
= true;
1195 b
->is_system
= true;
1197 /* Let's do per-method access control on the system bus. We
1198 * need the caller's UID and capability set for that. */
1200 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1201 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1203 r
= sd_bus_start(b
);
1215 int bus_set_address_user(sd_bus
*b
) {
1220 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1222 return sd_bus_set_address(b
, e
);
1224 e
= secure_getenv("XDG_RUNTIME_DIR");
1226 _cleanup_free_
char *ee
= NULL
;
1228 ee
= bus_address_escape(e
);
1232 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, getuid(), ee
);
1234 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, getuid());
1242 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1246 assert_return(ret
, -EINVAL
);
1252 r
= bus_set_address_user(b
);
1256 b
->bus_client
= true;
1259 /* We don't do any per-method access control on the user
1263 r
= sd_bus_start(b
);
1275 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1276 _cleanup_free_
char *e
= NULL
;
1277 char *m
= NULL
, *c
= NULL
;
1282 /* Let's see if we shall enter some container */
1283 m
= strchr(host
, ':');
1287 /* Let's make sure this is not a port of some kind,
1288 * and is a valid machine name. */
1289 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1292 /* Cut out the host part */
1293 t
= strndupa(host
, m
- host
- 1);
1294 e
= bus_address_escape(t
);
1298 c
= strjoina(",argv4=--machine=", m
);
1303 e
= bus_address_escape(host
);
1308 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1315 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1319 assert_return(host
, -EINVAL
);
1320 assert_return(ret
, -EINVAL
);
1322 r
= sd_bus_new(&bus
);
1326 r
= bus_set_address_system_remote(bus
, host
);
1330 bus
->bus_client
= true;
1331 bus
->trusted
= false;
1332 bus
->is_system
= true;
1334 r
= sd_bus_start(bus
);
1346 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1347 _cleanup_free_
char *e
= NULL
;
1352 e
= bus_address_escape(machine
);
1356 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1363 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1367 assert_return(machine
, -EINVAL
);
1368 assert_return(ret
, -EINVAL
);
1369 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1371 r
= sd_bus_new(&bus
);
1375 r
= bus_set_address_system_machine(bus
, machine
);
1379 bus
->bus_client
= true;
1380 bus
->trusted
= false;
1381 bus
->is_system
= true;
1383 r
= sd_bus_start(bus
);
1395 _public_
void sd_bus_close(sd_bus
*bus
) {
1399 if (bus
->state
== BUS_CLOSED
)
1401 if (bus_pid_changed(bus
))
1404 bus
->state
= BUS_CLOSED
;
1406 sd_bus_detach_event(bus
);
1408 /* Drop all queued messages so that they drop references to
1409 * the bus object and the bus may be freed */
1410 bus_reset_queues(bus
);
1412 if (!bus
->is_kernel
)
1415 /* We'll leave the fd open in case this is a kernel bus, since
1416 * there might still be memblocks around that reference this
1417 * bus, and they might need to invoke the KDBUS_CMD_FREE
1418 * ioctl on the fd when they are freed. */
1421 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1429 return sd_bus_unref(bus
);
1432 static void bus_enter_closing(sd_bus
*bus
) {
1435 if (bus
->state
!= BUS_OPENING
&&
1436 bus
->state
!= BUS_AUTHENTICATING
&&
1437 bus
->state
!= BUS_HELLO
&&
1438 bus
->state
!= BUS_RUNNING
)
1441 bus
->state
= BUS_CLOSING
;
1444 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1445 assert_return(bus
, NULL
);
1447 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1452 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1458 i
= REFCNT_DEC(bus
->n_ref
);
1466 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1468 assert_return(bus
, -EINVAL
);
1469 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1471 return BUS_IS_OPEN(bus
->state
);
1474 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1477 assert_return(bus
, -EINVAL
);
1478 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1479 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1481 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1484 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1485 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1488 r
= bus_ensure_running(bus
);
1492 return bus
->can_fds
;
1495 return bus_type_is_valid(type
);
1498 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1501 assert_return(bus
, -EINVAL
);
1502 assert_return(id
, -EINVAL
);
1503 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1505 r
= bus_ensure_running(bus
);
1509 *id
= bus
->server_id
;
1513 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1518 /* If we copy the same message to multiple
1519 * destinations, avoid using the same cookie
1521 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1526 timeout
= BUS_DEFAULT_TIMEOUT
;
1528 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1531 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1532 bool remarshal
= false;
1536 /* wrong packet version */
1537 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1540 /* wrong packet endianness */
1541 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1544 /* TODO: kdbus-messages received from the kernel contain data which is
1545 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1546 * force remarshaling of the message. Technically, we could just
1547 * recreate the kdbus message, but that is non-trivial as other parts of
1548 * the message refer to m->kdbus already. This should be fixed! */
1549 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1552 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1555 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1559 /* Fake some timestamps, if they were requested, and not
1560 * already initialized */
1561 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1562 if (m
->realtime
<= 0)
1563 m
->realtime
= now(CLOCK_REALTIME
);
1565 if (m
->monotonic
<= 0)
1566 m
->monotonic
= now(CLOCK_MONOTONIC
);
1569 /* The bus specification says the serial number cannot be 0,
1570 * hence let's fill something in for synthetic messages. Since
1571 * synthetic messages might have a fake sender and we don't
1572 * want to interfere with the real sender's serial numbers we
1573 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1574 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1575 * even though kdbus can do 64bit. */
1576 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1579 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1586 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1588 r
= bus_socket_write_message(bus
, m
, idx
);
1593 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1594 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1595 bus_message_type_to_string(m
->header
->type
),
1596 strna(sd_bus_message_get_sender(m
)),
1597 strna(sd_bus_message_get_destination(m
)),
1598 strna(sd_bus_message_get_path(m
)),
1599 strna(sd_bus_message_get_interface(m
)),
1600 strna(sd_bus_message_get_member(m
)),
1601 BUS_MESSAGE_COOKIE(m
),
1603 strna(m
->error
.message
));
1608 static int dispatch_wqueue(sd_bus
*bus
) {
1612 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1614 while (bus
->wqueue_size
> 0) {
1616 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1620 /* Didn't do anything this time */
1622 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1623 /* Fully written. Let's drop the entry from
1626 * This isn't particularly optimized, but
1627 * well, this is supposed to be our worst-case
1628 * buffer only, and the socket buffer is
1629 * supposed to be our primary buffer, and if
1630 * it got full, then all bets are off
1633 bus
->wqueue_size
--;
1634 sd_bus_message_unref(bus
->wqueue
[0]);
1635 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1645 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1649 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1651 return bus_socket_read_message(bus
);
1654 int bus_rqueue_make_room(sd_bus
*bus
) {
1657 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1660 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1666 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1671 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1673 /* Note that the priority logic is only available on kdbus,
1674 * where the rqueue is unused. We check the rqueue here
1675 * anyway, because it's simple... */
1678 if (bus
->rqueue_size
> 0) {
1679 /* Dispatch a queued message */
1681 *m
= bus
->rqueue
[0];
1682 bus
->rqueue_size
--;
1683 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1687 /* Try to read a new message */
1688 r
= bus_read_message(bus
, hint_priority
, priority
);
1698 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1699 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1702 assert_return(m
, -EINVAL
);
1707 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1708 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1710 if (!BUS_IS_OPEN(bus
->state
))
1714 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1721 /* If the cookie number isn't kept, then we know that no reply
1723 if (!cookie
&& !m
->sealed
)
1724 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1726 r
= bus_seal_message(bus
, m
, 0);
1730 /* Remarshall if we have to. This will possibly unref the
1731 * message and place a replacement in m */
1732 r
= bus_remarshal_message(bus
, &m
);
1736 /* If this is a reply and no reply was requested, then let's
1737 * suppress this, if we can */
1741 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1744 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1746 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1747 bus_enter_closing(bus
);
1754 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1755 /* Wasn't fully written. So let's remember how
1756 * much was written. Note that the first entry
1757 * of the wqueue array is always allocated so
1758 * that we always can remember how much was
1760 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1761 bus
->wqueue_size
= 1;
1766 /* Just append it to the queue. */
1768 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1771 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1774 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1779 *cookie
= BUS_MESSAGE_COOKIE(m
);
1784 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1785 return bus_send_internal(bus
, m
, cookie
, false);
1788 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1791 assert_return(m
, -EINVAL
);
1796 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1798 if (!BUS_IS_OPEN(bus
->state
))
1801 if (!streq_ptr(m
->destination
, destination
)) {
1806 r
= sd_bus_message_set_destination(m
, destination
);
1811 return sd_bus_send(bus
, m
, cookie
);
1814 static usec_t
calc_elapse(uint64_t usec
) {
1815 if (usec
== (uint64_t) -1)
1818 return now(CLOCK_MONOTONIC
) + usec
;
1821 static int timeout_compare(const void *a
, const void *b
) {
1822 const struct reply_callback
*x
= a
, *y
= b
;
1824 if (x
->timeout
!= 0 && y
->timeout
== 0)
1827 if (x
->timeout
== 0 && y
->timeout
!= 0)
1830 if (x
->timeout
< y
->timeout
)
1833 if (x
->timeout
> y
->timeout
)
1839 _public_
int sd_bus_call_async(
1843 sd_bus_message_handler_t callback
,
1847 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1848 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1851 assert_return(m
, -EINVAL
);
1852 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1853 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1854 assert_return(callback
, -EINVAL
);
1859 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1860 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1862 if (!BUS_IS_OPEN(bus
->state
))
1865 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1869 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1873 r
= bus_seal_message(bus
, m
, usec
);
1877 r
= bus_remarshal_message(bus
, &m
);
1881 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1885 s
->reply_callback
.callback
= callback
;
1887 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1888 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1890 s
->reply_callback
.cookie
= 0;
1894 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1895 if (s
->reply_callback
.timeout
!= 0) {
1896 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1898 s
->reply_callback
.timeout
= 0;
1903 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1914 int bus_ensure_running(sd_bus
*bus
) {
1919 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1921 if (bus
->state
== BUS_RUNNING
)
1925 r
= sd_bus_process(bus
, NULL
);
1928 if (bus
->state
== BUS_RUNNING
)
1933 r
= sd_bus_wait(bus
, (uint64_t) -1);
1939 _public_
int sd_bus_call(
1943 sd_bus_error
*error
,
1944 sd_bus_message
**reply
) {
1946 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1952 bus_assert_return(m
, -EINVAL
, error
);
1953 bus_assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
, error
);
1954 bus_assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
, error
);
1955 bus_assert_return(!bus_error_is_dirty(error
), -EINVAL
, error
);
1960 bus_assert_return(!bus_pid_changed(bus
), -ECHILD
, error
);
1961 bus_assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
, error
);
1963 if (!BUS_IS_OPEN(bus
->state
)) {
1968 r
= bus_ensure_running(bus
);
1972 i
= bus
->rqueue_size
;
1974 r
= bus_seal_message(bus
, m
, usec
);
1978 r
= bus_remarshal_message(bus
, &m
);
1982 r
= bus_send_internal(bus
, m
, &cookie
, true);
1986 timeout
= calc_elapse(m
->timeout
);
1991 while (i
< bus
->rqueue_size
) {
1992 sd_bus_message
*incoming
= NULL
;
1994 incoming
= bus
->rqueue
[i
];
1996 if (incoming
->reply_cookie
== cookie
) {
1997 /* Found a match! */
1999 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2001 log_debug_bus_message(incoming
);
2003 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2005 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2009 sd_bus_message_unref(incoming
);
2014 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2015 sd_bus_message_unref(incoming
);
2018 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
) {
2019 r
= sd_bus_error_copy(error
, &incoming
->error
);
2020 sd_bus_message_unref(incoming
);
2027 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2030 streq(bus
->unique_name
, incoming
->sender
)) {
2032 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2035 /* Our own message? Somebody is trying
2036 * to send its own client a message,
2037 * let's not dead-lock, let's fail
2040 sd_bus_message_unref(incoming
);
2045 /* Try to read more, right-away */
2049 r
= bus_read_message(bus
, false, 0);
2051 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2052 bus_enter_closing(bus
);
2064 n
= now(CLOCK_MONOTONIC
);
2072 left
= (uint64_t) -1;
2074 r
= bus_poll(bus
, true, left
);
2082 r
= dispatch_wqueue(bus
);
2084 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2085 bus_enter_closing(bus
);
2094 return sd_bus_error_set_errno(error
, r
);
2097 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2099 assert_return(bus
, -EINVAL
);
2100 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2101 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2103 return bus
->input_fd
;
2106 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2109 assert_return(bus
, -EINVAL
);
2110 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2112 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2115 if (bus
->state
== BUS_OPENING
)
2117 else if (bus
->state
== BUS_AUTHENTICATING
) {
2119 if (bus_socket_auth_needs_write(bus
))
2124 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2125 if (bus
->rqueue_size
<= 0)
2127 if (bus
->wqueue_size
> 0)
2134 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2135 struct reply_callback
*c
;
2137 assert_return(bus
, -EINVAL
);
2138 assert_return(timeout_usec
, -EINVAL
);
2139 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2141 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2144 if (bus
->track_queue
) {
2149 if (bus
->state
== BUS_CLOSING
) {
2154 if (bus
->state
== BUS_AUTHENTICATING
) {
2155 *timeout_usec
= bus
->auth_timeout
;
2159 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2160 *timeout_usec
= (uint64_t) -1;
2164 if (bus
->rqueue_size
> 0) {
2169 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2171 *timeout_usec
= (uint64_t) -1;
2175 if (c
->timeout
== 0) {
2176 *timeout_usec
= (uint64_t) -1;
2180 *timeout_usec
= c
->timeout
;
2184 static int process_timeout(sd_bus
*bus
) {
2185 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2186 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2187 struct reply_callback
*c
;
2194 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2198 n
= now(CLOCK_MONOTONIC
);
2202 r
= bus_message_new_synthetic_error(
2205 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2210 r
= bus_seal_synthetic_message(bus
, m
);
2214 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2217 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2220 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2222 bus
->iteration_counter
++;
2224 bus
->current_message
= m
;
2225 bus
->current_slot
= sd_bus_slot_ref(slot
);
2226 bus
->current_handler
= c
->callback
;
2227 bus
->current_userdata
= slot
->userdata
;
2228 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2229 bus
->current_userdata
= NULL
;
2230 bus
->current_handler
= NULL
;
2231 bus
->current_slot
= NULL
;
2232 bus
->current_message
= NULL
;
2234 if (slot
->floating
) {
2235 bus_slot_disconnect(slot
);
2236 sd_bus_slot_unref(slot
);
2239 sd_bus_slot_unref(slot
);
2241 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2244 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2248 if (bus
->state
!= BUS_HELLO
)
2251 /* Let's make sure the first message on the bus is the HELLO
2252 * reply. But note that we don't actually parse the message
2253 * here (we leave that to the usual handling), we just verify
2254 * we don't let any earlier msg through. */
2256 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2257 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2260 if (m
->reply_cookie
!= 1)
2266 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2267 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2268 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2269 struct reply_callback
*c
;
2276 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2277 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2280 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2283 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2286 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2292 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2294 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2296 /* If the reply contained a file descriptor which we
2297 * didn't want we pass an error instead. */
2299 r
= bus_message_new_synthetic_error(
2302 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2307 /* Copy over original timestamp */
2308 synthetic_reply
->realtime
= m
->realtime
;
2309 synthetic_reply
->monotonic
= m
->monotonic
;
2310 synthetic_reply
->seqnum
= m
->seqnum
;
2312 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2316 m
= synthetic_reply
;
2318 r
= sd_bus_message_rewind(m
, true);
2323 if (c
->timeout
!= 0) {
2324 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2328 bus
->current_slot
= sd_bus_slot_ref(slot
);
2329 bus
->current_handler
= c
->callback
;
2330 bus
->current_userdata
= slot
->userdata
;
2331 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2332 bus
->current_userdata
= NULL
;
2333 bus
->current_handler
= NULL
;
2334 bus
->current_slot
= NULL
;
2336 if (slot
->floating
) {
2337 bus_slot_disconnect(slot
);
2338 sd_bus_slot_unref(slot
);
2341 sd_bus_slot_unref(slot
);
2343 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2346 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2347 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2348 struct filter_callback
*l
;
2355 bus
->filter_callbacks_modified
= false;
2357 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2360 if (bus
->filter_callbacks_modified
)
2363 /* Don't run this more than once per iteration */
2364 if (l
->last_iteration
== bus
->iteration_counter
)
2367 l
->last_iteration
= bus
->iteration_counter
;
2369 r
= sd_bus_message_rewind(m
, true);
2373 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2375 bus
->current_slot
= sd_bus_slot_ref(slot
);
2376 bus
->current_handler
= l
->callback
;
2377 bus
->current_userdata
= slot
->userdata
;
2378 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2379 bus
->current_userdata
= NULL
;
2380 bus
->current_handler
= NULL
;
2381 bus
->current_slot
= sd_bus_slot_unref(slot
);
2383 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2389 } while (bus
->filter_callbacks_modified
);
2394 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2401 bus
->match_callbacks_modified
= false;
2403 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2407 } while (bus
->match_callbacks_modified
);
2412 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2413 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2419 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2422 if (bus
->manual_peer_interface
)
2425 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2428 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2431 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2434 if (streq_ptr(m
->member
, "Ping"))
2435 r
= sd_bus_message_new_method_return(m
, &reply
);
2436 else if (streq_ptr(m
->member
, "GetMachineId")) {
2440 r
= sd_id128_get_machine(&id
);
2444 r
= sd_bus_message_new_method_return(m
, &reply
);
2448 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2450 r
= sd_bus_message_new_method_errorf(
2452 SD_BUS_ERROR_UNKNOWN_METHOD
,
2453 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2459 r
= sd_bus_send(bus
, reply
, NULL
);
2466 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2470 /* If we got a message with a file descriptor which we didn't
2471 * want to accept, then let's drop it. How can this even
2472 * happen? For example, when the kernel queues a message into
2473 * an activatable names's queue which allows fds, and then is
2474 * delivered to us later even though we ourselves did not
2477 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2483 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2486 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2487 return 1; /* just eat it up */
2489 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2492 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2498 bus
->current_message
= m
;
2499 bus
->iteration_counter
++;
2501 log_debug_bus_message(m
);
2503 r
= process_hello(bus
, m
);
2507 r
= process_reply(bus
, m
);
2511 r
= process_fd_check(bus
, m
);
2515 r
= process_filter(bus
, m
);
2519 r
= process_match(bus
, m
);
2523 r
= process_builtin(bus
, m
);
2527 r
= bus_process_object(bus
, m
);
2530 bus
->current_message
= NULL
;
2534 static int dispatch_track(sd_bus
*bus
) {
2537 if (!bus
->track_queue
)
2540 bus_track_dispatch(bus
->track_queue
);
2544 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2545 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2549 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2551 r
= process_timeout(bus
);
2555 r
= dispatch_wqueue(bus
);
2559 r
= dispatch_track(bus
);
2563 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2569 r
= process_message(bus
, m
);
2574 r
= sd_bus_message_rewind(m
, true);
2583 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2585 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2586 strna(sd_bus_message_get_sender(m
)),
2587 strna(sd_bus_message_get_path(m
)),
2588 strna(sd_bus_message_get_interface(m
)),
2589 strna(sd_bus_message_get_member(m
)));
2591 r
= sd_bus_reply_method_errorf(
2593 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2594 "Unknown object '%s'.", m
->path
);
2608 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2609 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2610 struct reply_callback
*c
;
2614 assert(bus
->state
== BUS_CLOSING
);
2616 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2618 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2621 /* First, fail all outstanding method calls */
2622 r
= bus_message_new_synthetic_error(
2625 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2630 r
= bus_seal_synthetic_message(bus
, m
);
2634 if (c
->timeout
!= 0) {
2635 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2639 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2642 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2644 bus
->iteration_counter
++;
2646 bus
->current_message
= m
;
2647 bus
->current_slot
= sd_bus_slot_ref(slot
);
2648 bus
->current_handler
= c
->callback
;
2649 bus
->current_userdata
= slot
->userdata
;
2650 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2651 bus
->current_userdata
= NULL
;
2652 bus
->current_handler
= NULL
;
2653 bus
->current_slot
= NULL
;
2654 bus
->current_message
= NULL
;
2656 if (slot
->floating
) {
2657 bus_slot_disconnect(slot
);
2658 sd_bus_slot_unref(slot
);
2661 sd_bus_slot_unref(slot
);
2663 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2666 /* Then, synthesize a Disconnected message */
2667 r
= sd_bus_message_new_signal(
2670 "/org/freedesktop/DBus/Local",
2671 "org.freedesktop.DBus.Local",
2676 bus_message_set_sender_local(bus
, m
);
2678 r
= bus_seal_synthetic_message(bus
, m
);
2684 bus
->current_message
= m
;
2685 bus
->iteration_counter
++;
2687 r
= process_filter(bus
, m
);
2691 r
= process_match(bus
, m
);
2703 bus
->current_message
= NULL
;
2708 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2709 BUS_DONT_DESTROY(bus
);
2712 /* Returns 0 when we didn't do anything. This should cause the
2713 * caller to invoke sd_bus_wait() before returning the next
2714 * time. Returns > 0 when we did something, which possibly
2715 * means *ret is filled in with an unprocessed message. */
2717 assert_return(bus
, -EINVAL
);
2718 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2720 /* We don't allow recursively invoking sd_bus_process(). */
2721 assert_return(!bus
->current_message
, -EBUSY
);
2722 assert(!bus
->current_slot
);
2724 switch (bus
->state
) {
2733 r
= bus_socket_process_opening(bus
);
2734 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2735 bus_enter_closing(bus
);
2743 case BUS_AUTHENTICATING
:
2744 r
= bus_socket_process_authenticating(bus
);
2745 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2746 bus_enter_closing(bus
);
2758 r
= process_running(bus
, hint_priority
, priority
, ret
);
2759 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2760 bus_enter_closing(bus
);
2770 return process_closing(bus
, ret
);
2773 assert_not_reached("Unknown state");
2776 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2777 return bus_process_internal(bus
, false, 0, ret
);
2780 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2781 return bus_process_internal(bus
, true, priority
, ret
);
2784 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2785 struct pollfd p
[2] = {};
2788 usec_t m
= USEC_INFINITY
;
2792 if (bus
->state
== BUS_CLOSING
)
2795 if (!BUS_IS_OPEN(bus
->state
))
2798 e
= sd_bus_get_events(bus
);
2803 /* The caller really needs some more data, he doesn't
2804 * care about what's already read, or any timeouts
2805 * except its own. */
2809 /* The caller wants to process if there's something to
2810 * process, but doesn't care otherwise */
2812 r
= sd_bus_get_timeout(bus
, &until
);
2817 nw
= now(CLOCK_MONOTONIC
);
2818 m
= until
> nw
? until
- nw
: 0;
2822 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2825 p
[0].fd
= bus
->input_fd
;
2826 if (bus
->output_fd
== bus
->input_fd
) {
2830 p
[0].events
= e
& POLLIN
;
2831 p
[1].fd
= bus
->output_fd
;
2832 p
[1].events
= e
& POLLOUT
;
2836 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2840 return r
> 0 ? 1 : 0;
2843 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2845 assert_return(bus
, -EINVAL
);
2846 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2848 if (bus
->state
== BUS_CLOSING
)
2851 if (!BUS_IS_OPEN(bus
->state
))
2854 if (bus
->rqueue_size
> 0)
2857 return bus_poll(bus
, false, timeout_usec
);
2860 _public_
int sd_bus_flush(sd_bus
*bus
) {
2863 assert_return(bus
, -EINVAL
);
2864 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2866 if (bus
->state
== BUS_CLOSING
)
2869 if (!BUS_IS_OPEN(bus
->state
))
2872 r
= bus_ensure_running(bus
);
2876 if (bus
->wqueue_size
<= 0)
2880 r
= dispatch_wqueue(bus
);
2882 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2883 bus_enter_closing(bus
);
2890 if (bus
->wqueue_size
<= 0)
2893 r
= bus_poll(bus
, false, (uint64_t) -1);
2899 _public_
int sd_bus_add_filter(
2902 sd_bus_message_handler_t callback
,
2907 assert_return(bus
, -EINVAL
);
2908 assert_return(callback
, -EINVAL
);
2909 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2911 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2915 s
->filter_callback
.callback
= callback
;
2917 bus
->filter_callbacks_modified
= true;
2918 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2926 _public_
int sd_bus_add_match(
2930 sd_bus_message_handler_t callback
,
2933 struct bus_match_component
*components
= NULL
;
2934 unsigned n_components
= 0;
2935 sd_bus_slot
*s
= NULL
;
2938 assert_return(bus
, -EINVAL
);
2939 assert_return(match
, -EINVAL
);
2940 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2942 r
= bus_match_parse(match
, &components
, &n_components
);
2946 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2952 s
->match_callback
.callback
= callback
;
2953 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2955 if (bus
->bus_client
) {
2956 enum bus_match_scope scope
;
2958 scope
= bus_match_get_scope(components
, n_components
);
2960 /* Do not install server-side matches for matches
2961 * against the local service, interface or bus
2963 if (scope
!= BUS_MATCH_LOCAL
) {
2965 if (!bus
->is_kernel
) {
2966 /* When this is not a kernel transport, we
2967 * store the original match string, so that we
2968 * can use it to remove the match again */
2970 s
->match_callback
.match_string
= strdup(match
);
2971 if (!s
->match_callback
.match_string
) {
2977 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
2981 s
->match_added
= true;
2985 bus
->match_callbacks_modified
= true;
2986 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
2995 bus_match_parse_free(components
, n_components
);
2996 sd_bus_slot_unref(s
);
3001 int bus_remove_match_by_string(
3004 sd_bus_message_handler_t callback
,
3007 struct bus_match_component
*components
= NULL
;
3008 unsigned n_components
= 0;
3009 struct match_callback
*c
;
3012 assert_return(bus
, -EINVAL
);
3013 assert_return(match
, -EINVAL
);
3014 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3016 r
= bus_match_parse(match
, &components
, &n_components
);
3020 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3024 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3027 bus_match_parse_free(components
, n_components
);
3032 bool bus_pid_changed(sd_bus
*bus
) {
3035 /* We don't support people creating a bus connection and
3036 * keeping it around over a fork(). Let's complain. */
3038 return bus
->original_pid
!= getpid();
3041 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3042 sd_bus
*bus
= userdata
;
3047 r
= sd_bus_process(bus
, NULL
);
3054 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3055 sd_bus
*bus
= userdata
;
3060 r
= sd_bus_process(bus
, NULL
);
3067 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3068 sd_bus
*bus
= userdata
;
3075 e
= sd_bus_get_events(bus
);
3079 if (bus
->output_fd
!= bus
->input_fd
) {
3081 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3085 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3089 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3094 r
= sd_bus_get_timeout(bus
, &until
);
3100 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3105 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3112 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3113 sd_bus
*bus
= userdata
;
3123 static int attach_io_events(sd_bus
*bus
) {
3128 if (bus
->input_fd
< 0)
3134 if (!bus
->input_io_event_source
) {
3135 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3139 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3143 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3147 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3149 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3154 if (bus
->output_fd
!= bus
->input_fd
) {
3155 assert(bus
->output_fd
>= 0);
3157 if (!bus
->output_io_event_source
) {
3158 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3162 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3166 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3168 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3177 static void detach_io_events(sd_bus
*bus
) {
3180 if (bus
->input_io_event_source
) {
3181 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3182 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3185 if (bus
->output_io_event_source
) {
3186 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3187 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3191 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3194 assert_return(bus
, -EINVAL
);
3195 assert_return(!bus
->event
, -EBUSY
);
3197 assert(!bus
->input_io_event_source
);
3198 assert(!bus
->output_io_event_source
);
3199 assert(!bus
->time_event_source
);
3202 bus
->event
= sd_event_ref(event
);
3204 r
= sd_event_default(&bus
->event
);
3209 bus
->event_priority
= priority
;
3211 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3215 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3219 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3223 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3227 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3231 r
= attach_io_events(bus
);
3238 sd_bus_detach_event(bus
);
3242 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3243 assert_return(bus
, -EINVAL
);
3248 detach_io_events(bus
);
3250 if (bus
->time_event_source
) {
3251 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3252 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3255 if (bus
->quit_event_source
) {
3256 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3257 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3260 bus
->event
= sd_event_unref(bus
->event
);
3264 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3265 assert_return(bus
, NULL
);
3270 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3271 assert_return(bus
, NULL
);
3273 return bus
->current_message
;
3276 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3277 assert_return(bus
, NULL
);
3279 return bus
->current_slot
;
3282 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3283 assert_return(bus
, NULL
);
3285 return bus
->current_handler
;
3288 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3289 assert_return(bus
, NULL
);
3291 return bus
->current_userdata
;
3294 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3299 assert(default_bus
);
3302 return !!*default_bus
;
3305 *ret
= sd_bus_ref(*default_bus
);
3313 b
->default_bus_ptr
= default_bus
;
3321 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3322 static thread_local sd_bus
*default_system_bus
= NULL
;
3324 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3327 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3328 static thread_local sd_bus
*default_user_bus
= NULL
;
3330 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3333 _public_
int sd_bus_default(sd_bus
**ret
) {
3337 /* Let's try our best to reuse another cached connection. If
3338 * the starter bus type is set, connect via our normal
3339 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3340 * we can share the connection with the user/system default
3343 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3345 if (streq(e
, "system"))
3346 return sd_bus_default_system(ret
);
3347 else if (STR_IN_SET(e
, "user", "session"))
3348 return sd_bus_default_user(ret
);
3351 /* No type is specified, so we have not other option than to
3352 * use the starter address if it is set. */
3354 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3356 static thread_local sd_bus
*default_starter_bus
= NULL
;
3358 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3361 /* Finally, if nothing is set use the cached connection for
3362 * the right scope */
3364 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3365 return sd_bus_default_user(ret
);
3367 return sd_bus_default_system(ret
);
3370 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3371 assert_return(b
, -EINVAL
);
3372 assert_return(tid
, -EINVAL
);
3373 assert_return(!bus_pid_changed(b
), -ECHILD
);
3381 return sd_event_get_tid(b
->event
, tid
);
3386 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3387 _cleanup_free_
char *e
= NULL
;
3390 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3391 assert_return(external_id
, -EINVAL
);
3392 assert_return(ret_path
, -EINVAL
);
3394 e
= bus_label_escape(external_id
);
3398 ret
= strjoin(prefix
, "/", e
, NULL
);
3406 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3410 assert_return(object_path_is_valid(path
), -EINVAL
);
3411 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3412 assert_return(external_id
, -EINVAL
);
3414 e
= object_path_startswith(path
, prefix
);
3416 *external_id
= NULL
;
3420 ret
= bus_label_unescape(e
);
3428 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3431 assert_return(bus
, -EINVAL
);
3432 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3434 if (!bus
->is_kernel
)
3437 if (!BUS_IS_OPEN(bus
->state
))
3440 if (bus
->rqueue_size
> 0)
3443 if (bus
->wqueue_size
> 0)
3446 r
= bus_kernel_try_close(bus
);
3454 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3455 assert_return(bus
, -EINVAL
);
3456 assert_return(description
, -EINVAL
);
3457 assert_return(bus
->description
, -ENXIO
);
3458 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3460 *description
= bus
->description
;
3464 int bus_get_root_path(sd_bus
*bus
) {
3467 if (bus
->cgroup_root
)
3470 r
= cg_get_root_path(&bus
->cgroup_root
);
3472 bus
->cgroup_root
= strdup("/");
3473 if (!bus
->cgroup_root
)
3482 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3485 assert_return(bus
, -EINVAL
);
3486 assert_return(scope
, -EINVAL
);
3487 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3489 if (bus
->is_kernel
) {
3490 _cleanup_free_
char *n
= NULL
;
3493 r
= bus_kernel_get_bus_name(bus
, &n
);
3497 if (streq(n
, "0-system")) {
3502 dash
= strchr(n
, '-');
3503 if (streq_ptr(dash
, "-user")) {
3514 if (bus
->is_system
) {
3522 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3524 assert_return(bus
, -EINVAL
);
3525 assert_return(address
, -EINVAL
);
3526 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3529 *address
= bus
->address
;
3536 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3537 assert_return(bus
, -EINVAL
);
3538 assert_return(mask
, -EINVAL
);
3539 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3541 *mask
= bus
->creds_mask
;
3545 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3546 assert_return(bus
, -EINVAL
);
3547 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3549 return bus
->bus_client
;
3552 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3553 assert_return(bus
, -EINVAL
);
3554 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3556 return bus
->is_server
;
3559 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3560 assert_return(bus
, -EINVAL
);
3561 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3563 return bus
->anonymous_auth
;
3566 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3567 assert_return(bus
, -EINVAL
);
3568 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3570 return bus
->trusted
;
3573 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3574 assert_return(bus
, -EINVAL
);
3575 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3577 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);