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/>.
32 #include "bus-container.h"
33 #include "bus-control.h"
34 #include "bus-internal.h"
35 #include "bus-kernel.h"
36 #include "bus-label.h"
37 #include "bus-message.h"
38 #include "bus-objects.h"
39 #include "bus-protocol.h"
41 #include "bus-socket.h"
42 #include "bus-track.h"
45 #include "cgroup-util.h"
47 #include "hostname-util.h"
50 #include "string-util.h"
54 #define log_debug_bus_message(m) \
56 sd_bus_message *_mm = (m); \
57 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
58 bus_message_type_to_string(_mm->header->type), \
59 strna(sd_bus_message_get_sender(_mm)), \
60 strna(sd_bus_message_get_destination(_mm)), \
61 strna(sd_bus_message_get_path(_mm)), \
62 strna(sd_bus_message_get_interface(_mm)), \
63 strna(sd_bus_message_get_member(_mm)), \
64 BUS_MESSAGE_COOKIE(_mm), \
66 strna(_mm->error.message)); \
69 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
70 static int attach_io_events(sd_bus
*b
);
71 static void detach_io_events(sd_bus
*b
);
73 static thread_local sd_bus
*default_system_bus
= NULL
;
74 static thread_local sd_bus
*default_user_bus
= NULL
;
75 static thread_local sd_bus
*default_starter_bus
= NULL
;
77 static void bus_close_fds(sd_bus
*b
) {
82 if (b
->input_fd
!= b
->output_fd
)
83 safe_close(b
->output_fd
);
84 b
->output_fd
= b
->input_fd
= safe_close(b
->input_fd
);
87 static void bus_reset_queues(sd_bus
*b
) {
90 while (b
->rqueue_size
> 0)
91 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
93 b
->rqueue
= mfree(b
->rqueue
);
94 b
->rqueue_allocated
= 0;
96 while (b
->wqueue_size
> 0)
97 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
99 b
->wqueue
= mfree(b
->wqueue
);
100 b
->wqueue_allocated
= 0;
103 static void bus_free(sd_bus
*b
) {
107 assert(!b
->track_queue
);
109 b
->state
= BUS_CLOSED
;
111 sd_bus_detach_event(b
);
113 while ((s
= b
->slots
)) {
114 /* At this point only floating slots can still be
115 * around, because the non-floating ones keep a
116 * reference to the bus, and we thus couldn't be
117 * destructing right now... We forcibly disconnect the
118 * slots here, so that they still can be referenced by
119 * apps, but are dead. */
122 bus_slot_disconnect(s
);
123 sd_bus_slot_unref(s
);
126 if (b
->default_bus_ptr
)
127 *b
->default_bus_ptr
= NULL
;
132 munmap(b
->kdbus_buffer
, KDBUS_POOL_SIZE
);
136 free(b
->unique_name
);
137 free(b
->auth_buffer
);
142 free(b
->cgroup_root
);
143 free(b
->description
);
146 strv_free(b
->exec_argv
);
148 close_many(b
->fds
, b
->n_fds
);
153 ordered_hashmap_free_free(b
->reply_callbacks
);
154 prioq_free(b
->reply_callbacks_prioq
);
156 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
157 bus_match_free(&b
->match_callbacks
);
159 hashmap_free_free(b
->vtable_methods
);
160 hashmap_free_free(b
->vtable_properties
);
162 assert(hashmap_isempty(b
->nodes
));
163 hashmap_free(b
->nodes
);
165 bus_kernel_flush_memfd(b
);
167 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
172 _public_
int sd_bus_new(sd_bus
**ret
) {
175 assert_return(ret
, -EINVAL
);
181 r
->n_ref
= REFCNT_INIT
;
182 r
->input_fd
= r
->output_fd
= -1;
183 r
->message_version
= 1;
184 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
185 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
186 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
187 r
->original_pid
= getpid();
189 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
191 /* We guarantee that wqueue always has space for at least one
193 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
202 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
205 assert_return(bus
, -EINVAL
);
206 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
207 assert_return(address
, -EINVAL
);
208 assert_return(!bus_pid_changed(bus
), -ECHILD
);
220 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
221 assert_return(bus
, -EINVAL
);
222 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
223 assert_return(input_fd
>= 0, -EBADF
);
224 assert_return(output_fd
>= 0, -EBADF
);
225 assert_return(!bus_pid_changed(bus
), -ECHILD
);
227 bus
->input_fd
= input_fd
;
228 bus
->output_fd
= output_fd
;
232 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
235 assert_return(bus
, -EINVAL
);
236 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
237 assert_return(path
, -EINVAL
);
238 assert_return(!strv_isempty(argv
), -EINVAL
);
239 assert_return(!bus_pid_changed(bus
), -ECHILD
);
251 free(bus
->exec_path
);
252 strv_free(bus
->exec_argv
);
260 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
261 assert_return(bus
, -EINVAL
);
262 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
263 assert_return(!bus_pid_changed(bus
), -ECHILD
);
265 bus
->bus_client
= !!b
;
269 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
270 assert_return(bus
, -EINVAL
);
271 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
272 assert_return(!bus_pid_changed(bus
), -ECHILD
);
274 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_MONITOR
, b
);
278 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
279 assert_return(bus
, -EINVAL
);
280 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
281 assert_return(!bus_pid_changed(bus
), -ECHILD
);
283 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
287 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
289 assert_return(bus
, -EINVAL
);
290 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
291 assert_return(!bus_pid_changed(bus
), -ECHILD
);
293 new_flags
= bus
->attach_flags
;
294 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
296 if (bus
->attach_flags
== new_flags
)
299 bus
->attach_flags
= new_flags
;
300 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
301 bus_kernel_realize_attach_flags(bus
);
306 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
309 assert_return(bus
, -EINVAL
);
310 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
311 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
312 assert_return(!bus_pid_changed(bus
), -ECHILD
);
315 bus
->creds_mask
|= mask
;
317 bus
->creds_mask
&= ~mask
;
319 /* The well knowns we need unconditionally, so that matches can work */
320 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
322 /* Make sure we don't lose the timestamp flag */
323 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
324 if (bus
->attach_flags
== new_flags
)
327 bus
->attach_flags
= new_flags
;
328 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
329 bus_kernel_realize_attach_flags(bus
);
334 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
335 assert_return(bus
, -EINVAL
);
336 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
337 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
338 assert_return(!bus_pid_changed(bus
), -ECHILD
);
340 bus
->is_server
= !!b
;
341 bus
->server_id
= server_id
;
345 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
346 assert_return(bus
, -EINVAL
);
347 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
348 assert_return(!bus_pid_changed(bus
), -ECHILD
);
350 bus
->anonymous_auth
= !!b
;
354 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
355 assert_return(bus
, -EINVAL
);
356 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
357 assert_return(!bus_pid_changed(bus
), -ECHILD
);
363 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
364 assert_return(bus
, -EINVAL
);
365 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
366 assert_return(!bus_pid_changed(bus
), -ECHILD
);
368 return free_and_strdup(&bus
->description
, description
);
371 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
372 assert_return(bus
, -EINVAL
);
373 assert_return(!bus_pid_changed(bus
), -ECHILD
);
375 bus
->allow_interactive_authorization
= !!b
;
379 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
380 assert_return(bus
, -EINVAL
);
381 assert_return(!bus_pid_changed(bus
), -ECHILD
);
383 return bus
->allow_interactive_authorization
;
386 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
394 assert(bus
->state
== BUS_HELLO
|| bus
->state
== BUS_CLOSING
);
396 r
= sd_bus_message_get_errno(reply
);
400 r
= sd_bus_message_read(reply
, "s", &s
);
404 if (!service_name_is_valid(s
) || s
[0] != ':')
407 bus
->unique_name
= strdup(s
);
408 if (!bus
->unique_name
)
411 if (bus
->state
== BUS_HELLO
)
412 bus
->state
= BUS_RUNNING
;
417 static int bus_send_hello(sd_bus
*bus
) {
418 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
423 if (!bus
->bus_client
|| bus
->is_kernel
)
426 r
= sd_bus_message_new_method_call(
429 "org.freedesktop.DBus",
430 "/org/freedesktop/DBus",
431 "org.freedesktop.DBus",
436 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
439 int bus_start_running(sd_bus
*bus
) {
442 if (bus
->bus_client
&& !bus
->is_kernel
) {
443 bus
->state
= BUS_HELLO
;
447 bus
->state
= BUS_RUNNING
;
451 static int parse_address_key(const char **p
, const char *key
, char **value
) {
452 size_t l
, n
= 0, allocated
= 0;
462 if (strncmp(*p
, key
, l
) != 0)
475 while (*a
!= ';' && *a
!= ',' && *a
!= 0) {
493 c
= (char) ((x
<< 4) | y
);
500 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
524 static void skip_address_key(const char **p
) {
528 *p
+= strcspn(*p
, ",");
534 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
535 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
544 while (**p
!= 0 && **p
!= ';') {
545 r
= parse_address_key(p
, "guid", guid
);
551 r
= parse_address_key(p
, "path", &path
);
557 r
= parse_address_key(p
, "abstract", &abstract
);
566 if (!path
&& !abstract
)
569 if (path
&& abstract
)
574 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
577 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
578 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
579 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
580 } else if (abstract
) {
581 l
= strlen(abstract
);
582 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
585 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
586 b
->sockaddr
.un
.sun_path
[0] = 0;
587 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
588 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
594 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
595 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
597 struct addrinfo
*result
, hints
= {
598 .ai_socktype
= SOCK_STREAM
,
599 .ai_flags
= AI_ADDRCONFIG
,
607 while (**p
!= 0 && **p
!= ';') {
608 r
= parse_address_key(p
, "guid", guid
);
614 r
= parse_address_key(p
, "host", &host
);
620 r
= parse_address_key(p
, "port", &port
);
626 r
= parse_address_key(p
, "family", &family
);
639 if (streq(family
, "ipv4"))
640 hints
.ai_family
= AF_INET
;
641 else if (streq(family
, "ipv6"))
642 hints
.ai_family
= AF_INET6
;
647 r
= getaddrinfo(host
, port
, &hints
, &result
);
651 return -EADDRNOTAVAIL
;
653 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
654 b
->sockaddr_size
= result
->ai_addrlen
;
656 freeaddrinfo(result
);
661 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
663 unsigned n_argv
= 0, j
;
665 size_t allocated
= 0;
673 while (**p
!= 0 && **p
!= ';') {
674 r
= parse_address_key(p
, "guid", guid
);
680 r
= parse_address_key(p
, "path", &path
);
686 if (startswith(*p
, "argv")) {
690 ul
= strtoul(*p
+ 4, (char**) p
, 10);
691 if (errno
> 0 || **p
!= '=' || ul
> 256) {
699 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
707 r
= parse_address_key(p
, NULL
, argv
+ ul
);
722 /* Make sure there are no holes in the array, with the
723 * exception of argv[0] */
724 for (j
= 1; j
< n_argv
; j
++)
730 if (argv
&& argv
[0] == NULL
) {
731 argv
[0] = strdup(path
);
743 for (j
= 0; j
< n_argv
; j
++)
751 static int parse_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
752 _cleanup_free_
char *path
= NULL
;
760 while (**p
!= 0 && **p
!= ';') {
761 r
= parse_address_key(p
, "guid", guid
);
767 r
= parse_address_key(p
, "path", &path
);
786 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
787 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
795 while (**p
!= 0 && **p
!= ';') {
796 r
= parse_address_key(p
, "guid", guid
);
802 r
= parse_address_key(p
, "machine", &machine
);
808 r
= parse_address_key(p
, "pid", &pid
);
817 if (!machine
== !pid
)
821 if (!machine_name_is_valid(machine
))
825 b
->machine
= machine
;
828 b
->machine
= mfree(b
->machine
);
832 r
= parse_pid(pid
, &b
->nspid
);
838 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
839 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
840 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + strlen("/var/run/dbus/system_bus_socket");
845 static int parse_container_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
846 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
854 while (**p
!= 0 && **p
!= ';') {
855 r
= parse_address_key(p
, "guid", guid
);
861 r
= parse_address_key(p
, "machine", &machine
);
867 r
= parse_address_key(p
, "pid", &pid
);
876 if (!machine
== !pid
)
880 if (!machine_name_is_valid(machine
))
884 b
->machine
= machine
;
887 b
->machine
= mfree(b
->machine
);
891 r
= parse_pid(pid
, &b
->nspid
);
897 r
= free_and_strdup(&b
->kernel
, "/sys/fs/kdbus/0-system/bus");
904 static void bus_reset_parsed_address(sd_bus
*b
) {
908 b
->sockaddr_size
= 0;
909 b
->exec_argv
= strv_free(b
->exec_argv
);
910 b
->exec_path
= mfree(b
->exec_path
);
911 b
->server_id
= SD_ID128_NULL
;
912 b
->kernel
= mfree(b
->kernel
);
913 b
->machine
= mfree(b
->machine
);
917 static int bus_parse_next_address(sd_bus
*b
) {
918 _cleanup_free_
char *guid
= NULL
;
926 if (b
->address
[b
->address_index
] == 0)
929 bus_reset_parsed_address(b
);
931 a
= b
->address
+ b
->address_index
;
940 if (startswith(a
, "unix:")) {
943 r
= parse_unix_address(b
, &a
, &guid
);
948 } else if (startswith(a
, "tcp:")) {
951 r
= parse_tcp_address(b
, &a
, &guid
);
957 } else if (startswith(a
, "unixexec:")) {
960 r
= parse_exec_address(b
, &a
, &guid
);
966 } else if (startswith(a
, "kernel:")) {
969 r
= parse_kernel_address(b
, &a
, &guid
);
974 } else if (startswith(a
, "x-machine-unix:")) {
977 r
= parse_container_unix_address(b
, &a
, &guid
);
982 } else if (startswith(a
, "x-machine-kernel:")) {
985 r
= parse_container_kernel_address(b
, &a
, &guid
);
998 r
= sd_id128_from_string(guid
, &b
->server_id
);
1003 b
->address_index
= a
- b
->address
;
1007 static int bus_start_address(sd_bus
*b
) {
1008 bool container_kdbus_available
= false;
1009 bool kdbus_available
= false;
1015 bool skipped
= false;
1020 * Usually, if you provide multiple different bus-addresses, we
1021 * try all of them in order. We use the first one that
1022 * succeeds. However, if you mix kernel and unix addresses, we
1023 * never try unix-addresses if a previous kernel address was
1024 * tried and kdbus was available. This is required to prevent
1025 * clients to fallback to the bus-proxy if kdbus is available
1026 * but failed (eg., too many connections).
1030 r
= bus_socket_exec(b
);
1031 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
) {
1032 r
= bus_container_connect_kernel(b
);
1033 if (r
< 0 && !IN_SET(r
, -ENOENT
, -ESOCKTNOSUPPORT
))
1034 container_kdbus_available
= true;
1036 } else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
) {
1037 if (!container_kdbus_available
)
1038 r
= bus_container_connect_socket(b
);
1042 } else if (b
->kernel
) {
1043 r
= bus_kernel_connect(b
);
1044 if (r
< 0 && !IN_SET(r
, -ENOENT
, -ESOCKTNOSUPPORT
))
1045 kdbus_available
= true;
1047 } else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
) {
1048 if (!kdbus_available
)
1049 r
= bus_socket_connect(b
);
1057 r
= attach_io_events(b
);
1062 b
->last_connect_error
= -r
;
1065 r
= bus_parse_next_address(b
);
1069 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1073 int bus_next_address(sd_bus
*b
) {
1076 bus_reset_parsed_address(b
);
1077 return bus_start_address(b
);
1080 static int bus_start_fd(sd_bus
*b
) {
1085 assert(b
->input_fd
>= 0);
1086 assert(b
->output_fd
>= 0);
1088 r
= fd_nonblock(b
->input_fd
, true);
1092 r
= fd_cloexec(b
->input_fd
, true);
1096 if (b
->input_fd
!= b
->output_fd
) {
1097 r
= fd_nonblock(b
->output_fd
, true);
1101 r
= fd_cloexec(b
->output_fd
, true);
1106 if (fstat(b
->input_fd
, &st
) < 0)
1109 if (S_ISCHR(b
->input_fd
))
1110 return bus_kernel_take_fd(b
);
1112 return bus_socket_take_fd(b
);
1115 _public_
int sd_bus_start(sd_bus
*bus
) {
1118 assert_return(bus
, -EINVAL
);
1119 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1120 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1122 bus
->state
= BUS_OPENING
;
1124 if (bus
->is_server
&& bus
->bus_client
)
1127 if (bus
->input_fd
>= 0)
1128 r
= bus_start_fd(bus
);
1129 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1130 r
= bus_start_address(bus
);
1139 return bus_send_hello(bus
);
1142 _public_
int sd_bus_open(sd_bus
**ret
) {
1147 assert_return(ret
, -EINVAL
);
1149 /* Let's connect to the starter bus if it is set, and
1150 * otherwise to the bus that is appropropriate for the scope
1151 * we are running in */
1153 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1155 if (streq(e
, "system"))
1156 return sd_bus_open_system(ret
);
1157 else if (STR_IN_SET(e
, "session", "user"))
1158 return sd_bus_open_user(ret
);
1161 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1163 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1164 return sd_bus_open_user(ret
);
1166 return sd_bus_open_system(ret
);
1173 r
= sd_bus_set_address(b
, e
);
1177 b
->bus_client
= true;
1179 /* We don't know whether the bus is trusted or not, so better
1180 * be safe, and authenticate everything */
1182 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1183 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1185 r
= sd_bus_start(b
);
1197 int bus_set_address_system(sd_bus
*b
) {
1201 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1203 return sd_bus_set_address(b
, e
);
1205 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1208 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1212 assert_return(ret
, -EINVAL
);
1218 r
= bus_set_address_system(b
);
1222 b
->bus_client
= true;
1223 b
->is_system
= true;
1225 /* Let's do per-method access control on the system bus. We
1226 * need the caller's UID and capability set for that. */
1228 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1229 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1231 r
= sd_bus_start(b
);
1243 int bus_set_address_user(sd_bus
*b
) {
1250 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1252 return sd_bus_set_address(b
, e
);
1254 r
= cg_pid_get_owner_uid(0, &uid
);
1258 e
= secure_getenv("XDG_RUNTIME_DIR");
1260 _cleanup_free_
char *ee
= NULL
;
1262 ee
= bus_address_escape(e
);
1266 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, uid
, ee
);
1268 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, uid
);
1276 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1280 assert_return(ret
, -EINVAL
);
1286 r
= bus_set_address_user(b
);
1290 b
->bus_client
= true;
1293 /* We don't do any per-method access control on the user
1297 r
= sd_bus_start(b
);
1309 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1310 _cleanup_free_
char *e
= NULL
;
1311 char *m
= NULL
, *c
= NULL
;
1316 /* Let's see if we shall enter some container */
1317 m
= strchr(host
, ':');
1321 /* Let's make sure this is not a port of some kind,
1322 * and is a valid machine name. */
1323 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1326 /* Cut out the host part */
1327 t
= strndupa(host
, m
- host
- 1);
1328 e
= bus_address_escape(t
);
1332 c
= strjoina(",argv4=--machine=", m
);
1337 e
= bus_address_escape(host
);
1342 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1349 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1353 assert_return(host
, -EINVAL
);
1354 assert_return(ret
, -EINVAL
);
1356 r
= sd_bus_new(&bus
);
1360 r
= bus_set_address_system_remote(bus
, host
);
1364 bus
->bus_client
= true;
1365 bus
->trusted
= false;
1366 bus
->is_system
= true;
1368 r
= sd_bus_start(bus
);
1380 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1381 _cleanup_free_
char *e
= NULL
;
1386 e
= bus_address_escape(machine
);
1390 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1397 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1401 assert_return(machine
, -EINVAL
);
1402 assert_return(ret
, -EINVAL
);
1403 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1405 r
= sd_bus_new(&bus
);
1409 r
= bus_set_address_system_machine(bus
, machine
);
1413 bus
->bus_client
= true;
1414 bus
->trusted
= false;
1415 bus
->is_system
= true;
1417 r
= sd_bus_start(bus
);
1429 _public_
void sd_bus_close(sd_bus
*bus
) {
1433 if (bus
->state
== BUS_CLOSED
)
1435 if (bus_pid_changed(bus
))
1438 bus
->state
= BUS_CLOSED
;
1440 sd_bus_detach_event(bus
);
1442 /* Drop all queued messages so that they drop references to
1443 * the bus object and the bus may be freed */
1444 bus_reset_queues(bus
);
1446 if (!bus
->is_kernel
)
1449 /* We'll leave the fd open in case this is a kernel bus, since
1450 * there might still be memblocks around that reference this
1451 * bus, and they might need to invoke the KDBUS_CMD_FREE
1452 * ioctl on the fd when they are freed. */
1455 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1463 return sd_bus_unref(bus
);
1466 static void bus_enter_closing(sd_bus
*bus
) {
1469 if (bus
->state
!= BUS_OPENING
&&
1470 bus
->state
!= BUS_AUTHENTICATING
&&
1471 bus
->state
!= BUS_HELLO
&&
1472 bus
->state
!= BUS_RUNNING
)
1475 bus
->state
= BUS_CLOSING
;
1478 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1479 assert_return(bus
, NULL
);
1481 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1486 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1492 i
= REFCNT_DEC(bus
->n_ref
);
1500 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1502 assert_return(bus
, -EINVAL
);
1503 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1505 return BUS_IS_OPEN(bus
->state
);
1508 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1511 assert_return(bus
, -EINVAL
);
1512 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1513 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1515 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1518 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1519 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1522 r
= bus_ensure_running(bus
);
1526 return bus
->can_fds
;
1529 return bus_type_is_valid(type
);
1532 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1535 assert_return(bus
, -EINVAL
);
1536 assert_return(id
, -EINVAL
);
1537 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1539 r
= bus_ensure_running(bus
);
1543 *id
= bus
->server_id
;
1547 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1552 /* If we copy the same message to multiple
1553 * destinations, avoid using the same cookie
1555 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1560 timeout
= BUS_DEFAULT_TIMEOUT
;
1562 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1565 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1566 bool remarshal
= false;
1570 /* wrong packet version */
1571 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1574 /* wrong packet endianness */
1575 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1578 /* TODO: kdbus-messages received from the kernel contain data which is
1579 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1580 * force remarshaling of the message. Technically, we could just
1581 * recreate the kdbus message, but that is non-trivial as other parts of
1582 * the message refer to m->kdbus already. This should be fixed! */
1583 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1586 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1589 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1593 /* Fake some timestamps, if they were requested, and not
1594 * already initialized */
1595 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1596 if (m
->realtime
<= 0)
1597 m
->realtime
= now(CLOCK_REALTIME
);
1599 if (m
->monotonic
<= 0)
1600 m
->monotonic
= now(CLOCK_MONOTONIC
);
1603 /* The bus specification says the serial number cannot be 0,
1604 * hence let's fill something in for synthetic messages. Since
1605 * synthetic messages might have a fake sender and we don't
1606 * want to interfere with the real sender's serial numbers we
1607 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1608 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1609 * even though kdbus can do 64bit. */
1610 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1613 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1620 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1622 r
= bus_socket_write_message(bus
, m
, idx
);
1627 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1628 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1629 bus_message_type_to_string(m
->header
->type
),
1630 strna(sd_bus_message_get_sender(m
)),
1631 strna(sd_bus_message_get_destination(m
)),
1632 strna(sd_bus_message_get_path(m
)),
1633 strna(sd_bus_message_get_interface(m
)),
1634 strna(sd_bus_message_get_member(m
)),
1635 BUS_MESSAGE_COOKIE(m
),
1637 strna(m
->error
.message
));
1642 static int dispatch_wqueue(sd_bus
*bus
) {
1646 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1648 while (bus
->wqueue_size
> 0) {
1650 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1654 /* Didn't do anything this time */
1656 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1657 /* Fully written. Let's drop the entry from
1660 * This isn't particularly optimized, but
1661 * well, this is supposed to be our worst-case
1662 * buffer only, and the socket buffer is
1663 * supposed to be our primary buffer, and if
1664 * it got full, then all bets are off
1667 bus
->wqueue_size
--;
1668 sd_bus_message_unref(bus
->wqueue
[0]);
1669 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1679 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1683 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1685 return bus_socket_read_message(bus
);
1688 int bus_rqueue_make_room(sd_bus
*bus
) {
1691 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1694 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1700 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1705 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1707 /* Note that the priority logic is only available on kdbus,
1708 * where the rqueue is unused. We check the rqueue here
1709 * anyway, because it's simple... */
1712 if (bus
->rqueue_size
> 0) {
1713 /* Dispatch a queued message */
1715 *m
= bus
->rqueue
[0];
1716 bus
->rqueue_size
--;
1717 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1721 /* Try to read a new message */
1722 r
= bus_read_message(bus
, hint_priority
, priority
);
1732 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1733 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1736 assert_return(m
, -EINVAL
);
1741 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1742 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1744 if (!BUS_IS_OPEN(bus
->state
))
1748 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1755 /* If the cookie number isn't kept, then we know that no reply
1757 if (!cookie
&& !m
->sealed
)
1758 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1760 r
= bus_seal_message(bus
, m
, 0);
1764 /* Remarshall if we have to. This will possibly unref the
1765 * message and place a replacement in m */
1766 r
= bus_remarshal_message(bus
, &m
);
1770 /* If this is a reply and no reply was requested, then let's
1771 * suppress this, if we can */
1775 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1778 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1780 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1781 bus_enter_closing(bus
);
1788 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1789 /* Wasn't fully written. So let's remember how
1790 * much was written. Note that the first entry
1791 * of the wqueue array is always allocated so
1792 * that we always can remember how much was
1794 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1795 bus
->wqueue_size
= 1;
1800 /* Just append it to the queue. */
1802 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1805 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1808 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1813 *cookie
= BUS_MESSAGE_COOKIE(m
);
1818 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1819 return bus_send_internal(bus
, m
, cookie
, false);
1822 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1825 assert_return(m
, -EINVAL
);
1830 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1832 if (!BUS_IS_OPEN(bus
->state
))
1835 if (!streq_ptr(m
->destination
, destination
)) {
1840 r
= sd_bus_message_set_destination(m
, destination
);
1845 return sd_bus_send(bus
, m
, cookie
);
1848 static usec_t
calc_elapse(uint64_t usec
) {
1849 if (usec
== (uint64_t) -1)
1852 return now(CLOCK_MONOTONIC
) + usec
;
1855 static int timeout_compare(const void *a
, const void *b
) {
1856 const struct reply_callback
*x
= a
, *y
= b
;
1858 if (x
->timeout
!= 0 && y
->timeout
== 0)
1861 if (x
->timeout
== 0 && y
->timeout
!= 0)
1864 if (x
->timeout
< y
->timeout
)
1867 if (x
->timeout
> y
->timeout
)
1873 _public_
int sd_bus_call_async(
1877 sd_bus_message_handler_t callback
,
1881 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1882 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1885 assert_return(m
, -EINVAL
);
1886 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1887 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1888 assert_return(callback
, -EINVAL
);
1893 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1894 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1896 if (!BUS_IS_OPEN(bus
->state
))
1899 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1903 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1907 r
= bus_seal_message(bus
, m
, usec
);
1911 r
= bus_remarshal_message(bus
, &m
);
1915 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1919 s
->reply_callback
.callback
= callback
;
1921 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1922 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1924 s
->reply_callback
.cookie
= 0;
1928 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1929 if (s
->reply_callback
.timeout
!= 0) {
1930 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1932 s
->reply_callback
.timeout
= 0;
1937 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1948 int bus_ensure_running(sd_bus
*bus
) {
1953 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1955 if (bus
->state
== BUS_RUNNING
)
1959 r
= sd_bus_process(bus
, NULL
);
1962 if (bus
->state
== BUS_RUNNING
)
1967 r
= sd_bus_wait(bus
, (uint64_t) -1);
1973 _public_
int sd_bus_call(
1977 sd_bus_error
*error
,
1978 sd_bus_message
**reply
) {
1980 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1986 bus_assert_return(m
, -EINVAL
, error
);
1987 bus_assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
, error
);
1988 bus_assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
, error
);
1989 bus_assert_return(!bus_error_is_dirty(error
), -EINVAL
, error
);
1994 bus_assert_return(!bus_pid_changed(bus
), -ECHILD
, error
);
1995 bus_assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
, error
);
1997 if (!BUS_IS_OPEN(bus
->state
)) {
2002 r
= bus_ensure_running(bus
);
2006 i
= bus
->rqueue_size
;
2008 r
= bus_seal_message(bus
, m
, usec
);
2012 r
= bus_remarshal_message(bus
, &m
);
2016 r
= bus_send_internal(bus
, m
, &cookie
, true);
2020 timeout
= calc_elapse(m
->timeout
);
2025 while (i
< bus
->rqueue_size
) {
2026 sd_bus_message
*incoming
= NULL
;
2028 incoming
= bus
->rqueue
[i
];
2030 if (incoming
->reply_cookie
== cookie
) {
2031 /* Found a match! */
2033 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2035 log_debug_bus_message(incoming
);
2037 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2039 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2043 sd_bus_message_unref(incoming
);
2048 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2049 sd_bus_message_unref(incoming
);
2052 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
) {
2053 r
= sd_bus_error_copy(error
, &incoming
->error
);
2054 sd_bus_message_unref(incoming
);
2061 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2064 streq(bus
->unique_name
, incoming
->sender
)) {
2066 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2069 /* Our own message? Somebody is trying
2070 * to send its own client a message,
2071 * let's not dead-lock, let's fail
2074 sd_bus_message_unref(incoming
);
2079 /* Try to read more, right-away */
2083 r
= bus_read_message(bus
, false, 0);
2085 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2086 bus_enter_closing(bus
);
2098 n
= now(CLOCK_MONOTONIC
);
2106 left
= (uint64_t) -1;
2108 r
= bus_poll(bus
, true, left
);
2116 r
= dispatch_wqueue(bus
);
2118 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2119 bus_enter_closing(bus
);
2128 return sd_bus_error_set_errno(error
, r
);
2131 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2133 assert_return(bus
, -EINVAL
);
2134 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2135 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2137 return bus
->input_fd
;
2140 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2143 assert_return(bus
, -EINVAL
);
2144 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2146 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2149 if (bus
->state
== BUS_OPENING
)
2151 else if (bus
->state
== BUS_AUTHENTICATING
) {
2153 if (bus_socket_auth_needs_write(bus
))
2158 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2159 if (bus
->rqueue_size
<= 0)
2161 if (bus
->wqueue_size
> 0)
2168 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2169 struct reply_callback
*c
;
2171 assert_return(bus
, -EINVAL
);
2172 assert_return(timeout_usec
, -EINVAL
);
2173 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2175 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2178 if (bus
->track_queue
) {
2183 if (bus
->state
== BUS_CLOSING
) {
2188 if (bus
->state
== BUS_AUTHENTICATING
) {
2189 *timeout_usec
= bus
->auth_timeout
;
2193 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2194 *timeout_usec
= (uint64_t) -1;
2198 if (bus
->rqueue_size
> 0) {
2203 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2205 *timeout_usec
= (uint64_t) -1;
2209 if (c
->timeout
== 0) {
2210 *timeout_usec
= (uint64_t) -1;
2214 *timeout_usec
= c
->timeout
;
2218 static int process_timeout(sd_bus
*bus
) {
2219 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2220 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2221 struct reply_callback
*c
;
2228 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2232 n
= now(CLOCK_MONOTONIC
);
2236 r
= bus_message_new_synthetic_error(
2239 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2244 r
= bus_seal_synthetic_message(bus
, m
);
2248 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2251 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2254 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2256 bus
->iteration_counter
++;
2258 bus
->current_message
= m
;
2259 bus
->current_slot
= sd_bus_slot_ref(slot
);
2260 bus
->current_handler
= c
->callback
;
2261 bus
->current_userdata
= slot
->userdata
;
2262 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2263 bus
->current_userdata
= NULL
;
2264 bus
->current_handler
= NULL
;
2265 bus
->current_slot
= NULL
;
2266 bus
->current_message
= NULL
;
2268 if (slot
->floating
) {
2269 bus_slot_disconnect(slot
);
2270 sd_bus_slot_unref(slot
);
2273 sd_bus_slot_unref(slot
);
2275 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2278 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2282 if (bus
->state
!= BUS_HELLO
)
2285 /* Let's make sure the first message on the bus is the HELLO
2286 * reply. But note that we don't actually parse the message
2287 * here (we leave that to the usual handling), we just verify
2288 * we don't let any earlier msg through. */
2290 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2291 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2294 if (m
->reply_cookie
!= 1)
2300 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2301 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2302 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2303 struct reply_callback
*c
;
2310 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2311 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2314 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2317 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2320 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2326 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2328 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2330 /* If the reply contained a file descriptor which we
2331 * didn't want we pass an error instead. */
2333 r
= bus_message_new_synthetic_error(
2336 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2341 /* Copy over original timestamp */
2342 synthetic_reply
->realtime
= m
->realtime
;
2343 synthetic_reply
->monotonic
= m
->monotonic
;
2344 synthetic_reply
->seqnum
= m
->seqnum
;
2346 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2350 m
= synthetic_reply
;
2352 r
= sd_bus_message_rewind(m
, true);
2357 if (c
->timeout
!= 0) {
2358 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2362 bus
->current_slot
= sd_bus_slot_ref(slot
);
2363 bus
->current_handler
= c
->callback
;
2364 bus
->current_userdata
= slot
->userdata
;
2365 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2366 bus
->current_userdata
= NULL
;
2367 bus
->current_handler
= NULL
;
2368 bus
->current_slot
= NULL
;
2370 if (slot
->floating
) {
2371 bus_slot_disconnect(slot
);
2372 sd_bus_slot_unref(slot
);
2375 sd_bus_slot_unref(slot
);
2377 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2380 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2381 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2382 struct filter_callback
*l
;
2389 bus
->filter_callbacks_modified
= false;
2391 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2394 if (bus
->filter_callbacks_modified
)
2397 /* Don't run this more than once per iteration */
2398 if (l
->last_iteration
== bus
->iteration_counter
)
2401 l
->last_iteration
= bus
->iteration_counter
;
2403 r
= sd_bus_message_rewind(m
, true);
2407 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2409 bus
->current_slot
= sd_bus_slot_ref(slot
);
2410 bus
->current_handler
= l
->callback
;
2411 bus
->current_userdata
= slot
->userdata
;
2412 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2413 bus
->current_userdata
= NULL
;
2414 bus
->current_handler
= NULL
;
2415 bus
->current_slot
= sd_bus_slot_unref(slot
);
2417 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2423 } while (bus
->filter_callbacks_modified
);
2428 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2435 bus
->match_callbacks_modified
= false;
2437 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2441 } while (bus
->match_callbacks_modified
);
2446 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2447 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2453 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2456 if (bus
->manual_peer_interface
)
2459 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2462 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2465 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2468 if (streq_ptr(m
->member
, "Ping"))
2469 r
= sd_bus_message_new_method_return(m
, &reply
);
2470 else if (streq_ptr(m
->member
, "GetMachineId")) {
2474 r
= sd_id128_get_machine(&id
);
2478 r
= sd_bus_message_new_method_return(m
, &reply
);
2482 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2484 r
= sd_bus_message_new_method_errorf(
2486 SD_BUS_ERROR_UNKNOWN_METHOD
,
2487 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2493 r
= sd_bus_send(bus
, reply
, NULL
);
2500 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2504 /* If we got a message with a file descriptor which we didn't
2505 * want to accept, then let's drop it. How can this even
2506 * happen? For example, when the kernel queues a message into
2507 * an activatable names's queue which allows fds, and then is
2508 * delivered to us later even though we ourselves did not
2511 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2517 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2520 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2521 return 1; /* just eat it up */
2523 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2526 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2532 bus
->current_message
= m
;
2533 bus
->iteration_counter
++;
2535 log_debug_bus_message(m
);
2537 r
= process_hello(bus
, m
);
2541 r
= process_reply(bus
, m
);
2545 r
= process_fd_check(bus
, m
);
2549 r
= process_filter(bus
, m
);
2553 r
= process_match(bus
, m
);
2557 r
= process_builtin(bus
, m
);
2561 r
= bus_process_object(bus
, m
);
2564 bus
->current_message
= NULL
;
2568 static int dispatch_track(sd_bus
*bus
) {
2571 if (!bus
->track_queue
)
2574 bus_track_dispatch(bus
->track_queue
);
2578 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2579 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2583 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2585 r
= process_timeout(bus
);
2589 r
= dispatch_wqueue(bus
);
2593 r
= dispatch_track(bus
);
2597 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2603 r
= process_message(bus
, m
);
2608 r
= sd_bus_message_rewind(m
, true);
2617 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2619 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2620 strna(sd_bus_message_get_sender(m
)),
2621 strna(sd_bus_message_get_path(m
)),
2622 strna(sd_bus_message_get_interface(m
)),
2623 strna(sd_bus_message_get_member(m
)));
2625 r
= sd_bus_reply_method_errorf(
2627 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2628 "Unknown object '%s'.", m
->path
);
2642 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2643 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2644 struct reply_callback
*c
;
2648 assert(bus
->state
== BUS_CLOSING
);
2650 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2652 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2655 /* First, fail all outstanding method calls */
2656 r
= bus_message_new_synthetic_error(
2659 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2664 r
= bus_seal_synthetic_message(bus
, m
);
2668 if (c
->timeout
!= 0) {
2669 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2673 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2676 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2678 bus
->iteration_counter
++;
2680 bus
->current_message
= m
;
2681 bus
->current_slot
= sd_bus_slot_ref(slot
);
2682 bus
->current_handler
= c
->callback
;
2683 bus
->current_userdata
= slot
->userdata
;
2684 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2685 bus
->current_userdata
= NULL
;
2686 bus
->current_handler
= NULL
;
2687 bus
->current_slot
= NULL
;
2688 bus
->current_message
= NULL
;
2690 if (slot
->floating
) {
2691 bus_slot_disconnect(slot
);
2692 sd_bus_slot_unref(slot
);
2695 sd_bus_slot_unref(slot
);
2697 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2700 /* Then, synthesize a Disconnected message */
2701 r
= sd_bus_message_new_signal(
2704 "/org/freedesktop/DBus/Local",
2705 "org.freedesktop.DBus.Local",
2710 bus_message_set_sender_local(bus
, m
);
2712 r
= bus_seal_synthetic_message(bus
, m
);
2718 bus
->current_message
= m
;
2719 bus
->iteration_counter
++;
2721 r
= process_filter(bus
, m
);
2725 r
= process_match(bus
, m
);
2737 bus
->current_message
= NULL
;
2742 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2743 BUS_DONT_DESTROY(bus
);
2746 /* Returns 0 when we didn't do anything. This should cause the
2747 * caller to invoke sd_bus_wait() before returning the next
2748 * time. Returns > 0 when we did something, which possibly
2749 * means *ret is filled in with an unprocessed message. */
2751 assert_return(bus
, -EINVAL
);
2752 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2754 /* We don't allow recursively invoking sd_bus_process(). */
2755 assert_return(!bus
->current_message
, -EBUSY
);
2756 assert(!bus
->current_slot
);
2758 switch (bus
->state
) {
2767 r
= bus_socket_process_opening(bus
);
2768 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2769 bus_enter_closing(bus
);
2777 case BUS_AUTHENTICATING
:
2778 r
= bus_socket_process_authenticating(bus
);
2779 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2780 bus_enter_closing(bus
);
2792 r
= process_running(bus
, hint_priority
, priority
, ret
);
2793 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2794 bus_enter_closing(bus
);
2804 return process_closing(bus
, ret
);
2807 assert_not_reached("Unknown state");
2810 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2811 return bus_process_internal(bus
, false, 0, ret
);
2814 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2815 return bus_process_internal(bus
, true, priority
, ret
);
2818 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2819 struct pollfd p
[2] = {};
2822 usec_t m
= USEC_INFINITY
;
2826 if (bus
->state
== BUS_CLOSING
)
2829 if (!BUS_IS_OPEN(bus
->state
))
2832 e
= sd_bus_get_events(bus
);
2837 /* The caller really needs some more data, he doesn't
2838 * care about what's already read, or any timeouts
2839 * except its own. */
2843 /* The caller wants to process if there's something to
2844 * process, but doesn't care otherwise */
2846 r
= sd_bus_get_timeout(bus
, &until
);
2851 nw
= now(CLOCK_MONOTONIC
);
2852 m
= until
> nw
? until
- nw
: 0;
2856 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2859 p
[0].fd
= bus
->input_fd
;
2860 if (bus
->output_fd
== bus
->input_fd
) {
2864 p
[0].events
= e
& POLLIN
;
2865 p
[1].fd
= bus
->output_fd
;
2866 p
[1].events
= e
& POLLOUT
;
2870 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2874 return r
> 0 ? 1 : 0;
2877 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2879 assert_return(bus
, -EINVAL
);
2880 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2882 if (bus
->state
== BUS_CLOSING
)
2885 if (!BUS_IS_OPEN(bus
->state
))
2888 if (bus
->rqueue_size
> 0)
2891 return bus_poll(bus
, false, timeout_usec
);
2894 _public_
int sd_bus_flush(sd_bus
*bus
) {
2897 assert_return(bus
, -EINVAL
);
2898 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2900 if (bus
->state
== BUS_CLOSING
)
2903 if (!BUS_IS_OPEN(bus
->state
))
2906 r
= bus_ensure_running(bus
);
2910 if (bus
->wqueue_size
<= 0)
2914 r
= dispatch_wqueue(bus
);
2916 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2917 bus_enter_closing(bus
);
2924 if (bus
->wqueue_size
<= 0)
2927 r
= bus_poll(bus
, false, (uint64_t) -1);
2933 _public_
int sd_bus_add_filter(
2936 sd_bus_message_handler_t callback
,
2941 assert_return(bus
, -EINVAL
);
2942 assert_return(callback
, -EINVAL
);
2943 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2945 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2949 s
->filter_callback
.callback
= callback
;
2951 bus
->filter_callbacks_modified
= true;
2952 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2960 _public_
int sd_bus_add_match(
2964 sd_bus_message_handler_t callback
,
2967 struct bus_match_component
*components
= NULL
;
2968 unsigned n_components
= 0;
2969 sd_bus_slot
*s
= NULL
;
2972 assert_return(bus
, -EINVAL
);
2973 assert_return(match
, -EINVAL
);
2974 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2976 r
= bus_match_parse(match
, &components
, &n_components
);
2980 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2986 s
->match_callback
.callback
= callback
;
2987 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2989 if (bus
->bus_client
) {
2990 enum bus_match_scope scope
;
2992 scope
= bus_match_get_scope(components
, n_components
);
2994 /* Do not install server-side matches for matches
2995 * against the local service, interface or bus
2997 if (scope
!= BUS_MATCH_LOCAL
) {
2999 if (!bus
->is_kernel
) {
3000 /* When this is not a kernel transport, we
3001 * store the original match string, so that we
3002 * can use it to remove the match again */
3004 s
->match_callback
.match_string
= strdup(match
);
3005 if (!s
->match_callback
.match_string
) {
3011 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
3015 s
->match_added
= true;
3019 bus
->match_callbacks_modified
= true;
3020 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
3029 bus_match_parse_free(components
, n_components
);
3030 sd_bus_slot_unref(s
);
3035 int bus_remove_match_by_string(
3038 sd_bus_message_handler_t callback
,
3041 struct bus_match_component
*components
= NULL
;
3042 unsigned n_components
= 0;
3043 struct match_callback
*c
;
3046 assert_return(bus
, -EINVAL
);
3047 assert_return(match
, -EINVAL
);
3048 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3050 r
= bus_match_parse(match
, &components
, &n_components
);
3054 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3058 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3061 bus_match_parse_free(components
, n_components
);
3066 bool bus_pid_changed(sd_bus
*bus
) {
3069 /* We don't support people creating a bus connection and
3070 * keeping it around over a fork(). Let's complain. */
3072 return bus
->original_pid
!= getpid();
3075 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3076 sd_bus
*bus
= userdata
;
3081 r
= sd_bus_process(bus
, NULL
);
3088 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3089 sd_bus
*bus
= userdata
;
3094 r
= sd_bus_process(bus
, NULL
);
3101 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3102 sd_bus
*bus
= userdata
;
3109 e
= sd_bus_get_events(bus
);
3113 if (bus
->output_fd
!= bus
->input_fd
) {
3115 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3119 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3123 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3128 r
= sd_bus_get_timeout(bus
, &until
);
3134 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3139 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3146 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3147 sd_bus
*bus
= userdata
;
3157 static int attach_io_events(sd_bus
*bus
) {
3162 if (bus
->input_fd
< 0)
3168 if (!bus
->input_io_event_source
) {
3169 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3173 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3177 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3181 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3183 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3188 if (bus
->output_fd
!= bus
->input_fd
) {
3189 assert(bus
->output_fd
>= 0);
3191 if (!bus
->output_io_event_source
) {
3192 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3196 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3200 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3202 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3211 static void detach_io_events(sd_bus
*bus
) {
3214 if (bus
->input_io_event_source
) {
3215 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3216 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3219 if (bus
->output_io_event_source
) {
3220 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3221 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3225 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3228 assert_return(bus
, -EINVAL
);
3229 assert_return(!bus
->event
, -EBUSY
);
3231 assert(!bus
->input_io_event_source
);
3232 assert(!bus
->output_io_event_source
);
3233 assert(!bus
->time_event_source
);
3236 bus
->event
= sd_event_ref(event
);
3238 r
= sd_event_default(&bus
->event
);
3243 bus
->event_priority
= priority
;
3245 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3249 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3253 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3257 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3261 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3265 r
= attach_io_events(bus
);
3272 sd_bus_detach_event(bus
);
3276 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3277 assert_return(bus
, -EINVAL
);
3282 detach_io_events(bus
);
3284 if (bus
->time_event_source
) {
3285 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3286 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3289 if (bus
->quit_event_source
) {
3290 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3291 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3294 bus
->event
= sd_event_unref(bus
->event
);
3298 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3299 assert_return(bus
, NULL
);
3304 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3305 assert_return(bus
, NULL
);
3307 return bus
->current_message
;
3310 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3311 assert_return(bus
, NULL
);
3313 return bus
->current_slot
;
3316 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3317 assert_return(bus
, NULL
);
3319 return bus
->current_handler
;
3322 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3323 assert_return(bus
, NULL
);
3325 return bus
->current_userdata
;
3328 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3333 assert(default_bus
);
3336 return !!*default_bus
;
3339 *ret
= sd_bus_ref(*default_bus
);
3347 b
->default_bus_ptr
= default_bus
;
3355 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3356 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3360 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3361 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3364 _public_
int sd_bus_default(sd_bus
**ret
) {
3368 /* Let's try our best to reuse another cached connection. If
3369 * the starter bus type is set, connect via our normal
3370 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3371 * we can share the connection with the user/system default
3374 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3376 if (streq(e
, "system"))
3377 return sd_bus_default_system(ret
);
3378 else if (STR_IN_SET(e
, "user", "session"))
3379 return sd_bus_default_user(ret
);
3382 /* No type is specified, so we have not other option than to
3383 * use the starter address if it is set. */
3385 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3388 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3391 /* Finally, if nothing is set use the cached connection for
3392 * the right scope */
3394 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3395 return sd_bus_default_user(ret
);
3397 return sd_bus_default_system(ret
);
3400 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3401 assert_return(b
, -EINVAL
);
3402 assert_return(tid
, -EINVAL
);
3403 assert_return(!bus_pid_changed(b
), -ECHILD
);
3411 return sd_event_get_tid(b
->event
, tid
);
3416 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3417 _cleanup_free_
char *e
= NULL
;
3420 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3421 assert_return(external_id
, -EINVAL
);
3422 assert_return(ret_path
, -EINVAL
);
3424 e
= bus_label_escape(external_id
);
3428 ret
= strjoin(prefix
, "/", e
, NULL
);
3436 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3440 assert_return(object_path_is_valid(path
), -EINVAL
);
3441 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3442 assert_return(external_id
, -EINVAL
);
3444 e
= object_path_startswith(path
, prefix
);
3446 *external_id
= NULL
;
3450 ret
= bus_label_unescape(e
);
3458 _public_
int sd_bus_path_encode_many(char **out
, const char *path_template
, ...) {
3459 _cleanup_strv_free_
char **labels
= NULL
;
3460 char *path
, *path_pos
, **label_pos
;
3461 const char *sep
, *template_pos
;
3466 assert_return(out
, -EINVAL
);
3467 assert_return(path_template
, -EINVAL
);
3469 path_length
= strlen(path_template
);
3471 va_start(list
, path_template
);
3472 for (sep
= strchr(path_template
, '%'); sep
; sep
= strchr(sep
+ 1, '%')) {
3476 arg
= va_arg(list
, const char *);
3482 label
= bus_label_escape(arg
);
3488 r
= strv_consume(&labels
, label
);
3494 /* add label length, but account for the format character */
3495 path_length
+= strlen(label
) - 1;
3499 path
= malloc(path_length
+ 1);
3506 for (template_pos
= path_template
; *template_pos
; ) {
3507 sep
= strchrnul(template_pos
, '%');
3508 path_pos
= mempcpy(path_pos
, template_pos
, sep
- template_pos
);
3512 path_pos
= stpcpy(path_pos
, *label_pos
++);
3513 template_pos
= sep
+ 1;
3521 _public_
int sd_bus_path_decode_many(const char *path
, const char *path_template
, ...) {
3522 _cleanup_strv_free_
char **labels
= NULL
;
3523 const char *template_pos
, *path_pos
;
3529 * This decodes an object-path based on a template argument. The
3530 * template consists of a verbatim path, optionally including special
3533 * - Each occurrence of '%' in the template matches an arbitrary
3534 * substring of a label in the given path. At most one such
3535 * directive is allowed per label. For each such directive, the
3536 * caller must provide an output parameter (char **) via va_arg. If
3537 * NULL is passed, the given label is verified, but not returned.
3538 * For each matched label, the *decoded* label is stored in the
3539 * passed output argument, and the caller is responsible to free
3540 * it. Note that the output arguments are only modified if the
3541 * actualy path matched the template. Otherwise, they're left
3544 * This function returns <0 on error, 0 if the path does not match the
3545 * template, 1 if it matched.
3548 assert_return(path
, -EINVAL
);
3549 assert_return(path_template
, -EINVAL
);
3553 for (template_pos
= path_template
; *template_pos
; ) {
3558 /* verify everything until the next '%' matches verbatim */
3559 sep
= strchrnul(template_pos
, '%');
3560 length
= sep
- template_pos
;
3561 if (strncmp(path_pos
, template_pos
, length
))
3565 template_pos
+= length
;
3570 /* We found the next '%' character. Everything up until here
3571 * matched. We now skip ahead to the end of this label and make
3572 * sure it matches the tail of the label in the path. Then we
3573 * decode the string in-between and save it for later use. */
3575 ++template_pos
; /* skip over '%' */
3577 sep
= strchrnul(template_pos
, '/');
3578 length
= sep
- template_pos
; /* length of suffix to match verbatim */
3580 /* verify the suffixes match */
3581 sep
= strchrnul(path_pos
, '/');
3582 if (sep
- path_pos
< (ssize_t
)length
||
3583 strncmp(sep
- length
, template_pos
, length
))
3586 template_pos
+= length
; /* skip over matched label */
3587 length
= sep
- path_pos
- length
; /* length of sub-label to decode */
3589 /* store unescaped label for later use */
3590 label
= bus_label_unescape_n(path_pos
, length
);
3594 r
= strv_consume(&labels
, label
);
3598 path_pos
= sep
; /* skip decoded label and suffix */
3601 /* end of template must match end of path */
3605 /* copy the labels over to the caller */
3606 va_start(list
, path_template
);
3607 for (label_pos
= labels
; label_pos
&& *label_pos
; ++label_pos
) {
3610 arg
= va_arg(list
, char **);
3623 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3626 assert_return(bus
, -EINVAL
);
3627 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3629 if (!bus
->is_kernel
)
3632 if (!BUS_IS_OPEN(bus
->state
))
3635 if (bus
->rqueue_size
> 0)
3638 if (bus
->wqueue_size
> 0)
3641 r
= bus_kernel_try_close(bus
);
3649 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3650 assert_return(bus
, -EINVAL
);
3651 assert_return(description
, -EINVAL
);
3652 assert_return(bus
->description
, -ENXIO
);
3653 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3655 *description
= bus
->description
;
3659 int bus_get_root_path(sd_bus
*bus
) {
3662 if (bus
->cgroup_root
)
3665 r
= cg_get_root_path(&bus
->cgroup_root
);
3667 bus
->cgroup_root
= strdup("/");
3668 if (!bus
->cgroup_root
)
3677 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3680 assert_return(bus
, -EINVAL
);
3681 assert_return(scope
, -EINVAL
);
3682 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3684 if (bus
->is_kernel
) {
3685 _cleanup_free_
char *n
= NULL
;
3688 r
= bus_kernel_get_bus_name(bus
, &n
);
3692 if (streq(n
, "0-system")) {
3697 dash
= strchr(n
, '-');
3698 if (streq_ptr(dash
, "-user")) {
3709 if (bus
->is_system
) {
3717 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3719 assert_return(bus
, -EINVAL
);
3720 assert_return(address
, -EINVAL
);
3721 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3724 *address
= bus
->address
;
3731 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3732 assert_return(bus
, -EINVAL
);
3733 assert_return(mask
, -EINVAL
);
3734 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3736 *mask
= bus
->creds_mask
;
3740 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3741 assert_return(bus
, -EINVAL
);
3742 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3744 return bus
->bus_client
;
3747 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3748 assert_return(bus
, -EINVAL
);
3749 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3751 return bus
->is_server
;
3754 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3755 assert_return(bus
, -EINVAL
);
3756 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3758 return bus
->anonymous_auth
;
3761 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3762 assert_return(bus
, -EINVAL
);
3763 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3765 return bus
->trusted
;
3768 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3769 assert_return(bus
, -EINVAL
);
3770 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3772 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);
3775 static void flush_close(sd_bus
*bus
) {
3779 /* Flushes and closes the specified bus. We take a ref before,
3780 * to ensure the flushing does not cause the bus to be
3783 sd_bus_flush_close_unref(sd_bus_ref(bus
));
3786 _public_
void sd_bus_default_flush_close(void) {
3787 flush_close(default_starter_bus
);
3788 flush_close(default_user_bus
);
3789 flush_close(default_system_bus
);