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 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
53 static int attach_io_events(sd_bus
*b
);
54 static void detach_io_events(sd_bus
*b
);
56 static void bus_close_fds(sd_bus
*b
) {
62 safe_close(b
->input_fd
);
64 if (b
->output_fd
>= 0 && b
->output_fd
!= b
->input_fd
)
65 safe_close(b
->output_fd
);
67 b
->input_fd
= b
->output_fd
= -1;
70 static void bus_reset_queues(sd_bus
*b
) {
73 while (b
->rqueue_size
> 0)
74 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
78 b
->rqueue_allocated
= 0;
80 while (b
->wqueue_size
> 0)
81 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
85 b
->wqueue_allocated
= 0;
88 static void bus_free(sd_bus
*b
) {
92 assert(!b
->track_queue
);
94 b
->state
= BUS_CLOSED
;
96 sd_bus_detach_event(b
);
98 while ((s
= b
->slots
)) {
99 /* At this point only floating slots can still be
100 * around, because the non-floating ones keep a
101 * reference to the bus, and we thus couldn't be
102 * destructing right now... We forcibly disconnect the
103 * slots here, so that they still can be referenced by
104 * apps, but are dead. */
107 bus_slot_disconnect(s
);
108 sd_bus_slot_unref(s
);
111 if (b
->default_bus_ptr
)
112 *b
->default_bus_ptr
= NULL
;
117 munmap(b
->kdbus_buffer
, KDBUS_POOL_SIZE
);
121 free(b
->unique_name
);
122 free(b
->auth_buffer
);
127 free(b
->cgroup_root
);
128 free(b
->description
);
131 strv_free(b
->exec_argv
);
133 close_many(b
->fds
, b
->n_fds
);
138 ordered_hashmap_free_free(b
->reply_callbacks
);
139 prioq_free(b
->reply_callbacks_prioq
);
141 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
142 bus_match_free(&b
->match_callbacks
);
144 hashmap_free_free(b
->vtable_methods
);
145 hashmap_free_free(b
->vtable_properties
);
147 assert(hashmap_isempty(b
->nodes
));
148 hashmap_free(b
->nodes
);
150 bus_kernel_flush_memfd(b
);
152 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
157 _public_
int sd_bus_new(sd_bus
**ret
) {
160 assert_return(ret
, -EINVAL
);
166 r
->n_ref
= REFCNT_INIT
;
167 r
->input_fd
= r
->output_fd
= -1;
168 r
->message_version
= 1;
169 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
170 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
171 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
172 r
->original_pid
= getpid();
174 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
176 /* We guarantee that wqueue always has space for at least one
178 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
187 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
190 assert_return(bus
, -EINVAL
);
191 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
192 assert_return(address
, -EINVAL
);
193 assert_return(!bus_pid_changed(bus
), -ECHILD
);
205 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
206 assert_return(bus
, -EINVAL
);
207 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
208 assert_return(input_fd
>= 0, -EINVAL
);
209 assert_return(output_fd
>= 0, -EINVAL
);
210 assert_return(!bus_pid_changed(bus
), -ECHILD
);
212 bus
->input_fd
= input_fd
;
213 bus
->output_fd
= output_fd
;
217 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
220 assert_return(bus
, -EINVAL
);
221 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
222 assert_return(path
, -EINVAL
);
223 assert_return(!strv_isempty(argv
), -EINVAL
);
224 assert_return(!bus_pid_changed(bus
), -ECHILD
);
236 free(bus
->exec_path
);
237 strv_free(bus
->exec_argv
);
245 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
246 assert_return(bus
, -EINVAL
);
247 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
248 assert_return(!bus_pid_changed(bus
), -ECHILD
);
250 bus
->bus_client
= !!b
;
254 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
255 assert_return(bus
, -EINVAL
);
256 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
257 assert_return(!bus_pid_changed(bus
), -ECHILD
);
259 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_MONITOR
, b
);
263 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
264 assert_return(bus
, -EINVAL
);
265 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
266 assert_return(!bus_pid_changed(bus
), -ECHILD
);
268 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
272 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
274 assert_return(bus
, -EINVAL
);
275 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
276 assert_return(!bus_pid_changed(bus
), -ECHILD
);
278 new_flags
= bus
->attach_flags
;
279 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
281 if (bus
->attach_flags
== new_flags
)
284 bus
->attach_flags
= new_flags
;
285 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
286 bus_kernel_realize_attach_flags(bus
);
291 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
294 assert_return(bus
, -EINVAL
);
295 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
296 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
297 assert_return(!bus_pid_changed(bus
), -ECHILD
);
300 bus
->creds_mask
|= mask
;
302 bus
->creds_mask
&= ~mask
;
304 /* The well knowns we need unconditionally, so that matches can work */
305 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
307 /* Make sure we don't lose the timestamp flag */
308 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
309 if (bus
->attach_flags
== new_flags
)
312 bus
->attach_flags
= new_flags
;
313 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
314 bus_kernel_realize_attach_flags(bus
);
319 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
320 assert_return(bus
, -EINVAL
);
321 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
322 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
323 assert_return(!bus_pid_changed(bus
), -ECHILD
);
325 bus
->is_server
= !!b
;
326 bus
->server_id
= server_id
;
330 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
331 assert_return(bus
, -EINVAL
);
332 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
333 assert_return(!bus_pid_changed(bus
), -ECHILD
);
335 bus
->anonymous_auth
= !!b
;
339 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
340 assert_return(bus
, -EINVAL
);
341 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
342 assert_return(!bus_pid_changed(bus
), -ECHILD
);
348 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
349 assert_return(bus
, -EINVAL
);
350 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
351 assert_return(!bus_pid_changed(bus
), -ECHILD
);
353 return free_and_strdup(&bus
->description
, description
);
356 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
357 assert_return(bus
, -EINVAL
);
358 assert_return(!bus_pid_changed(bus
), -ECHILD
);
360 bus
->allow_interactive_authorization
= !!b
;
364 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
365 assert_return(bus
, -EINVAL
);
366 assert_return(!bus_pid_changed(bus
), -ECHILD
);
368 return bus
->allow_interactive_authorization
;
371 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
379 assert(bus
->state
== BUS_HELLO
|| bus
->state
== BUS_CLOSING
);
381 r
= sd_bus_message_get_errno(reply
);
385 r
= sd_bus_message_read(reply
, "s", &s
);
389 if (!service_name_is_valid(s
) || s
[0] != ':')
392 bus
->unique_name
= strdup(s
);
393 if (!bus
->unique_name
)
396 if (bus
->state
== BUS_HELLO
)
397 bus
->state
= BUS_RUNNING
;
402 static int bus_send_hello(sd_bus
*bus
) {
403 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
408 if (!bus
->bus_client
|| bus
->is_kernel
)
411 r
= sd_bus_message_new_method_call(
414 "org.freedesktop.DBus",
415 "/org/freedesktop/DBus",
416 "org.freedesktop.DBus",
421 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
424 int bus_start_running(sd_bus
*bus
) {
427 if (bus
->bus_client
&& !bus
->is_kernel
) {
428 bus
->state
= BUS_HELLO
;
432 bus
->state
= BUS_RUNNING
;
436 static int parse_address_key(const char **p
, const char *key
, char **value
) {
437 size_t l
, n
= 0, allocated
= 0;
447 if (strncmp(*p
, key
, l
) != 0)
460 while (*a
!= ';' && *a
!= ',' && *a
!= 0) {
478 c
= (char) ((x
<< 4) | y
);
485 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
509 static void skip_address_key(const char **p
) {
513 *p
+= strcspn(*p
, ",");
519 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
520 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
529 while (**p
!= 0 && **p
!= ';') {
530 r
= parse_address_key(p
, "guid", guid
);
536 r
= parse_address_key(p
, "path", &path
);
542 r
= parse_address_key(p
, "abstract", &abstract
);
551 if (!path
&& !abstract
)
554 if (path
&& abstract
)
559 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
562 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
563 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
564 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
565 } else if (abstract
) {
566 l
= strlen(abstract
);
567 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
570 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
571 b
->sockaddr
.un
.sun_path
[0] = 0;
572 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
573 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
579 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
580 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
582 struct addrinfo
*result
, hints
= {
583 .ai_socktype
= SOCK_STREAM
,
584 .ai_flags
= AI_ADDRCONFIG
,
592 while (**p
!= 0 && **p
!= ';') {
593 r
= parse_address_key(p
, "guid", guid
);
599 r
= parse_address_key(p
, "host", &host
);
605 r
= parse_address_key(p
, "port", &port
);
611 r
= parse_address_key(p
, "family", &family
);
624 if (streq(family
, "ipv4"))
625 hints
.ai_family
= AF_INET
;
626 else if (streq(family
, "ipv6"))
627 hints
.ai_family
= AF_INET6
;
632 r
= getaddrinfo(host
, port
, &hints
, &result
);
636 return -EADDRNOTAVAIL
;
638 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
639 b
->sockaddr_size
= result
->ai_addrlen
;
641 freeaddrinfo(result
);
646 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
648 unsigned n_argv
= 0, j
;
650 size_t allocated
= 0;
658 while (**p
!= 0 && **p
!= ';') {
659 r
= parse_address_key(p
, "guid", guid
);
665 r
= parse_address_key(p
, "path", &path
);
671 if (startswith(*p
, "argv")) {
675 ul
= strtoul(*p
+ 4, (char**) p
, 10);
676 if (errno
> 0 || **p
!= '=' || ul
> 256) {
684 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
692 r
= parse_address_key(p
, NULL
, argv
+ ul
);
707 /* Make sure there are no holes in the array, with the
708 * exception of argv[0] */
709 for (j
= 1; j
< n_argv
; j
++)
715 if (argv
&& argv
[0] == NULL
) {
716 argv
[0] = strdup(path
);
728 for (j
= 0; j
< n_argv
; j
++)
736 static int parse_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
737 _cleanup_free_
char *path
= NULL
;
745 while (**p
!= 0 && **p
!= ';') {
746 r
= parse_address_key(p
, "guid", guid
);
752 r
= parse_address_key(p
, "path", &path
);
771 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
772 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
780 while (**p
!= 0 && **p
!= ';') {
781 r
= parse_address_key(p
, "guid", guid
);
787 r
= parse_address_key(p
, "machine", &machine
);
793 r
= parse_address_key(p
, "pid", &pid
);
802 if (!machine
== !pid
)
806 if (!machine_name_is_valid(machine
))
810 b
->machine
= machine
;
818 r
= parse_pid(pid
, &b
->nspid
);
824 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
825 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
826 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + strlen("/var/run/dbus/system_bus_socket");
831 static int parse_container_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
832 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
840 while (**p
!= 0 && **p
!= ';') {
841 r
= parse_address_key(p
, "guid", guid
);
847 r
= parse_address_key(p
, "machine", &machine
);
853 r
= parse_address_key(p
, "pid", &pid
);
862 if (!machine
== !pid
)
866 if (!machine_name_is_valid(machine
))
870 b
->machine
= machine
;
878 r
= parse_pid(pid
, &b
->nspid
);
885 b
->kernel
= strdup("/sys/fs/kdbus/0-system/bus");
892 static void bus_reset_parsed_address(sd_bus
*b
) {
896 b
->sockaddr_size
= 0;
897 strv_free(b
->exec_argv
);
901 b
->server_id
= SD_ID128_NULL
;
909 static int bus_parse_next_address(sd_bus
*b
) {
910 _cleanup_free_
char *guid
= NULL
;
918 if (b
->address
[b
->address_index
] == 0)
921 bus_reset_parsed_address(b
);
923 a
= b
->address
+ b
->address_index
;
932 if (startswith(a
, "unix:")) {
935 r
= parse_unix_address(b
, &a
, &guid
);
940 } else if (startswith(a
, "tcp:")) {
943 r
= parse_tcp_address(b
, &a
, &guid
);
949 } else if (startswith(a
, "unixexec:")) {
952 r
= parse_exec_address(b
, &a
, &guid
);
958 } else if (startswith(a
, "kernel:")) {
961 r
= parse_kernel_address(b
, &a
, &guid
);
966 } else if (startswith(a
, "x-machine-unix:")) {
969 r
= parse_container_unix_address(b
, &a
, &guid
);
974 } else if (startswith(a
, "x-machine-kernel:")) {
977 r
= parse_container_kernel_address(b
, &a
, &guid
);
990 r
= sd_id128_from_string(guid
, &b
->server_id
);
995 b
->address_index
= a
- b
->address
;
999 static int bus_start_address(sd_bus
*b
) {
1005 bool skipped
= false;
1010 r
= bus_socket_exec(b
);
1011 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
)
1012 r
= bus_container_connect_kernel(b
);
1013 else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1014 r
= bus_container_connect_socket(b
);
1016 r
= bus_kernel_connect(b
);
1017 else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1018 r
= bus_socket_connect(b
);
1024 r
= attach_io_events(b
);
1029 b
->last_connect_error
= -r
;
1032 r
= bus_parse_next_address(b
);
1036 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1040 int bus_next_address(sd_bus
*b
) {
1043 bus_reset_parsed_address(b
);
1044 return bus_start_address(b
);
1047 static int bus_start_fd(sd_bus
*b
) {
1052 assert(b
->input_fd
>= 0);
1053 assert(b
->output_fd
>= 0);
1055 r
= fd_nonblock(b
->input_fd
, true);
1059 r
= fd_cloexec(b
->input_fd
, true);
1063 if (b
->input_fd
!= b
->output_fd
) {
1064 r
= fd_nonblock(b
->output_fd
, true);
1068 r
= fd_cloexec(b
->output_fd
, true);
1073 if (fstat(b
->input_fd
, &st
) < 0)
1076 if (S_ISCHR(b
->input_fd
))
1077 return bus_kernel_take_fd(b
);
1079 return bus_socket_take_fd(b
);
1082 _public_
int sd_bus_start(sd_bus
*bus
) {
1085 assert_return(bus
, -EINVAL
);
1086 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1087 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1089 bus
->state
= BUS_OPENING
;
1091 if (bus
->is_server
&& bus
->bus_client
)
1094 if (bus
->input_fd
>= 0)
1095 r
= bus_start_fd(bus
);
1096 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1097 r
= bus_start_address(bus
);
1106 return bus_send_hello(bus
);
1109 _public_
int sd_bus_open(sd_bus
**ret
) {
1114 assert_return(ret
, -EINVAL
);
1116 /* Let's connect to the starter bus if it is set, and
1117 * otherwise to the bus that is appropropriate for the scope
1118 * we are running in */
1120 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1122 if (streq(e
, "system"))
1123 return sd_bus_open_system(ret
);
1124 else if (STR_IN_SET(e
, "session", "user"))
1125 return sd_bus_open_user(ret
);
1128 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1130 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1131 return sd_bus_open_user(ret
);
1133 return sd_bus_open_system(ret
);
1140 r
= sd_bus_set_address(b
, e
);
1144 b
->bus_client
= true;
1146 /* We don't know whether the bus is trusted or not, so better
1147 * be safe, and authenticate everything */
1149 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1150 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1152 r
= sd_bus_start(b
);
1164 int bus_set_address_system(sd_bus
*b
) {
1168 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1170 return sd_bus_set_address(b
, e
);
1172 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1175 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1179 assert_return(ret
, -EINVAL
);
1185 r
= bus_set_address_system(b
);
1189 b
->bus_client
= true;
1190 b
->is_system
= true;
1192 /* Let's do per-method access control on the system bus. We
1193 * need the caller's UID and capability set for that. */
1195 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1196 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1198 r
= sd_bus_start(b
);
1210 int bus_set_address_user(sd_bus
*b
) {
1215 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1217 return sd_bus_set_address(b
, e
);
1219 e
= secure_getenv("XDG_RUNTIME_DIR");
1221 _cleanup_free_
char *ee
= NULL
;
1223 ee
= bus_address_escape(e
);
1228 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, getuid(), ee
);
1230 (void) asprintf(&b
->address
, UNIX_USER_BUS_ADDRESS_FMT
, ee
);
1234 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, getuid());
1236 return -ECONNREFUSED
;
1246 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1250 assert_return(ret
, -EINVAL
);
1256 r
= bus_set_address_user(b
);
1260 b
->bus_client
= true;
1263 /* We don't do any per-method access control on the user
1267 r
= sd_bus_start(b
);
1279 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1280 _cleanup_free_
char *e
= NULL
;
1281 char *m
= NULL
, *c
= NULL
;
1286 /* Let's see if we shall enter some container */
1287 m
= strchr(host
, ':');
1291 /* Let's make sure this is not a port of some kind,
1292 * and is a valid machine name. */
1293 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1296 /* Cut out the host part */
1297 t
= strndupa(host
, m
- host
- 1);
1298 e
= bus_address_escape(t
);
1302 c
= strjoina(",argv4=--machine=", m
);
1307 e
= bus_address_escape(host
);
1312 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1319 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1323 assert_return(host
, -EINVAL
);
1324 assert_return(ret
, -EINVAL
);
1326 r
= sd_bus_new(&bus
);
1330 r
= bus_set_address_system_remote(bus
, host
);
1334 bus
->bus_client
= true;
1335 bus
->trusted
= false;
1336 bus
->is_system
= true;
1338 r
= sd_bus_start(bus
);
1350 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1351 _cleanup_free_
char *e
= NULL
;
1356 e
= bus_address_escape(machine
);
1361 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1363 b
->address
= strjoin("x-machine-unix:machine=", e
, NULL
);
1371 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1375 assert_return(machine
, -EINVAL
);
1376 assert_return(ret
, -EINVAL
);
1377 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1379 r
= sd_bus_new(&bus
);
1383 r
= bus_set_address_system_machine(bus
, machine
);
1387 bus
->bus_client
= true;
1388 bus
->trusted
= false;
1389 bus
->is_system
= true;
1391 r
= sd_bus_start(bus
);
1403 _public_
void sd_bus_close(sd_bus
*bus
) {
1407 if (bus
->state
== BUS_CLOSED
)
1409 if (bus_pid_changed(bus
))
1412 bus
->state
= BUS_CLOSED
;
1414 sd_bus_detach_event(bus
);
1416 /* Drop all queued messages so that they drop references to
1417 * the bus object and the bus may be freed */
1418 bus_reset_queues(bus
);
1420 if (!bus
->is_kernel
)
1423 /* We'll leave the fd open in case this is a kernel bus, since
1424 * there might still be memblocks around that reference this
1425 * bus, and they might need to invoke the KDBUS_CMD_FREE
1426 * ioctl on the fd when they are freed. */
1429 static void bus_enter_closing(sd_bus
*bus
) {
1432 if (bus
->state
!= BUS_OPENING
&&
1433 bus
->state
!= BUS_AUTHENTICATING
&&
1434 bus
->state
!= BUS_HELLO
&&
1435 bus
->state
!= BUS_RUNNING
)
1438 bus
->state
= BUS_CLOSING
;
1441 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1442 assert_return(bus
, NULL
);
1444 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1449 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1455 i
= REFCNT_DEC(bus
->n_ref
);
1463 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1465 assert_return(bus
, -EINVAL
);
1466 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1468 return BUS_IS_OPEN(bus
->state
);
1471 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1474 assert_return(bus
, -EINVAL
);
1475 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1476 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1478 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1481 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1482 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1485 r
= bus_ensure_running(bus
);
1489 return bus
->can_fds
;
1492 return bus_type_is_valid(type
);
1495 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1498 assert_return(bus
, -EINVAL
);
1499 assert_return(id
, -EINVAL
);
1500 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1502 r
= bus_ensure_running(bus
);
1506 *id
= bus
->server_id
;
1510 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1515 /* If we copy the same message to multiple
1516 * destinations, avoid using the same cookie
1518 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1523 timeout
= BUS_DEFAULT_TIMEOUT
;
1525 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1528 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1529 bool remarshal
= false;
1533 /* wrong packet version */
1534 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1537 /* wrong packet endianness */
1538 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1541 /* TODO: kdbus-messages received from the kernel contain data which is
1542 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1543 * force remarshaling of the message. Technically, we could just
1544 * recreate the kdbus message, but that is non-trivial as other parts of
1545 * the message refer to m->kdbus already. This should be fixed! */
1546 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1549 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1552 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1556 /* Fake some timestamps, if they were requested, and not
1557 * already initialized */
1558 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1559 if (m
->realtime
<= 0)
1560 m
->realtime
= now(CLOCK_REALTIME
);
1562 if (m
->monotonic
<= 0)
1563 m
->monotonic
= now(CLOCK_MONOTONIC
);
1566 /* The bus specification says the serial number cannot be 0,
1567 * hence let's fill something in for synthetic messages. Since
1568 * synthetic messages might have a fake sender and we don't
1569 * want to interfere with the real sender's serial numbers we
1570 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1571 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1572 * even though kdbus can do 64bit. */
1573 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1576 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1583 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1585 r
= bus_socket_write_message(bus
, m
, idx
);
1590 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1591 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1592 bus_message_type_to_string(m
->header
->type
),
1593 strna(sd_bus_message_get_sender(m
)),
1594 strna(sd_bus_message_get_destination(m
)),
1595 strna(sd_bus_message_get_path(m
)),
1596 strna(sd_bus_message_get_interface(m
)),
1597 strna(sd_bus_message_get_member(m
)),
1598 BUS_MESSAGE_COOKIE(m
),
1600 strna(m
->error
.message
));
1605 static int dispatch_wqueue(sd_bus
*bus
) {
1609 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1611 while (bus
->wqueue_size
> 0) {
1613 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1617 /* Didn't do anything this time */
1619 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1620 /* Fully written. Let's drop the entry from
1623 * This isn't particularly optimized, but
1624 * well, this is supposed to be our worst-case
1625 * buffer only, and the socket buffer is
1626 * supposed to be our primary buffer, and if
1627 * it got full, then all bets are off
1630 bus
->wqueue_size
--;
1631 sd_bus_message_unref(bus
->wqueue
[0]);
1632 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1642 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1646 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1648 return bus_socket_read_message(bus
);
1651 int bus_rqueue_make_room(sd_bus
*bus
) {
1654 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1657 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1663 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1668 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1670 /* Note that the priority logic is only available on kdbus,
1671 * where the rqueue is unused. We check the rqueue here
1672 * anyway, because it's simple... */
1675 if (bus
->rqueue_size
> 0) {
1676 /* Dispatch a queued message */
1678 *m
= bus
->rqueue
[0];
1679 bus
->rqueue_size
--;
1680 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1684 /* Try to read a new message */
1685 r
= bus_read_message(bus
, hint_priority
, priority
);
1695 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1696 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1699 assert_return(m
, -EINVAL
);
1704 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1705 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1707 if (!BUS_IS_OPEN(bus
->state
))
1711 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1718 /* If the cookie number isn't kept, then we know that no reply
1720 if (!cookie
&& !m
->sealed
)
1721 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1723 r
= bus_seal_message(bus
, m
, 0);
1727 /* Remarshall if we have to. This will possibly unref the
1728 * message and place a replacement in m */
1729 r
= bus_remarshal_message(bus
, &m
);
1733 /* If this is a reply and no reply was requested, then let's
1734 * suppress this, if we can */
1738 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1741 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1743 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1744 bus_enter_closing(bus
);
1751 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1752 /* Wasn't fully written. So let's remember how
1753 * much was written. Note that the first entry
1754 * of the wqueue array is always allocated so
1755 * that we always can remember how much was
1757 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1758 bus
->wqueue_size
= 1;
1763 /* Just append it to the queue. */
1765 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1768 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1771 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1776 *cookie
= BUS_MESSAGE_COOKIE(m
);
1781 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1782 return bus_send_internal(bus
, m
, cookie
, false);
1785 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1788 assert_return(m
, -EINVAL
);
1793 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1795 if (!BUS_IS_OPEN(bus
->state
))
1798 if (!streq_ptr(m
->destination
, destination
)) {
1803 r
= sd_bus_message_set_destination(m
, destination
);
1808 return sd_bus_send(bus
, m
, cookie
);
1811 static usec_t
calc_elapse(uint64_t usec
) {
1812 if (usec
== (uint64_t) -1)
1815 return now(CLOCK_MONOTONIC
) + usec
;
1818 static int timeout_compare(const void *a
, const void *b
) {
1819 const struct reply_callback
*x
= a
, *y
= b
;
1821 if (x
->timeout
!= 0 && y
->timeout
== 0)
1824 if (x
->timeout
== 0 && y
->timeout
!= 0)
1827 if (x
->timeout
< y
->timeout
)
1830 if (x
->timeout
> y
->timeout
)
1836 _public_
int sd_bus_call_async(
1840 sd_bus_message_handler_t callback
,
1844 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1845 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1848 assert_return(m
, -EINVAL
);
1849 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1850 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1851 assert_return(callback
, -EINVAL
);
1856 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1857 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1859 if (!BUS_IS_OPEN(bus
->state
))
1862 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1866 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1870 r
= bus_seal_message(bus
, m
, usec
);
1874 r
= bus_remarshal_message(bus
, &m
);
1878 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1882 s
->reply_callback
.callback
= callback
;
1884 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1885 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1887 s
->reply_callback
.cookie
= 0;
1891 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1892 if (s
->reply_callback
.timeout
!= 0) {
1893 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1895 s
->reply_callback
.timeout
= 0;
1900 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1911 int bus_ensure_running(sd_bus
*bus
) {
1916 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1918 if (bus
->state
== BUS_RUNNING
)
1922 r
= sd_bus_process(bus
, NULL
);
1925 if (bus
->state
== BUS_RUNNING
)
1930 r
= sd_bus_wait(bus
, (uint64_t) -1);
1936 _public_
int sd_bus_call(
1940 sd_bus_error
*error
,
1941 sd_bus_message
**reply
) {
1943 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1949 assert_return(m
, -EINVAL
);
1950 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1951 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1952 assert_return(!bus_error_is_dirty(error
), -EINVAL
);
1957 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1958 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1960 if (!BUS_IS_OPEN(bus
->state
))
1963 r
= bus_ensure_running(bus
);
1967 i
= bus
->rqueue_size
;
1969 r
= bus_seal_message(bus
, m
, usec
);
1973 r
= bus_remarshal_message(bus
, &m
);
1977 r
= bus_send_internal(bus
, m
, &cookie
, true);
1981 timeout
= calc_elapse(m
->timeout
);
1986 while (i
< bus
->rqueue_size
) {
1987 sd_bus_message
*incoming
= NULL
;
1989 incoming
= bus
->rqueue
[i
];
1991 if (incoming
->reply_cookie
== cookie
) {
1992 /* Found a match! */
1994 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
1997 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
1999 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2003 sd_bus_message_unref(incoming
);
2008 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2010 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
)
2011 r
= sd_bus_error_copy(error
, &incoming
->error
);
2015 sd_bus_message_unref(incoming
);
2018 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2021 streq(bus
->unique_name
, incoming
->sender
)) {
2023 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2026 /* Our own message? Somebody is trying
2027 * to send its own client a message,
2028 * let's not dead-lock, let's fail
2031 sd_bus_message_unref(incoming
);
2035 /* Try to read more, right-away */
2039 r
= bus_read_message(bus
, false, 0);
2041 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2042 bus_enter_closing(bus
);
2054 n
= now(CLOCK_MONOTONIC
);
2060 left
= (uint64_t) -1;
2062 r
= bus_poll(bus
, true, left
);
2068 r
= dispatch_wqueue(bus
);
2070 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2071 bus_enter_closing(bus
);
2080 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2082 assert_return(bus
, -EINVAL
);
2083 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2084 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2086 return bus
->input_fd
;
2089 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2092 assert_return(bus
, -EINVAL
);
2093 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2095 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2098 if (bus
->state
== BUS_OPENING
)
2100 else if (bus
->state
== BUS_AUTHENTICATING
) {
2102 if (bus_socket_auth_needs_write(bus
))
2107 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2108 if (bus
->rqueue_size
<= 0)
2110 if (bus
->wqueue_size
> 0)
2117 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2118 struct reply_callback
*c
;
2120 assert_return(bus
, -EINVAL
);
2121 assert_return(timeout_usec
, -EINVAL
);
2122 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2124 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2127 if (bus
->track_queue
) {
2132 if (bus
->state
== BUS_CLOSING
) {
2137 if (bus
->state
== BUS_AUTHENTICATING
) {
2138 *timeout_usec
= bus
->auth_timeout
;
2142 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2143 *timeout_usec
= (uint64_t) -1;
2147 if (bus
->rqueue_size
> 0) {
2152 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2154 *timeout_usec
= (uint64_t) -1;
2158 if (c
->timeout
== 0) {
2159 *timeout_usec
= (uint64_t) -1;
2163 *timeout_usec
= c
->timeout
;
2167 static int process_timeout(sd_bus
*bus
) {
2168 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2169 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2170 struct reply_callback
*c
;
2177 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2181 n
= now(CLOCK_MONOTONIC
);
2185 r
= bus_message_new_synthetic_error(
2188 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2193 r
= bus_seal_synthetic_message(bus
, m
);
2197 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2200 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2203 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2205 bus
->iteration_counter
++;
2207 bus
->current_message
= m
;
2208 bus
->current_slot
= sd_bus_slot_ref(slot
);
2209 bus
->current_handler
= c
->callback
;
2210 bus
->current_userdata
= slot
->userdata
;
2211 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2212 bus
->current_userdata
= NULL
;
2213 bus
->current_handler
= NULL
;
2214 bus
->current_slot
= NULL
;
2215 bus
->current_message
= NULL
;
2217 if (slot
->floating
) {
2218 bus_slot_disconnect(slot
);
2219 sd_bus_slot_unref(slot
);
2222 sd_bus_slot_unref(slot
);
2224 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2227 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2231 if (bus
->state
!= BUS_HELLO
)
2234 /* Let's make sure the first message on the bus is the HELLO
2235 * reply. But note that we don't actually parse the message
2236 * here (we leave that to the usual handling), we just verify
2237 * we don't let any earlier msg through. */
2239 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2240 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2243 if (m
->reply_cookie
!= 1)
2249 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2250 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2251 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2252 struct reply_callback
*c
;
2259 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2260 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2263 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2266 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2269 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2275 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2277 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2279 /* If the reply contained a file descriptor which we
2280 * didn't want we pass an error instead. */
2282 r
= bus_message_new_synthetic_error(
2285 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2290 /* Copy over original timestamp */
2291 synthetic_reply
->realtime
= m
->realtime
;
2292 synthetic_reply
->monotonic
= m
->monotonic
;
2293 synthetic_reply
->seqnum
= m
->seqnum
;
2295 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2299 m
= synthetic_reply
;
2301 r
= sd_bus_message_rewind(m
, true);
2306 if (c
->timeout
!= 0) {
2307 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2311 bus
->current_slot
= sd_bus_slot_ref(slot
);
2312 bus
->current_handler
= c
->callback
;
2313 bus
->current_userdata
= slot
->userdata
;
2314 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2315 bus
->current_userdata
= NULL
;
2316 bus
->current_handler
= NULL
;
2317 bus
->current_slot
= NULL
;
2319 if (slot
->floating
) {
2320 bus_slot_disconnect(slot
);
2321 sd_bus_slot_unref(slot
);
2324 sd_bus_slot_unref(slot
);
2326 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2329 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2330 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2331 struct filter_callback
*l
;
2338 bus
->filter_callbacks_modified
= false;
2340 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2343 if (bus
->filter_callbacks_modified
)
2346 /* Don't run this more than once per iteration */
2347 if (l
->last_iteration
== bus
->iteration_counter
)
2350 l
->last_iteration
= bus
->iteration_counter
;
2352 r
= sd_bus_message_rewind(m
, true);
2356 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2358 bus
->current_slot
= sd_bus_slot_ref(slot
);
2359 bus
->current_handler
= l
->callback
;
2360 bus
->current_userdata
= slot
->userdata
;
2361 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2362 bus
->current_userdata
= NULL
;
2363 bus
->current_handler
= NULL
;
2364 bus
->current_slot
= sd_bus_slot_unref(slot
);
2366 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2372 } while (bus
->filter_callbacks_modified
);
2377 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2384 bus
->match_callbacks_modified
= false;
2386 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2390 } while (bus
->match_callbacks_modified
);
2395 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2396 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2402 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2405 if (bus
->manual_peer_interface
)
2408 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2411 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2414 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2417 if (streq_ptr(m
->member
, "Ping"))
2418 r
= sd_bus_message_new_method_return(m
, &reply
);
2419 else if (streq_ptr(m
->member
, "GetMachineId")) {
2423 r
= sd_id128_get_machine(&id
);
2427 r
= sd_bus_message_new_method_return(m
, &reply
);
2431 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2433 r
= sd_bus_message_new_method_errorf(
2435 SD_BUS_ERROR_UNKNOWN_METHOD
,
2436 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2442 r
= sd_bus_send(bus
, reply
, NULL
);
2449 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2453 /* If we got a message with a file descriptor which we didn't
2454 * want to accept, then let's drop it. How can this even
2455 * happen? For example, when the kernel queues a message into
2456 * an activatable names's queue which allows fds, and then is
2457 * delivered to us later even though we ourselves did not
2460 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2466 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2469 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2470 return 1; /* just eat it up */
2472 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2475 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2481 bus
->current_message
= m
;
2482 bus
->iteration_counter
++;
2484 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
2485 bus_message_type_to_string(m
->header
->type
),
2486 strna(sd_bus_message_get_sender(m
)),
2487 strna(sd_bus_message_get_destination(m
)),
2488 strna(sd_bus_message_get_path(m
)),
2489 strna(sd_bus_message_get_interface(m
)),
2490 strna(sd_bus_message_get_member(m
)),
2491 BUS_MESSAGE_COOKIE(m
),
2493 strna(m
->error
.message
));
2495 r
= process_hello(bus
, m
);
2499 r
= process_reply(bus
, m
);
2503 r
= process_fd_check(bus
, m
);
2507 r
= process_filter(bus
, m
);
2511 r
= process_match(bus
, m
);
2515 r
= process_builtin(bus
, m
);
2519 r
= bus_process_object(bus
, m
);
2522 bus
->current_message
= NULL
;
2526 static int dispatch_track(sd_bus
*bus
) {
2529 if (!bus
->track_queue
)
2532 bus_track_dispatch(bus
->track_queue
);
2536 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2537 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2541 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2543 r
= process_timeout(bus
);
2547 r
= dispatch_wqueue(bus
);
2551 r
= dispatch_track(bus
);
2555 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2561 r
= process_message(bus
, m
);
2566 r
= sd_bus_message_rewind(m
, true);
2575 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2577 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2578 strna(sd_bus_message_get_sender(m
)),
2579 strna(sd_bus_message_get_path(m
)),
2580 strna(sd_bus_message_get_interface(m
)),
2581 strna(sd_bus_message_get_member(m
)));
2583 r
= sd_bus_reply_method_errorf(
2585 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2586 "Unknown object '%s'.", m
->path
);
2600 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2601 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2602 struct reply_callback
*c
;
2606 assert(bus
->state
== BUS_CLOSING
);
2608 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2610 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2613 /* First, fail all outstanding method calls */
2614 r
= bus_message_new_synthetic_error(
2617 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2622 r
= bus_seal_synthetic_message(bus
, m
);
2626 if (c
->timeout
!= 0) {
2627 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2631 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2634 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2636 bus
->iteration_counter
++;
2638 bus
->current_message
= m
;
2639 bus
->current_slot
= sd_bus_slot_ref(slot
);
2640 bus
->current_handler
= c
->callback
;
2641 bus
->current_userdata
= slot
->userdata
;
2642 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2643 bus
->current_userdata
= NULL
;
2644 bus
->current_handler
= NULL
;
2645 bus
->current_slot
= NULL
;
2646 bus
->current_message
= NULL
;
2648 if (slot
->floating
) {
2649 bus_slot_disconnect(slot
);
2650 sd_bus_slot_unref(slot
);
2653 sd_bus_slot_unref(slot
);
2655 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2658 /* Then, synthesize a Disconnected message */
2659 r
= sd_bus_message_new_signal(
2662 "/org/freedesktop/DBus/Local",
2663 "org.freedesktop.DBus.Local",
2668 bus_message_set_sender_local(bus
, m
);
2670 r
= bus_seal_synthetic_message(bus
, m
);
2676 bus
->current_message
= m
;
2677 bus
->iteration_counter
++;
2679 r
= process_filter(bus
, m
);
2683 r
= process_match(bus
, m
);
2695 bus
->current_message
= NULL
;
2700 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2701 BUS_DONT_DESTROY(bus
);
2704 /* Returns 0 when we didn't do anything. This should cause the
2705 * caller to invoke sd_bus_wait() before returning the next
2706 * time. Returns > 0 when we did something, which possibly
2707 * means *ret is filled in with an unprocessed message. */
2709 assert_return(bus
, -EINVAL
);
2710 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2712 /* We don't allow recursively invoking sd_bus_process(). */
2713 assert_return(!bus
->current_message
, -EBUSY
);
2714 assert(!bus
->current_slot
);
2716 switch (bus
->state
) {
2725 r
= bus_socket_process_opening(bus
);
2726 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2727 bus_enter_closing(bus
);
2735 case BUS_AUTHENTICATING
:
2736 r
= bus_socket_process_authenticating(bus
);
2737 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2738 bus_enter_closing(bus
);
2750 r
= process_running(bus
, hint_priority
, priority
, ret
);
2751 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2752 bus_enter_closing(bus
);
2762 return process_closing(bus
, ret
);
2765 assert_not_reached("Unknown state");
2768 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2769 return bus_process_internal(bus
, false, 0, ret
);
2772 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2773 return bus_process_internal(bus
, true, priority
, ret
);
2776 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2777 struct pollfd p
[2] = {};
2780 usec_t m
= USEC_INFINITY
;
2784 if (bus
->state
== BUS_CLOSING
)
2787 if (!BUS_IS_OPEN(bus
->state
))
2790 e
= sd_bus_get_events(bus
);
2795 /* The caller really needs some more data, he doesn't
2796 * care about what's already read, or any timeouts
2797 * except its own. */
2801 /* The caller wants to process if there's something to
2802 * process, but doesn't care otherwise */
2804 r
= sd_bus_get_timeout(bus
, &until
);
2809 nw
= now(CLOCK_MONOTONIC
);
2810 m
= until
> nw
? until
- nw
: 0;
2814 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2817 p
[0].fd
= bus
->input_fd
;
2818 if (bus
->output_fd
== bus
->input_fd
) {
2822 p
[0].events
= e
& POLLIN
;
2823 p
[1].fd
= bus
->output_fd
;
2824 p
[1].events
= e
& POLLOUT
;
2828 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2832 return r
> 0 ? 1 : 0;
2835 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2837 assert_return(bus
, -EINVAL
);
2838 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2840 if (bus
->state
== BUS_CLOSING
)
2843 if (!BUS_IS_OPEN(bus
->state
))
2846 if (bus
->rqueue_size
> 0)
2849 return bus_poll(bus
, false, timeout_usec
);
2852 _public_
int sd_bus_flush(sd_bus
*bus
) {
2855 assert_return(bus
, -EINVAL
);
2856 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2858 if (bus
->state
== BUS_CLOSING
)
2861 if (!BUS_IS_OPEN(bus
->state
))
2864 r
= bus_ensure_running(bus
);
2868 if (bus
->wqueue_size
<= 0)
2872 r
= dispatch_wqueue(bus
);
2874 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2875 bus_enter_closing(bus
);
2882 if (bus
->wqueue_size
<= 0)
2885 r
= bus_poll(bus
, false, (uint64_t) -1);
2891 _public_
int sd_bus_add_filter(
2894 sd_bus_message_handler_t callback
,
2899 assert_return(bus
, -EINVAL
);
2900 assert_return(callback
, -EINVAL
);
2901 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2903 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2907 s
->filter_callback
.callback
= callback
;
2909 bus
->filter_callbacks_modified
= true;
2910 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2918 _public_
int sd_bus_add_match(
2922 sd_bus_message_handler_t callback
,
2925 struct bus_match_component
*components
= NULL
;
2926 unsigned n_components
= 0;
2927 sd_bus_slot
*s
= NULL
;
2930 assert_return(bus
, -EINVAL
);
2931 assert_return(match
, -EINVAL
);
2932 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2934 r
= bus_match_parse(match
, &components
, &n_components
);
2938 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2944 s
->match_callback
.callback
= callback
;
2945 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2947 if (bus
->bus_client
) {
2949 if (!bus
->is_kernel
) {
2950 /* When this is not a kernel transport, we
2951 * store the original match string, so that we
2952 * can use it to remove the match again */
2954 s
->match_callback
.match_string
= strdup(match
);
2955 if (!s
->match_callback
.match_string
) {
2961 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
2966 bus
->match_callbacks_modified
= true;
2967 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
2976 bus_match_parse_free(components
, n_components
);
2977 sd_bus_slot_unref(s
);
2982 int bus_remove_match_by_string(
2985 sd_bus_message_handler_t callback
,
2988 struct bus_match_component
*components
= NULL
;
2989 unsigned n_components
= 0;
2990 struct match_callback
*c
;
2993 assert_return(bus
, -EINVAL
);
2994 assert_return(match
, -EINVAL
);
2995 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2997 r
= bus_match_parse(match
, &components
, &n_components
);
3001 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3005 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3008 bus_match_parse_free(components
, n_components
);
3013 bool bus_pid_changed(sd_bus
*bus
) {
3016 /* We don't support people creating a bus connection and
3017 * keeping it around over a fork(). Let's complain. */
3019 return bus
->original_pid
!= getpid();
3022 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3023 sd_bus
*bus
= userdata
;
3028 r
= sd_bus_process(bus
, NULL
);
3035 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3036 sd_bus
*bus
= userdata
;
3041 r
= sd_bus_process(bus
, NULL
);
3048 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3049 sd_bus
*bus
= userdata
;
3056 e
= sd_bus_get_events(bus
);
3060 if (bus
->output_fd
!= bus
->input_fd
) {
3062 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3066 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3070 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3075 r
= sd_bus_get_timeout(bus
, &until
);
3081 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3086 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3093 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3094 sd_bus
*bus
= userdata
;
3104 static int attach_io_events(sd_bus
*bus
) {
3109 if (bus
->input_fd
< 0)
3115 if (!bus
->input_io_event_source
) {
3116 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3120 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3124 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3128 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3130 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3135 if (bus
->output_fd
!= bus
->input_fd
) {
3136 assert(bus
->output_fd
>= 0);
3138 if (!bus
->output_io_event_source
) {
3139 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3143 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3147 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3149 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3158 static void detach_io_events(sd_bus
*bus
) {
3161 if (bus
->input_io_event_source
) {
3162 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3163 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3166 if (bus
->output_io_event_source
) {
3167 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3168 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3172 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3175 assert_return(bus
, -EINVAL
);
3176 assert_return(!bus
->event
, -EBUSY
);
3178 assert(!bus
->input_io_event_source
);
3179 assert(!bus
->output_io_event_source
);
3180 assert(!bus
->time_event_source
);
3183 bus
->event
= sd_event_ref(event
);
3185 r
= sd_event_default(&bus
->event
);
3190 bus
->event_priority
= priority
;
3192 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3196 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3200 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3204 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3208 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3212 r
= attach_io_events(bus
);
3219 sd_bus_detach_event(bus
);
3223 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3224 assert_return(bus
, -EINVAL
);
3229 detach_io_events(bus
);
3231 if (bus
->time_event_source
) {
3232 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3233 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3236 if (bus
->quit_event_source
) {
3237 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3238 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3241 bus
->event
= sd_event_unref(bus
->event
);
3245 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3246 assert_return(bus
, NULL
);
3251 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3252 assert_return(bus
, NULL
);
3254 return bus
->current_message
;
3257 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3258 assert_return(bus
, NULL
);
3260 return bus
->current_slot
;
3263 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3264 assert_return(bus
, NULL
);
3266 return bus
->current_handler
;
3269 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3270 assert_return(bus
, NULL
);
3272 return bus
->current_userdata
;
3275 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3280 assert(default_bus
);
3283 return !!*default_bus
;
3286 *ret
= sd_bus_ref(*default_bus
);
3294 b
->default_bus_ptr
= default_bus
;
3302 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3303 static thread_local sd_bus
*default_system_bus
= NULL
;
3305 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3308 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3309 static thread_local sd_bus
*default_user_bus
= NULL
;
3311 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3314 _public_
int sd_bus_default(sd_bus
**ret
) {
3318 /* Let's try our best to reuse another cached connection. If
3319 * the starter bus type is set, connect via our normal
3320 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3321 * we can share the connection with the user/system default
3324 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3326 if (streq(e
, "system"))
3327 return sd_bus_default_system(ret
);
3328 else if (STR_IN_SET(e
, "user", "session"))
3329 return sd_bus_default_user(ret
);
3332 /* No type is specified, so we have not other option than to
3333 * use the starter address if it is set. */
3335 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3337 static thread_local sd_bus
*default_starter_bus
= NULL
;
3339 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3342 /* Finally, if nothing is set use the cached connection for
3343 * the right scope */
3345 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3346 return sd_bus_default_user(ret
);
3348 return sd_bus_default_system(ret
);
3351 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3352 assert_return(b
, -EINVAL
);
3353 assert_return(tid
, -EINVAL
);
3354 assert_return(!bus_pid_changed(b
), -ECHILD
);
3362 return sd_event_get_tid(b
->event
, tid
);
3367 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3368 _cleanup_free_
char *e
= NULL
;
3371 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3372 assert_return(external_id
, -EINVAL
);
3373 assert_return(ret_path
, -EINVAL
);
3375 e
= bus_label_escape(external_id
);
3379 ret
= strjoin(prefix
, "/", e
, NULL
);
3387 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3391 assert_return(object_path_is_valid(path
), -EINVAL
);
3392 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3393 assert_return(external_id
, -EINVAL
);
3395 e
= object_path_startswith(path
, prefix
);
3397 *external_id
= NULL
;
3401 ret
= bus_label_unescape(e
);
3409 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3412 assert_return(bus
, -EINVAL
);
3413 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3415 if (!bus
->is_kernel
)
3418 if (!BUS_IS_OPEN(bus
->state
))
3421 if (bus
->rqueue_size
> 0)
3424 if (bus
->wqueue_size
> 0)
3427 r
= bus_kernel_try_close(bus
);
3435 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3436 assert_return(bus
, -EINVAL
);
3437 assert_return(description
, -EINVAL
);
3438 assert_return(bus
->description
, -ENXIO
);
3439 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3441 *description
= bus
->description
;
3445 int bus_get_root_path(sd_bus
*bus
) {
3448 if (bus
->cgroup_root
)
3451 r
= cg_get_root_path(&bus
->cgroup_root
);
3453 bus
->cgroup_root
= strdup("/");
3454 if (!bus
->cgroup_root
)
3463 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3466 assert_return(bus
, -EINVAL
);
3467 assert_return(scope
, -EINVAL
);
3468 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3470 if (bus
->is_kernel
) {
3471 _cleanup_free_
char *n
= NULL
;
3474 r
= bus_kernel_get_bus_name(bus
, &n
);
3478 if (streq(n
, "0-system")) {
3483 dash
= strchr(n
, '-');
3484 if (streq_ptr(dash
, "-user")) {
3495 if (bus
->is_system
) {
3503 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3505 assert_return(bus
, -EINVAL
);
3506 assert_return(address
, -EINVAL
);
3507 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3510 *address
= bus
->address
;
3517 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3518 assert_return(bus
, -EINVAL
);
3519 assert_return(mask
, -EINVAL
);
3520 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3522 *mask
= bus
->creds_mask
;
3526 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3527 assert_return(bus
, -EINVAL
);
3528 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3530 return bus
->bus_client
;
3533 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3534 assert_return(bus
, -EINVAL
);
3535 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3537 return bus
->is_server
;
3540 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3541 assert_return(bus
, -EINVAL
);
3542 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3544 return bus
->anonymous_auth
;
3547 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3548 assert_return(bus
, -EINVAL
);
3549 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3551 return bus
->trusted
;
3554 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3555 assert_return(bus
, -EINVAL
);
3556 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3558 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);