1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
32 #include "bus-container.h"
33 #include "bus-control.h"
34 #include "bus-internal.h"
35 #include "bus-kernel.h"
36 #include "bus-label.h"
37 #include "bus-message.h"
38 #include "bus-objects.h"
39 #include "bus-protocol.h"
41 #include "bus-socket.h"
42 #include "bus-track.h"
45 #include "cgroup-util.h"
48 #include "hostname-util.h"
51 #include "string-util.h"
55 #define log_debug_bus_message(m) \
57 sd_bus_message *_mm = (m); \
58 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
59 bus_message_type_to_string(_mm->header->type), \
60 strna(sd_bus_message_get_sender(_mm)), \
61 strna(sd_bus_message_get_destination(_mm)), \
62 strna(sd_bus_message_get_path(_mm)), \
63 strna(sd_bus_message_get_interface(_mm)), \
64 strna(sd_bus_message_get_member(_mm)), \
65 BUS_MESSAGE_COOKIE(_mm), \
67 strna(_mm->error.message)); \
70 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
71 static int attach_io_events(sd_bus
*b
);
72 static void detach_io_events(sd_bus
*b
);
74 static thread_local sd_bus
*default_system_bus
= NULL
;
75 static thread_local sd_bus
*default_user_bus
= NULL
;
76 static thread_local sd_bus
*default_starter_bus
= NULL
;
78 static void bus_close_fds(sd_bus
*b
) {
83 if (b
->input_fd
!= b
->output_fd
)
84 safe_close(b
->output_fd
);
85 b
->output_fd
= b
->input_fd
= safe_close(b
->input_fd
);
88 static void bus_reset_queues(sd_bus
*b
) {
91 while (b
->rqueue_size
> 0)
92 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
94 b
->rqueue
= mfree(b
->rqueue
);
95 b
->rqueue_allocated
= 0;
97 while (b
->wqueue_size
> 0)
98 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
100 b
->wqueue
= mfree(b
->wqueue
);
101 b
->wqueue_allocated
= 0;
104 static void bus_free(sd_bus
*b
) {
108 assert(!b
->track_queue
);
110 b
->state
= BUS_CLOSED
;
112 sd_bus_detach_event(b
);
114 while ((s
= b
->slots
)) {
115 /* At this point only floating slots can still be
116 * around, because the non-floating ones keep a
117 * reference to the bus, and we thus couldn't be
118 * destructing right now... We forcibly disconnect the
119 * slots here, so that they still can be referenced by
120 * apps, but are dead. */
123 bus_slot_disconnect(s
);
124 sd_bus_slot_unref(s
);
127 if (b
->default_bus_ptr
)
128 *b
->default_bus_ptr
= NULL
;
133 munmap(b
->kdbus_buffer
, KDBUS_POOL_SIZE
);
137 free(b
->unique_name
);
138 free(b
->auth_buffer
);
143 free(b
->cgroup_root
);
144 free(b
->description
);
147 strv_free(b
->exec_argv
);
149 close_many(b
->fds
, b
->n_fds
);
154 ordered_hashmap_free_free(b
->reply_callbacks
);
155 prioq_free(b
->reply_callbacks_prioq
);
157 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
158 bus_match_free(&b
->match_callbacks
);
160 hashmap_free_free(b
->vtable_methods
);
161 hashmap_free_free(b
->vtable_properties
);
163 assert(hashmap_isempty(b
->nodes
));
164 hashmap_free(b
->nodes
);
166 bus_kernel_flush_memfd(b
);
168 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
173 _public_
int sd_bus_new(sd_bus
**ret
) {
176 assert_return(ret
, -EINVAL
);
182 r
->n_ref
= REFCNT_INIT
;
183 r
->input_fd
= r
->output_fd
= -1;
184 r
->message_version
= 1;
185 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
186 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
187 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
188 r
->original_pid
= getpid();
190 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
192 /* We guarantee that wqueue always has space for at least one
194 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
203 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
206 assert_return(bus
, -EINVAL
);
207 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
208 assert_return(address
, -EINVAL
);
209 assert_return(!bus_pid_changed(bus
), -ECHILD
);
221 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
222 assert_return(bus
, -EINVAL
);
223 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
224 assert_return(input_fd
>= 0, -EBADF
);
225 assert_return(output_fd
>= 0, -EBADF
);
226 assert_return(!bus_pid_changed(bus
), -ECHILD
);
228 bus
->input_fd
= input_fd
;
229 bus
->output_fd
= output_fd
;
233 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
236 assert_return(bus
, -EINVAL
);
237 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
238 assert_return(path
, -EINVAL
);
239 assert_return(!strv_isempty(argv
), -EINVAL
);
240 assert_return(!bus_pid_changed(bus
), -ECHILD
);
252 free(bus
->exec_path
);
253 strv_free(bus
->exec_argv
);
261 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
262 assert_return(bus
, -EINVAL
);
263 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
264 assert_return(!bus_pid_changed(bus
), -ECHILD
);
266 bus
->bus_client
= !!b
;
270 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
271 assert_return(bus
, -EINVAL
);
272 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
273 assert_return(!bus_pid_changed(bus
), -ECHILD
);
275 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_MONITOR
, b
);
279 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
280 assert_return(bus
, -EINVAL
);
281 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
282 assert_return(!bus_pid_changed(bus
), -ECHILD
);
284 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
288 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
290 assert_return(bus
, -EINVAL
);
291 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
292 assert_return(!bus_pid_changed(bus
), -ECHILD
);
294 new_flags
= bus
->attach_flags
;
295 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
297 if (bus
->attach_flags
== new_flags
)
300 bus
->attach_flags
= new_flags
;
301 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
302 bus_kernel_realize_attach_flags(bus
);
307 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
310 assert_return(bus
, -EINVAL
);
311 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
312 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
313 assert_return(!bus_pid_changed(bus
), -ECHILD
);
316 bus
->creds_mask
|= mask
;
318 bus
->creds_mask
&= ~mask
;
320 /* The well knowns we need unconditionally, so that matches can work */
321 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
323 /* Make sure we don't lose the timestamp flag */
324 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
325 if (bus
->attach_flags
== new_flags
)
328 bus
->attach_flags
= new_flags
;
329 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
330 bus_kernel_realize_attach_flags(bus
);
335 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
336 assert_return(bus
, -EINVAL
);
337 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
338 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
339 assert_return(!bus_pid_changed(bus
), -ECHILD
);
341 bus
->is_server
= !!b
;
342 bus
->server_id
= server_id
;
346 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
347 assert_return(bus
, -EINVAL
);
348 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
349 assert_return(!bus_pid_changed(bus
), -ECHILD
);
351 bus
->anonymous_auth
= !!b
;
355 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
356 assert_return(bus
, -EINVAL
);
357 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
358 assert_return(!bus_pid_changed(bus
), -ECHILD
);
364 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
365 assert_return(bus
, -EINVAL
);
366 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
367 assert_return(!bus_pid_changed(bus
), -ECHILD
);
369 return free_and_strdup(&bus
->description
, description
);
372 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
373 assert_return(bus
, -EINVAL
);
374 assert_return(!bus_pid_changed(bus
), -ECHILD
);
376 bus
->allow_interactive_authorization
= !!b
;
380 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
381 assert_return(bus
, -EINVAL
);
382 assert_return(!bus_pid_changed(bus
), -ECHILD
);
384 return bus
->allow_interactive_authorization
;
387 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
395 assert(bus
->state
== BUS_HELLO
|| bus
->state
== BUS_CLOSING
);
397 r
= sd_bus_message_get_errno(reply
);
401 r
= sd_bus_message_read(reply
, "s", &s
);
405 if (!service_name_is_valid(s
) || s
[0] != ':')
408 bus
->unique_name
= strdup(s
);
409 if (!bus
->unique_name
)
412 if (bus
->state
== BUS_HELLO
)
413 bus
->state
= BUS_RUNNING
;
418 static int bus_send_hello(sd_bus
*bus
) {
419 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
424 if (!bus
->bus_client
|| bus
->is_kernel
)
427 r
= sd_bus_message_new_method_call(
430 "org.freedesktop.DBus",
431 "/org/freedesktop/DBus",
432 "org.freedesktop.DBus",
437 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
440 int bus_start_running(sd_bus
*bus
) {
443 if (bus
->bus_client
&& !bus
->is_kernel
) {
444 bus
->state
= BUS_HELLO
;
448 bus
->state
= BUS_RUNNING
;
452 static int parse_address_key(const char **p
, const char *key
, char **value
) {
453 size_t l
, n
= 0, allocated
= 0;
463 if (strncmp(*p
, key
, l
) != 0)
476 while (*a
!= ';' && *a
!= ',' && *a
!= 0) {
494 c
= (char) ((x
<< 4) | y
);
501 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
525 static void skip_address_key(const char **p
) {
529 *p
+= strcspn(*p
, ",");
535 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
536 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
545 while (**p
!= 0 && **p
!= ';') {
546 r
= parse_address_key(p
, "guid", guid
);
552 r
= parse_address_key(p
, "path", &path
);
558 r
= parse_address_key(p
, "abstract", &abstract
);
567 if (!path
&& !abstract
)
570 if (path
&& abstract
)
575 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
578 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
579 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
580 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
581 } else if (abstract
) {
582 l
= strlen(abstract
);
583 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
586 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
587 b
->sockaddr
.un
.sun_path
[0] = 0;
588 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
589 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
595 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
596 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
598 struct addrinfo
*result
, hints
= {
599 .ai_socktype
= SOCK_STREAM
,
600 .ai_flags
= AI_ADDRCONFIG
,
608 while (**p
!= 0 && **p
!= ';') {
609 r
= parse_address_key(p
, "guid", guid
);
615 r
= parse_address_key(p
, "host", &host
);
621 r
= parse_address_key(p
, "port", &port
);
627 r
= parse_address_key(p
, "family", &family
);
640 if (streq(family
, "ipv4"))
641 hints
.ai_family
= AF_INET
;
642 else if (streq(family
, "ipv6"))
643 hints
.ai_family
= AF_INET6
;
648 r
= getaddrinfo(host
, port
, &hints
, &result
);
652 return -EADDRNOTAVAIL
;
654 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
655 b
->sockaddr_size
= result
->ai_addrlen
;
657 freeaddrinfo(result
);
662 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
664 unsigned n_argv
= 0, j
;
666 size_t allocated
= 0;
674 while (**p
!= 0 && **p
!= ';') {
675 r
= parse_address_key(p
, "guid", guid
);
681 r
= parse_address_key(p
, "path", &path
);
687 if (startswith(*p
, "argv")) {
691 ul
= strtoul(*p
+ 4, (char**) p
, 10);
692 if (errno
> 0 || **p
!= '=' || ul
> 256) {
700 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
708 r
= parse_address_key(p
, NULL
, argv
+ ul
);
723 /* Make sure there are no holes in the array, with the
724 * exception of argv[0] */
725 for (j
= 1; j
< n_argv
; j
++)
731 if (argv
&& argv
[0] == NULL
) {
732 argv
[0] = strdup(path
);
744 for (j
= 0; j
< n_argv
; j
++)
752 static int parse_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
753 _cleanup_free_
char *path
= NULL
;
761 while (**p
!= 0 && **p
!= ';') {
762 r
= parse_address_key(p
, "guid", guid
);
768 r
= parse_address_key(p
, "path", &path
);
787 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
788 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
796 while (**p
!= 0 && **p
!= ';') {
797 r
= parse_address_key(p
, "guid", guid
);
803 r
= parse_address_key(p
, "machine", &machine
);
809 r
= parse_address_key(p
, "pid", &pid
);
818 if (!machine
== !pid
)
822 if (!machine_name_is_valid(machine
))
826 b
->machine
= machine
;
829 b
->machine
= mfree(b
->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
;
888 b
->machine
= mfree(b
->machine
);
892 r
= parse_pid(pid
, &b
->nspid
);
898 r
= free_and_strdup(&b
->kernel
, "/sys/fs/kdbus/0-system/bus");
905 static void bus_reset_parsed_address(sd_bus
*b
) {
909 b
->sockaddr_size
= 0;
910 b
->exec_argv
= strv_free(b
->exec_argv
);
911 b
->exec_path
= mfree(b
->exec_path
);
912 b
->server_id
= SD_ID128_NULL
;
913 b
->kernel
= mfree(b
->kernel
);
914 b
->machine
= mfree(b
->machine
);
918 static int bus_parse_next_address(sd_bus
*b
) {
919 _cleanup_free_
char *guid
= NULL
;
927 if (b
->address
[b
->address_index
] == 0)
930 bus_reset_parsed_address(b
);
932 a
= b
->address
+ b
->address_index
;
941 if (startswith(a
, "unix:")) {
944 r
= parse_unix_address(b
, &a
, &guid
);
949 } else if (startswith(a
, "tcp:")) {
952 r
= parse_tcp_address(b
, &a
, &guid
);
958 } else if (startswith(a
, "unixexec:")) {
961 r
= parse_exec_address(b
, &a
, &guid
);
967 } else if (startswith(a
, "kernel:")) {
970 r
= parse_kernel_address(b
, &a
, &guid
);
975 } else if (startswith(a
, "x-machine-unix:")) {
978 r
= parse_container_unix_address(b
, &a
, &guid
);
983 } else if (startswith(a
, "x-machine-kernel:")) {
986 r
= parse_container_kernel_address(b
, &a
, &guid
);
999 r
= sd_id128_from_string(guid
, &b
->server_id
);
1004 b
->address_index
= a
- b
->address
;
1008 static int bus_start_address(sd_bus
*b
) {
1009 bool container_kdbus_available
= false;
1010 bool kdbus_available
= false;
1016 bool skipped
= false;
1021 * Usually, if you provide multiple different bus-addresses, we
1022 * try all of them in order. We use the first one that
1023 * succeeds. However, if you mix kernel and unix addresses, we
1024 * never try unix-addresses if a previous kernel address was
1025 * tried and kdbus was available. This is required to prevent
1026 * clients to fallback to the bus-proxy if kdbus is available
1027 * but failed (eg., too many connections).
1031 r
= bus_socket_exec(b
);
1032 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
) {
1033 r
= bus_container_connect_kernel(b
);
1034 if (r
< 0 && !IN_SET(r
, -ENOENT
, -ESOCKTNOSUPPORT
))
1035 container_kdbus_available
= true;
1037 } else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
) {
1038 if (!container_kdbus_available
)
1039 r
= bus_container_connect_socket(b
);
1043 } else if (b
->kernel
) {
1044 r
= bus_kernel_connect(b
);
1045 if (r
< 0 && !IN_SET(r
, -ENOENT
, -ESOCKTNOSUPPORT
))
1046 kdbus_available
= true;
1048 } else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
) {
1049 if (!kdbus_available
)
1050 r
= bus_socket_connect(b
);
1058 r
= attach_io_events(b
);
1063 b
->last_connect_error
= -r
;
1066 r
= bus_parse_next_address(b
);
1070 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1074 int bus_next_address(sd_bus
*b
) {
1077 bus_reset_parsed_address(b
);
1078 return bus_start_address(b
);
1081 static int bus_start_fd(sd_bus
*b
) {
1086 assert(b
->input_fd
>= 0);
1087 assert(b
->output_fd
>= 0);
1089 r
= fd_nonblock(b
->input_fd
, true);
1093 r
= fd_cloexec(b
->input_fd
, true);
1097 if (b
->input_fd
!= b
->output_fd
) {
1098 r
= fd_nonblock(b
->output_fd
, true);
1102 r
= fd_cloexec(b
->output_fd
, true);
1107 if (fstat(b
->input_fd
, &st
) < 0)
1110 if (S_ISCHR(b
->input_fd
))
1111 return bus_kernel_take_fd(b
);
1113 return bus_socket_take_fd(b
);
1116 _public_
int sd_bus_start(sd_bus
*bus
) {
1119 assert_return(bus
, -EINVAL
);
1120 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1121 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1123 bus
->state
= BUS_OPENING
;
1125 if (bus
->is_server
&& bus
->bus_client
)
1128 if (bus
->input_fd
>= 0)
1129 r
= bus_start_fd(bus
);
1130 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1131 r
= bus_start_address(bus
);
1140 return bus_send_hello(bus
);
1143 _public_
int sd_bus_open(sd_bus
**ret
) {
1148 assert_return(ret
, -EINVAL
);
1150 /* Let's connect to the starter bus if it is set, and
1151 * otherwise to the bus that is appropropriate for the scope
1152 * we are running in */
1154 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1156 if (streq(e
, "system"))
1157 return sd_bus_open_system(ret
);
1158 else if (STR_IN_SET(e
, "session", "user"))
1159 return sd_bus_open_user(ret
);
1162 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1164 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1165 return sd_bus_open_user(ret
);
1167 return sd_bus_open_system(ret
);
1174 r
= sd_bus_set_address(b
, e
);
1178 b
->bus_client
= true;
1180 /* We don't know whether the bus is trusted or not, so better
1181 * be safe, and authenticate everything */
1183 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1184 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1186 r
= sd_bus_start(b
);
1198 int bus_set_address_system(sd_bus
*b
) {
1202 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1204 return sd_bus_set_address(b
, e
);
1206 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1209 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1213 assert_return(ret
, -EINVAL
);
1219 r
= bus_set_address_system(b
);
1223 b
->bus_client
= true;
1224 b
->is_system
= true;
1226 /* Let's do per-method access control on the system bus. We
1227 * need the caller's UID and capability set for that. */
1229 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1230 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1232 r
= sd_bus_start(b
);
1244 int bus_set_address_user(sd_bus
*b
) {
1251 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1253 return sd_bus_set_address(b
, e
);
1255 r
= cg_pid_get_owner_uid(0, &uid
);
1259 e
= secure_getenv("XDG_RUNTIME_DIR");
1261 _cleanup_free_
char *ee
= NULL
;
1263 ee
= bus_address_escape(e
);
1267 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, uid
, ee
);
1269 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, uid
);
1277 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1281 assert_return(ret
, -EINVAL
);
1287 r
= bus_set_address_user(b
);
1291 b
->bus_client
= true;
1294 /* We don't do any per-method access control on the user
1298 r
= sd_bus_start(b
);
1310 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1311 _cleanup_free_
char *e
= NULL
;
1312 char *m
= NULL
, *c
= NULL
;
1317 /* Let's see if we shall enter some container */
1318 m
= strchr(host
, ':');
1322 /* Let's make sure this is not a port of some kind,
1323 * and is a valid machine name. */
1324 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1327 /* Cut out the host part */
1328 t
= strndupa(host
, m
- host
- 1);
1329 e
= bus_address_escape(t
);
1333 c
= strjoina(",argv4=--machine=", m
);
1338 e
= bus_address_escape(host
);
1343 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1350 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1354 assert_return(host
, -EINVAL
);
1355 assert_return(ret
, -EINVAL
);
1357 r
= sd_bus_new(&bus
);
1361 r
= bus_set_address_system_remote(bus
, host
);
1365 bus
->bus_client
= true;
1366 bus
->trusted
= false;
1367 bus
->is_system
= true;
1369 r
= sd_bus_start(bus
);
1381 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1382 _cleanup_free_
char *e
= NULL
;
1387 e
= bus_address_escape(machine
);
1391 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1398 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1402 assert_return(machine
, -EINVAL
);
1403 assert_return(ret
, -EINVAL
);
1404 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1406 r
= sd_bus_new(&bus
);
1410 r
= bus_set_address_system_machine(bus
, machine
);
1414 bus
->bus_client
= true;
1415 bus
->trusted
= false;
1416 bus
->is_system
= true;
1418 r
= sd_bus_start(bus
);
1430 _public_
void sd_bus_close(sd_bus
*bus
) {
1434 if (bus
->state
== BUS_CLOSED
)
1436 if (bus_pid_changed(bus
))
1439 bus
->state
= BUS_CLOSED
;
1441 sd_bus_detach_event(bus
);
1443 /* Drop all queued messages so that they drop references to
1444 * the bus object and the bus may be freed */
1445 bus_reset_queues(bus
);
1447 if (!bus
->is_kernel
)
1450 /* We'll leave the fd open in case this is a kernel bus, since
1451 * there might still be memblocks around that reference this
1452 * bus, and they might need to invoke the KDBUS_CMD_FREE
1453 * ioctl on the fd when they are freed. */
1456 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1464 return sd_bus_unref(bus
);
1467 static void bus_enter_closing(sd_bus
*bus
) {
1470 if (bus
->state
!= BUS_OPENING
&&
1471 bus
->state
!= BUS_AUTHENTICATING
&&
1472 bus
->state
!= BUS_HELLO
&&
1473 bus
->state
!= BUS_RUNNING
)
1476 bus
->state
= BUS_CLOSING
;
1479 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1480 assert_return(bus
, NULL
);
1482 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1487 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1493 i
= REFCNT_DEC(bus
->n_ref
);
1501 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1503 assert_return(bus
, -EINVAL
);
1504 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1506 return BUS_IS_OPEN(bus
->state
);
1509 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1512 assert_return(bus
, -EINVAL
);
1513 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1514 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1516 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1519 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1520 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1523 r
= bus_ensure_running(bus
);
1527 return bus
->can_fds
;
1530 return bus_type_is_valid(type
);
1533 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1536 assert_return(bus
, -EINVAL
);
1537 assert_return(id
, -EINVAL
);
1538 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1540 r
= bus_ensure_running(bus
);
1544 *id
= bus
->server_id
;
1548 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1553 /* If we copy the same message to multiple
1554 * destinations, avoid using the same cookie
1556 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1561 timeout
= BUS_DEFAULT_TIMEOUT
;
1563 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1566 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1567 bool remarshal
= false;
1571 /* wrong packet version */
1572 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1575 /* wrong packet endianness */
1576 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1579 /* TODO: kdbus-messages received from the kernel contain data which is
1580 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1581 * force remarshaling of the message. Technically, we could just
1582 * recreate the kdbus message, but that is non-trivial as other parts of
1583 * the message refer to m->kdbus already. This should be fixed! */
1584 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1587 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1590 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1594 /* Fake some timestamps, if they were requested, and not
1595 * already initialized */
1596 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1597 if (m
->realtime
<= 0)
1598 m
->realtime
= now(CLOCK_REALTIME
);
1600 if (m
->monotonic
<= 0)
1601 m
->monotonic
= now(CLOCK_MONOTONIC
);
1604 /* The bus specification says the serial number cannot be 0,
1605 * hence let's fill something in for synthetic messages. Since
1606 * synthetic messages might have a fake sender and we don't
1607 * want to interfere with the real sender's serial numbers we
1608 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1609 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1610 * even though kdbus can do 64bit. */
1611 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1614 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1621 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1623 r
= bus_socket_write_message(bus
, m
, idx
);
1628 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1629 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1630 bus_message_type_to_string(m
->header
->type
),
1631 strna(sd_bus_message_get_sender(m
)),
1632 strna(sd_bus_message_get_destination(m
)),
1633 strna(sd_bus_message_get_path(m
)),
1634 strna(sd_bus_message_get_interface(m
)),
1635 strna(sd_bus_message_get_member(m
)),
1636 BUS_MESSAGE_COOKIE(m
),
1638 strna(m
->error
.message
));
1643 static int dispatch_wqueue(sd_bus
*bus
) {
1647 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1649 while (bus
->wqueue_size
> 0) {
1651 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1655 /* Didn't do anything this time */
1657 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1658 /* Fully written. Let's drop the entry from
1661 * This isn't particularly optimized, but
1662 * well, this is supposed to be our worst-case
1663 * buffer only, and the socket buffer is
1664 * supposed to be our primary buffer, and if
1665 * it got full, then all bets are off
1668 bus
->wqueue_size
--;
1669 sd_bus_message_unref(bus
->wqueue
[0]);
1670 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1680 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1684 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1686 return bus_socket_read_message(bus
);
1689 int bus_rqueue_make_room(sd_bus
*bus
) {
1692 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1695 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1701 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1706 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1708 /* Note that the priority logic is only available on kdbus,
1709 * where the rqueue is unused. We check the rqueue here
1710 * anyway, because it's simple... */
1713 if (bus
->rqueue_size
> 0) {
1714 /* Dispatch a queued message */
1716 *m
= bus
->rqueue
[0];
1717 bus
->rqueue_size
--;
1718 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1722 /* Try to read a new message */
1723 r
= bus_read_message(bus
, hint_priority
, priority
);
1733 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1734 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1737 assert_return(m
, -EINVAL
);
1742 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1743 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1745 if (!BUS_IS_OPEN(bus
->state
))
1749 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1756 /* If the cookie number isn't kept, then we know that no reply
1758 if (!cookie
&& !m
->sealed
)
1759 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1761 r
= bus_seal_message(bus
, m
, 0);
1765 /* Remarshall if we have to. This will possibly unref the
1766 * message and place a replacement in m */
1767 r
= bus_remarshal_message(bus
, &m
);
1771 /* If this is a reply and no reply was requested, then let's
1772 * suppress this, if we can */
1776 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1779 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1781 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1782 bus_enter_closing(bus
);
1789 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1790 /* Wasn't fully written. So let's remember how
1791 * much was written. Note that the first entry
1792 * of the wqueue array is always allocated so
1793 * that we always can remember how much was
1795 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1796 bus
->wqueue_size
= 1;
1801 /* Just append it to the queue. */
1803 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1806 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1809 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1814 *cookie
= BUS_MESSAGE_COOKIE(m
);
1819 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1820 return bus_send_internal(bus
, m
, cookie
, false);
1823 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1826 assert_return(m
, -EINVAL
);
1831 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1833 if (!BUS_IS_OPEN(bus
->state
))
1836 if (!streq_ptr(m
->destination
, destination
)) {
1841 r
= sd_bus_message_set_destination(m
, destination
);
1846 return sd_bus_send(bus
, m
, cookie
);
1849 static usec_t
calc_elapse(uint64_t usec
) {
1850 if (usec
== (uint64_t) -1)
1853 return now(CLOCK_MONOTONIC
) + usec
;
1856 static int timeout_compare(const void *a
, const void *b
) {
1857 const struct reply_callback
*x
= a
, *y
= b
;
1859 if (x
->timeout
!= 0 && y
->timeout
== 0)
1862 if (x
->timeout
== 0 && y
->timeout
!= 0)
1865 if (x
->timeout
< y
->timeout
)
1868 if (x
->timeout
> y
->timeout
)
1874 _public_
int sd_bus_call_async(
1878 sd_bus_message_handler_t callback
,
1882 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1883 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1886 assert_return(m
, -EINVAL
);
1887 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1888 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1889 assert_return(callback
, -EINVAL
);
1894 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1895 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1897 if (!BUS_IS_OPEN(bus
->state
))
1900 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1904 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1908 r
= bus_seal_message(bus
, m
, usec
);
1912 r
= bus_remarshal_message(bus
, &m
);
1916 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1920 s
->reply_callback
.callback
= callback
;
1922 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1923 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1925 s
->reply_callback
.cookie
= 0;
1929 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1930 if (s
->reply_callback
.timeout
!= 0) {
1931 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1933 s
->reply_callback
.timeout
= 0;
1938 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1949 int bus_ensure_running(sd_bus
*bus
) {
1954 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1956 if (bus
->state
== BUS_RUNNING
)
1960 r
= sd_bus_process(bus
, NULL
);
1963 if (bus
->state
== BUS_RUNNING
)
1968 r
= sd_bus_wait(bus
, (uint64_t) -1);
1974 _public_
int sd_bus_call(
1978 sd_bus_error
*error
,
1979 sd_bus_message
**reply
) {
1981 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1987 bus_assert_return(m
, -EINVAL
, error
);
1988 bus_assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
, error
);
1989 bus_assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
, error
);
1990 bus_assert_return(!bus_error_is_dirty(error
), -EINVAL
, error
);
1995 bus_assert_return(!bus_pid_changed(bus
), -ECHILD
, error
);
1996 bus_assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
, error
);
1998 if (!BUS_IS_OPEN(bus
->state
)) {
2003 r
= bus_ensure_running(bus
);
2007 i
= bus
->rqueue_size
;
2009 r
= bus_seal_message(bus
, m
, usec
);
2013 r
= bus_remarshal_message(bus
, &m
);
2017 r
= bus_send_internal(bus
, m
, &cookie
, true);
2021 timeout
= calc_elapse(m
->timeout
);
2026 while (i
< bus
->rqueue_size
) {
2027 sd_bus_message
*incoming
= NULL
;
2029 incoming
= bus
->rqueue
[i
];
2031 if (incoming
->reply_cookie
== cookie
) {
2032 /* Found a match! */
2034 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2036 log_debug_bus_message(incoming
);
2038 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
2040 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2044 sd_bus_message_unref(incoming
);
2049 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2050 sd_bus_message_unref(incoming
);
2053 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
) {
2054 r
= sd_bus_error_copy(error
, &incoming
->error
);
2055 sd_bus_message_unref(incoming
);
2062 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2065 streq(bus
->unique_name
, incoming
->sender
)) {
2067 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2070 /* Our own message? Somebody is trying
2071 * to send its own client a message,
2072 * let's not dead-lock, let's fail
2075 sd_bus_message_unref(incoming
);
2080 /* Try to read more, right-away */
2084 r
= bus_read_message(bus
, false, 0);
2086 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2087 bus_enter_closing(bus
);
2099 n
= now(CLOCK_MONOTONIC
);
2107 left
= (uint64_t) -1;
2109 r
= bus_poll(bus
, true, left
);
2117 r
= dispatch_wqueue(bus
);
2119 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2120 bus_enter_closing(bus
);
2129 return sd_bus_error_set_errno(error
, r
);
2132 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2134 assert_return(bus
, -EINVAL
);
2135 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2136 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2138 return bus
->input_fd
;
2141 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2144 assert_return(bus
, -EINVAL
);
2145 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2147 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2150 if (bus
->state
== BUS_OPENING
)
2152 else if (bus
->state
== BUS_AUTHENTICATING
) {
2154 if (bus_socket_auth_needs_write(bus
))
2159 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2160 if (bus
->rqueue_size
<= 0)
2162 if (bus
->wqueue_size
> 0)
2169 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2170 struct reply_callback
*c
;
2172 assert_return(bus
, -EINVAL
);
2173 assert_return(timeout_usec
, -EINVAL
);
2174 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2176 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2179 if (bus
->track_queue
) {
2184 if (bus
->state
== BUS_CLOSING
) {
2189 if (bus
->state
== BUS_AUTHENTICATING
) {
2190 *timeout_usec
= bus
->auth_timeout
;
2194 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2195 *timeout_usec
= (uint64_t) -1;
2199 if (bus
->rqueue_size
> 0) {
2204 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2206 *timeout_usec
= (uint64_t) -1;
2210 if (c
->timeout
== 0) {
2211 *timeout_usec
= (uint64_t) -1;
2215 *timeout_usec
= c
->timeout
;
2219 static int process_timeout(sd_bus
*bus
) {
2220 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2221 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2222 struct reply_callback
*c
;
2229 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2233 n
= now(CLOCK_MONOTONIC
);
2237 r
= bus_message_new_synthetic_error(
2240 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2245 r
= bus_seal_synthetic_message(bus
, m
);
2249 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2252 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2255 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2257 bus
->iteration_counter
++;
2259 bus
->current_message
= m
;
2260 bus
->current_slot
= sd_bus_slot_ref(slot
);
2261 bus
->current_handler
= c
->callback
;
2262 bus
->current_userdata
= slot
->userdata
;
2263 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2264 bus
->current_userdata
= NULL
;
2265 bus
->current_handler
= NULL
;
2266 bus
->current_slot
= NULL
;
2267 bus
->current_message
= NULL
;
2269 if (slot
->floating
) {
2270 bus_slot_disconnect(slot
);
2271 sd_bus_slot_unref(slot
);
2274 sd_bus_slot_unref(slot
);
2276 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2279 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2283 if (bus
->state
!= BUS_HELLO
)
2286 /* Let's make sure the first message on the bus is the HELLO
2287 * reply. But note that we don't actually parse the message
2288 * here (we leave that to the usual handling), we just verify
2289 * we don't let any earlier msg through. */
2291 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2292 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2295 if (m
->reply_cookie
!= 1)
2301 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2302 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2303 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2304 struct reply_callback
*c
;
2311 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2312 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2315 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2318 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2321 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2327 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2329 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2331 /* If the reply contained a file descriptor which we
2332 * didn't want we pass an error instead. */
2334 r
= bus_message_new_synthetic_error(
2337 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2342 /* Copy over original timestamp */
2343 synthetic_reply
->realtime
= m
->realtime
;
2344 synthetic_reply
->monotonic
= m
->monotonic
;
2345 synthetic_reply
->seqnum
= m
->seqnum
;
2347 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2351 m
= synthetic_reply
;
2353 r
= sd_bus_message_rewind(m
, true);
2358 if (c
->timeout
!= 0) {
2359 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2363 bus
->current_slot
= sd_bus_slot_ref(slot
);
2364 bus
->current_handler
= c
->callback
;
2365 bus
->current_userdata
= slot
->userdata
;
2366 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2367 bus
->current_userdata
= NULL
;
2368 bus
->current_handler
= NULL
;
2369 bus
->current_slot
= NULL
;
2371 if (slot
->floating
) {
2372 bus_slot_disconnect(slot
);
2373 sd_bus_slot_unref(slot
);
2376 sd_bus_slot_unref(slot
);
2378 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2381 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2382 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2383 struct filter_callback
*l
;
2390 bus
->filter_callbacks_modified
= false;
2392 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2395 if (bus
->filter_callbacks_modified
)
2398 /* Don't run this more than once per iteration */
2399 if (l
->last_iteration
== bus
->iteration_counter
)
2402 l
->last_iteration
= bus
->iteration_counter
;
2404 r
= sd_bus_message_rewind(m
, true);
2408 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2410 bus
->current_slot
= sd_bus_slot_ref(slot
);
2411 bus
->current_handler
= l
->callback
;
2412 bus
->current_userdata
= slot
->userdata
;
2413 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2414 bus
->current_userdata
= NULL
;
2415 bus
->current_handler
= NULL
;
2416 bus
->current_slot
= sd_bus_slot_unref(slot
);
2418 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2424 } while (bus
->filter_callbacks_modified
);
2429 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2436 bus
->match_callbacks_modified
= false;
2438 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2442 } while (bus
->match_callbacks_modified
);
2447 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2448 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2454 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2457 if (bus
->manual_peer_interface
)
2460 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2463 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2466 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2469 if (streq_ptr(m
->member
, "Ping"))
2470 r
= sd_bus_message_new_method_return(m
, &reply
);
2471 else if (streq_ptr(m
->member
, "GetMachineId")) {
2475 r
= sd_id128_get_machine(&id
);
2479 r
= sd_bus_message_new_method_return(m
, &reply
);
2483 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2485 r
= sd_bus_message_new_method_errorf(
2487 SD_BUS_ERROR_UNKNOWN_METHOD
,
2488 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2494 r
= sd_bus_send(bus
, reply
, NULL
);
2501 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2505 /* If we got a message with a file descriptor which we didn't
2506 * want to accept, then let's drop it. How can this even
2507 * happen? For example, when the kernel queues a message into
2508 * an activatable names's queue which allows fds, and then is
2509 * delivered to us later even though we ourselves did not
2512 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2518 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2521 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2522 return 1; /* just eat it up */
2524 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2527 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2533 bus
->current_message
= m
;
2534 bus
->iteration_counter
++;
2536 log_debug_bus_message(m
);
2538 r
= process_hello(bus
, m
);
2542 r
= process_reply(bus
, m
);
2546 r
= process_fd_check(bus
, m
);
2550 r
= process_filter(bus
, m
);
2554 r
= process_match(bus
, m
);
2558 r
= process_builtin(bus
, m
);
2562 r
= bus_process_object(bus
, m
);
2565 bus
->current_message
= NULL
;
2569 static int dispatch_track(sd_bus
*bus
) {
2572 if (!bus
->track_queue
)
2575 bus_track_dispatch(bus
->track_queue
);
2579 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2580 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2584 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2586 r
= process_timeout(bus
);
2590 r
= dispatch_wqueue(bus
);
2594 r
= dispatch_track(bus
);
2598 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2604 r
= process_message(bus
, m
);
2609 r
= sd_bus_message_rewind(m
, true);
2618 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2620 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2621 strna(sd_bus_message_get_sender(m
)),
2622 strna(sd_bus_message_get_path(m
)),
2623 strna(sd_bus_message_get_interface(m
)),
2624 strna(sd_bus_message_get_member(m
)));
2626 r
= sd_bus_reply_method_errorf(
2628 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2629 "Unknown object '%s'.", m
->path
);
2643 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2644 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2645 struct reply_callback
*c
;
2649 assert(bus
->state
== BUS_CLOSING
);
2651 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2653 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2656 /* First, fail all outstanding method calls */
2657 r
= bus_message_new_synthetic_error(
2660 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2665 r
= bus_seal_synthetic_message(bus
, m
);
2669 if (c
->timeout
!= 0) {
2670 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2674 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2677 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2679 bus
->iteration_counter
++;
2681 bus
->current_message
= m
;
2682 bus
->current_slot
= sd_bus_slot_ref(slot
);
2683 bus
->current_handler
= c
->callback
;
2684 bus
->current_userdata
= slot
->userdata
;
2685 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2686 bus
->current_userdata
= NULL
;
2687 bus
->current_handler
= NULL
;
2688 bus
->current_slot
= NULL
;
2689 bus
->current_message
= NULL
;
2691 if (slot
->floating
) {
2692 bus_slot_disconnect(slot
);
2693 sd_bus_slot_unref(slot
);
2696 sd_bus_slot_unref(slot
);
2698 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2701 /* Then, synthesize a Disconnected message */
2702 r
= sd_bus_message_new_signal(
2705 "/org/freedesktop/DBus/Local",
2706 "org.freedesktop.DBus.Local",
2711 bus_message_set_sender_local(bus
, m
);
2713 r
= bus_seal_synthetic_message(bus
, m
);
2719 bus
->current_message
= m
;
2720 bus
->iteration_counter
++;
2722 r
= process_filter(bus
, m
);
2726 r
= process_match(bus
, m
);
2738 bus
->current_message
= NULL
;
2743 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2744 BUS_DONT_DESTROY(bus
);
2747 /* Returns 0 when we didn't do anything. This should cause the
2748 * caller to invoke sd_bus_wait() before returning the next
2749 * time. Returns > 0 when we did something, which possibly
2750 * means *ret is filled in with an unprocessed message. */
2752 assert_return(bus
, -EINVAL
);
2753 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2755 /* We don't allow recursively invoking sd_bus_process(). */
2756 assert_return(!bus
->current_message
, -EBUSY
);
2757 assert(!bus
->current_slot
);
2759 switch (bus
->state
) {
2768 r
= bus_socket_process_opening(bus
);
2769 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2770 bus_enter_closing(bus
);
2778 case BUS_AUTHENTICATING
:
2779 r
= bus_socket_process_authenticating(bus
);
2780 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2781 bus_enter_closing(bus
);
2793 r
= process_running(bus
, hint_priority
, priority
, ret
);
2794 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2795 bus_enter_closing(bus
);
2805 return process_closing(bus
, ret
);
2808 assert_not_reached("Unknown state");
2811 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2812 return bus_process_internal(bus
, false, 0, ret
);
2815 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2816 return bus_process_internal(bus
, true, priority
, ret
);
2819 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2820 struct pollfd p
[2] = {};
2823 usec_t m
= USEC_INFINITY
;
2827 if (bus
->state
== BUS_CLOSING
)
2830 if (!BUS_IS_OPEN(bus
->state
))
2833 e
= sd_bus_get_events(bus
);
2838 /* The caller really needs some more data, he doesn't
2839 * care about what's already read, or any timeouts
2840 * except its own. */
2844 /* The caller wants to process if there's something to
2845 * process, but doesn't care otherwise */
2847 r
= sd_bus_get_timeout(bus
, &until
);
2852 nw
= now(CLOCK_MONOTONIC
);
2853 m
= until
> nw
? until
- nw
: 0;
2857 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2860 p
[0].fd
= bus
->input_fd
;
2861 if (bus
->output_fd
== bus
->input_fd
) {
2865 p
[0].events
= e
& POLLIN
;
2866 p
[1].fd
= bus
->output_fd
;
2867 p
[1].events
= e
& POLLOUT
;
2871 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2875 return r
> 0 ? 1 : 0;
2878 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2880 assert_return(bus
, -EINVAL
);
2881 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2883 if (bus
->state
== BUS_CLOSING
)
2886 if (!BUS_IS_OPEN(bus
->state
))
2889 if (bus
->rqueue_size
> 0)
2892 return bus_poll(bus
, false, timeout_usec
);
2895 _public_
int sd_bus_flush(sd_bus
*bus
) {
2898 assert_return(bus
, -EINVAL
);
2899 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2901 if (bus
->state
== BUS_CLOSING
)
2904 if (!BUS_IS_OPEN(bus
->state
))
2907 r
= bus_ensure_running(bus
);
2911 if (bus
->wqueue_size
<= 0)
2915 r
= dispatch_wqueue(bus
);
2917 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2918 bus_enter_closing(bus
);
2925 if (bus
->wqueue_size
<= 0)
2928 r
= bus_poll(bus
, false, (uint64_t) -1);
2934 _public_
int sd_bus_add_filter(
2937 sd_bus_message_handler_t callback
,
2942 assert_return(bus
, -EINVAL
);
2943 assert_return(callback
, -EINVAL
);
2944 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2946 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2950 s
->filter_callback
.callback
= callback
;
2952 bus
->filter_callbacks_modified
= true;
2953 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2961 _public_
int sd_bus_add_match(
2965 sd_bus_message_handler_t callback
,
2968 struct bus_match_component
*components
= NULL
;
2969 unsigned n_components
= 0;
2970 sd_bus_slot
*s
= NULL
;
2973 assert_return(bus
, -EINVAL
);
2974 assert_return(match
, -EINVAL
);
2975 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2977 r
= bus_match_parse(match
, &components
, &n_components
);
2981 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2987 s
->match_callback
.callback
= callback
;
2988 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2990 if (bus
->bus_client
) {
2991 enum bus_match_scope scope
;
2993 scope
= bus_match_get_scope(components
, n_components
);
2995 /* Do not install server-side matches for matches
2996 * against the local service, interface or bus
2998 if (scope
!= BUS_MATCH_LOCAL
) {
3000 if (!bus
->is_kernel
) {
3001 /* When this is not a kernel transport, we
3002 * store the original match string, so that we
3003 * can use it to remove the match again */
3005 s
->match_callback
.match_string
= strdup(match
);
3006 if (!s
->match_callback
.match_string
) {
3012 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
3016 s
->match_added
= true;
3020 bus
->match_callbacks_modified
= true;
3021 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
3030 bus_match_parse_free(components
, n_components
);
3031 sd_bus_slot_unref(s
);
3036 int bus_remove_match_by_string(
3039 sd_bus_message_handler_t callback
,
3042 struct bus_match_component
*components
= NULL
;
3043 unsigned n_components
= 0;
3044 struct match_callback
*c
;
3047 assert_return(bus
, -EINVAL
);
3048 assert_return(match
, -EINVAL
);
3049 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3051 r
= bus_match_parse(match
, &components
, &n_components
);
3055 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3059 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3062 bus_match_parse_free(components
, n_components
);
3067 bool bus_pid_changed(sd_bus
*bus
) {
3070 /* We don't support people creating a bus connection and
3071 * keeping it around over a fork(). Let's complain. */
3073 return bus
->original_pid
!= getpid();
3076 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3077 sd_bus
*bus
= userdata
;
3082 r
= sd_bus_process(bus
, NULL
);
3089 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3090 sd_bus
*bus
= userdata
;
3095 r
= sd_bus_process(bus
, NULL
);
3102 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3103 sd_bus
*bus
= userdata
;
3110 e
= sd_bus_get_events(bus
);
3114 if (bus
->output_fd
!= bus
->input_fd
) {
3116 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3120 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3124 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3129 r
= sd_bus_get_timeout(bus
, &until
);
3135 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3140 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3147 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3148 sd_bus
*bus
= userdata
;
3158 static int attach_io_events(sd_bus
*bus
) {
3163 if (bus
->input_fd
< 0)
3169 if (!bus
->input_io_event_source
) {
3170 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3174 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3178 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3182 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3184 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3189 if (bus
->output_fd
!= bus
->input_fd
) {
3190 assert(bus
->output_fd
>= 0);
3192 if (!bus
->output_io_event_source
) {
3193 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3197 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3201 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3203 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3212 static void detach_io_events(sd_bus
*bus
) {
3215 if (bus
->input_io_event_source
) {
3216 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3217 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3220 if (bus
->output_io_event_source
) {
3221 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3222 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3226 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3229 assert_return(bus
, -EINVAL
);
3230 assert_return(!bus
->event
, -EBUSY
);
3232 assert(!bus
->input_io_event_source
);
3233 assert(!bus
->output_io_event_source
);
3234 assert(!bus
->time_event_source
);
3237 bus
->event
= sd_event_ref(event
);
3239 r
= sd_event_default(&bus
->event
);
3244 bus
->event_priority
= priority
;
3246 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3250 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3254 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3258 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3262 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3266 r
= attach_io_events(bus
);
3273 sd_bus_detach_event(bus
);
3277 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3278 assert_return(bus
, -EINVAL
);
3283 detach_io_events(bus
);
3285 if (bus
->time_event_source
) {
3286 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3287 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3290 if (bus
->quit_event_source
) {
3291 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3292 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3295 bus
->event
= sd_event_unref(bus
->event
);
3299 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3300 assert_return(bus
, NULL
);
3305 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3306 assert_return(bus
, NULL
);
3308 return bus
->current_message
;
3311 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3312 assert_return(bus
, NULL
);
3314 return bus
->current_slot
;
3317 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3318 assert_return(bus
, NULL
);
3320 return bus
->current_handler
;
3323 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3324 assert_return(bus
, NULL
);
3326 return bus
->current_userdata
;
3329 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3334 assert(default_bus
);
3337 return !!*default_bus
;
3340 *ret
= sd_bus_ref(*default_bus
);
3348 b
->default_bus_ptr
= default_bus
;
3356 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3357 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3361 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3362 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3365 _public_
int sd_bus_default(sd_bus
**ret
) {
3369 /* Let's try our best to reuse another cached connection. If
3370 * the starter bus type is set, connect via our normal
3371 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3372 * we can share the connection with the user/system default
3375 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3377 if (streq(e
, "system"))
3378 return sd_bus_default_system(ret
);
3379 else if (STR_IN_SET(e
, "user", "session"))
3380 return sd_bus_default_user(ret
);
3383 /* No type is specified, so we have not other option than to
3384 * use the starter address if it is set. */
3386 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3389 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3392 /* Finally, if nothing is set use the cached connection for
3393 * the right scope */
3395 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3396 return sd_bus_default_user(ret
);
3398 return sd_bus_default_system(ret
);
3401 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3402 assert_return(b
, -EINVAL
);
3403 assert_return(tid
, -EINVAL
);
3404 assert_return(!bus_pid_changed(b
), -ECHILD
);
3412 return sd_event_get_tid(b
->event
, tid
);
3417 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3418 _cleanup_free_
char *e
= NULL
;
3421 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3422 assert_return(external_id
, -EINVAL
);
3423 assert_return(ret_path
, -EINVAL
);
3425 e
= bus_label_escape(external_id
);
3429 ret
= strjoin(prefix
, "/", e
, NULL
);
3437 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3441 assert_return(object_path_is_valid(path
), -EINVAL
);
3442 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3443 assert_return(external_id
, -EINVAL
);
3445 e
= object_path_startswith(path
, prefix
);
3447 *external_id
= NULL
;
3451 ret
= bus_label_unescape(e
);
3459 _public_
int sd_bus_path_encode_many(char **out
, const char *path_template
, ...) {
3460 _cleanup_strv_free_
char **labels
= NULL
;
3461 char *path
, *path_pos
, **label_pos
;
3462 const char *sep
, *template_pos
;
3467 assert_return(out
, -EINVAL
);
3468 assert_return(path_template
, -EINVAL
);
3470 path_length
= strlen(path_template
);
3472 va_start(list
, path_template
);
3473 for (sep
= strchr(path_template
, '%'); sep
; sep
= strchr(sep
+ 1, '%')) {
3477 arg
= va_arg(list
, const char *);
3483 label
= bus_label_escape(arg
);
3489 r
= strv_consume(&labels
, label
);
3495 /* add label length, but account for the format character */
3496 path_length
+= strlen(label
) - 1;
3500 path
= malloc(path_length
+ 1);
3507 for (template_pos
= path_template
; *template_pos
; ) {
3508 sep
= strchrnul(template_pos
, '%');
3509 path_pos
= mempcpy(path_pos
, template_pos
, sep
- template_pos
);
3513 path_pos
= stpcpy(path_pos
, *label_pos
++);
3514 template_pos
= sep
+ 1;
3522 _public_
int sd_bus_path_decode_many(const char *path
, const char *path_template
, ...) {
3523 _cleanup_strv_free_
char **labels
= NULL
;
3524 const char *template_pos
, *path_pos
;
3530 * This decodes an object-path based on a template argument. The
3531 * template consists of a verbatim path, optionally including special
3534 * - Each occurrence of '%' in the template matches an arbitrary
3535 * substring of a label in the given path. At most one such
3536 * directive is allowed per label. For each such directive, the
3537 * caller must provide an output parameter (char **) via va_arg. If
3538 * NULL is passed, the given label is verified, but not returned.
3539 * For each matched label, the *decoded* label is stored in the
3540 * passed output argument, and the caller is responsible to free
3541 * it. Note that the output arguments are only modified if the
3542 * actualy path matched the template. Otherwise, they're left
3545 * This function returns <0 on error, 0 if the path does not match the
3546 * template, 1 if it matched.
3549 assert_return(path
, -EINVAL
);
3550 assert_return(path_template
, -EINVAL
);
3554 for (template_pos
= path_template
; *template_pos
; ) {
3559 /* verify everything until the next '%' matches verbatim */
3560 sep
= strchrnul(template_pos
, '%');
3561 length
= sep
- template_pos
;
3562 if (strncmp(path_pos
, template_pos
, length
))
3566 template_pos
+= length
;
3571 /* We found the next '%' character. Everything up until here
3572 * matched. We now skip ahead to the end of this label and make
3573 * sure it matches the tail of the label in the path. Then we
3574 * decode the string in-between and save it for later use. */
3576 ++template_pos
; /* skip over '%' */
3578 sep
= strchrnul(template_pos
, '/');
3579 length
= sep
- template_pos
; /* length of suffix to match verbatim */
3581 /* verify the suffixes match */
3582 sep
= strchrnul(path_pos
, '/');
3583 if (sep
- path_pos
< (ssize_t
)length
||
3584 strncmp(sep
- length
, template_pos
, length
))
3587 template_pos
+= length
; /* skip over matched label */
3588 length
= sep
- path_pos
- length
; /* length of sub-label to decode */
3590 /* store unescaped label for later use */
3591 label
= bus_label_unescape_n(path_pos
, length
);
3595 r
= strv_consume(&labels
, label
);
3599 path_pos
= sep
; /* skip decoded label and suffix */
3602 /* end of template must match end of path */
3606 /* copy the labels over to the caller */
3607 va_start(list
, path_template
);
3608 for (label_pos
= labels
; label_pos
&& *label_pos
; ++label_pos
) {
3611 arg
= va_arg(list
, char **);
3624 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3627 assert_return(bus
, -EINVAL
);
3628 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3630 if (!bus
->is_kernel
)
3633 if (!BUS_IS_OPEN(bus
->state
))
3636 if (bus
->rqueue_size
> 0)
3639 if (bus
->wqueue_size
> 0)
3642 r
= bus_kernel_try_close(bus
);
3650 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3651 assert_return(bus
, -EINVAL
);
3652 assert_return(description
, -EINVAL
);
3653 assert_return(bus
->description
, -ENXIO
);
3654 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3656 *description
= bus
->description
;
3660 int bus_get_root_path(sd_bus
*bus
) {
3663 if (bus
->cgroup_root
)
3666 r
= cg_get_root_path(&bus
->cgroup_root
);
3668 bus
->cgroup_root
= strdup("/");
3669 if (!bus
->cgroup_root
)
3678 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3681 assert_return(bus
, -EINVAL
);
3682 assert_return(scope
, -EINVAL
);
3683 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3685 if (bus
->is_kernel
) {
3686 _cleanup_free_
char *n
= NULL
;
3689 r
= bus_kernel_get_bus_name(bus
, &n
);
3693 if (streq(n
, "0-system")) {
3698 dash
= strchr(n
, '-');
3699 if (streq_ptr(dash
, "-user")) {
3710 if (bus
->is_system
) {
3718 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3720 assert_return(bus
, -EINVAL
);
3721 assert_return(address
, -EINVAL
);
3722 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3725 *address
= bus
->address
;
3732 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3733 assert_return(bus
, -EINVAL
);
3734 assert_return(mask
, -EINVAL
);
3735 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3737 *mask
= bus
->creds_mask
;
3741 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3742 assert_return(bus
, -EINVAL
);
3743 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3745 return bus
->bus_client
;
3748 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3749 assert_return(bus
, -EINVAL
);
3750 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3752 return bus
->is_server
;
3755 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3756 assert_return(bus
, -EINVAL
);
3757 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3759 return bus
->anonymous_auth
;
3762 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3763 assert_return(bus
, -EINVAL
);
3764 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3766 return bus
->trusted
;
3769 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3770 assert_return(bus
, -EINVAL
);
3771 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3773 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);
3776 static void flush_close(sd_bus
*bus
) {
3780 /* Flushes and closes the specified bus. We take a ref before,
3781 * to ensure the flushing does not cause the bus to be
3784 sd_bus_flush_close_unref(sd_bus_ref(bus
));
3787 _public_
void sd_bus_default_flush_close(void) {
3788 flush_close(default_starter_bus
);
3789 flush_close(default_user_bus
);
3790 flush_close(default_system_bus
);