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
) {
77 safe_close(b
->input_fd
);
79 if (b
->output_fd
>= 0 && b
->output_fd
!= b
->input_fd
)
80 safe_close(b
->output_fd
);
82 b
->input_fd
= b
->output_fd
= -1;
85 static void bus_reset_queues(sd_bus
*b
) {
88 while (b
->rqueue_size
> 0)
89 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
93 b
->rqueue_allocated
= 0;
95 while (b
->wqueue_size
> 0)
96 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
100 b
->wqueue_allocated
= 0;
103 static void bus_free(sd_bus
*b
) {
107 assert(!b
->track_queue
);
109 b
->state
= BUS_CLOSED
;
111 sd_bus_detach_event(b
);
113 while ((s
= b
->slots
)) {
114 /* At this point only floating slots can still be
115 * around, because the non-floating ones keep a
116 * reference to the bus, and we thus couldn't be
117 * destructing right now... We forcibly disconnect the
118 * slots here, so that they still can be referenced by
119 * apps, but are dead. */
122 bus_slot_disconnect(s
);
123 sd_bus_slot_unref(s
);
126 if (b
->default_bus_ptr
)
127 *b
->default_bus_ptr
= NULL
;
132 munmap(b
->kdbus_buffer
, KDBUS_POOL_SIZE
);
136 free(b
->unique_name
);
137 free(b
->auth_buffer
);
142 free(b
->cgroup_root
);
143 free(b
->description
);
146 strv_free(b
->exec_argv
);
148 close_many(b
->fds
, b
->n_fds
);
153 ordered_hashmap_free_free(b
->reply_callbacks
);
154 prioq_free(b
->reply_callbacks_prioq
);
156 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
157 bus_match_free(&b
->match_callbacks
);
159 hashmap_free_free(b
->vtable_methods
);
160 hashmap_free_free(b
->vtable_properties
);
162 assert(hashmap_isempty(b
->nodes
));
163 hashmap_free(b
->nodes
);
165 bus_kernel_flush_memfd(b
);
167 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
172 _public_
int sd_bus_new(sd_bus
**ret
) {
175 assert_return(ret
, -EINVAL
);
181 r
->n_ref
= REFCNT_INIT
;
182 r
->input_fd
= r
->output_fd
= -1;
183 r
->message_version
= 1;
184 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
185 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
186 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
187 r
->original_pid
= getpid();
189 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
191 /* We guarantee that wqueue always has space for at least one
193 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
202 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
205 assert_return(bus
, -EINVAL
);
206 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
207 assert_return(address
, -EINVAL
);
208 assert_return(!bus_pid_changed(bus
), -ECHILD
);
220 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
221 assert_return(bus
, -EINVAL
);
222 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
223 assert_return(input_fd
>= 0, -EINVAL
);
224 assert_return(output_fd
>= 0, -EINVAL
);
225 assert_return(!bus_pid_changed(bus
), -ECHILD
);
227 bus
->input_fd
= input_fd
;
228 bus
->output_fd
= output_fd
;
232 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
235 assert_return(bus
, -EINVAL
);
236 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
237 assert_return(path
, -EINVAL
);
238 assert_return(!strv_isempty(argv
), -EINVAL
);
239 assert_return(!bus_pid_changed(bus
), -ECHILD
);
251 free(bus
->exec_path
);
252 strv_free(bus
->exec_argv
);
260 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
261 assert_return(bus
, -EINVAL
);
262 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
263 assert_return(!bus_pid_changed(bus
), -ECHILD
);
265 bus
->bus_client
= !!b
;
269 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
270 assert_return(bus
, -EINVAL
);
271 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
272 assert_return(!bus_pid_changed(bus
), -ECHILD
);
274 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_MONITOR
, b
);
278 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
279 assert_return(bus
, -EINVAL
);
280 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
281 assert_return(!bus_pid_changed(bus
), -ECHILD
);
283 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
287 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
289 assert_return(bus
, -EINVAL
);
290 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
291 assert_return(!bus_pid_changed(bus
), -ECHILD
);
293 new_flags
= bus
->attach_flags
;
294 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
296 if (bus
->attach_flags
== new_flags
)
299 bus
->attach_flags
= new_flags
;
300 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
301 bus_kernel_realize_attach_flags(bus
);
306 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
309 assert_return(bus
, -EINVAL
);
310 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
311 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
312 assert_return(!bus_pid_changed(bus
), -ECHILD
);
315 bus
->creds_mask
|= mask
;
317 bus
->creds_mask
&= ~mask
;
319 /* The well knowns we need unconditionally, so that matches can work */
320 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
322 /* Make sure we don't lose the timestamp flag */
323 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
324 if (bus
->attach_flags
== new_flags
)
327 bus
->attach_flags
= new_flags
;
328 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
329 bus_kernel_realize_attach_flags(bus
);
334 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
335 assert_return(bus
, -EINVAL
);
336 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
337 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
338 assert_return(!bus_pid_changed(bus
), -ECHILD
);
340 bus
->is_server
= !!b
;
341 bus
->server_id
= server_id
;
345 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
346 assert_return(bus
, -EINVAL
);
347 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
348 assert_return(!bus_pid_changed(bus
), -ECHILD
);
350 bus
->anonymous_auth
= !!b
;
354 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
355 assert_return(bus
, -EINVAL
);
356 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
357 assert_return(!bus_pid_changed(bus
), -ECHILD
);
363 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
364 assert_return(bus
, -EINVAL
);
365 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
366 assert_return(!bus_pid_changed(bus
), -ECHILD
);
368 return free_and_strdup(&bus
->description
, description
);
371 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
372 assert_return(bus
, -EINVAL
);
373 assert_return(!bus_pid_changed(bus
), -ECHILD
);
375 bus
->allow_interactive_authorization
= !!b
;
379 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
380 assert_return(bus
, -EINVAL
);
381 assert_return(!bus_pid_changed(bus
), -ECHILD
);
383 return bus
->allow_interactive_authorization
;
386 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
394 assert(bus
->state
== BUS_HELLO
|| bus
->state
== BUS_CLOSING
);
396 r
= sd_bus_message_get_errno(reply
);
400 r
= sd_bus_message_read(reply
, "s", &s
);
404 if (!service_name_is_valid(s
) || s
[0] != ':')
407 bus
->unique_name
= strdup(s
);
408 if (!bus
->unique_name
)
411 if (bus
->state
== BUS_HELLO
)
412 bus
->state
= BUS_RUNNING
;
417 static int bus_send_hello(sd_bus
*bus
) {
418 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
423 if (!bus
->bus_client
|| bus
->is_kernel
)
426 r
= sd_bus_message_new_method_call(
429 "org.freedesktop.DBus",
430 "/org/freedesktop/DBus",
431 "org.freedesktop.DBus",
436 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
439 int bus_start_running(sd_bus
*bus
) {
442 if (bus
->bus_client
&& !bus
->is_kernel
) {
443 bus
->state
= BUS_HELLO
;
447 bus
->state
= BUS_RUNNING
;
451 static int parse_address_key(const char **p
, const char *key
, char **value
) {
452 size_t l
, n
= 0, allocated
= 0;
462 if (strncmp(*p
, key
, l
) != 0)
475 while (*a
!= ';' && *a
!= ',' && *a
!= 0) {
493 c
= (char) ((x
<< 4) | y
);
500 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
524 static void skip_address_key(const char **p
) {
528 *p
+= strcspn(*p
, ",");
534 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
535 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
544 while (**p
!= 0 && **p
!= ';') {
545 r
= parse_address_key(p
, "guid", guid
);
551 r
= parse_address_key(p
, "path", &path
);
557 r
= parse_address_key(p
, "abstract", &abstract
);
566 if (!path
&& !abstract
)
569 if (path
&& abstract
)
574 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
577 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
578 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
579 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
580 } else if (abstract
) {
581 l
= strlen(abstract
);
582 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
585 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
586 b
->sockaddr
.un
.sun_path
[0] = 0;
587 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
588 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
594 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
595 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
597 struct addrinfo
*result
, hints
= {
598 .ai_socktype
= SOCK_STREAM
,
599 .ai_flags
= AI_ADDRCONFIG
,
607 while (**p
!= 0 && **p
!= ';') {
608 r
= parse_address_key(p
, "guid", guid
);
614 r
= parse_address_key(p
, "host", &host
);
620 r
= parse_address_key(p
, "port", &port
);
626 r
= parse_address_key(p
, "family", &family
);
639 if (streq(family
, "ipv4"))
640 hints
.ai_family
= AF_INET
;
641 else if (streq(family
, "ipv6"))
642 hints
.ai_family
= AF_INET6
;
647 r
= getaddrinfo(host
, port
, &hints
, &result
);
651 return -EADDRNOTAVAIL
;
653 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
654 b
->sockaddr_size
= result
->ai_addrlen
;
656 freeaddrinfo(result
);
661 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
663 unsigned n_argv
= 0, j
;
665 size_t allocated
= 0;
673 while (**p
!= 0 && **p
!= ';') {
674 r
= parse_address_key(p
, "guid", guid
);
680 r
= parse_address_key(p
, "path", &path
);
686 if (startswith(*p
, "argv")) {
690 ul
= strtoul(*p
+ 4, (char**) p
, 10);
691 if (errno
> 0 || **p
!= '=' || ul
> 256) {
699 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
707 r
= parse_address_key(p
, NULL
, argv
+ ul
);
722 /* Make sure there are no holes in the array, with the
723 * exception of argv[0] */
724 for (j
= 1; j
< n_argv
; j
++)
730 if (argv
&& argv
[0] == NULL
) {
731 argv
[0] = strdup(path
);
743 for (j
= 0; j
< n_argv
; j
++)
751 static int parse_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
752 _cleanup_free_
char *path
= NULL
;
760 while (**p
!= 0 && **p
!= ';') {
761 r
= parse_address_key(p
, "guid", guid
);
767 r
= parse_address_key(p
, "path", &path
);
786 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
787 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
795 while (**p
!= 0 && **p
!= ';') {
796 r
= parse_address_key(p
, "guid", guid
);
802 r
= parse_address_key(p
, "machine", &machine
);
808 r
= parse_address_key(p
, "pid", &pid
);
817 if (!machine
== !pid
)
821 if (!machine_name_is_valid(machine
))
825 b
->machine
= machine
;
833 r
= parse_pid(pid
, &b
->nspid
);
839 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
840 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
841 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + strlen("/var/run/dbus/system_bus_socket");
846 static int parse_container_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
847 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
855 while (**p
!= 0 && **p
!= ';') {
856 r
= parse_address_key(p
, "guid", guid
);
862 r
= parse_address_key(p
, "machine", &machine
);
868 r
= parse_address_key(p
, "pid", &pid
);
877 if (!machine
== !pid
)
881 if (!machine_name_is_valid(machine
))
885 b
->machine
= machine
;
893 r
= parse_pid(pid
, &b
->nspid
);
900 b
->kernel
= strdup("/sys/fs/kdbus/0-system/bus");
907 static void bus_reset_parsed_address(sd_bus
*b
) {
911 b
->sockaddr_size
= 0;
912 strv_free(b
->exec_argv
);
916 b
->server_id
= SD_ID128_NULL
;
924 static int bus_parse_next_address(sd_bus
*b
) {
925 _cleanup_free_
char *guid
= NULL
;
933 if (b
->address
[b
->address_index
] == 0)
936 bus_reset_parsed_address(b
);
938 a
= b
->address
+ b
->address_index
;
947 if (startswith(a
, "unix:")) {
950 r
= parse_unix_address(b
, &a
, &guid
);
955 } else if (startswith(a
, "tcp:")) {
958 r
= parse_tcp_address(b
, &a
, &guid
);
964 } else if (startswith(a
, "unixexec:")) {
967 r
= parse_exec_address(b
, &a
, &guid
);
973 } else if (startswith(a
, "kernel:")) {
976 r
= parse_kernel_address(b
, &a
, &guid
);
981 } else if (startswith(a
, "x-machine-unix:")) {
984 r
= parse_container_unix_address(b
, &a
, &guid
);
989 } else if (startswith(a
, "x-machine-kernel:")) {
992 r
= parse_container_kernel_address(b
, &a
, &guid
);
1005 r
= sd_id128_from_string(guid
, &b
->server_id
);
1010 b
->address_index
= a
- b
->address
;
1014 static int bus_start_address(sd_bus
*b
) {
1020 bool skipped
= false;
1025 r
= bus_socket_exec(b
);
1026 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
)
1027 r
= bus_container_connect_kernel(b
);
1028 else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1029 r
= bus_container_connect_socket(b
);
1031 r
= bus_kernel_connect(b
);
1032 else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1033 r
= bus_socket_connect(b
);
1039 r
= attach_io_events(b
);
1044 b
->last_connect_error
= -r
;
1047 r
= bus_parse_next_address(b
);
1051 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1055 int bus_next_address(sd_bus
*b
) {
1058 bus_reset_parsed_address(b
);
1059 return bus_start_address(b
);
1062 static int bus_start_fd(sd_bus
*b
) {
1067 assert(b
->input_fd
>= 0);
1068 assert(b
->output_fd
>= 0);
1070 r
= fd_nonblock(b
->input_fd
, true);
1074 r
= fd_cloexec(b
->input_fd
, true);
1078 if (b
->input_fd
!= b
->output_fd
) {
1079 r
= fd_nonblock(b
->output_fd
, true);
1083 r
= fd_cloexec(b
->output_fd
, true);
1088 if (fstat(b
->input_fd
, &st
) < 0)
1091 if (S_ISCHR(b
->input_fd
))
1092 return bus_kernel_take_fd(b
);
1094 return bus_socket_take_fd(b
);
1097 _public_
int sd_bus_start(sd_bus
*bus
) {
1100 assert_return(bus
, -EINVAL
);
1101 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1102 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1104 bus
->state
= BUS_OPENING
;
1106 if (bus
->is_server
&& bus
->bus_client
)
1109 if (bus
->input_fd
>= 0)
1110 r
= bus_start_fd(bus
);
1111 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1112 r
= bus_start_address(bus
);
1121 return bus_send_hello(bus
);
1124 _public_
int sd_bus_open(sd_bus
**ret
) {
1129 assert_return(ret
, -EINVAL
);
1131 /* Let's connect to the starter bus if it is set, and
1132 * otherwise to the bus that is appropropriate for the scope
1133 * we are running in */
1135 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1137 if (streq(e
, "system"))
1138 return sd_bus_open_system(ret
);
1139 else if (STR_IN_SET(e
, "session", "user"))
1140 return sd_bus_open_user(ret
);
1143 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1145 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1146 return sd_bus_open_user(ret
);
1148 return sd_bus_open_system(ret
);
1155 r
= sd_bus_set_address(b
, e
);
1159 b
->bus_client
= true;
1161 /* We don't know whether the bus is trusted or not, so better
1162 * be safe, and authenticate everything */
1164 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1165 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1167 r
= sd_bus_start(b
);
1179 int bus_set_address_system(sd_bus
*b
) {
1183 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1185 return sd_bus_set_address(b
, e
);
1187 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1190 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1194 assert_return(ret
, -EINVAL
);
1200 r
= bus_set_address_system(b
);
1204 b
->bus_client
= true;
1205 b
->is_system
= true;
1207 /* Let's do per-method access control on the system bus. We
1208 * need the caller's UID and capability set for that. */
1210 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1211 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1213 r
= sd_bus_start(b
);
1225 int bus_set_address_user(sd_bus
*b
) {
1230 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1232 return sd_bus_set_address(b
, e
);
1234 e
= secure_getenv("XDG_RUNTIME_DIR");
1236 _cleanup_free_
char *ee
= NULL
;
1238 ee
= bus_address_escape(e
);
1243 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, getuid(), ee
);
1245 (void) asprintf(&b
->address
, UNIX_USER_BUS_ADDRESS_FMT
, ee
);
1249 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, getuid());
1251 return -ECONNREFUSED
;
1261 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1265 assert_return(ret
, -EINVAL
);
1271 r
= bus_set_address_user(b
);
1275 b
->bus_client
= true;
1278 /* We don't do any per-method access control on the user
1282 r
= sd_bus_start(b
);
1294 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1295 _cleanup_free_
char *e
= NULL
;
1296 char *m
= NULL
, *c
= NULL
;
1301 /* Let's see if we shall enter some container */
1302 m
= strchr(host
, ':');
1306 /* Let's make sure this is not a port of some kind,
1307 * and is a valid machine name. */
1308 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1311 /* Cut out the host part */
1312 t
= strndupa(host
, m
- host
- 1);
1313 e
= bus_address_escape(t
);
1317 c
= strjoina(",argv4=--machine=", m
);
1322 e
= bus_address_escape(host
);
1327 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1334 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1338 assert_return(host
, -EINVAL
);
1339 assert_return(ret
, -EINVAL
);
1341 r
= sd_bus_new(&bus
);
1345 r
= bus_set_address_system_remote(bus
, host
);
1349 bus
->bus_client
= true;
1350 bus
->trusted
= false;
1351 bus
->is_system
= true;
1353 r
= sd_bus_start(bus
);
1365 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1366 _cleanup_free_
char *e
= NULL
;
1371 e
= bus_address_escape(machine
);
1376 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1378 b
->address
= strjoin("x-machine-unix:machine=", e
, NULL
);
1386 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1390 assert_return(machine
, -EINVAL
);
1391 assert_return(ret
, -EINVAL
);
1392 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1394 r
= sd_bus_new(&bus
);
1398 r
= bus_set_address_system_machine(bus
, machine
);
1402 bus
->bus_client
= true;
1403 bus
->trusted
= false;
1404 bus
->is_system
= true;
1406 r
= sd_bus_start(bus
);
1418 _public_
void sd_bus_close(sd_bus
*bus
) {
1422 if (bus
->state
== BUS_CLOSED
)
1424 if (bus_pid_changed(bus
))
1427 bus
->state
= BUS_CLOSED
;
1429 sd_bus_detach_event(bus
);
1431 /* Drop all queued messages so that they drop references to
1432 * the bus object and the bus may be freed */
1433 bus_reset_queues(bus
);
1435 if (!bus
->is_kernel
)
1438 /* We'll leave the fd open in case this is a kernel bus, since
1439 * there might still be memblocks around that reference this
1440 * bus, and they might need to invoke the KDBUS_CMD_FREE
1441 * ioctl on the fd when they are freed. */
1444 static void bus_enter_closing(sd_bus
*bus
) {
1447 if (bus
->state
!= BUS_OPENING
&&
1448 bus
->state
!= BUS_AUTHENTICATING
&&
1449 bus
->state
!= BUS_HELLO
&&
1450 bus
->state
!= BUS_RUNNING
)
1453 bus
->state
= BUS_CLOSING
;
1456 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1457 assert_return(bus
, NULL
);
1459 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1464 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1470 i
= REFCNT_DEC(bus
->n_ref
);
1478 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1480 assert_return(bus
, -EINVAL
);
1481 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1483 return BUS_IS_OPEN(bus
->state
);
1486 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1489 assert_return(bus
, -EINVAL
);
1490 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1491 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1493 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1496 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1497 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1500 r
= bus_ensure_running(bus
);
1504 return bus
->can_fds
;
1507 return bus_type_is_valid(type
);
1510 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1513 assert_return(bus
, -EINVAL
);
1514 assert_return(id
, -EINVAL
);
1515 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1517 r
= bus_ensure_running(bus
);
1521 *id
= bus
->server_id
;
1525 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1530 /* If we copy the same message to multiple
1531 * destinations, avoid using the same cookie
1533 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1538 timeout
= BUS_DEFAULT_TIMEOUT
;
1540 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1543 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1544 bool remarshal
= false;
1548 /* wrong packet version */
1549 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1552 /* wrong packet endianness */
1553 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1556 /* TODO: kdbus-messages received from the kernel contain data which is
1557 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1558 * force remarshaling of the message. Technically, we could just
1559 * recreate the kdbus message, but that is non-trivial as other parts of
1560 * the message refer to m->kdbus already. This should be fixed! */
1561 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1564 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1567 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1571 /* Fake some timestamps, if they were requested, and not
1572 * already initialized */
1573 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1574 if (m
->realtime
<= 0)
1575 m
->realtime
= now(CLOCK_REALTIME
);
1577 if (m
->monotonic
<= 0)
1578 m
->monotonic
= now(CLOCK_MONOTONIC
);
1581 /* The bus specification says the serial number cannot be 0,
1582 * hence let's fill something in for synthetic messages. Since
1583 * synthetic messages might have a fake sender and we don't
1584 * want to interfere with the real sender's serial numbers we
1585 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1586 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1587 * even though kdbus can do 64bit. */
1588 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1591 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1598 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1600 r
= bus_socket_write_message(bus
, m
, idx
);
1605 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1606 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1607 bus_message_type_to_string(m
->header
->type
),
1608 strna(sd_bus_message_get_sender(m
)),
1609 strna(sd_bus_message_get_destination(m
)),
1610 strna(sd_bus_message_get_path(m
)),
1611 strna(sd_bus_message_get_interface(m
)),
1612 strna(sd_bus_message_get_member(m
)),
1613 BUS_MESSAGE_COOKIE(m
),
1615 strna(m
->error
.message
));
1620 static int dispatch_wqueue(sd_bus
*bus
) {
1624 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1626 while (bus
->wqueue_size
> 0) {
1628 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1632 /* Didn't do anything this time */
1634 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1635 /* Fully written. Let's drop the entry from
1638 * This isn't particularly optimized, but
1639 * well, this is supposed to be our worst-case
1640 * buffer only, and the socket buffer is
1641 * supposed to be our primary buffer, and if
1642 * it got full, then all bets are off
1645 bus
->wqueue_size
--;
1646 sd_bus_message_unref(bus
->wqueue
[0]);
1647 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1657 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1661 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1663 return bus_socket_read_message(bus
);
1666 int bus_rqueue_make_room(sd_bus
*bus
) {
1669 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1672 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1678 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1683 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1685 /* Note that the priority logic is only available on kdbus,
1686 * where the rqueue is unused. We check the rqueue here
1687 * anyway, because it's simple... */
1690 if (bus
->rqueue_size
> 0) {
1691 /* Dispatch a queued message */
1693 *m
= bus
->rqueue
[0];
1694 bus
->rqueue_size
--;
1695 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1699 /* Try to read a new message */
1700 r
= bus_read_message(bus
, hint_priority
, priority
);
1710 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1711 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1714 assert_return(m
, -EINVAL
);
1719 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1720 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1722 if (!BUS_IS_OPEN(bus
->state
))
1726 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1733 /* If the cookie number isn't kept, then we know that no reply
1735 if (!cookie
&& !m
->sealed
)
1736 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1738 r
= bus_seal_message(bus
, m
, 0);
1742 /* Remarshall if we have to. This will possibly unref the
1743 * message and place a replacement in m */
1744 r
= bus_remarshal_message(bus
, &m
);
1748 /* If this is a reply and no reply was requested, then let's
1749 * suppress this, if we can */
1753 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1756 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1758 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1759 bus_enter_closing(bus
);
1766 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1767 /* Wasn't fully written. So let's remember how
1768 * much was written. Note that the first entry
1769 * of the wqueue array is always allocated so
1770 * that we always can remember how much was
1772 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1773 bus
->wqueue_size
= 1;
1778 /* Just append it to the queue. */
1780 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1783 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1786 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1791 *cookie
= BUS_MESSAGE_COOKIE(m
);
1796 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1797 return bus_send_internal(bus
, m
, cookie
, false);
1800 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1803 assert_return(m
, -EINVAL
);
1808 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1810 if (!BUS_IS_OPEN(bus
->state
))
1813 if (!streq_ptr(m
->destination
, destination
)) {
1818 r
= sd_bus_message_set_destination(m
, destination
);
1823 return sd_bus_send(bus
, m
, cookie
);
1826 static usec_t
calc_elapse(uint64_t usec
) {
1827 if (usec
== (uint64_t) -1)
1830 return now(CLOCK_MONOTONIC
) + usec
;
1833 static int timeout_compare(const void *a
, const void *b
) {
1834 const struct reply_callback
*x
= a
, *y
= b
;
1836 if (x
->timeout
!= 0 && y
->timeout
== 0)
1839 if (x
->timeout
== 0 && y
->timeout
!= 0)
1842 if (x
->timeout
< y
->timeout
)
1845 if (x
->timeout
> y
->timeout
)
1851 _public_
int sd_bus_call_async(
1855 sd_bus_message_handler_t callback
,
1859 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1860 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1863 assert_return(m
, -EINVAL
);
1864 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1865 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1866 assert_return(callback
, -EINVAL
);
1871 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1872 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1874 if (!BUS_IS_OPEN(bus
->state
))
1877 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1881 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1885 r
= bus_seal_message(bus
, m
, usec
);
1889 r
= bus_remarshal_message(bus
, &m
);
1893 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1897 s
->reply_callback
.callback
= callback
;
1899 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1900 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1902 s
->reply_callback
.cookie
= 0;
1906 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1907 if (s
->reply_callback
.timeout
!= 0) {
1908 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1910 s
->reply_callback
.timeout
= 0;
1915 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1926 int bus_ensure_running(sd_bus
*bus
) {
1931 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1933 if (bus
->state
== BUS_RUNNING
)
1937 r
= sd_bus_process(bus
, NULL
);
1940 if (bus
->state
== BUS_RUNNING
)
1945 r
= sd_bus_wait(bus
, (uint64_t) -1);
1951 _public_
int sd_bus_call(
1955 sd_bus_error
*error
,
1956 sd_bus_message
**reply
) {
1958 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1964 assert_return(m
, -EINVAL
);
1965 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1966 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1967 assert_return(!bus_error_is_dirty(error
), -EINVAL
);
1972 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1973 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1975 if (!BUS_IS_OPEN(bus
->state
))
1978 r
= bus_ensure_running(bus
);
1982 i
= bus
->rqueue_size
;
1984 r
= bus_seal_message(bus
, m
, usec
);
1988 r
= bus_remarshal_message(bus
, &m
);
1992 r
= bus_send_internal(bus
, m
, &cookie
, true);
1996 timeout
= calc_elapse(m
->timeout
);
2001 while (i
< bus
->rqueue_size
) {
2002 sd_bus_message
*incoming
= NULL
;
2004 incoming
= bus
->rqueue
[i
];
2006 if (incoming
->reply_cookie
== cookie
) {
2007 /* Found a match! */
2009 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2011 log_debug_bus_message(incoming
);
2013 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2015 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2019 sd_bus_message_unref(incoming
);
2024 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2026 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
)
2027 r
= sd_bus_error_copy(error
, &incoming
->error
);
2031 sd_bus_message_unref(incoming
);
2034 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2037 streq(bus
->unique_name
, incoming
->sender
)) {
2039 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2042 /* Our own message? Somebody is trying
2043 * to send its own client a message,
2044 * let's not dead-lock, let's fail
2047 sd_bus_message_unref(incoming
);
2051 /* Try to read more, right-away */
2055 r
= bus_read_message(bus
, false, 0);
2057 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2058 bus_enter_closing(bus
);
2070 n
= now(CLOCK_MONOTONIC
);
2076 left
= (uint64_t) -1;
2078 r
= bus_poll(bus
, true, left
);
2084 r
= dispatch_wqueue(bus
);
2086 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2087 bus_enter_closing(bus
);
2096 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2098 assert_return(bus
, -EINVAL
);
2099 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2100 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2102 return bus
->input_fd
;
2105 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2108 assert_return(bus
, -EINVAL
);
2109 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2111 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2114 if (bus
->state
== BUS_OPENING
)
2116 else if (bus
->state
== BUS_AUTHENTICATING
) {
2118 if (bus_socket_auth_needs_write(bus
))
2123 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2124 if (bus
->rqueue_size
<= 0)
2126 if (bus
->wqueue_size
> 0)
2133 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2134 struct reply_callback
*c
;
2136 assert_return(bus
, -EINVAL
);
2137 assert_return(timeout_usec
, -EINVAL
);
2138 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2140 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2143 if (bus
->track_queue
) {
2148 if (bus
->state
== BUS_CLOSING
) {
2153 if (bus
->state
== BUS_AUTHENTICATING
) {
2154 *timeout_usec
= bus
->auth_timeout
;
2158 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2159 *timeout_usec
= (uint64_t) -1;
2163 if (bus
->rqueue_size
> 0) {
2168 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2170 *timeout_usec
= (uint64_t) -1;
2174 if (c
->timeout
== 0) {
2175 *timeout_usec
= (uint64_t) -1;
2179 *timeout_usec
= c
->timeout
;
2183 static int process_timeout(sd_bus
*bus
) {
2184 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2185 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2186 struct reply_callback
*c
;
2193 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2197 n
= now(CLOCK_MONOTONIC
);
2201 r
= bus_message_new_synthetic_error(
2204 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2209 r
= bus_seal_synthetic_message(bus
, m
);
2213 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2216 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2219 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2221 bus
->iteration_counter
++;
2223 bus
->current_message
= m
;
2224 bus
->current_slot
= sd_bus_slot_ref(slot
);
2225 bus
->current_handler
= c
->callback
;
2226 bus
->current_userdata
= slot
->userdata
;
2227 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2228 bus
->current_userdata
= NULL
;
2229 bus
->current_handler
= NULL
;
2230 bus
->current_slot
= NULL
;
2231 bus
->current_message
= NULL
;
2233 if (slot
->floating
) {
2234 bus_slot_disconnect(slot
);
2235 sd_bus_slot_unref(slot
);
2238 sd_bus_slot_unref(slot
);
2240 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2243 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2247 if (bus
->state
!= BUS_HELLO
)
2250 /* Let's make sure the first message on the bus is the HELLO
2251 * reply. But note that we don't actually parse the message
2252 * here (we leave that to the usual handling), we just verify
2253 * we don't let any earlier msg through. */
2255 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2256 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2259 if (m
->reply_cookie
!= 1)
2265 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2266 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2267 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2268 struct reply_callback
*c
;
2275 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2276 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2279 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2282 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2285 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2291 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2293 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2295 /* If the reply contained a file descriptor which we
2296 * didn't want we pass an error instead. */
2298 r
= bus_message_new_synthetic_error(
2301 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2306 /* Copy over original timestamp */
2307 synthetic_reply
->realtime
= m
->realtime
;
2308 synthetic_reply
->monotonic
= m
->monotonic
;
2309 synthetic_reply
->seqnum
= m
->seqnum
;
2311 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2315 m
= synthetic_reply
;
2317 r
= sd_bus_message_rewind(m
, true);
2322 if (c
->timeout
!= 0) {
2323 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2327 bus
->current_slot
= sd_bus_slot_ref(slot
);
2328 bus
->current_handler
= c
->callback
;
2329 bus
->current_userdata
= slot
->userdata
;
2330 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2331 bus
->current_userdata
= NULL
;
2332 bus
->current_handler
= NULL
;
2333 bus
->current_slot
= NULL
;
2335 if (slot
->floating
) {
2336 bus_slot_disconnect(slot
);
2337 sd_bus_slot_unref(slot
);
2340 sd_bus_slot_unref(slot
);
2342 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2345 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2346 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2347 struct filter_callback
*l
;
2354 bus
->filter_callbacks_modified
= false;
2356 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2359 if (bus
->filter_callbacks_modified
)
2362 /* Don't run this more than once per iteration */
2363 if (l
->last_iteration
== bus
->iteration_counter
)
2366 l
->last_iteration
= bus
->iteration_counter
;
2368 r
= sd_bus_message_rewind(m
, true);
2372 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2374 bus
->current_slot
= sd_bus_slot_ref(slot
);
2375 bus
->current_handler
= l
->callback
;
2376 bus
->current_userdata
= slot
->userdata
;
2377 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2378 bus
->current_userdata
= NULL
;
2379 bus
->current_handler
= NULL
;
2380 bus
->current_slot
= sd_bus_slot_unref(slot
);
2382 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2388 } while (bus
->filter_callbacks_modified
);
2393 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2400 bus
->match_callbacks_modified
= false;
2402 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2406 } while (bus
->match_callbacks_modified
);
2411 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2412 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2418 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2421 if (bus
->manual_peer_interface
)
2424 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2427 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2430 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2433 if (streq_ptr(m
->member
, "Ping"))
2434 r
= sd_bus_message_new_method_return(m
, &reply
);
2435 else if (streq_ptr(m
->member
, "GetMachineId")) {
2439 r
= sd_id128_get_machine(&id
);
2443 r
= sd_bus_message_new_method_return(m
, &reply
);
2447 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2449 r
= sd_bus_message_new_method_errorf(
2451 SD_BUS_ERROR_UNKNOWN_METHOD
,
2452 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2458 r
= sd_bus_send(bus
, reply
, NULL
);
2465 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2469 /* If we got a message with a file descriptor which we didn't
2470 * want to accept, then let's drop it. How can this even
2471 * happen? For example, when the kernel queues a message into
2472 * an activatable names's queue which allows fds, and then is
2473 * delivered to us later even though we ourselves did not
2476 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2482 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2485 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2486 return 1; /* just eat it up */
2488 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2491 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2497 bus
->current_message
= m
;
2498 bus
->iteration_counter
++;
2500 log_debug_bus_message(m
);
2502 r
= process_hello(bus
, m
);
2506 r
= process_reply(bus
, m
);
2510 r
= process_fd_check(bus
, m
);
2514 r
= process_filter(bus
, m
);
2518 r
= process_match(bus
, m
);
2522 r
= process_builtin(bus
, m
);
2526 r
= bus_process_object(bus
, m
);
2529 bus
->current_message
= NULL
;
2533 static int dispatch_track(sd_bus
*bus
) {
2536 if (!bus
->track_queue
)
2539 bus_track_dispatch(bus
->track_queue
);
2543 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2544 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2548 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2550 r
= process_timeout(bus
);
2554 r
= dispatch_wqueue(bus
);
2558 r
= dispatch_track(bus
);
2562 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2568 r
= process_message(bus
, m
);
2573 r
= sd_bus_message_rewind(m
, true);
2582 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2584 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2585 strna(sd_bus_message_get_sender(m
)),
2586 strna(sd_bus_message_get_path(m
)),
2587 strna(sd_bus_message_get_interface(m
)),
2588 strna(sd_bus_message_get_member(m
)));
2590 r
= sd_bus_reply_method_errorf(
2592 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2593 "Unknown object '%s'.", m
->path
);
2607 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2608 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2609 struct reply_callback
*c
;
2613 assert(bus
->state
== BUS_CLOSING
);
2615 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2617 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2620 /* First, fail all outstanding method calls */
2621 r
= bus_message_new_synthetic_error(
2624 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2629 r
= bus_seal_synthetic_message(bus
, m
);
2633 if (c
->timeout
!= 0) {
2634 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2638 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2641 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2643 bus
->iteration_counter
++;
2645 bus
->current_message
= m
;
2646 bus
->current_slot
= sd_bus_slot_ref(slot
);
2647 bus
->current_handler
= c
->callback
;
2648 bus
->current_userdata
= slot
->userdata
;
2649 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2650 bus
->current_userdata
= NULL
;
2651 bus
->current_handler
= NULL
;
2652 bus
->current_slot
= NULL
;
2653 bus
->current_message
= NULL
;
2655 if (slot
->floating
) {
2656 bus_slot_disconnect(slot
);
2657 sd_bus_slot_unref(slot
);
2660 sd_bus_slot_unref(slot
);
2662 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2665 /* Then, synthesize a Disconnected message */
2666 r
= sd_bus_message_new_signal(
2669 "/org/freedesktop/DBus/Local",
2670 "org.freedesktop.DBus.Local",
2675 bus_message_set_sender_local(bus
, m
);
2677 r
= bus_seal_synthetic_message(bus
, m
);
2683 bus
->current_message
= m
;
2684 bus
->iteration_counter
++;
2686 r
= process_filter(bus
, m
);
2690 r
= process_match(bus
, m
);
2702 bus
->current_message
= NULL
;
2707 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2708 BUS_DONT_DESTROY(bus
);
2711 /* Returns 0 when we didn't do anything. This should cause the
2712 * caller to invoke sd_bus_wait() before returning the next
2713 * time. Returns > 0 when we did something, which possibly
2714 * means *ret is filled in with an unprocessed message. */
2716 assert_return(bus
, -EINVAL
);
2717 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2719 /* We don't allow recursively invoking sd_bus_process(). */
2720 assert_return(!bus
->current_message
, -EBUSY
);
2721 assert(!bus
->current_slot
);
2723 switch (bus
->state
) {
2732 r
= bus_socket_process_opening(bus
);
2733 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2734 bus_enter_closing(bus
);
2742 case BUS_AUTHENTICATING
:
2743 r
= bus_socket_process_authenticating(bus
);
2744 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2745 bus_enter_closing(bus
);
2757 r
= process_running(bus
, hint_priority
, priority
, ret
);
2758 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2759 bus_enter_closing(bus
);
2769 return process_closing(bus
, ret
);
2772 assert_not_reached("Unknown state");
2775 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2776 return bus_process_internal(bus
, false, 0, ret
);
2779 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2780 return bus_process_internal(bus
, true, priority
, ret
);
2783 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2784 struct pollfd p
[2] = {};
2787 usec_t m
= USEC_INFINITY
;
2791 if (bus
->state
== BUS_CLOSING
)
2794 if (!BUS_IS_OPEN(bus
->state
))
2797 e
= sd_bus_get_events(bus
);
2802 /* The caller really needs some more data, he doesn't
2803 * care about what's already read, or any timeouts
2804 * except its own. */
2808 /* The caller wants to process if there's something to
2809 * process, but doesn't care otherwise */
2811 r
= sd_bus_get_timeout(bus
, &until
);
2816 nw
= now(CLOCK_MONOTONIC
);
2817 m
= until
> nw
? until
- nw
: 0;
2821 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2824 p
[0].fd
= bus
->input_fd
;
2825 if (bus
->output_fd
== bus
->input_fd
) {
2829 p
[0].events
= e
& POLLIN
;
2830 p
[1].fd
= bus
->output_fd
;
2831 p
[1].events
= e
& POLLOUT
;
2835 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2839 return r
> 0 ? 1 : 0;
2842 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2844 assert_return(bus
, -EINVAL
);
2845 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2847 if (bus
->state
== BUS_CLOSING
)
2850 if (!BUS_IS_OPEN(bus
->state
))
2853 if (bus
->rqueue_size
> 0)
2856 return bus_poll(bus
, false, timeout_usec
);
2859 _public_
int sd_bus_flush(sd_bus
*bus
) {
2862 assert_return(bus
, -EINVAL
);
2863 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2865 if (bus
->state
== BUS_CLOSING
)
2868 if (!BUS_IS_OPEN(bus
->state
))
2871 r
= bus_ensure_running(bus
);
2875 if (bus
->wqueue_size
<= 0)
2879 r
= dispatch_wqueue(bus
);
2881 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2882 bus_enter_closing(bus
);
2889 if (bus
->wqueue_size
<= 0)
2892 r
= bus_poll(bus
, false, (uint64_t) -1);
2898 _public_
int sd_bus_add_filter(
2901 sd_bus_message_handler_t callback
,
2906 assert_return(bus
, -EINVAL
);
2907 assert_return(callback
, -EINVAL
);
2908 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2910 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2914 s
->filter_callback
.callback
= callback
;
2916 bus
->filter_callbacks_modified
= true;
2917 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2925 _public_
int sd_bus_add_match(
2929 sd_bus_message_handler_t callback
,
2932 struct bus_match_component
*components
= NULL
;
2933 unsigned n_components
= 0;
2934 sd_bus_slot
*s
= NULL
;
2937 assert_return(bus
, -EINVAL
);
2938 assert_return(match
, -EINVAL
);
2939 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2941 r
= bus_match_parse(match
, &components
, &n_components
);
2945 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2951 s
->match_callback
.callback
= callback
;
2952 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2954 if (bus
->bus_client
) {
2955 enum bus_match_scope scope
;
2957 scope
= bus_match_get_scope(components
, n_components
);
2959 /* Do not install server-side matches for matches
2960 * against the local service, interface or bus
2961 * path. Also, when on kdbus don't install driver
2962 * matches server side. */
2963 if (scope
== BUS_MATCH_GENERIC
||
2964 (!bus
->is_kernel
&& scope
== BUS_MATCH_DRIVER
)) {
2966 if (!bus
->is_kernel
) {
2967 /* When this is not a kernel transport, we
2968 * store the original match string, so that we
2969 * can use it to remove the match again */
2971 s
->match_callback
.match_string
= strdup(match
);
2972 if (!s
->match_callback
.match_string
) {
2978 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
2982 s
->match_added
= true;
2986 bus
->match_callbacks_modified
= true;
2987 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
2996 bus_match_parse_free(components
, n_components
);
2997 sd_bus_slot_unref(s
);
3002 int bus_remove_match_by_string(
3005 sd_bus_message_handler_t callback
,
3008 struct bus_match_component
*components
= NULL
;
3009 unsigned n_components
= 0;
3010 struct match_callback
*c
;
3013 assert_return(bus
, -EINVAL
);
3014 assert_return(match
, -EINVAL
);
3015 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3017 r
= bus_match_parse(match
, &components
, &n_components
);
3021 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3025 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3028 bus_match_parse_free(components
, n_components
);
3033 bool bus_pid_changed(sd_bus
*bus
) {
3036 /* We don't support people creating a bus connection and
3037 * keeping it around over a fork(). Let's complain. */
3039 return bus
->original_pid
!= getpid();
3042 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3043 sd_bus
*bus
= userdata
;
3048 r
= sd_bus_process(bus
, NULL
);
3055 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3056 sd_bus
*bus
= userdata
;
3061 r
= sd_bus_process(bus
, NULL
);
3068 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3069 sd_bus
*bus
= userdata
;
3076 e
= sd_bus_get_events(bus
);
3080 if (bus
->output_fd
!= bus
->input_fd
) {
3082 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3086 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3090 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3095 r
= sd_bus_get_timeout(bus
, &until
);
3101 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3106 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3113 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3114 sd_bus
*bus
= userdata
;
3124 static int attach_io_events(sd_bus
*bus
) {
3129 if (bus
->input_fd
< 0)
3135 if (!bus
->input_io_event_source
) {
3136 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3140 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3144 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3148 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3150 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3155 if (bus
->output_fd
!= bus
->input_fd
) {
3156 assert(bus
->output_fd
>= 0);
3158 if (!bus
->output_io_event_source
) {
3159 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3163 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3167 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3169 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3178 static void detach_io_events(sd_bus
*bus
) {
3181 if (bus
->input_io_event_source
) {
3182 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3183 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3186 if (bus
->output_io_event_source
) {
3187 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3188 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3192 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3195 assert_return(bus
, -EINVAL
);
3196 assert_return(!bus
->event
, -EBUSY
);
3198 assert(!bus
->input_io_event_source
);
3199 assert(!bus
->output_io_event_source
);
3200 assert(!bus
->time_event_source
);
3203 bus
->event
= sd_event_ref(event
);
3205 r
= sd_event_default(&bus
->event
);
3210 bus
->event_priority
= priority
;
3212 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3216 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3220 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3224 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3228 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3232 r
= attach_io_events(bus
);
3239 sd_bus_detach_event(bus
);
3243 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3244 assert_return(bus
, -EINVAL
);
3249 detach_io_events(bus
);
3251 if (bus
->time_event_source
) {
3252 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3253 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3256 if (bus
->quit_event_source
) {
3257 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3258 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3261 bus
->event
= sd_event_unref(bus
->event
);
3265 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3266 assert_return(bus
, NULL
);
3271 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3272 assert_return(bus
, NULL
);
3274 return bus
->current_message
;
3277 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3278 assert_return(bus
, NULL
);
3280 return bus
->current_slot
;
3283 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3284 assert_return(bus
, NULL
);
3286 return bus
->current_handler
;
3289 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3290 assert_return(bus
, NULL
);
3292 return bus
->current_userdata
;
3295 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3300 assert(default_bus
);
3303 return !!*default_bus
;
3306 *ret
= sd_bus_ref(*default_bus
);
3314 b
->default_bus_ptr
= default_bus
;
3322 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3323 static thread_local sd_bus
*default_system_bus
= NULL
;
3325 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3328 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3329 static thread_local sd_bus
*default_user_bus
= NULL
;
3331 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3334 _public_
int sd_bus_default(sd_bus
**ret
) {
3338 /* Let's try our best to reuse another cached connection. If
3339 * the starter bus type is set, connect via our normal
3340 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3341 * we can share the connection with the user/system default
3344 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3346 if (streq(e
, "system"))
3347 return sd_bus_default_system(ret
);
3348 else if (STR_IN_SET(e
, "user", "session"))
3349 return sd_bus_default_user(ret
);
3352 /* No type is specified, so we have not other option than to
3353 * use the starter address if it is set. */
3355 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3357 static thread_local sd_bus
*default_starter_bus
= NULL
;
3359 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3362 /* Finally, if nothing is set use the cached connection for
3363 * the right scope */
3365 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3366 return sd_bus_default_user(ret
);
3368 return sd_bus_default_system(ret
);
3371 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3372 assert_return(b
, -EINVAL
);
3373 assert_return(tid
, -EINVAL
);
3374 assert_return(!bus_pid_changed(b
), -ECHILD
);
3382 return sd_event_get_tid(b
->event
, tid
);
3387 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3388 _cleanup_free_
char *e
= NULL
;
3391 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3392 assert_return(external_id
, -EINVAL
);
3393 assert_return(ret_path
, -EINVAL
);
3395 e
= bus_label_escape(external_id
);
3399 ret
= strjoin(prefix
, "/", e
, NULL
);
3407 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3411 assert_return(object_path_is_valid(path
), -EINVAL
);
3412 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3413 assert_return(external_id
, -EINVAL
);
3415 e
= object_path_startswith(path
, prefix
);
3417 *external_id
= NULL
;
3421 ret
= bus_label_unescape(e
);
3429 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3432 assert_return(bus
, -EINVAL
);
3433 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3435 if (!bus
->is_kernel
)
3438 if (!BUS_IS_OPEN(bus
->state
))
3441 if (bus
->rqueue_size
> 0)
3444 if (bus
->wqueue_size
> 0)
3447 r
= bus_kernel_try_close(bus
);
3455 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3456 assert_return(bus
, -EINVAL
);
3457 assert_return(description
, -EINVAL
);
3458 assert_return(bus
->description
, -ENXIO
);
3459 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3461 *description
= bus
->description
;
3465 int bus_get_root_path(sd_bus
*bus
) {
3468 if (bus
->cgroup_root
)
3471 r
= cg_get_root_path(&bus
->cgroup_root
);
3473 bus
->cgroup_root
= strdup("/");
3474 if (!bus
->cgroup_root
)
3483 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3486 assert_return(bus
, -EINVAL
);
3487 assert_return(scope
, -EINVAL
);
3488 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3490 if (bus
->is_kernel
) {
3491 _cleanup_free_
char *n
= NULL
;
3494 r
= bus_kernel_get_bus_name(bus
, &n
);
3498 if (streq(n
, "0-system")) {
3503 dash
= strchr(n
, '-');
3504 if (streq_ptr(dash
, "-user")) {
3515 if (bus
->is_system
) {
3523 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3525 assert_return(bus
, -EINVAL
);
3526 assert_return(address
, -EINVAL
);
3527 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3530 *address
= bus
->address
;
3537 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3538 assert_return(bus
, -EINVAL
);
3539 assert_return(mask
, -EINVAL
);
3540 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3542 *mask
= bus
->creds_mask
;
3546 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3547 assert_return(bus
, -EINVAL
);
3548 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3550 return bus
->bus_client
;
3553 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3554 assert_return(bus
, -EINVAL
);
3555 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3557 return bus
->is_server
;
3560 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3561 assert_return(bus
, -EINVAL
);
3562 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3564 return bus
->anonymous_auth
;
3567 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3568 assert_return(bus
, -EINVAL
);
3569 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3571 return bus
->trusted
;
3574 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3575 assert_return(bus
, -EINVAL
);
3576 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3578 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);