1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
35 #include "cgroup-util.h"
36 #include "bus-label.h"
39 #include "bus-internal.h"
40 #include "bus-message.h"
42 #include "bus-socket.h"
43 #include "bus-kernel.h"
44 #include "bus-control.h"
45 #include "bus-objects.h"
47 #include "bus-container.h"
48 #include "bus-protocol.h"
49 #include "bus-track.h"
52 #define log_debug_bus_message(m) \
54 sd_bus_message *_mm = (m); \
55 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
56 bus_message_type_to_string(_mm->header->type), \
57 strna(sd_bus_message_get_sender(_mm)), \
58 strna(sd_bus_message_get_destination(_mm)), \
59 strna(sd_bus_message_get_path(_mm)), \
60 strna(sd_bus_message_get_interface(_mm)), \
61 strna(sd_bus_message_get_member(_mm)), \
62 BUS_MESSAGE_COOKIE(_mm), \
64 strna(_mm->error.message)); \
67 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
68 static int attach_io_events(sd_bus
*b
);
69 static void detach_io_events(sd_bus
*b
);
71 static void bus_close_fds(sd_bus
*b
) {
76 if (b
->input_fd
!= b
->output_fd
)
77 safe_close(b
->output_fd
);
78 b
->output_fd
= b
->input_fd
= safe_close(b
->input_fd
);
81 static void bus_reset_queues(sd_bus
*b
) {
84 while (b
->rqueue_size
> 0)
85 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
89 b
->rqueue_allocated
= 0;
91 while (b
->wqueue_size
> 0)
92 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
96 b
->wqueue_allocated
= 0;
99 static void bus_free(sd_bus
*b
) {
103 assert(!b
->track_queue
);
105 b
->state
= BUS_CLOSED
;
107 sd_bus_detach_event(b
);
109 while ((s
= b
->slots
)) {
110 /* At this point only floating slots can still be
111 * around, because the non-floating ones keep a
112 * reference to the bus, and we thus couldn't be
113 * destructing right now... We forcibly disconnect the
114 * slots here, so that they still can be referenced by
115 * apps, but are dead. */
118 bus_slot_disconnect(s
);
119 sd_bus_slot_unref(s
);
122 if (b
->default_bus_ptr
)
123 *b
->default_bus_ptr
= NULL
;
128 munmap(b
->kdbus_buffer
, KDBUS_POOL_SIZE
);
132 free(b
->unique_name
);
133 free(b
->auth_buffer
);
138 free(b
->cgroup_root
);
139 free(b
->description
);
142 strv_free(b
->exec_argv
);
144 close_many(b
->fds
, b
->n_fds
);
149 ordered_hashmap_free_free(b
->reply_callbacks
);
150 prioq_free(b
->reply_callbacks_prioq
);
152 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
153 bus_match_free(&b
->match_callbacks
);
155 hashmap_free_free(b
->vtable_methods
);
156 hashmap_free_free(b
->vtable_properties
);
158 assert(hashmap_isempty(b
->nodes
));
159 hashmap_free(b
->nodes
);
161 bus_kernel_flush_memfd(b
);
163 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
168 _public_
int sd_bus_new(sd_bus
**ret
) {
171 assert_return(ret
, -EINVAL
);
177 r
->n_ref
= REFCNT_INIT
;
178 r
->input_fd
= r
->output_fd
= -1;
179 r
->message_version
= 1;
180 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
181 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
182 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
183 r
->original_pid
= getpid();
185 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
187 /* We guarantee that wqueue always has space for at least one
189 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
198 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
201 assert_return(bus
, -EINVAL
);
202 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
203 assert_return(address
, -EINVAL
);
204 assert_return(!bus_pid_changed(bus
), -ECHILD
);
216 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
217 assert_return(bus
, -EINVAL
);
218 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
219 assert_return(input_fd
>= 0, -EINVAL
);
220 assert_return(output_fd
>= 0, -EINVAL
);
221 assert_return(!bus_pid_changed(bus
), -ECHILD
);
223 bus
->input_fd
= input_fd
;
224 bus
->output_fd
= output_fd
;
228 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
231 assert_return(bus
, -EINVAL
);
232 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
233 assert_return(path
, -EINVAL
);
234 assert_return(!strv_isempty(argv
), -EINVAL
);
235 assert_return(!bus_pid_changed(bus
), -ECHILD
);
247 free(bus
->exec_path
);
248 strv_free(bus
->exec_argv
);
256 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
257 assert_return(bus
, -EINVAL
);
258 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
259 assert_return(!bus_pid_changed(bus
), -ECHILD
);
261 bus
->bus_client
= !!b
;
265 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
266 assert_return(bus
, -EINVAL
);
267 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
268 assert_return(!bus_pid_changed(bus
), -ECHILD
);
270 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_MONITOR
, b
);
274 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
275 assert_return(bus
, -EINVAL
);
276 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
277 assert_return(!bus_pid_changed(bus
), -ECHILD
);
279 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
283 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
285 assert_return(bus
, -EINVAL
);
286 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
287 assert_return(!bus_pid_changed(bus
), -ECHILD
);
289 new_flags
= bus
->attach_flags
;
290 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
292 if (bus
->attach_flags
== new_flags
)
295 bus
->attach_flags
= new_flags
;
296 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
297 bus_kernel_realize_attach_flags(bus
);
302 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
305 assert_return(bus
, -EINVAL
);
306 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
307 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
308 assert_return(!bus_pid_changed(bus
), -ECHILD
);
311 bus
->creds_mask
|= mask
;
313 bus
->creds_mask
&= ~mask
;
315 /* The well knowns we need unconditionally, so that matches can work */
316 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
318 /* Make sure we don't lose the timestamp flag */
319 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
320 if (bus
->attach_flags
== new_flags
)
323 bus
->attach_flags
= new_flags
;
324 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
325 bus_kernel_realize_attach_flags(bus
);
330 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
331 assert_return(bus
, -EINVAL
);
332 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
333 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
334 assert_return(!bus_pid_changed(bus
), -ECHILD
);
336 bus
->is_server
= !!b
;
337 bus
->server_id
= server_id
;
341 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
342 assert_return(bus
, -EINVAL
);
343 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
344 assert_return(!bus_pid_changed(bus
), -ECHILD
);
346 bus
->anonymous_auth
= !!b
;
350 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
351 assert_return(bus
, -EINVAL
);
352 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
353 assert_return(!bus_pid_changed(bus
), -ECHILD
);
359 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
360 assert_return(bus
, -EINVAL
);
361 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
362 assert_return(!bus_pid_changed(bus
), -ECHILD
);
364 return free_and_strdup(&bus
->description
, description
);
367 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
368 assert_return(bus
, -EINVAL
);
369 assert_return(!bus_pid_changed(bus
), -ECHILD
);
371 bus
->allow_interactive_authorization
= !!b
;
375 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
376 assert_return(bus
, -EINVAL
);
377 assert_return(!bus_pid_changed(bus
), -ECHILD
);
379 return bus
->allow_interactive_authorization
;
382 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
390 assert(bus
->state
== BUS_HELLO
|| bus
->state
== BUS_CLOSING
);
392 r
= sd_bus_message_get_errno(reply
);
396 r
= sd_bus_message_read(reply
, "s", &s
);
400 if (!service_name_is_valid(s
) || s
[0] != ':')
403 bus
->unique_name
= strdup(s
);
404 if (!bus
->unique_name
)
407 if (bus
->state
== BUS_HELLO
)
408 bus
->state
= BUS_RUNNING
;
413 static int bus_send_hello(sd_bus
*bus
) {
414 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
419 if (!bus
->bus_client
|| bus
->is_kernel
)
422 r
= sd_bus_message_new_method_call(
425 "org.freedesktop.DBus",
426 "/org/freedesktop/DBus",
427 "org.freedesktop.DBus",
432 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
435 int bus_start_running(sd_bus
*bus
) {
438 if (bus
->bus_client
&& !bus
->is_kernel
) {
439 bus
->state
= BUS_HELLO
;
443 bus
->state
= BUS_RUNNING
;
447 static int parse_address_key(const char **p
, const char *key
, char **value
) {
448 size_t l
, n
= 0, allocated
= 0;
458 if (strncmp(*p
, key
, l
) != 0)
471 while (*a
!= ';' && *a
!= ',' && *a
!= 0) {
489 c
= (char) ((x
<< 4) | y
);
496 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
520 static void skip_address_key(const char **p
) {
524 *p
+= strcspn(*p
, ",");
530 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
531 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
540 while (**p
!= 0 && **p
!= ';') {
541 r
= parse_address_key(p
, "guid", guid
);
547 r
= parse_address_key(p
, "path", &path
);
553 r
= parse_address_key(p
, "abstract", &abstract
);
562 if (!path
&& !abstract
)
565 if (path
&& abstract
)
570 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
573 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
574 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
575 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
576 } else if (abstract
) {
577 l
= strlen(abstract
);
578 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
581 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
582 b
->sockaddr
.un
.sun_path
[0] = 0;
583 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
584 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
590 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
591 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
593 struct addrinfo
*result
, hints
= {
594 .ai_socktype
= SOCK_STREAM
,
595 .ai_flags
= AI_ADDRCONFIG
,
603 while (**p
!= 0 && **p
!= ';') {
604 r
= parse_address_key(p
, "guid", guid
);
610 r
= parse_address_key(p
, "host", &host
);
616 r
= parse_address_key(p
, "port", &port
);
622 r
= parse_address_key(p
, "family", &family
);
635 if (streq(family
, "ipv4"))
636 hints
.ai_family
= AF_INET
;
637 else if (streq(family
, "ipv6"))
638 hints
.ai_family
= AF_INET6
;
643 r
= getaddrinfo(host
, port
, &hints
, &result
);
647 return -EADDRNOTAVAIL
;
649 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
650 b
->sockaddr_size
= result
->ai_addrlen
;
652 freeaddrinfo(result
);
657 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
659 unsigned n_argv
= 0, j
;
661 size_t allocated
= 0;
669 while (**p
!= 0 && **p
!= ';') {
670 r
= parse_address_key(p
, "guid", guid
);
676 r
= parse_address_key(p
, "path", &path
);
682 if (startswith(*p
, "argv")) {
686 ul
= strtoul(*p
+ 4, (char**) p
, 10);
687 if (errno
> 0 || **p
!= '=' || ul
> 256) {
695 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
703 r
= parse_address_key(p
, NULL
, argv
+ ul
);
718 /* Make sure there are no holes in the array, with the
719 * exception of argv[0] */
720 for (j
= 1; j
< n_argv
; j
++)
726 if (argv
&& argv
[0] == NULL
) {
727 argv
[0] = strdup(path
);
739 for (j
= 0; j
< n_argv
; j
++)
747 static int parse_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
748 _cleanup_free_
char *path
= NULL
;
756 while (**p
!= 0 && **p
!= ';') {
757 r
= parse_address_key(p
, "guid", guid
);
763 r
= parse_address_key(p
, "path", &path
);
782 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
783 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
791 while (**p
!= 0 && **p
!= ';') {
792 r
= parse_address_key(p
, "guid", guid
);
798 r
= parse_address_key(p
, "machine", &machine
);
804 r
= parse_address_key(p
, "pid", &pid
);
813 if (!machine
== !pid
)
817 if (!machine_name_is_valid(machine
))
821 b
->machine
= machine
;
829 r
= parse_pid(pid
, &b
->nspid
);
835 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
836 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
837 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + strlen("/var/run/dbus/system_bus_socket");
842 static int parse_container_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
843 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
851 while (**p
!= 0 && **p
!= ';') {
852 r
= parse_address_key(p
, "guid", guid
);
858 r
= parse_address_key(p
, "machine", &machine
);
864 r
= parse_address_key(p
, "pid", &pid
);
873 if (!machine
== !pid
)
877 if (!machine_name_is_valid(machine
))
881 b
->machine
= machine
;
889 r
= parse_pid(pid
, &b
->nspid
);
895 r
= free_and_strdup(&b
->kernel
, "/sys/fs/kdbus/0-system/bus");
902 static void bus_reset_parsed_address(sd_bus
*b
) {
906 b
->sockaddr_size
= 0;
907 strv_free(b
->exec_argv
);
911 b
->server_id
= SD_ID128_NULL
;
919 static int bus_parse_next_address(sd_bus
*b
) {
920 _cleanup_free_
char *guid
= NULL
;
928 if (b
->address
[b
->address_index
] == 0)
931 bus_reset_parsed_address(b
);
933 a
= b
->address
+ b
->address_index
;
942 if (startswith(a
, "unix:")) {
945 r
= parse_unix_address(b
, &a
, &guid
);
950 } else if (startswith(a
, "tcp:")) {
953 r
= parse_tcp_address(b
, &a
, &guid
);
959 } else if (startswith(a
, "unixexec:")) {
962 r
= parse_exec_address(b
, &a
, &guid
);
968 } else if (startswith(a
, "kernel:")) {
971 r
= parse_kernel_address(b
, &a
, &guid
);
976 } else if (startswith(a
, "x-machine-unix:")) {
979 r
= parse_container_unix_address(b
, &a
, &guid
);
984 } else if (startswith(a
, "x-machine-kernel:")) {
987 r
= parse_container_kernel_address(b
, &a
, &guid
);
1000 r
= sd_id128_from_string(guid
, &b
->server_id
);
1005 b
->address_index
= a
- b
->address
;
1009 static int bus_start_address(sd_bus
*b
) {
1015 bool skipped
= false;
1020 r
= bus_socket_exec(b
);
1021 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
)
1022 r
= bus_container_connect_kernel(b
);
1023 else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1024 r
= bus_container_connect_socket(b
);
1026 r
= bus_kernel_connect(b
);
1027 else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1028 r
= bus_socket_connect(b
);
1034 r
= attach_io_events(b
);
1039 b
->last_connect_error
= -r
;
1042 r
= bus_parse_next_address(b
);
1046 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1050 int bus_next_address(sd_bus
*b
) {
1053 bus_reset_parsed_address(b
);
1054 return bus_start_address(b
);
1057 static int bus_start_fd(sd_bus
*b
) {
1062 assert(b
->input_fd
>= 0);
1063 assert(b
->output_fd
>= 0);
1065 r
= fd_nonblock(b
->input_fd
, true);
1069 r
= fd_cloexec(b
->input_fd
, true);
1073 if (b
->input_fd
!= b
->output_fd
) {
1074 r
= fd_nonblock(b
->output_fd
, true);
1078 r
= fd_cloexec(b
->output_fd
, true);
1083 if (fstat(b
->input_fd
, &st
) < 0)
1086 if (S_ISCHR(b
->input_fd
))
1087 return bus_kernel_take_fd(b
);
1089 return bus_socket_take_fd(b
);
1092 _public_
int sd_bus_start(sd_bus
*bus
) {
1095 assert_return(bus
, -EINVAL
);
1096 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1097 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1099 bus
->state
= BUS_OPENING
;
1101 if (bus
->is_server
&& bus
->bus_client
)
1104 if (bus
->input_fd
>= 0)
1105 r
= bus_start_fd(bus
);
1106 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1107 r
= bus_start_address(bus
);
1116 return bus_send_hello(bus
);
1119 _public_
int sd_bus_open(sd_bus
**ret
) {
1124 assert_return(ret
, -EINVAL
);
1126 /* Let's connect to the starter bus if it is set, and
1127 * otherwise to the bus that is appropropriate for the scope
1128 * we are running in */
1130 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1132 if (streq(e
, "system"))
1133 return sd_bus_open_system(ret
);
1134 else if (STR_IN_SET(e
, "session", "user"))
1135 return sd_bus_open_user(ret
);
1138 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1140 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1141 return sd_bus_open_user(ret
);
1143 return sd_bus_open_system(ret
);
1150 r
= sd_bus_set_address(b
, e
);
1154 b
->bus_client
= true;
1156 /* We don't know whether the bus is trusted or not, so better
1157 * be safe, and authenticate everything */
1159 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1160 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1162 r
= sd_bus_start(b
);
1174 int bus_set_address_system(sd_bus
*b
) {
1178 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1180 return sd_bus_set_address(b
, e
);
1182 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1185 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1189 assert_return(ret
, -EINVAL
);
1195 r
= bus_set_address_system(b
);
1199 b
->bus_client
= true;
1200 b
->is_system
= true;
1202 /* Let's do per-method access control on the system bus. We
1203 * need the caller's UID and capability set for that. */
1205 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1206 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1208 r
= sd_bus_start(b
);
1220 int bus_set_address_user(sd_bus
*b
) {
1225 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1227 return sd_bus_set_address(b
, e
);
1229 e
= secure_getenv("XDG_RUNTIME_DIR");
1231 _cleanup_free_
char *ee
= NULL
;
1233 ee
= bus_address_escape(e
);
1237 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, getuid(), ee
);
1239 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, getuid());
1247 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1251 assert_return(ret
, -EINVAL
);
1257 r
= bus_set_address_user(b
);
1261 b
->bus_client
= true;
1264 /* We don't do any per-method access control on the user
1268 r
= sd_bus_start(b
);
1280 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1281 _cleanup_free_
char *e
= NULL
;
1282 char *m
= NULL
, *c
= NULL
;
1287 /* Let's see if we shall enter some container */
1288 m
= strchr(host
, ':');
1292 /* Let's make sure this is not a port of some kind,
1293 * and is a valid machine name. */
1294 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1297 /* Cut out the host part */
1298 t
= strndupa(host
, m
- host
- 1);
1299 e
= bus_address_escape(t
);
1303 c
= strjoina(",argv4=--machine=", m
);
1308 e
= bus_address_escape(host
);
1313 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1320 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1324 assert_return(host
, -EINVAL
);
1325 assert_return(ret
, -EINVAL
);
1327 r
= sd_bus_new(&bus
);
1331 r
= bus_set_address_system_remote(bus
, host
);
1335 bus
->bus_client
= true;
1336 bus
->trusted
= false;
1337 bus
->is_system
= true;
1339 r
= sd_bus_start(bus
);
1351 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1352 _cleanup_free_
char *e
= NULL
;
1357 e
= bus_address_escape(machine
);
1361 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1368 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1372 assert_return(machine
, -EINVAL
);
1373 assert_return(ret
, -EINVAL
);
1374 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1376 r
= sd_bus_new(&bus
);
1380 r
= bus_set_address_system_machine(bus
, machine
);
1384 bus
->bus_client
= true;
1385 bus
->trusted
= false;
1386 bus
->is_system
= true;
1388 r
= sd_bus_start(bus
);
1400 _public_
void sd_bus_close(sd_bus
*bus
) {
1404 if (bus
->state
== BUS_CLOSED
)
1406 if (bus_pid_changed(bus
))
1409 bus
->state
= BUS_CLOSED
;
1411 sd_bus_detach_event(bus
);
1413 /* Drop all queued messages so that they drop references to
1414 * the bus object and the bus may be freed */
1415 bus_reset_queues(bus
);
1417 if (!bus
->is_kernel
)
1420 /* We'll leave the fd open in case this is a kernel bus, since
1421 * there might still be memblocks around that reference this
1422 * bus, and they might need to invoke the KDBUS_CMD_FREE
1423 * ioctl on the fd when they are freed. */
1426 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1434 return sd_bus_unref(bus
);
1437 static void bus_enter_closing(sd_bus
*bus
) {
1440 if (bus
->state
!= BUS_OPENING
&&
1441 bus
->state
!= BUS_AUTHENTICATING
&&
1442 bus
->state
!= BUS_HELLO
&&
1443 bus
->state
!= BUS_RUNNING
)
1446 bus
->state
= BUS_CLOSING
;
1449 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1450 assert_return(bus
, NULL
);
1452 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1457 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1463 i
= REFCNT_DEC(bus
->n_ref
);
1471 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1473 assert_return(bus
, -EINVAL
);
1474 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1476 return BUS_IS_OPEN(bus
->state
);
1479 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1482 assert_return(bus
, -EINVAL
);
1483 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1484 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1486 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1489 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1490 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1493 r
= bus_ensure_running(bus
);
1497 return bus
->can_fds
;
1500 return bus_type_is_valid(type
);
1503 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1506 assert_return(bus
, -EINVAL
);
1507 assert_return(id
, -EINVAL
);
1508 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1510 r
= bus_ensure_running(bus
);
1514 *id
= bus
->server_id
;
1518 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1523 /* If we copy the same message to multiple
1524 * destinations, avoid using the same cookie
1526 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1531 timeout
= BUS_DEFAULT_TIMEOUT
;
1533 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1536 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1537 bool remarshal
= false;
1541 /* wrong packet version */
1542 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1545 /* wrong packet endianness */
1546 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1549 /* TODO: kdbus-messages received from the kernel contain data which is
1550 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1551 * force remarshaling of the message. Technically, we could just
1552 * recreate the kdbus message, but that is non-trivial as other parts of
1553 * the message refer to m->kdbus already. This should be fixed! */
1554 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1557 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1560 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1564 /* Fake some timestamps, if they were requested, and not
1565 * already initialized */
1566 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1567 if (m
->realtime
<= 0)
1568 m
->realtime
= now(CLOCK_REALTIME
);
1570 if (m
->monotonic
<= 0)
1571 m
->monotonic
= now(CLOCK_MONOTONIC
);
1574 /* The bus specification says the serial number cannot be 0,
1575 * hence let's fill something in for synthetic messages. Since
1576 * synthetic messages might have a fake sender and we don't
1577 * want to interfere with the real sender's serial numbers we
1578 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1579 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1580 * even though kdbus can do 64bit. */
1581 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1584 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1591 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1593 r
= bus_socket_write_message(bus
, m
, idx
);
1598 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1599 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1600 bus_message_type_to_string(m
->header
->type
),
1601 strna(sd_bus_message_get_sender(m
)),
1602 strna(sd_bus_message_get_destination(m
)),
1603 strna(sd_bus_message_get_path(m
)),
1604 strna(sd_bus_message_get_interface(m
)),
1605 strna(sd_bus_message_get_member(m
)),
1606 BUS_MESSAGE_COOKIE(m
),
1608 strna(m
->error
.message
));
1613 static int dispatch_wqueue(sd_bus
*bus
) {
1617 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1619 while (bus
->wqueue_size
> 0) {
1621 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1625 /* Didn't do anything this time */
1627 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1628 /* Fully written. Let's drop the entry from
1631 * This isn't particularly optimized, but
1632 * well, this is supposed to be our worst-case
1633 * buffer only, and the socket buffer is
1634 * supposed to be our primary buffer, and if
1635 * it got full, then all bets are off
1638 bus
->wqueue_size
--;
1639 sd_bus_message_unref(bus
->wqueue
[0]);
1640 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1650 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1654 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1656 return bus_socket_read_message(bus
);
1659 int bus_rqueue_make_room(sd_bus
*bus
) {
1662 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1665 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1671 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1676 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1678 /* Note that the priority logic is only available on kdbus,
1679 * where the rqueue is unused. We check the rqueue here
1680 * anyway, because it's simple... */
1683 if (bus
->rqueue_size
> 0) {
1684 /* Dispatch a queued message */
1686 *m
= bus
->rqueue
[0];
1687 bus
->rqueue_size
--;
1688 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1692 /* Try to read a new message */
1693 r
= bus_read_message(bus
, hint_priority
, priority
);
1703 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1704 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1707 assert_return(m
, -EINVAL
);
1712 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1713 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1715 if (!BUS_IS_OPEN(bus
->state
))
1719 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1726 /* If the cookie number isn't kept, then we know that no reply
1728 if (!cookie
&& !m
->sealed
)
1729 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1731 r
= bus_seal_message(bus
, m
, 0);
1735 /* Remarshall if we have to. This will possibly unref the
1736 * message and place a replacement in m */
1737 r
= bus_remarshal_message(bus
, &m
);
1741 /* If this is a reply and no reply was requested, then let's
1742 * suppress this, if we can */
1746 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1749 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1751 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1752 bus_enter_closing(bus
);
1759 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1760 /* Wasn't fully written. So let's remember how
1761 * much was written. Note that the first entry
1762 * of the wqueue array is always allocated so
1763 * that we always can remember how much was
1765 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1766 bus
->wqueue_size
= 1;
1771 /* Just append it to the queue. */
1773 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1776 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1779 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1784 *cookie
= BUS_MESSAGE_COOKIE(m
);
1789 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1790 return bus_send_internal(bus
, m
, cookie
, false);
1793 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1796 assert_return(m
, -EINVAL
);
1801 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1803 if (!BUS_IS_OPEN(bus
->state
))
1806 if (!streq_ptr(m
->destination
, destination
)) {
1811 r
= sd_bus_message_set_destination(m
, destination
);
1816 return sd_bus_send(bus
, m
, cookie
);
1819 static usec_t
calc_elapse(uint64_t usec
) {
1820 if (usec
== (uint64_t) -1)
1823 return now(CLOCK_MONOTONIC
) + usec
;
1826 static int timeout_compare(const void *a
, const void *b
) {
1827 const struct reply_callback
*x
= a
, *y
= b
;
1829 if (x
->timeout
!= 0 && y
->timeout
== 0)
1832 if (x
->timeout
== 0 && y
->timeout
!= 0)
1835 if (x
->timeout
< y
->timeout
)
1838 if (x
->timeout
> y
->timeout
)
1844 _public_
int sd_bus_call_async(
1848 sd_bus_message_handler_t callback
,
1852 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1853 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1856 assert_return(m
, -EINVAL
);
1857 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1858 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1859 assert_return(callback
, -EINVAL
);
1864 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1865 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1867 if (!BUS_IS_OPEN(bus
->state
))
1870 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1874 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1878 r
= bus_seal_message(bus
, m
, usec
);
1882 r
= bus_remarshal_message(bus
, &m
);
1886 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1890 s
->reply_callback
.callback
= callback
;
1892 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1893 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1895 s
->reply_callback
.cookie
= 0;
1899 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1900 if (s
->reply_callback
.timeout
!= 0) {
1901 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1903 s
->reply_callback
.timeout
= 0;
1908 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1919 int bus_ensure_running(sd_bus
*bus
) {
1924 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1926 if (bus
->state
== BUS_RUNNING
)
1930 r
= sd_bus_process(bus
, NULL
);
1933 if (bus
->state
== BUS_RUNNING
)
1938 r
= sd_bus_wait(bus
, (uint64_t) -1);
1944 _public_
int sd_bus_call(
1948 sd_bus_error
*error
,
1949 sd_bus_message
**reply
) {
1951 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1957 assert_return(m
, -EINVAL
);
1958 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1959 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1960 assert_return(!bus_error_is_dirty(error
), -EINVAL
);
1965 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1966 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1968 if (!BUS_IS_OPEN(bus
->state
))
1971 r
= bus_ensure_running(bus
);
1975 i
= bus
->rqueue_size
;
1977 r
= bus_seal_message(bus
, m
, usec
);
1981 r
= bus_remarshal_message(bus
, &m
);
1985 r
= bus_send_internal(bus
, m
, &cookie
, true);
1989 timeout
= calc_elapse(m
->timeout
);
1994 while (i
< bus
->rqueue_size
) {
1995 sd_bus_message
*incoming
= NULL
;
1997 incoming
= bus
->rqueue
[i
];
1999 if (incoming
->reply_cookie
== cookie
) {
2000 /* Found a match! */
2002 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2004 log_debug_bus_message(incoming
);
2006 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2008 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2012 sd_bus_message_unref(incoming
);
2017 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2019 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
)
2020 r
= sd_bus_error_copy(error
, &incoming
->error
);
2024 sd_bus_message_unref(incoming
);
2027 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2030 streq(bus
->unique_name
, incoming
->sender
)) {
2032 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2035 /* Our own message? Somebody is trying
2036 * to send its own client a message,
2037 * let's not dead-lock, let's fail
2040 sd_bus_message_unref(incoming
);
2044 /* Try to read more, right-away */
2048 r
= bus_read_message(bus
, false, 0);
2050 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2051 bus_enter_closing(bus
);
2063 n
= now(CLOCK_MONOTONIC
);
2069 left
= (uint64_t) -1;
2071 r
= bus_poll(bus
, true, left
);
2077 r
= dispatch_wqueue(bus
);
2079 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2080 bus_enter_closing(bus
);
2089 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2091 assert_return(bus
, -EINVAL
);
2092 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2093 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2095 return bus
->input_fd
;
2098 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2101 assert_return(bus
, -EINVAL
);
2102 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2104 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2107 if (bus
->state
== BUS_OPENING
)
2109 else if (bus
->state
== BUS_AUTHENTICATING
) {
2111 if (bus_socket_auth_needs_write(bus
))
2116 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2117 if (bus
->rqueue_size
<= 0)
2119 if (bus
->wqueue_size
> 0)
2126 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2127 struct reply_callback
*c
;
2129 assert_return(bus
, -EINVAL
);
2130 assert_return(timeout_usec
, -EINVAL
);
2131 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2133 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2136 if (bus
->track_queue
) {
2141 if (bus
->state
== BUS_CLOSING
) {
2146 if (bus
->state
== BUS_AUTHENTICATING
) {
2147 *timeout_usec
= bus
->auth_timeout
;
2151 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2152 *timeout_usec
= (uint64_t) -1;
2156 if (bus
->rqueue_size
> 0) {
2161 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2163 *timeout_usec
= (uint64_t) -1;
2167 if (c
->timeout
== 0) {
2168 *timeout_usec
= (uint64_t) -1;
2172 *timeout_usec
= c
->timeout
;
2176 static int process_timeout(sd_bus
*bus
) {
2177 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2178 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2179 struct reply_callback
*c
;
2186 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2190 n
= now(CLOCK_MONOTONIC
);
2194 r
= bus_message_new_synthetic_error(
2197 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2202 r
= bus_seal_synthetic_message(bus
, m
);
2206 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2209 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2212 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2214 bus
->iteration_counter
++;
2216 bus
->current_message
= m
;
2217 bus
->current_slot
= sd_bus_slot_ref(slot
);
2218 bus
->current_handler
= c
->callback
;
2219 bus
->current_userdata
= slot
->userdata
;
2220 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2221 bus
->current_userdata
= NULL
;
2222 bus
->current_handler
= NULL
;
2223 bus
->current_slot
= NULL
;
2224 bus
->current_message
= NULL
;
2226 if (slot
->floating
) {
2227 bus_slot_disconnect(slot
);
2228 sd_bus_slot_unref(slot
);
2231 sd_bus_slot_unref(slot
);
2233 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2236 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2240 if (bus
->state
!= BUS_HELLO
)
2243 /* Let's make sure the first message on the bus is the HELLO
2244 * reply. But note that we don't actually parse the message
2245 * here (we leave that to the usual handling), we just verify
2246 * we don't let any earlier msg through. */
2248 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2249 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2252 if (m
->reply_cookie
!= 1)
2258 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2259 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2260 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2261 struct reply_callback
*c
;
2268 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2269 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2272 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2275 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2278 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2284 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2286 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2288 /* If the reply contained a file descriptor which we
2289 * didn't want we pass an error instead. */
2291 r
= bus_message_new_synthetic_error(
2294 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2299 /* Copy over original timestamp */
2300 synthetic_reply
->realtime
= m
->realtime
;
2301 synthetic_reply
->monotonic
= m
->monotonic
;
2302 synthetic_reply
->seqnum
= m
->seqnum
;
2304 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2308 m
= synthetic_reply
;
2310 r
= sd_bus_message_rewind(m
, true);
2315 if (c
->timeout
!= 0) {
2316 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2320 bus
->current_slot
= sd_bus_slot_ref(slot
);
2321 bus
->current_handler
= c
->callback
;
2322 bus
->current_userdata
= slot
->userdata
;
2323 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2324 bus
->current_userdata
= NULL
;
2325 bus
->current_handler
= NULL
;
2326 bus
->current_slot
= NULL
;
2328 if (slot
->floating
) {
2329 bus_slot_disconnect(slot
);
2330 sd_bus_slot_unref(slot
);
2333 sd_bus_slot_unref(slot
);
2335 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2338 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2339 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2340 struct filter_callback
*l
;
2347 bus
->filter_callbacks_modified
= false;
2349 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2352 if (bus
->filter_callbacks_modified
)
2355 /* Don't run this more than once per iteration */
2356 if (l
->last_iteration
== bus
->iteration_counter
)
2359 l
->last_iteration
= bus
->iteration_counter
;
2361 r
= sd_bus_message_rewind(m
, true);
2365 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2367 bus
->current_slot
= sd_bus_slot_ref(slot
);
2368 bus
->current_handler
= l
->callback
;
2369 bus
->current_userdata
= slot
->userdata
;
2370 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2371 bus
->current_userdata
= NULL
;
2372 bus
->current_handler
= NULL
;
2373 bus
->current_slot
= sd_bus_slot_unref(slot
);
2375 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2381 } while (bus
->filter_callbacks_modified
);
2386 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2393 bus
->match_callbacks_modified
= false;
2395 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2399 } while (bus
->match_callbacks_modified
);
2404 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2405 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2411 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2414 if (bus
->manual_peer_interface
)
2417 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2420 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2423 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2426 if (streq_ptr(m
->member
, "Ping"))
2427 r
= sd_bus_message_new_method_return(m
, &reply
);
2428 else if (streq_ptr(m
->member
, "GetMachineId")) {
2432 r
= sd_id128_get_machine(&id
);
2436 r
= sd_bus_message_new_method_return(m
, &reply
);
2440 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2442 r
= sd_bus_message_new_method_errorf(
2444 SD_BUS_ERROR_UNKNOWN_METHOD
,
2445 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2451 r
= sd_bus_send(bus
, reply
, NULL
);
2458 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2462 /* If we got a message with a file descriptor which we didn't
2463 * want to accept, then let's drop it. How can this even
2464 * happen? For example, when the kernel queues a message into
2465 * an activatable names's queue which allows fds, and then is
2466 * delivered to us later even though we ourselves did not
2469 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2475 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2478 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2479 return 1; /* just eat it up */
2481 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2484 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2490 bus
->current_message
= m
;
2491 bus
->iteration_counter
++;
2493 log_debug_bus_message(m
);
2495 r
= process_hello(bus
, m
);
2499 r
= process_reply(bus
, m
);
2503 r
= process_fd_check(bus
, m
);
2507 r
= process_filter(bus
, m
);
2511 r
= process_match(bus
, m
);
2515 r
= process_builtin(bus
, m
);
2519 r
= bus_process_object(bus
, m
);
2522 bus
->current_message
= NULL
;
2526 static int dispatch_track(sd_bus
*bus
) {
2529 if (!bus
->track_queue
)
2532 bus_track_dispatch(bus
->track_queue
);
2536 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2537 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2541 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2543 r
= process_timeout(bus
);
2547 r
= dispatch_wqueue(bus
);
2551 r
= dispatch_track(bus
);
2555 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2561 r
= process_message(bus
, m
);
2566 r
= sd_bus_message_rewind(m
, true);
2575 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2577 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2578 strna(sd_bus_message_get_sender(m
)),
2579 strna(sd_bus_message_get_path(m
)),
2580 strna(sd_bus_message_get_interface(m
)),
2581 strna(sd_bus_message_get_member(m
)));
2583 r
= sd_bus_reply_method_errorf(
2585 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2586 "Unknown object '%s'.", m
->path
);
2600 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2601 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2602 struct reply_callback
*c
;
2606 assert(bus
->state
== BUS_CLOSING
);
2608 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2610 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2613 /* First, fail all outstanding method calls */
2614 r
= bus_message_new_synthetic_error(
2617 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2622 r
= bus_seal_synthetic_message(bus
, m
);
2626 if (c
->timeout
!= 0) {
2627 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2631 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2634 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2636 bus
->iteration_counter
++;
2638 bus
->current_message
= m
;
2639 bus
->current_slot
= sd_bus_slot_ref(slot
);
2640 bus
->current_handler
= c
->callback
;
2641 bus
->current_userdata
= slot
->userdata
;
2642 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2643 bus
->current_userdata
= NULL
;
2644 bus
->current_handler
= NULL
;
2645 bus
->current_slot
= NULL
;
2646 bus
->current_message
= NULL
;
2648 if (slot
->floating
) {
2649 bus_slot_disconnect(slot
);
2650 sd_bus_slot_unref(slot
);
2653 sd_bus_slot_unref(slot
);
2655 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2658 /* Then, synthesize a Disconnected message */
2659 r
= sd_bus_message_new_signal(
2662 "/org/freedesktop/DBus/Local",
2663 "org.freedesktop.DBus.Local",
2668 bus_message_set_sender_local(bus
, m
);
2670 r
= bus_seal_synthetic_message(bus
, m
);
2676 bus
->current_message
= m
;
2677 bus
->iteration_counter
++;
2679 r
= process_filter(bus
, m
);
2683 r
= process_match(bus
, m
);
2695 bus
->current_message
= NULL
;
2700 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2701 BUS_DONT_DESTROY(bus
);
2704 /* Returns 0 when we didn't do anything. This should cause the
2705 * caller to invoke sd_bus_wait() before returning the next
2706 * time. Returns > 0 when we did something, which possibly
2707 * means *ret is filled in with an unprocessed message. */
2709 assert_return(bus
, -EINVAL
);
2710 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2712 /* We don't allow recursively invoking sd_bus_process(). */
2713 assert_return(!bus
->current_message
, -EBUSY
);
2714 assert(!bus
->current_slot
);
2716 switch (bus
->state
) {
2725 r
= bus_socket_process_opening(bus
);
2726 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2727 bus_enter_closing(bus
);
2735 case BUS_AUTHENTICATING
:
2736 r
= bus_socket_process_authenticating(bus
);
2737 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2738 bus_enter_closing(bus
);
2750 r
= process_running(bus
, hint_priority
, priority
, ret
);
2751 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2752 bus_enter_closing(bus
);
2762 return process_closing(bus
, ret
);
2765 assert_not_reached("Unknown state");
2768 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2769 return bus_process_internal(bus
, false, 0, ret
);
2772 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2773 return bus_process_internal(bus
, true, priority
, ret
);
2776 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2777 struct pollfd p
[2] = {};
2780 usec_t m
= USEC_INFINITY
;
2784 if (bus
->state
== BUS_CLOSING
)
2787 if (!BUS_IS_OPEN(bus
->state
))
2790 e
= sd_bus_get_events(bus
);
2795 /* The caller really needs some more data, he doesn't
2796 * care about what's already read, or any timeouts
2797 * except its own. */
2801 /* The caller wants to process if there's something to
2802 * process, but doesn't care otherwise */
2804 r
= sd_bus_get_timeout(bus
, &until
);
2809 nw
= now(CLOCK_MONOTONIC
);
2810 m
= until
> nw
? until
- nw
: 0;
2814 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2817 p
[0].fd
= bus
->input_fd
;
2818 if (bus
->output_fd
== bus
->input_fd
) {
2822 p
[0].events
= e
& POLLIN
;
2823 p
[1].fd
= bus
->output_fd
;
2824 p
[1].events
= e
& POLLOUT
;
2828 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2832 return r
> 0 ? 1 : 0;
2835 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2837 assert_return(bus
, -EINVAL
);
2838 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2840 if (bus
->state
== BUS_CLOSING
)
2843 if (!BUS_IS_OPEN(bus
->state
))
2846 if (bus
->rqueue_size
> 0)
2849 return bus_poll(bus
, false, timeout_usec
);
2852 _public_
int sd_bus_flush(sd_bus
*bus
) {
2855 assert_return(bus
, -EINVAL
);
2856 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2858 if (bus
->state
== BUS_CLOSING
)
2861 if (!BUS_IS_OPEN(bus
->state
))
2864 r
= bus_ensure_running(bus
);
2868 if (bus
->wqueue_size
<= 0)
2872 r
= dispatch_wqueue(bus
);
2874 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2875 bus_enter_closing(bus
);
2882 if (bus
->wqueue_size
<= 0)
2885 r
= bus_poll(bus
, false, (uint64_t) -1);
2891 _public_
int sd_bus_add_filter(
2894 sd_bus_message_handler_t callback
,
2899 assert_return(bus
, -EINVAL
);
2900 assert_return(callback
, -EINVAL
);
2901 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2903 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2907 s
->filter_callback
.callback
= callback
;
2909 bus
->filter_callbacks_modified
= true;
2910 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2918 _public_
int sd_bus_add_match(
2922 sd_bus_message_handler_t callback
,
2925 struct bus_match_component
*components
= NULL
;
2926 unsigned n_components
= 0;
2927 sd_bus_slot
*s
= NULL
;
2930 assert_return(bus
, -EINVAL
);
2931 assert_return(match
, -EINVAL
);
2932 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2934 r
= bus_match_parse(match
, &components
, &n_components
);
2938 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2944 s
->match_callback
.callback
= callback
;
2945 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2947 if (bus
->bus_client
) {
2948 enum bus_match_scope scope
;
2950 scope
= bus_match_get_scope(components
, n_components
);
2952 /* Do not install server-side matches for matches
2953 * against the local service, interface or bus
2955 if (scope
!= BUS_MATCH_LOCAL
) {
2957 if (!bus
->is_kernel
) {
2958 /* When this is not a kernel transport, we
2959 * store the original match string, so that we
2960 * can use it to remove the match again */
2962 s
->match_callback
.match_string
= strdup(match
);
2963 if (!s
->match_callback
.match_string
) {
2969 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
2973 s
->match_added
= true;
2977 bus
->match_callbacks_modified
= true;
2978 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
2987 bus_match_parse_free(components
, n_components
);
2988 sd_bus_slot_unref(s
);
2993 int bus_remove_match_by_string(
2996 sd_bus_message_handler_t callback
,
2999 struct bus_match_component
*components
= NULL
;
3000 unsigned n_components
= 0;
3001 struct match_callback
*c
;
3004 assert_return(bus
, -EINVAL
);
3005 assert_return(match
, -EINVAL
);
3006 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3008 r
= bus_match_parse(match
, &components
, &n_components
);
3012 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3016 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3019 bus_match_parse_free(components
, n_components
);
3024 bool bus_pid_changed(sd_bus
*bus
) {
3027 /* We don't support people creating a bus connection and
3028 * keeping it around over a fork(). Let's complain. */
3030 return bus
->original_pid
!= getpid();
3033 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3034 sd_bus
*bus
= userdata
;
3039 r
= sd_bus_process(bus
, NULL
);
3046 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3047 sd_bus
*bus
= userdata
;
3052 r
= sd_bus_process(bus
, NULL
);
3059 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3060 sd_bus
*bus
= userdata
;
3067 e
= sd_bus_get_events(bus
);
3071 if (bus
->output_fd
!= bus
->input_fd
) {
3073 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3077 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3081 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3086 r
= sd_bus_get_timeout(bus
, &until
);
3092 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3097 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3104 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3105 sd_bus
*bus
= userdata
;
3115 static int attach_io_events(sd_bus
*bus
) {
3120 if (bus
->input_fd
< 0)
3126 if (!bus
->input_io_event_source
) {
3127 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3131 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3135 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3139 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3141 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3146 if (bus
->output_fd
!= bus
->input_fd
) {
3147 assert(bus
->output_fd
>= 0);
3149 if (!bus
->output_io_event_source
) {
3150 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3154 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3158 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3160 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3169 static void detach_io_events(sd_bus
*bus
) {
3172 if (bus
->input_io_event_source
) {
3173 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3174 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3177 if (bus
->output_io_event_source
) {
3178 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3179 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3183 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3186 assert_return(bus
, -EINVAL
);
3187 assert_return(!bus
->event
, -EBUSY
);
3189 assert(!bus
->input_io_event_source
);
3190 assert(!bus
->output_io_event_source
);
3191 assert(!bus
->time_event_source
);
3194 bus
->event
= sd_event_ref(event
);
3196 r
= sd_event_default(&bus
->event
);
3201 bus
->event_priority
= priority
;
3203 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3207 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3211 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3215 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3219 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3223 r
= attach_io_events(bus
);
3230 sd_bus_detach_event(bus
);
3234 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3235 assert_return(bus
, -EINVAL
);
3240 detach_io_events(bus
);
3242 if (bus
->time_event_source
) {
3243 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3244 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3247 if (bus
->quit_event_source
) {
3248 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3249 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3252 bus
->event
= sd_event_unref(bus
->event
);
3256 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3257 assert_return(bus
, NULL
);
3262 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3263 assert_return(bus
, NULL
);
3265 return bus
->current_message
;
3268 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3269 assert_return(bus
, NULL
);
3271 return bus
->current_slot
;
3274 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3275 assert_return(bus
, NULL
);
3277 return bus
->current_handler
;
3280 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3281 assert_return(bus
, NULL
);
3283 return bus
->current_userdata
;
3286 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3291 assert(default_bus
);
3294 return !!*default_bus
;
3297 *ret
= sd_bus_ref(*default_bus
);
3305 b
->default_bus_ptr
= default_bus
;
3313 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3314 static thread_local sd_bus
*default_system_bus
= NULL
;
3316 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3319 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3320 static thread_local sd_bus
*default_user_bus
= NULL
;
3322 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3325 _public_
int sd_bus_default(sd_bus
**ret
) {
3329 /* Let's try our best to reuse another cached connection. If
3330 * the starter bus type is set, connect via our normal
3331 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3332 * we can share the connection with the user/system default
3335 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3337 if (streq(e
, "system"))
3338 return sd_bus_default_system(ret
);
3339 else if (STR_IN_SET(e
, "user", "session"))
3340 return sd_bus_default_user(ret
);
3343 /* No type is specified, so we have not other option than to
3344 * use the starter address if it is set. */
3346 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3348 static thread_local sd_bus
*default_starter_bus
= NULL
;
3350 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3353 /* Finally, if nothing is set use the cached connection for
3354 * the right scope */
3356 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3357 return sd_bus_default_user(ret
);
3359 return sd_bus_default_system(ret
);
3362 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3363 assert_return(b
, -EINVAL
);
3364 assert_return(tid
, -EINVAL
);
3365 assert_return(!bus_pid_changed(b
), -ECHILD
);
3373 return sd_event_get_tid(b
->event
, tid
);
3378 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3379 _cleanup_free_
char *e
= NULL
;
3382 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3383 assert_return(external_id
, -EINVAL
);
3384 assert_return(ret_path
, -EINVAL
);
3386 e
= bus_label_escape(external_id
);
3390 ret
= strjoin(prefix
, "/", e
, NULL
);
3398 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3402 assert_return(object_path_is_valid(path
), -EINVAL
);
3403 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3404 assert_return(external_id
, -EINVAL
);
3406 e
= object_path_startswith(path
, prefix
);
3408 *external_id
= NULL
;
3412 ret
= bus_label_unescape(e
);
3420 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3423 assert_return(bus
, -EINVAL
);
3424 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3426 if (!bus
->is_kernel
)
3429 if (!BUS_IS_OPEN(bus
->state
))
3432 if (bus
->rqueue_size
> 0)
3435 if (bus
->wqueue_size
> 0)
3438 r
= bus_kernel_try_close(bus
);
3446 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3447 assert_return(bus
, -EINVAL
);
3448 assert_return(description
, -EINVAL
);
3449 assert_return(bus
->description
, -ENXIO
);
3450 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3452 *description
= bus
->description
;
3456 int bus_get_root_path(sd_bus
*bus
) {
3459 if (bus
->cgroup_root
)
3462 r
= cg_get_root_path(&bus
->cgroup_root
);
3464 bus
->cgroup_root
= strdup("/");
3465 if (!bus
->cgroup_root
)
3474 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3477 assert_return(bus
, -EINVAL
);
3478 assert_return(scope
, -EINVAL
);
3479 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3481 if (bus
->is_kernel
) {
3482 _cleanup_free_
char *n
= NULL
;
3485 r
= bus_kernel_get_bus_name(bus
, &n
);
3489 if (streq(n
, "0-system")) {
3494 dash
= strchr(n
, '-');
3495 if (streq_ptr(dash
, "-user")) {
3506 if (bus
->is_system
) {
3514 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3516 assert_return(bus
, -EINVAL
);
3517 assert_return(address
, -EINVAL
);
3518 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3521 *address
= bus
->address
;
3528 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3529 assert_return(bus
, -EINVAL
);
3530 assert_return(mask
, -EINVAL
);
3531 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3533 *mask
= bus
->creds_mask
;
3537 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3538 assert_return(bus
, -EINVAL
);
3539 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3541 return bus
->bus_client
;
3544 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3545 assert_return(bus
, -EINVAL
);
3546 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3548 return bus
->is_server
;
3551 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3552 assert_return(bus
, -EINVAL
);
3553 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3555 return bus
->anonymous_auth
;
3558 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3559 assert_return(bus
, -EINVAL
);
3560 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3562 return bus
->trusted
;
3565 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3566 assert_return(bus
, -EINVAL
);
3567 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3569 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);