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 "alloc-util.h"
33 #include "bus-container.h"
34 #include "bus-control.h"
35 #include "bus-internal.h"
36 #include "bus-kernel.h"
37 #include "bus-label.h"
38 #include "bus-message.h"
39 #include "bus-objects.h"
40 #include "bus-protocol.h"
42 #include "bus-socket.h"
43 #include "bus-track.h"
46 #include "cgroup-util.h"
49 #include "hexdecoct.h"
50 #include "hostname-util.h"
53 #include "parse-util.h"
54 #include "string-util.h"
58 #define log_debug_bus_message(m) \
60 sd_bus_message *_mm = (m); \
61 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
62 bus_message_type_to_string(_mm->header->type), \
63 strna(sd_bus_message_get_sender(_mm)), \
64 strna(sd_bus_message_get_destination(_mm)), \
65 strna(sd_bus_message_get_path(_mm)), \
66 strna(sd_bus_message_get_interface(_mm)), \
67 strna(sd_bus_message_get_member(_mm)), \
68 BUS_MESSAGE_COOKIE(_mm), \
70 strna(_mm->error.message)); \
73 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
74 static int attach_io_events(sd_bus
*b
);
75 static void detach_io_events(sd_bus
*b
);
77 static thread_local sd_bus
*default_system_bus
= NULL
;
78 static thread_local sd_bus
*default_user_bus
= NULL
;
79 static thread_local sd_bus
*default_starter_bus
= NULL
;
81 static void bus_close_fds(sd_bus
*b
) {
86 if (b
->input_fd
!= b
->output_fd
)
87 safe_close(b
->output_fd
);
88 b
->output_fd
= b
->input_fd
= safe_close(b
->input_fd
);
91 static void bus_reset_queues(sd_bus
*b
) {
94 while (b
->rqueue_size
> 0)
95 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
97 b
->rqueue
= mfree(b
->rqueue
);
98 b
->rqueue_allocated
= 0;
100 while (b
->wqueue_size
> 0)
101 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
103 b
->wqueue
= mfree(b
->wqueue
);
104 b
->wqueue_allocated
= 0;
107 static void bus_free(sd_bus
*b
) {
111 assert(!b
->track_queue
);
113 b
->state
= BUS_CLOSED
;
115 sd_bus_detach_event(b
);
117 while ((s
= b
->slots
)) {
118 /* At this point only floating slots can still be
119 * around, because the non-floating ones keep a
120 * reference to the bus, and we thus couldn't be
121 * destructing right now... We forcibly disconnect the
122 * slots here, so that they still can be referenced by
123 * apps, but are dead. */
126 bus_slot_disconnect(s
);
127 sd_bus_slot_unref(s
);
130 if (b
->default_bus_ptr
)
131 *b
->default_bus_ptr
= NULL
;
136 munmap(b
->kdbus_buffer
, KDBUS_POOL_SIZE
);
140 free(b
->unique_name
);
141 free(b
->auth_buffer
);
146 free(b
->cgroup_root
);
147 free(b
->description
);
150 strv_free(b
->exec_argv
);
152 close_many(b
->fds
, b
->n_fds
);
157 ordered_hashmap_free_free(b
->reply_callbacks
);
158 prioq_free(b
->reply_callbacks_prioq
);
160 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
161 bus_match_free(&b
->match_callbacks
);
163 hashmap_free_free(b
->vtable_methods
);
164 hashmap_free_free(b
->vtable_properties
);
166 assert(hashmap_isempty(b
->nodes
));
167 hashmap_free(b
->nodes
);
169 bus_kernel_flush_memfd(b
);
171 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
176 _public_
int sd_bus_new(sd_bus
**ret
) {
179 assert_return(ret
, -EINVAL
);
185 r
->n_ref
= REFCNT_INIT
;
186 r
->input_fd
= r
->output_fd
= -1;
187 r
->message_version
= 1;
188 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
189 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
190 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
191 r
->original_pid
= getpid();
193 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
195 /* We guarantee that wqueue always has space for at least one
197 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
206 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
209 assert_return(bus
, -EINVAL
);
210 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
211 assert_return(address
, -EINVAL
);
212 assert_return(!bus_pid_changed(bus
), -ECHILD
);
224 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
225 assert_return(bus
, -EINVAL
);
226 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
227 assert_return(input_fd
>= 0, -EBADF
);
228 assert_return(output_fd
>= 0, -EBADF
);
229 assert_return(!bus_pid_changed(bus
), -ECHILD
);
231 bus
->input_fd
= input_fd
;
232 bus
->output_fd
= output_fd
;
236 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
239 assert_return(bus
, -EINVAL
);
240 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
241 assert_return(path
, -EINVAL
);
242 assert_return(!strv_isempty(argv
), -EINVAL
);
243 assert_return(!bus_pid_changed(bus
), -ECHILD
);
255 free(bus
->exec_path
);
256 strv_free(bus
->exec_argv
);
264 _public_
int sd_bus_set_bus_client(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 bus
->bus_client
= !!b
;
273 _public_
int sd_bus_set_monitor(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_MONITOR
, b
);
282 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
283 assert_return(bus
, -EINVAL
);
284 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
285 assert_return(!bus_pid_changed(bus
), -ECHILD
);
287 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
291 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
293 assert_return(bus
, -EINVAL
);
294 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
295 assert_return(!bus_pid_changed(bus
), -ECHILD
);
297 new_flags
= bus
->attach_flags
;
298 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
300 if (bus
->attach_flags
== new_flags
)
303 bus
->attach_flags
= new_flags
;
304 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
305 bus_kernel_realize_attach_flags(bus
);
310 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
313 assert_return(bus
, -EINVAL
);
314 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
315 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
316 assert_return(!bus_pid_changed(bus
), -ECHILD
);
319 bus
->creds_mask
|= mask
;
321 bus
->creds_mask
&= ~mask
;
323 /* The well knowns we need unconditionally, so that matches can work */
324 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
326 /* Make sure we don't lose the timestamp flag */
327 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
328 if (bus
->attach_flags
== new_flags
)
331 bus
->attach_flags
= new_flags
;
332 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
333 bus_kernel_realize_attach_flags(bus
);
338 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
339 assert_return(bus
, -EINVAL
);
340 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
341 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
342 assert_return(!bus_pid_changed(bus
), -ECHILD
);
344 bus
->is_server
= !!b
;
345 bus
->server_id
= server_id
;
349 _public_
int sd_bus_set_anonymous(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
);
354 bus
->anonymous_auth
= !!b
;
358 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
359 assert_return(bus
, -EINVAL
);
360 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
361 assert_return(!bus_pid_changed(bus
), -ECHILD
);
367 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
368 assert_return(bus
, -EINVAL
);
369 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
370 assert_return(!bus_pid_changed(bus
), -ECHILD
);
372 return free_and_strdup(&bus
->description
, description
);
375 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
376 assert_return(bus
, -EINVAL
);
377 assert_return(!bus_pid_changed(bus
), -ECHILD
);
379 bus
->allow_interactive_authorization
= !!b
;
383 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
384 assert_return(bus
, -EINVAL
);
385 assert_return(!bus_pid_changed(bus
), -ECHILD
);
387 return bus
->allow_interactive_authorization
;
390 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
398 assert(bus
->state
== BUS_HELLO
|| bus
->state
== BUS_CLOSING
);
400 r
= sd_bus_message_get_errno(reply
);
404 r
= sd_bus_message_read(reply
, "s", &s
);
408 if (!service_name_is_valid(s
) || s
[0] != ':')
411 bus
->unique_name
= strdup(s
);
412 if (!bus
->unique_name
)
415 if (bus
->state
== BUS_HELLO
)
416 bus
->state
= BUS_RUNNING
;
421 static int bus_send_hello(sd_bus
*bus
) {
422 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
427 if (!bus
->bus_client
|| bus
->is_kernel
)
430 r
= sd_bus_message_new_method_call(
433 "org.freedesktop.DBus",
434 "/org/freedesktop/DBus",
435 "org.freedesktop.DBus",
440 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
443 int bus_start_running(sd_bus
*bus
) {
446 if (bus
->bus_client
&& !bus
->is_kernel
) {
447 bus
->state
= BUS_HELLO
;
451 bus
->state
= BUS_RUNNING
;
455 static int parse_address_key(const char **p
, const char *key
, char **value
) {
456 size_t l
, n
= 0, allocated
= 0;
466 if (strncmp(*p
, key
, l
) != 0)
479 while (*a
!= ';' && *a
!= ',' && *a
!= 0) {
497 c
= (char) ((x
<< 4) | y
);
504 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
528 static void skip_address_key(const char **p
) {
532 *p
+= strcspn(*p
, ",");
538 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
539 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
548 while (**p
!= 0 && **p
!= ';') {
549 r
= parse_address_key(p
, "guid", guid
);
555 r
= parse_address_key(p
, "path", &path
);
561 r
= parse_address_key(p
, "abstract", &abstract
);
570 if (!path
&& !abstract
)
573 if (path
&& abstract
)
578 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
581 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
582 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
583 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
584 } else if (abstract
) {
585 l
= strlen(abstract
);
586 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
589 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
590 b
->sockaddr
.un
.sun_path
[0] = 0;
591 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
592 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
598 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
599 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
601 struct addrinfo
*result
, hints
= {
602 .ai_socktype
= SOCK_STREAM
,
603 .ai_flags
= AI_ADDRCONFIG
,
611 while (**p
!= 0 && **p
!= ';') {
612 r
= parse_address_key(p
, "guid", guid
);
618 r
= parse_address_key(p
, "host", &host
);
624 r
= parse_address_key(p
, "port", &port
);
630 r
= parse_address_key(p
, "family", &family
);
643 if (streq(family
, "ipv4"))
644 hints
.ai_family
= AF_INET
;
645 else if (streq(family
, "ipv6"))
646 hints
.ai_family
= AF_INET6
;
651 r
= getaddrinfo(host
, port
, &hints
, &result
);
655 return -EADDRNOTAVAIL
;
657 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
658 b
->sockaddr_size
= result
->ai_addrlen
;
660 freeaddrinfo(result
);
665 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
667 unsigned n_argv
= 0, j
;
669 size_t allocated
= 0;
677 while (**p
!= 0 && **p
!= ';') {
678 r
= parse_address_key(p
, "guid", guid
);
684 r
= parse_address_key(p
, "path", &path
);
690 if (startswith(*p
, "argv")) {
694 ul
= strtoul(*p
+ 4, (char**) p
, 10);
695 if (errno
> 0 || **p
!= '=' || ul
> 256) {
703 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
711 r
= parse_address_key(p
, NULL
, argv
+ ul
);
726 /* Make sure there are no holes in the array, with the
727 * exception of argv[0] */
728 for (j
= 1; j
< n_argv
; j
++)
734 if (argv
&& argv
[0] == NULL
) {
735 argv
[0] = strdup(path
);
747 for (j
= 0; j
< n_argv
; j
++)
755 static int parse_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
756 _cleanup_free_
char *path
= NULL
;
764 while (**p
!= 0 && **p
!= ';') {
765 r
= parse_address_key(p
, "guid", guid
);
771 r
= parse_address_key(p
, "path", &path
);
790 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
791 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
799 while (**p
!= 0 && **p
!= ';') {
800 r
= parse_address_key(p
, "guid", guid
);
806 r
= parse_address_key(p
, "machine", &machine
);
812 r
= parse_address_key(p
, "pid", &pid
);
821 if (!machine
== !pid
)
825 if (!machine_name_is_valid(machine
))
829 b
->machine
= machine
;
832 b
->machine
= mfree(b
->machine
);
836 r
= parse_pid(pid
, &b
->nspid
);
842 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
843 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
844 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + strlen("/var/run/dbus/system_bus_socket");
849 static int parse_container_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
850 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
858 while (**p
!= 0 && **p
!= ';') {
859 r
= parse_address_key(p
, "guid", guid
);
865 r
= parse_address_key(p
, "machine", &machine
);
871 r
= parse_address_key(p
, "pid", &pid
);
880 if (!machine
== !pid
)
884 if (!machine_name_is_valid(machine
))
888 b
->machine
= machine
;
891 b
->machine
= mfree(b
->machine
);
895 r
= parse_pid(pid
, &b
->nspid
);
901 r
= free_and_strdup(&b
->kernel
, "/sys/fs/kdbus/0-system/bus");
908 static void bus_reset_parsed_address(sd_bus
*b
) {
912 b
->sockaddr_size
= 0;
913 b
->exec_argv
= strv_free(b
->exec_argv
);
914 b
->exec_path
= mfree(b
->exec_path
);
915 b
->server_id
= SD_ID128_NULL
;
916 b
->kernel
= mfree(b
->kernel
);
917 b
->machine
= mfree(b
->machine
);
921 static int bus_parse_next_address(sd_bus
*b
) {
922 _cleanup_free_
char *guid
= NULL
;
930 if (b
->address
[b
->address_index
] == 0)
933 bus_reset_parsed_address(b
);
935 a
= b
->address
+ b
->address_index
;
944 if (startswith(a
, "unix:")) {
947 r
= parse_unix_address(b
, &a
, &guid
);
952 } else if (startswith(a
, "tcp:")) {
955 r
= parse_tcp_address(b
, &a
, &guid
);
961 } else if (startswith(a
, "unixexec:")) {
964 r
= parse_exec_address(b
, &a
, &guid
);
970 } else if (startswith(a
, "kernel:")) {
973 r
= parse_kernel_address(b
, &a
, &guid
);
978 } else if (startswith(a
, "x-machine-unix:")) {
981 r
= parse_container_unix_address(b
, &a
, &guid
);
986 } else if (startswith(a
, "x-machine-kernel:")) {
989 r
= parse_container_kernel_address(b
, &a
, &guid
);
1002 r
= sd_id128_from_string(guid
, &b
->server_id
);
1007 b
->address_index
= a
- b
->address
;
1011 static int bus_start_address(sd_bus
*b
) {
1012 bool container_kdbus_available
= false;
1013 bool kdbus_available
= false;
1019 bool skipped
= false;
1024 * Usually, if you provide multiple different bus-addresses, we
1025 * try all of them in order. We use the first one that
1026 * succeeds. However, if you mix kernel and unix addresses, we
1027 * never try unix-addresses if a previous kernel address was
1028 * tried and kdbus was available. This is required to prevent
1029 * clients to fallback to the bus-proxy if kdbus is available
1030 * but failed (eg., too many connections).
1034 r
= bus_socket_exec(b
);
1035 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
) {
1036 r
= bus_container_connect_kernel(b
);
1037 if (r
< 0 && !IN_SET(r
, -ENOENT
, -ESOCKTNOSUPPORT
))
1038 container_kdbus_available
= true;
1040 } else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
) {
1041 if (!container_kdbus_available
)
1042 r
= bus_container_connect_socket(b
);
1046 } else if (b
->kernel
) {
1047 r
= bus_kernel_connect(b
);
1048 if (r
< 0 && !IN_SET(r
, -ENOENT
, -ESOCKTNOSUPPORT
))
1049 kdbus_available
= true;
1051 } else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
) {
1052 if (!kdbus_available
)
1053 r
= bus_socket_connect(b
);
1061 r
= attach_io_events(b
);
1066 b
->last_connect_error
= -r
;
1069 r
= bus_parse_next_address(b
);
1073 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1077 int bus_next_address(sd_bus
*b
) {
1080 bus_reset_parsed_address(b
);
1081 return bus_start_address(b
);
1084 static int bus_start_fd(sd_bus
*b
) {
1089 assert(b
->input_fd
>= 0);
1090 assert(b
->output_fd
>= 0);
1092 r
= fd_nonblock(b
->input_fd
, true);
1096 r
= fd_cloexec(b
->input_fd
, true);
1100 if (b
->input_fd
!= b
->output_fd
) {
1101 r
= fd_nonblock(b
->output_fd
, true);
1105 r
= fd_cloexec(b
->output_fd
, true);
1110 if (fstat(b
->input_fd
, &st
) < 0)
1113 if (S_ISCHR(b
->input_fd
))
1114 return bus_kernel_take_fd(b
);
1116 return bus_socket_take_fd(b
);
1119 _public_
int sd_bus_start(sd_bus
*bus
) {
1122 assert_return(bus
, -EINVAL
);
1123 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1124 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1126 bus
->state
= BUS_OPENING
;
1128 if (bus
->is_server
&& bus
->bus_client
)
1131 if (bus
->input_fd
>= 0)
1132 r
= bus_start_fd(bus
);
1133 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1134 r
= bus_start_address(bus
);
1143 return bus_send_hello(bus
);
1146 _public_
int sd_bus_open(sd_bus
**ret
) {
1151 assert_return(ret
, -EINVAL
);
1153 /* Let's connect to the starter bus if it is set, and
1154 * otherwise to the bus that is appropropriate for the scope
1155 * we are running in */
1157 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1159 if (streq(e
, "system"))
1160 return sd_bus_open_system(ret
);
1161 else if (STR_IN_SET(e
, "session", "user"))
1162 return sd_bus_open_user(ret
);
1165 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1167 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1168 return sd_bus_open_user(ret
);
1170 return sd_bus_open_system(ret
);
1177 r
= sd_bus_set_address(b
, e
);
1181 b
->bus_client
= true;
1183 /* We don't know whether the bus is trusted or not, so better
1184 * be safe, and authenticate everything */
1186 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1187 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1189 r
= sd_bus_start(b
);
1201 int bus_set_address_system(sd_bus
*b
) {
1205 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1207 return sd_bus_set_address(b
, e
);
1209 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1212 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1216 assert_return(ret
, -EINVAL
);
1222 r
= bus_set_address_system(b
);
1226 b
->bus_client
= true;
1227 b
->is_system
= true;
1229 /* Let's do per-method access control on the system bus. We
1230 * need the caller's UID and capability set for that. */
1232 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1233 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1235 r
= sd_bus_start(b
);
1247 int bus_set_address_user(sd_bus
*b
) {
1254 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1256 return sd_bus_set_address(b
, e
);
1258 r
= cg_pid_get_owner_uid(0, &uid
);
1262 e
= secure_getenv("XDG_RUNTIME_DIR");
1264 _cleanup_free_
char *ee
= NULL
;
1266 ee
= bus_address_escape(e
);
1270 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, uid
, ee
);
1272 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, uid
);
1280 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1284 assert_return(ret
, -EINVAL
);
1290 r
= bus_set_address_user(b
);
1294 b
->bus_client
= true;
1297 /* We don't do any per-method access control on the user
1301 r
= sd_bus_start(b
);
1313 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1314 _cleanup_free_
char *e
= NULL
;
1315 char *m
= NULL
, *c
= NULL
;
1320 /* Let's see if we shall enter some container */
1321 m
= strchr(host
, ':');
1325 /* Let's make sure this is not a port of some kind,
1326 * and is a valid machine name. */
1327 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1330 /* Cut out the host part */
1331 t
= strndupa(host
, m
- host
- 1);
1332 e
= bus_address_escape(t
);
1336 c
= strjoina(",argv4=--machine=", m
);
1341 e
= bus_address_escape(host
);
1346 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1353 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1357 assert_return(host
, -EINVAL
);
1358 assert_return(ret
, -EINVAL
);
1360 r
= sd_bus_new(&bus
);
1364 r
= bus_set_address_system_remote(bus
, host
);
1368 bus
->bus_client
= true;
1369 bus
->trusted
= false;
1370 bus
->is_system
= true;
1372 r
= sd_bus_start(bus
);
1384 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1385 _cleanup_free_
char *e
= NULL
;
1390 e
= bus_address_escape(machine
);
1394 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1401 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1405 assert_return(machine
, -EINVAL
);
1406 assert_return(ret
, -EINVAL
);
1407 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1409 r
= sd_bus_new(&bus
);
1413 r
= bus_set_address_system_machine(bus
, machine
);
1417 bus
->bus_client
= true;
1418 bus
->trusted
= false;
1419 bus
->is_system
= true;
1421 r
= sd_bus_start(bus
);
1433 _public_
void sd_bus_close(sd_bus
*bus
) {
1437 if (bus
->state
== BUS_CLOSED
)
1439 if (bus_pid_changed(bus
))
1442 bus
->state
= BUS_CLOSED
;
1444 sd_bus_detach_event(bus
);
1446 /* Drop all queued messages so that they drop references to
1447 * the bus object and the bus may be freed */
1448 bus_reset_queues(bus
);
1450 if (!bus
->is_kernel
)
1453 /* We'll leave the fd open in case this is a kernel bus, since
1454 * there might still be memblocks around that reference this
1455 * bus, and they might need to invoke the KDBUS_CMD_FREE
1456 * ioctl on the fd when they are freed. */
1459 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1467 return sd_bus_unref(bus
);
1470 static void bus_enter_closing(sd_bus
*bus
) {
1473 if (bus
->state
!= BUS_OPENING
&&
1474 bus
->state
!= BUS_AUTHENTICATING
&&
1475 bus
->state
!= BUS_HELLO
&&
1476 bus
->state
!= BUS_RUNNING
)
1479 bus
->state
= BUS_CLOSING
;
1482 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1483 assert_return(bus
, NULL
);
1485 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1490 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1496 i
= REFCNT_DEC(bus
->n_ref
);
1504 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1506 assert_return(bus
, -EINVAL
);
1507 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1509 return BUS_IS_OPEN(bus
->state
);
1512 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1515 assert_return(bus
, -EINVAL
);
1516 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1517 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1519 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1522 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1523 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1526 r
= bus_ensure_running(bus
);
1530 return bus
->can_fds
;
1533 return bus_type_is_valid(type
);
1536 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1539 assert_return(bus
, -EINVAL
);
1540 assert_return(id
, -EINVAL
);
1541 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1543 r
= bus_ensure_running(bus
);
1547 *id
= bus
->server_id
;
1551 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1556 /* If we copy the same message to multiple
1557 * destinations, avoid using the same cookie
1559 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1564 timeout
= BUS_DEFAULT_TIMEOUT
;
1566 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1569 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1570 bool remarshal
= false;
1574 /* wrong packet version */
1575 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1578 /* wrong packet endianness */
1579 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1582 /* TODO: kdbus-messages received from the kernel contain data which is
1583 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1584 * force remarshaling of the message. Technically, we could just
1585 * recreate the kdbus message, but that is non-trivial as other parts of
1586 * the message refer to m->kdbus already. This should be fixed! */
1587 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1590 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1593 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1597 /* Fake some timestamps, if they were requested, and not
1598 * already initialized */
1599 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1600 if (m
->realtime
<= 0)
1601 m
->realtime
= now(CLOCK_REALTIME
);
1603 if (m
->monotonic
<= 0)
1604 m
->monotonic
= now(CLOCK_MONOTONIC
);
1607 /* The bus specification says the serial number cannot be 0,
1608 * hence let's fill something in for synthetic messages. Since
1609 * synthetic messages might have a fake sender and we don't
1610 * want to interfere with the real sender's serial numbers we
1611 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1612 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1613 * even though kdbus can do 64bit. */
1614 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1617 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1624 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1626 r
= bus_socket_write_message(bus
, m
, idx
);
1631 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1632 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1633 bus_message_type_to_string(m
->header
->type
),
1634 strna(sd_bus_message_get_sender(m
)),
1635 strna(sd_bus_message_get_destination(m
)),
1636 strna(sd_bus_message_get_path(m
)),
1637 strna(sd_bus_message_get_interface(m
)),
1638 strna(sd_bus_message_get_member(m
)),
1639 BUS_MESSAGE_COOKIE(m
),
1641 strna(m
->error
.message
));
1646 static int dispatch_wqueue(sd_bus
*bus
) {
1650 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1652 while (bus
->wqueue_size
> 0) {
1654 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1658 /* Didn't do anything this time */
1660 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1661 /* Fully written. Let's drop the entry from
1664 * This isn't particularly optimized, but
1665 * well, this is supposed to be our worst-case
1666 * buffer only, and the socket buffer is
1667 * supposed to be our primary buffer, and if
1668 * it got full, then all bets are off
1671 bus
->wqueue_size
--;
1672 sd_bus_message_unref(bus
->wqueue
[0]);
1673 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1683 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1687 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1689 return bus_socket_read_message(bus
);
1692 int bus_rqueue_make_room(sd_bus
*bus
) {
1695 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1698 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1704 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1709 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1711 /* Note that the priority logic is only available on kdbus,
1712 * where the rqueue is unused. We check the rqueue here
1713 * anyway, because it's simple... */
1716 if (bus
->rqueue_size
> 0) {
1717 /* Dispatch a queued message */
1719 *m
= bus
->rqueue
[0];
1720 bus
->rqueue_size
--;
1721 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1725 /* Try to read a new message */
1726 r
= bus_read_message(bus
, hint_priority
, priority
);
1736 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1737 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1740 assert_return(m
, -EINVAL
);
1745 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1746 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1748 if (!BUS_IS_OPEN(bus
->state
))
1752 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1759 /* If the cookie number isn't kept, then we know that no reply
1761 if (!cookie
&& !m
->sealed
)
1762 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1764 r
= bus_seal_message(bus
, m
, 0);
1768 /* Remarshall if we have to. This will possibly unref the
1769 * message and place a replacement in m */
1770 r
= bus_remarshal_message(bus
, &m
);
1774 /* If this is a reply and no reply was requested, then let's
1775 * suppress this, if we can */
1779 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1782 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1784 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1785 bus_enter_closing(bus
);
1792 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1793 /* Wasn't fully written. So let's remember how
1794 * much was written. Note that the first entry
1795 * of the wqueue array is always allocated so
1796 * that we always can remember how much was
1798 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1799 bus
->wqueue_size
= 1;
1804 /* Just append it to the queue. */
1806 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1809 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1812 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1817 *cookie
= BUS_MESSAGE_COOKIE(m
);
1822 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1823 return bus_send_internal(bus
, m
, cookie
, false);
1826 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1829 assert_return(m
, -EINVAL
);
1834 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1836 if (!BUS_IS_OPEN(bus
->state
))
1839 if (!streq_ptr(m
->destination
, destination
)) {
1844 r
= sd_bus_message_set_destination(m
, destination
);
1849 return sd_bus_send(bus
, m
, cookie
);
1852 static usec_t
calc_elapse(uint64_t usec
) {
1853 if (usec
== (uint64_t) -1)
1856 return now(CLOCK_MONOTONIC
) + usec
;
1859 static int timeout_compare(const void *a
, const void *b
) {
1860 const struct reply_callback
*x
= a
, *y
= b
;
1862 if (x
->timeout
!= 0 && y
->timeout
== 0)
1865 if (x
->timeout
== 0 && y
->timeout
!= 0)
1868 if (x
->timeout
< y
->timeout
)
1871 if (x
->timeout
> y
->timeout
)
1877 _public_
int sd_bus_call_async(
1881 sd_bus_message_handler_t callback
,
1885 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1886 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1889 assert_return(m
, -EINVAL
);
1890 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1891 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1892 assert_return(callback
, -EINVAL
);
1897 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1898 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1900 if (!BUS_IS_OPEN(bus
->state
))
1903 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1907 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1911 r
= bus_seal_message(bus
, m
, usec
);
1915 r
= bus_remarshal_message(bus
, &m
);
1919 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1923 s
->reply_callback
.callback
= callback
;
1925 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1926 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1928 s
->reply_callback
.cookie
= 0;
1932 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1933 if (s
->reply_callback
.timeout
!= 0) {
1934 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1936 s
->reply_callback
.timeout
= 0;
1941 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1952 int bus_ensure_running(sd_bus
*bus
) {
1957 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1959 if (bus
->state
== BUS_RUNNING
)
1963 r
= sd_bus_process(bus
, NULL
);
1966 if (bus
->state
== BUS_RUNNING
)
1971 r
= sd_bus_wait(bus
, (uint64_t) -1);
1977 _public_
int sd_bus_call(
1981 sd_bus_error
*error
,
1982 sd_bus_message
**reply
) {
1984 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1990 bus_assert_return(m
, -EINVAL
, error
);
1991 bus_assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
, error
);
1992 bus_assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
, error
);
1993 bus_assert_return(!bus_error_is_dirty(error
), -EINVAL
, error
);
1998 bus_assert_return(!bus_pid_changed(bus
), -ECHILD
, error
);
1999 bus_assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
, error
);
2001 if (!BUS_IS_OPEN(bus
->state
)) {
2006 r
= bus_ensure_running(bus
);
2010 i
= bus
->rqueue_size
;
2012 r
= bus_seal_message(bus
, m
, usec
);
2016 r
= bus_remarshal_message(bus
, &m
);
2020 r
= bus_send_internal(bus
, m
, &cookie
, true);
2024 timeout
= calc_elapse(m
->timeout
);
2029 while (i
< bus
->rqueue_size
) {
2030 sd_bus_message
*incoming
= NULL
;
2032 incoming
= bus
->rqueue
[i
];
2034 if (incoming
->reply_cookie
== cookie
) {
2035 /* Found a match! */
2037 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2039 log_debug_bus_message(incoming
);
2041 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2043 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2047 sd_bus_message_unref(incoming
);
2052 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2053 sd_bus_message_unref(incoming
);
2056 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
) {
2057 r
= sd_bus_error_copy(error
, &incoming
->error
);
2058 sd_bus_message_unref(incoming
);
2065 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2068 streq(bus
->unique_name
, incoming
->sender
)) {
2070 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2073 /* Our own message? Somebody is trying
2074 * to send its own client a message,
2075 * let's not dead-lock, let's fail
2078 sd_bus_message_unref(incoming
);
2083 /* Try to read more, right-away */
2087 r
= bus_read_message(bus
, false, 0);
2089 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2090 bus_enter_closing(bus
);
2102 n
= now(CLOCK_MONOTONIC
);
2110 left
= (uint64_t) -1;
2112 r
= bus_poll(bus
, true, left
);
2120 r
= dispatch_wqueue(bus
);
2122 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2123 bus_enter_closing(bus
);
2132 return sd_bus_error_set_errno(error
, r
);
2135 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2137 assert_return(bus
, -EINVAL
);
2138 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2139 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2141 return bus
->input_fd
;
2144 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2147 assert_return(bus
, -EINVAL
);
2148 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2150 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2153 if (bus
->state
== BUS_OPENING
)
2155 else if (bus
->state
== BUS_AUTHENTICATING
) {
2157 if (bus_socket_auth_needs_write(bus
))
2162 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2163 if (bus
->rqueue_size
<= 0)
2165 if (bus
->wqueue_size
> 0)
2172 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2173 struct reply_callback
*c
;
2175 assert_return(bus
, -EINVAL
);
2176 assert_return(timeout_usec
, -EINVAL
);
2177 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2179 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2182 if (bus
->track_queue
) {
2187 if (bus
->state
== BUS_CLOSING
) {
2192 if (bus
->state
== BUS_AUTHENTICATING
) {
2193 *timeout_usec
= bus
->auth_timeout
;
2197 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2198 *timeout_usec
= (uint64_t) -1;
2202 if (bus
->rqueue_size
> 0) {
2207 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2209 *timeout_usec
= (uint64_t) -1;
2213 if (c
->timeout
== 0) {
2214 *timeout_usec
= (uint64_t) -1;
2218 *timeout_usec
= c
->timeout
;
2222 static int process_timeout(sd_bus
*bus
) {
2223 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2224 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2225 struct reply_callback
*c
;
2232 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2236 n
= now(CLOCK_MONOTONIC
);
2240 r
= bus_message_new_synthetic_error(
2243 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2248 r
= bus_seal_synthetic_message(bus
, m
);
2252 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2255 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2258 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2260 bus
->iteration_counter
++;
2262 bus
->current_message
= m
;
2263 bus
->current_slot
= sd_bus_slot_ref(slot
);
2264 bus
->current_handler
= c
->callback
;
2265 bus
->current_userdata
= slot
->userdata
;
2266 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2267 bus
->current_userdata
= NULL
;
2268 bus
->current_handler
= NULL
;
2269 bus
->current_slot
= NULL
;
2270 bus
->current_message
= NULL
;
2272 if (slot
->floating
) {
2273 bus_slot_disconnect(slot
);
2274 sd_bus_slot_unref(slot
);
2277 sd_bus_slot_unref(slot
);
2279 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2282 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2286 if (bus
->state
!= BUS_HELLO
)
2289 /* Let's make sure the first message on the bus is the HELLO
2290 * reply. But note that we don't actually parse the message
2291 * here (we leave that to the usual handling), we just verify
2292 * we don't let any earlier msg through. */
2294 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2295 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2298 if (m
->reply_cookie
!= 1)
2304 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2305 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2306 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2307 struct reply_callback
*c
;
2314 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2315 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2318 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2321 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2324 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2330 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2332 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2334 /* If the reply contained a file descriptor which we
2335 * didn't want we pass an error instead. */
2337 r
= bus_message_new_synthetic_error(
2340 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2345 /* Copy over original timestamp */
2346 synthetic_reply
->realtime
= m
->realtime
;
2347 synthetic_reply
->monotonic
= m
->monotonic
;
2348 synthetic_reply
->seqnum
= m
->seqnum
;
2350 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2354 m
= synthetic_reply
;
2356 r
= sd_bus_message_rewind(m
, true);
2361 if (c
->timeout
!= 0) {
2362 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2366 bus
->current_slot
= sd_bus_slot_ref(slot
);
2367 bus
->current_handler
= c
->callback
;
2368 bus
->current_userdata
= slot
->userdata
;
2369 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2370 bus
->current_userdata
= NULL
;
2371 bus
->current_handler
= NULL
;
2372 bus
->current_slot
= NULL
;
2374 if (slot
->floating
) {
2375 bus_slot_disconnect(slot
);
2376 sd_bus_slot_unref(slot
);
2379 sd_bus_slot_unref(slot
);
2381 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2384 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2385 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2386 struct filter_callback
*l
;
2393 bus
->filter_callbacks_modified
= false;
2395 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2398 if (bus
->filter_callbacks_modified
)
2401 /* Don't run this more than once per iteration */
2402 if (l
->last_iteration
== bus
->iteration_counter
)
2405 l
->last_iteration
= bus
->iteration_counter
;
2407 r
= sd_bus_message_rewind(m
, true);
2411 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2413 bus
->current_slot
= sd_bus_slot_ref(slot
);
2414 bus
->current_handler
= l
->callback
;
2415 bus
->current_userdata
= slot
->userdata
;
2416 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2417 bus
->current_userdata
= NULL
;
2418 bus
->current_handler
= NULL
;
2419 bus
->current_slot
= sd_bus_slot_unref(slot
);
2421 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2427 } while (bus
->filter_callbacks_modified
);
2432 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2439 bus
->match_callbacks_modified
= false;
2441 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2445 } while (bus
->match_callbacks_modified
);
2450 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2451 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2457 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2460 if (bus
->manual_peer_interface
)
2463 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2466 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2469 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2472 if (streq_ptr(m
->member
, "Ping"))
2473 r
= sd_bus_message_new_method_return(m
, &reply
);
2474 else if (streq_ptr(m
->member
, "GetMachineId")) {
2478 r
= sd_id128_get_machine(&id
);
2482 r
= sd_bus_message_new_method_return(m
, &reply
);
2486 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2488 r
= sd_bus_message_new_method_errorf(
2490 SD_BUS_ERROR_UNKNOWN_METHOD
,
2491 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2497 r
= sd_bus_send(bus
, reply
, NULL
);
2504 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2508 /* If we got a message with a file descriptor which we didn't
2509 * want to accept, then let's drop it. How can this even
2510 * happen? For example, when the kernel queues a message into
2511 * an activatable names's queue which allows fds, and then is
2512 * delivered to us later even though we ourselves did not
2515 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2521 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2524 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2525 return 1; /* just eat it up */
2527 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2530 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2536 bus
->current_message
= m
;
2537 bus
->iteration_counter
++;
2539 log_debug_bus_message(m
);
2541 r
= process_hello(bus
, m
);
2545 r
= process_reply(bus
, m
);
2549 r
= process_fd_check(bus
, m
);
2553 r
= process_filter(bus
, m
);
2557 r
= process_match(bus
, m
);
2561 r
= process_builtin(bus
, m
);
2565 r
= bus_process_object(bus
, m
);
2568 bus
->current_message
= NULL
;
2572 static int dispatch_track(sd_bus
*bus
) {
2575 if (!bus
->track_queue
)
2578 bus_track_dispatch(bus
->track_queue
);
2582 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2583 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2587 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2589 r
= process_timeout(bus
);
2593 r
= dispatch_wqueue(bus
);
2597 r
= dispatch_track(bus
);
2601 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2607 r
= process_message(bus
, m
);
2612 r
= sd_bus_message_rewind(m
, true);
2621 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2623 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2624 strna(sd_bus_message_get_sender(m
)),
2625 strna(sd_bus_message_get_path(m
)),
2626 strna(sd_bus_message_get_interface(m
)),
2627 strna(sd_bus_message_get_member(m
)));
2629 r
= sd_bus_reply_method_errorf(
2631 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2632 "Unknown object '%s'.", m
->path
);
2646 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2647 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2648 struct reply_callback
*c
;
2652 assert(bus
->state
== BUS_CLOSING
);
2654 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2656 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2659 /* First, fail all outstanding method calls */
2660 r
= bus_message_new_synthetic_error(
2663 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2668 r
= bus_seal_synthetic_message(bus
, m
);
2672 if (c
->timeout
!= 0) {
2673 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2677 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2680 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2682 bus
->iteration_counter
++;
2684 bus
->current_message
= m
;
2685 bus
->current_slot
= sd_bus_slot_ref(slot
);
2686 bus
->current_handler
= c
->callback
;
2687 bus
->current_userdata
= slot
->userdata
;
2688 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2689 bus
->current_userdata
= NULL
;
2690 bus
->current_handler
= NULL
;
2691 bus
->current_slot
= NULL
;
2692 bus
->current_message
= NULL
;
2694 if (slot
->floating
) {
2695 bus_slot_disconnect(slot
);
2696 sd_bus_slot_unref(slot
);
2699 sd_bus_slot_unref(slot
);
2701 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2704 /* Then, synthesize a Disconnected message */
2705 r
= sd_bus_message_new_signal(
2708 "/org/freedesktop/DBus/Local",
2709 "org.freedesktop.DBus.Local",
2714 bus_message_set_sender_local(bus
, m
);
2716 r
= bus_seal_synthetic_message(bus
, m
);
2722 bus
->current_message
= m
;
2723 bus
->iteration_counter
++;
2725 r
= process_filter(bus
, m
);
2729 r
= process_match(bus
, m
);
2741 bus
->current_message
= NULL
;
2746 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2747 BUS_DONT_DESTROY(bus
);
2750 /* Returns 0 when we didn't do anything. This should cause the
2751 * caller to invoke sd_bus_wait() before returning the next
2752 * time. Returns > 0 when we did something, which possibly
2753 * means *ret is filled in with an unprocessed message. */
2755 assert_return(bus
, -EINVAL
);
2756 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2758 /* We don't allow recursively invoking sd_bus_process(). */
2759 assert_return(!bus
->current_message
, -EBUSY
);
2760 assert(!bus
->current_slot
);
2762 switch (bus
->state
) {
2771 r
= bus_socket_process_opening(bus
);
2772 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2773 bus_enter_closing(bus
);
2781 case BUS_AUTHENTICATING
:
2782 r
= bus_socket_process_authenticating(bus
);
2783 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2784 bus_enter_closing(bus
);
2796 r
= process_running(bus
, hint_priority
, priority
, ret
);
2797 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2798 bus_enter_closing(bus
);
2808 return process_closing(bus
, ret
);
2811 assert_not_reached("Unknown state");
2814 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2815 return bus_process_internal(bus
, false, 0, ret
);
2818 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2819 return bus_process_internal(bus
, true, priority
, ret
);
2822 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2823 struct pollfd p
[2] = {};
2826 usec_t m
= USEC_INFINITY
;
2830 if (bus
->state
== BUS_CLOSING
)
2833 if (!BUS_IS_OPEN(bus
->state
))
2836 e
= sd_bus_get_events(bus
);
2841 /* The caller really needs some more data, he doesn't
2842 * care about what's already read, or any timeouts
2843 * except its own. */
2847 /* The caller wants to process if there's something to
2848 * process, but doesn't care otherwise */
2850 r
= sd_bus_get_timeout(bus
, &until
);
2855 nw
= now(CLOCK_MONOTONIC
);
2856 m
= until
> nw
? until
- nw
: 0;
2860 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2863 p
[0].fd
= bus
->input_fd
;
2864 if (bus
->output_fd
== bus
->input_fd
) {
2868 p
[0].events
= e
& POLLIN
;
2869 p
[1].fd
= bus
->output_fd
;
2870 p
[1].events
= e
& POLLOUT
;
2874 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2878 return r
> 0 ? 1 : 0;
2881 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2883 assert_return(bus
, -EINVAL
);
2884 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2886 if (bus
->state
== BUS_CLOSING
)
2889 if (!BUS_IS_OPEN(bus
->state
))
2892 if (bus
->rqueue_size
> 0)
2895 return bus_poll(bus
, false, timeout_usec
);
2898 _public_
int sd_bus_flush(sd_bus
*bus
) {
2901 assert_return(bus
, -EINVAL
);
2902 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2904 if (bus
->state
== BUS_CLOSING
)
2907 if (!BUS_IS_OPEN(bus
->state
))
2910 r
= bus_ensure_running(bus
);
2914 if (bus
->wqueue_size
<= 0)
2918 r
= dispatch_wqueue(bus
);
2920 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2921 bus_enter_closing(bus
);
2928 if (bus
->wqueue_size
<= 0)
2931 r
= bus_poll(bus
, false, (uint64_t) -1);
2937 _public_
int sd_bus_add_filter(
2940 sd_bus_message_handler_t callback
,
2945 assert_return(bus
, -EINVAL
);
2946 assert_return(callback
, -EINVAL
);
2947 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2949 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2953 s
->filter_callback
.callback
= callback
;
2955 bus
->filter_callbacks_modified
= true;
2956 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2964 _public_
int sd_bus_add_match(
2968 sd_bus_message_handler_t callback
,
2971 struct bus_match_component
*components
= NULL
;
2972 unsigned n_components
= 0;
2973 sd_bus_slot
*s
= NULL
;
2976 assert_return(bus
, -EINVAL
);
2977 assert_return(match
, -EINVAL
);
2978 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2980 r
= bus_match_parse(match
, &components
, &n_components
);
2984 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2990 s
->match_callback
.callback
= callback
;
2991 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2993 if (bus
->bus_client
) {
2994 enum bus_match_scope scope
;
2996 scope
= bus_match_get_scope(components
, n_components
);
2998 /* Do not install server-side matches for matches
2999 * against the local service, interface or bus
3001 if (scope
!= BUS_MATCH_LOCAL
) {
3003 if (!bus
->is_kernel
) {
3004 /* When this is not a kernel transport, we
3005 * store the original match string, so that we
3006 * can use it to remove the match again */
3008 s
->match_callback
.match_string
= strdup(match
);
3009 if (!s
->match_callback
.match_string
) {
3015 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
3019 s
->match_added
= true;
3023 bus
->match_callbacks_modified
= true;
3024 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
3033 bus_match_parse_free(components
, n_components
);
3034 sd_bus_slot_unref(s
);
3039 int bus_remove_match_by_string(
3042 sd_bus_message_handler_t callback
,
3045 struct bus_match_component
*components
= NULL
;
3046 unsigned n_components
= 0;
3047 struct match_callback
*c
;
3050 assert_return(bus
, -EINVAL
);
3051 assert_return(match
, -EINVAL
);
3052 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3054 r
= bus_match_parse(match
, &components
, &n_components
);
3058 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3062 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3065 bus_match_parse_free(components
, n_components
);
3070 bool bus_pid_changed(sd_bus
*bus
) {
3073 /* We don't support people creating a bus connection and
3074 * keeping it around over a fork(). Let's complain. */
3076 return bus
->original_pid
!= getpid();
3079 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3080 sd_bus
*bus
= userdata
;
3085 r
= sd_bus_process(bus
, NULL
);
3092 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3093 sd_bus
*bus
= userdata
;
3098 r
= sd_bus_process(bus
, NULL
);
3105 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3106 sd_bus
*bus
= userdata
;
3113 e
= sd_bus_get_events(bus
);
3117 if (bus
->output_fd
!= bus
->input_fd
) {
3119 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3123 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3127 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3132 r
= sd_bus_get_timeout(bus
, &until
);
3138 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3143 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3150 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3151 sd_bus
*bus
= userdata
;
3161 static int attach_io_events(sd_bus
*bus
) {
3166 if (bus
->input_fd
< 0)
3172 if (!bus
->input_io_event_source
) {
3173 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3177 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3181 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3185 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3187 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3192 if (bus
->output_fd
!= bus
->input_fd
) {
3193 assert(bus
->output_fd
>= 0);
3195 if (!bus
->output_io_event_source
) {
3196 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3200 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3204 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3206 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3215 static void detach_io_events(sd_bus
*bus
) {
3218 if (bus
->input_io_event_source
) {
3219 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3220 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3223 if (bus
->output_io_event_source
) {
3224 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3225 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3229 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3232 assert_return(bus
, -EINVAL
);
3233 assert_return(!bus
->event
, -EBUSY
);
3235 assert(!bus
->input_io_event_source
);
3236 assert(!bus
->output_io_event_source
);
3237 assert(!bus
->time_event_source
);
3240 bus
->event
= sd_event_ref(event
);
3242 r
= sd_event_default(&bus
->event
);
3247 bus
->event_priority
= priority
;
3249 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3253 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3257 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3261 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3265 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3269 r
= attach_io_events(bus
);
3276 sd_bus_detach_event(bus
);
3280 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3281 assert_return(bus
, -EINVAL
);
3286 detach_io_events(bus
);
3288 if (bus
->time_event_source
) {
3289 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3290 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3293 if (bus
->quit_event_source
) {
3294 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3295 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3298 bus
->event
= sd_event_unref(bus
->event
);
3302 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3303 assert_return(bus
, NULL
);
3308 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3309 assert_return(bus
, NULL
);
3311 return bus
->current_message
;
3314 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3315 assert_return(bus
, NULL
);
3317 return bus
->current_slot
;
3320 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3321 assert_return(bus
, NULL
);
3323 return bus
->current_handler
;
3326 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3327 assert_return(bus
, NULL
);
3329 return bus
->current_userdata
;
3332 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3337 assert(default_bus
);
3340 return !!*default_bus
;
3343 *ret
= sd_bus_ref(*default_bus
);
3351 b
->default_bus_ptr
= default_bus
;
3359 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3360 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3364 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3365 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3368 _public_
int sd_bus_default(sd_bus
**ret
) {
3372 /* Let's try our best to reuse another cached connection. If
3373 * the starter bus type is set, connect via our normal
3374 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3375 * we can share the connection with the user/system default
3378 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3380 if (streq(e
, "system"))
3381 return sd_bus_default_system(ret
);
3382 else if (STR_IN_SET(e
, "user", "session"))
3383 return sd_bus_default_user(ret
);
3386 /* No type is specified, so we have not other option than to
3387 * use the starter address if it is set. */
3389 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3392 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3395 /* Finally, if nothing is set use the cached connection for
3396 * the right scope */
3398 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3399 return sd_bus_default_user(ret
);
3401 return sd_bus_default_system(ret
);
3404 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3405 assert_return(b
, -EINVAL
);
3406 assert_return(tid
, -EINVAL
);
3407 assert_return(!bus_pid_changed(b
), -ECHILD
);
3415 return sd_event_get_tid(b
->event
, tid
);
3420 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3421 _cleanup_free_
char *e
= NULL
;
3424 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3425 assert_return(external_id
, -EINVAL
);
3426 assert_return(ret_path
, -EINVAL
);
3428 e
= bus_label_escape(external_id
);
3432 ret
= strjoin(prefix
, "/", e
, NULL
);
3440 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3444 assert_return(object_path_is_valid(path
), -EINVAL
);
3445 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3446 assert_return(external_id
, -EINVAL
);
3448 e
= object_path_startswith(path
, prefix
);
3450 *external_id
= NULL
;
3454 ret
= bus_label_unescape(e
);
3462 _public_
int sd_bus_path_encode_many(char **out
, const char *path_template
, ...) {
3463 _cleanup_strv_free_
char **labels
= NULL
;
3464 char *path
, *path_pos
, **label_pos
;
3465 const char *sep
, *template_pos
;
3470 assert_return(out
, -EINVAL
);
3471 assert_return(path_template
, -EINVAL
);
3473 path_length
= strlen(path_template
);
3475 va_start(list
, path_template
);
3476 for (sep
= strchr(path_template
, '%'); sep
; sep
= strchr(sep
+ 1, '%')) {
3480 arg
= va_arg(list
, const char *);
3486 label
= bus_label_escape(arg
);
3492 r
= strv_consume(&labels
, label
);
3498 /* add label length, but account for the format character */
3499 path_length
+= strlen(label
) - 1;
3503 path
= malloc(path_length
+ 1);
3510 for (template_pos
= path_template
; *template_pos
; ) {
3511 sep
= strchrnul(template_pos
, '%');
3512 path_pos
= mempcpy(path_pos
, template_pos
, sep
- template_pos
);
3516 path_pos
= stpcpy(path_pos
, *label_pos
++);
3517 template_pos
= sep
+ 1;
3525 _public_
int sd_bus_path_decode_many(const char *path
, const char *path_template
, ...) {
3526 _cleanup_strv_free_
char **labels
= NULL
;
3527 const char *template_pos
, *path_pos
;
3533 * This decodes an object-path based on a template argument. The
3534 * template consists of a verbatim path, optionally including special
3537 * - Each occurrence of '%' in the template matches an arbitrary
3538 * substring of a label in the given path. At most one such
3539 * directive is allowed per label. For each such directive, the
3540 * caller must provide an output parameter (char **) via va_arg. If
3541 * NULL is passed, the given label is verified, but not returned.
3542 * For each matched label, the *decoded* label is stored in the
3543 * passed output argument, and the caller is responsible to free
3544 * it. Note that the output arguments are only modified if the
3545 * actualy path matched the template. Otherwise, they're left
3548 * This function returns <0 on error, 0 if the path does not match the
3549 * template, 1 if it matched.
3552 assert_return(path
, -EINVAL
);
3553 assert_return(path_template
, -EINVAL
);
3557 for (template_pos
= path_template
; *template_pos
; ) {
3562 /* verify everything until the next '%' matches verbatim */
3563 sep
= strchrnul(template_pos
, '%');
3564 length
= sep
- template_pos
;
3565 if (strncmp(path_pos
, template_pos
, length
))
3569 template_pos
+= length
;
3574 /* We found the next '%' character. Everything up until here
3575 * matched. We now skip ahead to the end of this label and make
3576 * sure it matches the tail of the label in the path. Then we
3577 * decode the string in-between and save it for later use. */
3579 ++template_pos
; /* skip over '%' */
3581 sep
= strchrnul(template_pos
, '/');
3582 length
= sep
- template_pos
; /* length of suffix to match verbatim */
3584 /* verify the suffixes match */
3585 sep
= strchrnul(path_pos
, '/');
3586 if (sep
- path_pos
< (ssize_t
)length
||
3587 strncmp(sep
- length
, template_pos
, length
))
3590 template_pos
+= length
; /* skip over matched label */
3591 length
= sep
- path_pos
- length
; /* length of sub-label to decode */
3593 /* store unescaped label for later use */
3594 label
= bus_label_unescape_n(path_pos
, length
);
3598 r
= strv_consume(&labels
, label
);
3602 path_pos
= sep
; /* skip decoded label and suffix */
3605 /* end of template must match end of path */
3609 /* copy the labels over to the caller */
3610 va_start(list
, path_template
);
3611 for (label_pos
= labels
; label_pos
&& *label_pos
; ++label_pos
) {
3614 arg
= va_arg(list
, char **);
3627 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3630 assert_return(bus
, -EINVAL
);
3631 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3633 if (!bus
->is_kernel
)
3636 if (!BUS_IS_OPEN(bus
->state
))
3639 if (bus
->rqueue_size
> 0)
3642 if (bus
->wqueue_size
> 0)
3645 r
= bus_kernel_try_close(bus
);
3653 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3654 assert_return(bus
, -EINVAL
);
3655 assert_return(description
, -EINVAL
);
3656 assert_return(bus
->description
, -ENXIO
);
3657 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3659 *description
= bus
->description
;
3663 int bus_get_root_path(sd_bus
*bus
) {
3666 if (bus
->cgroup_root
)
3669 r
= cg_get_root_path(&bus
->cgroup_root
);
3671 bus
->cgroup_root
= strdup("/");
3672 if (!bus
->cgroup_root
)
3681 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3684 assert_return(bus
, -EINVAL
);
3685 assert_return(scope
, -EINVAL
);
3686 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3688 if (bus
->is_kernel
) {
3689 _cleanup_free_
char *n
= NULL
;
3692 r
= bus_kernel_get_bus_name(bus
, &n
);
3696 if (streq(n
, "0-system")) {
3701 dash
= strchr(n
, '-');
3702 if (streq_ptr(dash
, "-user")) {
3713 if (bus
->is_system
) {
3721 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3723 assert_return(bus
, -EINVAL
);
3724 assert_return(address
, -EINVAL
);
3725 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3728 *address
= bus
->address
;
3735 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3736 assert_return(bus
, -EINVAL
);
3737 assert_return(mask
, -EINVAL
);
3738 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3740 *mask
= bus
->creds_mask
;
3744 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3745 assert_return(bus
, -EINVAL
);
3746 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3748 return bus
->bus_client
;
3751 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3752 assert_return(bus
, -EINVAL
);
3753 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3755 return bus
->is_server
;
3758 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3759 assert_return(bus
, -EINVAL
);
3760 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3762 return bus
->anonymous_auth
;
3765 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3766 assert_return(bus
, -EINVAL
);
3767 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3769 return bus
->trusted
;
3772 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3773 assert_return(bus
, -EINVAL
);
3774 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3776 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);
3779 static void flush_close(sd_bus
*bus
) {
3783 /* Flushes and closes the specified bus. We take a ref before,
3784 * to ensure the flushing does not cause the bus to be
3787 sd_bus_flush_close_unref(sd_bus_ref(bus
));
3790 _public_
void sd_bus_default_flush_close(void) {
3791 flush_close(default_starter_bus
);
3792 flush_close(default_user_bus
);
3793 flush_close(default_system_bus
);