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
);
120 free(b
->unique_name
);
121 free(b
->auth_buffer
);
126 free(b
->cgroup_root
);
127 free(b
->description
);
130 strv_free(b
->exec_argv
);
132 close_many(b
->fds
, b
->n_fds
);
137 ordered_hashmap_free_free(b
->reply_callbacks
);
138 prioq_free(b
->reply_callbacks_prioq
);
140 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
141 bus_match_free(&b
->match_callbacks
);
143 hashmap_free_free(b
->vtable_methods
);
144 hashmap_free_free(b
->vtable_properties
);
146 assert(hashmap_isempty(b
->nodes
));
147 hashmap_free(b
->nodes
);
149 bus_kernel_flush_memfd(b
);
151 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
156 _public_
int sd_bus_new(sd_bus
**ret
) {
159 assert_return(ret
, -EINVAL
);
165 r
->n_ref
= REFCNT_INIT
;
166 r
->input_fd
= r
->output_fd
= -1;
167 r
->message_version
= 1;
168 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
169 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
170 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
171 r
->original_pid
= getpid();
173 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
175 /* We guarantee that wqueue always has space for at least one
177 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
186 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
189 assert_return(bus
, -EINVAL
);
190 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
191 assert_return(address
, -EINVAL
);
192 assert_return(!bus_pid_changed(bus
), -ECHILD
);
204 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
205 assert_return(bus
, -EINVAL
);
206 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
207 assert_return(input_fd
>= 0, -EINVAL
);
208 assert_return(output_fd
>= 0, -EINVAL
);
209 assert_return(!bus_pid_changed(bus
), -ECHILD
);
211 bus
->input_fd
= input_fd
;
212 bus
->output_fd
= output_fd
;
216 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
219 assert_return(bus
, -EINVAL
);
220 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
221 assert_return(path
, -EINVAL
);
222 assert_return(!strv_isempty(argv
), -EINVAL
);
223 assert_return(!bus_pid_changed(bus
), -ECHILD
);
235 free(bus
->exec_path
);
236 strv_free(bus
->exec_argv
);
244 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
245 assert_return(bus
, -EINVAL
);
246 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
247 assert_return(!bus_pid_changed(bus
), -ECHILD
);
249 bus
->bus_client
= !!b
;
253 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
254 assert_return(bus
, -EINVAL
);
255 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
256 assert_return(!bus_pid_changed(bus
), -ECHILD
);
258 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_MONITOR
, b
);
262 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
263 assert_return(bus
, -EINVAL
);
264 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
265 assert_return(!bus_pid_changed(bus
), -ECHILD
);
267 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
271 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
273 assert_return(bus
, -EINVAL
);
274 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
275 assert_return(!bus_pid_changed(bus
), -ECHILD
);
277 new_flags
= bus
->attach_flags
;
278 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
280 if (bus
->attach_flags
== new_flags
)
283 bus
->attach_flags
= new_flags
;
284 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
285 bus_kernel_realize_attach_flags(bus
);
290 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
293 assert_return(bus
, -EINVAL
);
294 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
295 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
296 assert_return(!bus_pid_changed(bus
), -ECHILD
);
299 bus
->creds_mask
|= mask
;
301 bus
->creds_mask
&= ~mask
;
303 /* The well knowns we need unconditionally, so that matches can work */
304 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
306 /* Make sure we don't lose the timestamp flag */
307 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
308 if (bus
->attach_flags
== new_flags
)
311 bus
->attach_flags
= new_flags
;
312 if (bus
->state
!= BUS_UNSET
&& bus
->is_kernel
)
313 bus_kernel_realize_attach_flags(bus
);
318 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
319 assert_return(bus
, -EINVAL
);
320 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
321 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
322 assert_return(!bus_pid_changed(bus
), -ECHILD
);
324 bus
->is_server
= !!b
;
325 bus
->server_id
= server_id
;
329 _public_
int sd_bus_set_anonymous(sd_bus
*bus
, int b
) {
330 assert_return(bus
, -EINVAL
);
331 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
332 assert_return(!bus_pid_changed(bus
), -ECHILD
);
334 bus
->anonymous_auth
= !!b
;
338 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
339 assert_return(bus
, -EINVAL
);
340 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
341 assert_return(!bus_pid_changed(bus
), -ECHILD
);
347 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
348 assert_return(bus
, -EINVAL
);
349 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
350 assert_return(!bus_pid_changed(bus
), -ECHILD
);
352 return free_and_strdup(&bus
->description
, description
);
355 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
356 assert_return(bus
, -EINVAL
);
357 assert_return(!bus_pid_changed(bus
), -ECHILD
);
359 bus
->allow_interactive_authorization
= !!b
;
363 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
364 assert_return(bus
, -EINVAL
);
365 assert_return(!bus_pid_changed(bus
), -ECHILD
);
367 return bus
->allow_interactive_authorization
;
370 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
378 assert(bus
->state
== BUS_HELLO
|| bus
->state
== BUS_CLOSING
);
380 r
= sd_bus_message_get_errno(reply
);
384 r
= sd_bus_message_read(reply
, "s", &s
);
388 if (!service_name_is_valid(s
) || s
[0] != ':')
391 bus
->unique_name
= strdup(s
);
392 if (!bus
->unique_name
)
395 if (bus
->state
== BUS_HELLO
)
396 bus
->state
= BUS_RUNNING
;
401 static int bus_send_hello(sd_bus
*bus
) {
402 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
407 if (!bus
->bus_client
|| bus
->is_kernel
)
410 r
= sd_bus_message_new_method_call(
413 "org.freedesktop.DBus",
414 "/org/freedesktop/DBus",
415 "org.freedesktop.DBus",
420 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
423 int bus_start_running(sd_bus
*bus
) {
426 if (bus
->bus_client
&& !bus
->is_kernel
) {
427 bus
->state
= BUS_HELLO
;
431 bus
->state
= BUS_RUNNING
;
435 static int parse_address_key(const char **p
, const char *key
, char **value
) {
436 size_t l
, n
= 0, allocated
= 0;
446 if (strncmp(*p
, key
, l
) != 0)
459 while (*a
!= ';' && *a
!= ',' && *a
!= 0) {
477 c
= (char) ((x
<< 4) | y
);
484 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
508 static void skip_address_key(const char **p
) {
512 *p
+= strcspn(*p
, ",");
518 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
519 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
528 while (**p
!= 0 && **p
!= ';') {
529 r
= parse_address_key(p
, "guid", guid
);
535 r
= parse_address_key(p
, "path", &path
);
541 r
= parse_address_key(p
, "abstract", &abstract
);
550 if (!path
&& !abstract
)
553 if (path
&& abstract
)
558 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
561 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
562 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
563 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
564 } else if (abstract
) {
565 l
= strlen(abstract
);
566 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
569 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
570 b
->sockaddr
.un
.sun_path
[0] = 0;
571 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
572 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
578 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
579 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
581 struct addrinfo
*result
, hints
= {
582 .ai_socktype
= SOCK_STREAM
,
583 .ai_flags
= AI_ADDRCONFIG
,
591 while (**p
!= 0 && **p
!= ';') {
592 r
= parse_address_key(p
, "guid", guid
);
598 r
= parse_address_key(p
, "host", &host
);
604 r
= parse_address_key(p
, "port", &port
);
610 r
= parse_address_key(p
, "family", &family
);
623 if (streq(family
, "ipv4"))
624 hints
.ai_family
= AF_INET
;
625 else if (streq(family
, "ipv6"))
626 hints
.ai_family
= AF_INET6
;
631 r
= getaddrinfo(host
, port
, &hints
, &result
);
635 return -EADDRNOTAVAIL
;
637 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
638 b
->sockaddr_size
= result
->ai_addrlen
;
640 freeaddrinfo(result
);
645 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
647 unsigned n_argv
= 0, j
;
649 size_t allocated
= 0;
657 while (**p
!= 0 && **p
!= ';') {
658 r
= parse_address_key(p
, "guid", guid
);
664 r
= parse_address_key(p
, "path", &path
);
670 if (startswith(*p
, "argv")) {
674 ul
= strtoul(*p
+ 4, (char**) p
, 10);
675 if (errno
> 0 || **p
!= '=' || ul
> 256) {
683 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
691 r
= parse_address_key(p
, NULL
, argv
+ ul
);
706 /* Make sure there are no holes in the array, with the
707 * exception of argv[0] */
708 for (j
= 1; j
< n_argv
; j
++)
714 if (argv
&& argv
[0] == NULL
) {
715 argv
[0] = strdup(path
);
727 for (j
= 0; j
< n_argv
; j
++)
735 static int parse_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
736 _cleanup_free_
char *path
= NULL
;
744 while (**p
!= 0 && **p
!= ';') {
745 r
= parse_address_key(p
, "guid", guid
);
751 r
= parse_address_key(p
, "path", &path
);
770 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
771 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
779 while (**p
!= 0 && **p
!= ';') {
780 r
= parse_address_key(p
, "guid", guid
);
786 r
= parse_address_key(p
, "machine", &machine
);
792 r
= parse_address_key(p
, "pid", &pid
);
801 if (!machine
== !pid
)
805 if (!machine_name_is_valid(machine
))
809 b
->machine
= machine
;
817 r
= parse_pid(pid
, &b
->nspid
);
823 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
824 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
825 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + strlen("/var/run/dbus/system_bus_socket");
830 static int parse_container_kernel_address(sd_bus
*b
, const char **p
, char **guid
) {
831 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
839 while (**p
!= 0 && **p
!= ';') {
840 r
= parse_address_key(p
, "guid", guid
);
846 r
= parse_address_key(p
, "machine", &machine
);
852 r
= parse_address_key(p
, "pid", &pid
);
861 if (!machine
== !pid
)
865 if (!machine_name_is_valid(machine
))
869 b
->machine
= machine
;
877 r
= parse_pid(pid
, &b
->nspid
);
884 b
->kernel
= strdup("/sys/fs/kdbus/0-system/bus");
891 static void bus_reset_parsed_address(sd_bus
*b
) {
895 b
->sockaddr_size
= 0;
896 strv_free(b
->exec_argv
);
900 b
->server_id
= SD_ID128_NULL
;
908 static int bus_parse_next_address(sd_bus
*b
) {
909 _cleanup_free_
char *guid
= NULL
;
917 if (b
->address
[b
->address_index
] == 0)
920 bus_reset_parsed_address(b
);
922 a
= b
->address
+ b
->address_index
;
931 if (startswith(a
, "unix:")) {
934 r
= parse_unix_address(b
, &a
, &guid
);
939 } else if (startswith(a
, "tcp:")) {
942 r
= parse_tcp_address(b
, &a
, &guid
);
948 } else if (startswith(a
, "unixexec:")) {
951 r
= parse_exec_address(b
, &a
, &guid
);
957 } else if (startswith(a
, "kernel:")) {
960 r
= parse_kernel_address(b
, &a
, &guid
);
965 } else if (startswith(a
, "x-machine-unix:")) {
968 r
= parse_container_unix_address(b
, &a
, &guid
);
973 } else if (startswith(a
, "x-machine-kernel:")) {
976 r
= parse_container_kernel_address(b
, &a
, &guid
);
989 r
= sd_id128_from_string(guid
, &b
->server_id
);
994 b
->address_index
= a
- b
->address
;
998 static int bus_start_address(sd_bus
*b
) {
1004 bool skipped
= false;
1009 r
= bus_socket_exec(b
);
1010 else if ((b
->nspid
> 0 || b
->machine
) && b
->kernel
)
1011 r
= bus_container_connect_kernel(b
);
1012 else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1013 r
= bus_container_connect_socket(b
);
1015 r
= bus_kernel_connect(b
);
1016 else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
1017 r
= bus_socket_connect(b
);
1023 r
= attach_io_events(b
);
1028 b
->last_connect_error
= -r
;
1031 r
= bus_parse_next_address(b
);
1035 return b
->last_connect_error
? -b
->last_connect_error
: -ECONNREFUSED
;
1039 int bus_next_address(sd_bus
*b
) {
1042 bus_reset_parsed_address(b
);
1043 return bus_start_address(b
);
1046 static int bus_start_fd(sd_bus
*b
) {
1051 assert(b
->input_fd
>= 0);
1052 assert(b
->output_fd
>= 0);
1054 r
= fd_nonblock(b
->input_fd
, true);
1058 r
= fd_cloexec(b
->input_fd
, true);
1062 if (b
->input_fd
!= b
->output_fd
) {
1063 r
= fd_nonblock(b
->output_fd
, true);
1067 r
= fd_cloexec(b
->output_fd
, true);
1072 if (fstat(b
->input_fd
, &st
) < 0)
1075 if (S_ISCHR(b
->input_fd
))
1076 return bus_kernel_take_fd(b
);
1078 return bus_socket_take_fd(b
);
1081 _public_
int sd_bus_start(sd_bus
*bus
) {
1084 assert_return(bus
, -EINVAL
);
1085 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
1086 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1088 bus
->state
= BUS_OPENING
;
1090 if (bus
->is_server
&& bus
->bus_client
)
1093 if (bus
->input_fd
>= 0)
1094 r
= bus_start_fd(bus
);
1095 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->kernel
|| bus
->machine
)
1096 r
= bus_start_address(bus
);
1105 return bus_send_hello(bus
);
1108 _public_
int sd_bus_open(sd_bus
**ret
) {
1113 assert_return(ret
, -EINVAL
);
1115 /* Let's connect to the starter bus if it is set, and
1116 * otherwise to the bus that is appropropriate for the scope
1117 * we are running in */
1119 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1121 if (streq(e
, "system"))
1122 return sd_bus_open_system(ret
);
1123 else if (STR_IN_SET(e
, "session", "user"))
1124 return sd_bus_open_user(ret
);
1127 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1129 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1130 return sd_bus_open_user(ret
);
1132 return sd_bus_open_system(ret
);
1139 r
= sd_bus_set_address(b
, e
);
1143 b
->bus_client
= true;
1145 /* We don't know whether the bus is trusted or not, so better
1146 * be safe, and authenticate everything */
1148 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1149 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1151 r
= sd_bus_start(b
);
1163 int bus_set_address_system(sd_bus
*b
) {
1167 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1169 return sd_bus_set_address(b
, e
);
1171 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1174 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1178 assert_return(ret
, -EINVAL
);
1184 r
= bus_set_address_system(b
);
1188 b
->bus_client
= true;
1189 b
->is_system
= true;
1191 /* Let's do per-method access control on the system bus. We
1192 * need the caller's UID and capability set for that. */
1194 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1195 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1197 r
= sd_bus_start(b
);
1209 int bus_set_address_user(sd_bus
*b
) {
1214 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1216 return sd_bus_set_address(b
, e
);
1218 e
= secure_getenv("XDG_RUNTIME_DIR");
1220 _cleanup_free_
char *ee
= NULL
;
1222 ee
= bus_address_escape(e
);
1227 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
";" UNIX_USER_BUS_ADDRESS_FMT
, getuid(), ee
);
1229 (void) asprintf(&b
->address
, UNIX_USER_BUS_ADDRESS_FMT
, ee
);
1233 (void) asprintf(&b
->address
, KERNEL_USER_BUS_ADDRESS_FMT
, getuid());
1235 return -ECONNREFUSED
;
1245 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1249 assert_return(ret
, -EINVAL
);
1255 r
= bus_set_address_user(b
);
1259 b
->bus_client
= true;
1262 /* We don't do any per-method access control on the user
1266 r
= sd_bus_start(b
);
1278 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1279 _cleanup_free_
char *e
= NULL
;
1280 char *m
= NULL
, *c
= NULL
;
1285 /* Let's see if we shall enter some container */
1286 m
= strchr(host
, ':');
1290 /* Let's make sure this is not a port of some kind,
1291 * and is a valid machine name. */
1292 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1295 /* Cut out the host part */
1296 t
= strndupa(host
, m
- host
- 1);
1297 e
= bus_address_escape(t
);
1301 c
= strjoina(",argv4=--machine=", m
);
1306 e
= bus_address_escape(host
);
1311 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e
, ",argv3=systemd-stdio-bridge", c
, NULL
);
1318 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1322 assert_return(host
, -EINVAL
);
1323 assert_return(ret
, -EINVAL
);
1325 r
= sd_bus_new(&bus
);
1329 r
= bus_set_address_system_remote(bus
, host
);
1333 bus
->bus_client
= true;
1334 bus
->trusted
= false;
1335 bus
->is_system
= true;
1337 r
= sd_bus_start(bus
);
1349 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1350 _cleanup_free_
char *e
= NULL
;
1355 e
= bus_address_escape(machine
);
1360 b
->address
= strjoin("x-machine-kernel:machine=", e
, ";x-machine-unix:machine=", e
, NULL
);
1362 b
->address
= strjoin("x-machine-unix:machine=", e
, NULL
);
1370 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1374 assert_return(machine
, -EINVAL
);
1375 assert_return(ret
, -EINVAL
);
1376 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1378 r
= sd_bus_new(&bus
);
1382 r
= bus_set_address_system_machine(bus
, machine
);
1386 bus
->bus_client
= true;
1387 bus
->trusted
= false;
1388 bus
->is_system
= true;
1390 r
= sd_bus_start(bus
);
1402 _public_
void sd_bus_close(sd_bus
*bus
) {
1406 if (bus
->state
== BUS_CLOSED
)
1408 if (bus_pid_changed(bus
))
1411 bus
->state
= BUS_CLOSED
;
1413 sd_bus_detach_event(bus
);
1415 /* Drop all queued messages so that they drop references to
1416 * the bus object and the bus may be freed */
1417 bus_reset_queues(bus
);
1419 if (!bus
->is_kernel
)
1422 /* We'll leave the fd open in case this is a kernel bus, since
1423 * there might still be memblocks around that reference this
1424 * bus, and they might need to invoke the KDBUS_CMD_FREE
1425 * ioctl on the fd when they are freed. */
1428 static void bus_enter_closing(sd_bus
*bus
) {
1431 if (bus
->state
!= BUS_OPENING
&&
1432 bus
->state
!= BUS_AUTHENTICATING
&&
1433 bus
->state
!= BUS_HELLO
&&
1434 bus
->state
!= BUS_RUNNING
)
1437 bus
->state
= BUS_CLOSING
;
1440 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1441 assert_return(bus
, NULL
);
1443 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1448 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1454 i
= REFCNT_DEC(bus
->n_ref
);
1462 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1464 assert_return(bus
, -EINVAL
);
1465 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1467 return BUS_IS_OPEN(bus
->state
);
1470 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1473 assert_return(bus
, -EINVAL
);
1474 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1475 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1477 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1480 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1481 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1484 r
= bus_ensure_running(bus
);
1488 return bus
->can_fds
;
1491 return bus_type_is_valid(type
);
1494 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1497 assert_return(bus
, -EINVAL
);
1498 assert_return(id
, -EINVAL
);
1499 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1501 r
= bus_ensure_running(bus
);
1505 *id
= bus
->server_id
;
1509 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1514 /* If we copy the same message to multiple
1515 * destinations, avoid using the same cookie
1517 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1522 timeout
= BUS_DEFAULT_TIMEOUT
;
1524 return bus_message_seal(m
, ++b
->cookie
, timeout
);
1527 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1528 bool remarshal
= false;
1532 /* wrong packet version */
1533 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1536 /* wrong packet endianness */
1537 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1540 /* TODO: kdbus-messages received from the kernel contain data which is
1541 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1542 * force remarshaling of the message. Technically, we could just
1543 * recreate the kdbus message, but that is non-trivial as other parts of
1544 * the message refer to m->kdbus already. This should be fixed! */
1545 if ((*m
)->kdbus
&& (*m
)->release_kdbus
)
1548 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1551 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1555 /* Fake some timestamps, if they were requested, and not
1556 * already initialized */
1557 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1558 if (m
->realtime
<= 0)
1559 m
->realtime
= now(CLOCK_REALTIME
);
1561 if (m
->monotonic
<= 0)
1562 m
->monotonic
= now(CLOCK_MONOTONIC
);
1565 /* The bus specification says the serial number cannot be 0,
1566 * hence let's fill something in for synthetic messages. Since
1567 * synthetic messages might have a fake sender and we don't
1568 * want to interfere with the real sender's serial numbers we
1569 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1570 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1571 * even though kdbus can do 64bit. */
1572 return bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1575 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1582 r
= bus_kernel_write_message(bus
, m
, hint_sync_call
);
1584 r
= bus_socket_write_message(bus
, m
, idx
);
1589 if (bus
->is_kernel
|| *idx
>= BUS_MESSAGE_SIZE(m
))
1590 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
1591 bus_message_type_to_string(m
->header
->type
),
1592 strna(sd_bus_message_get_sender(m
)),
1593 strna(sd_bus_message_get_destination(m
)),
1594 strna(sd_bus_message_get_path(m
)),
1595 strna(sd_bus_message_get_interface(m
)),
1596 strna(sd_bus_message_get_member(m
)),
1597 BUS_MESSAGE_COOKIE(m
),
1599 strna(m
->error
.message
));
1604 static int dispatch_wqueue(sd_bus
*bus
) {
1608 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1610 while (bus
->wqueue_size
> 0) {
1612 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1616 /* Didn't do anything this time */
1618 else if (bus
->is_kernel
|| bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1619 /* Fully written. Let's drop the entry from
1622 * This isn't particularly optimized, but
1623 * well, this is supposed to be our worst-case
1624 * buffer only, and the socket buffer is
1625 * supposed to be our primary buffer, and if
1626 * it got full, then all bets are off
1629 bus
->wqueue_size
--;
1630 sd_bus_message_unref(bus
->wqueue
[0]);
1631 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1641 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1645 return bus_kernel_read_message(bus
, hint_priority
, priority
);
1647 return bus_socket_read_message(bus
);
1650 int bus_rqueue_make_room(sd_bus
*bus
) {
1653 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1656 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1662 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1667 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
1669 /* Note that the priority logic is only available on kdbus,
1670 * where the rqueue is unused. We check the rqueue here
1671 * anyway, because it's simple... */
1674 if (bus
->rqueue_size
> 0) {
1675 /* Dispatch a queued message */
1677 *m
= bus
->rqueue
[0];
1678 bus
->rqueue_size
--;
1679 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1683 /* Try to read a new message */
1684 r
= bus_read_message(bus
, hint_priority
, priority
);
1694 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1695 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1698 assert_return(m
, -EINVAL
);
1703 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1704 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1706 if (!BUS_IS_OPEN(bus
->state
))
1710 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1717 /* If the cookie number isn't kept, then we know that no reply
1719 if (!cookie
&& !m
->sealed
)
1720 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1722 r
= bus_seal_message(bus
, m
, 0);
1726 /* Remarshall if we have to. This will possibly unref the
1727 * message and place a replacement in m */
1728 r
= bus_remarshal_message(bus
, &m
);
1732 /* If this is a reply and no reply was requested, then let's
1733 * suppress this, if we can */
1737 if ((bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1740 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1742 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
1743 bus_enter_closing(bus
);
1750 if (!bus
->is_kernel
&& idx
< BUS_MESSAGE_SIZE(m
)) {
1751 /* Wasn't fully written. So let's remember how
1752 * much was written. Note that the first entry
1753 * of the wqueue array is always allocated so
1754 * that we always can remember how much was
1756 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1757 bus
->wqueue_size
= 1;
1762 /* Just append it to the queue. */
1764 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1767 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1770 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1775 *cookie
= BUS_MESSAGE_COOKIE(m
);
1780 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1781 return bus_send_internal(bus
, m
, cookie
, false);
1784 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1787 assert_return(m
, -EINVAL
);
1792 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1794 if (!BUS_IS_OPEN(bus
->state
))
1797 if (!streq_ptr(m
->destination
, destination
)) {
1802 r
= sd_bus_message_set_destination(m
, destination
);
1807 return sd_bus_send(bus
, m
, cookie
);
1810 static usec_t
calc_elapse(uint64_t usec
) {
1811 if (usec
== (uint64_t) -1)
1814 return now(CLOCK_MONOTONIC
) + usec
;
1817 static int timeout_compare(const void *a
, const void *b
) {
1818 const struct reply_callback
*x
= a
, *y
= b
;
1820 if (x
->timeout
!= 0 && y
->timeout
== 0)
1823 if (x
->timeout
== 0 && y
->timeout
!= 0)
1826 if (x
->timeout
< y
->timeout
)
1829 if (x
->timeout
> y
->timeout
)
1835 _public_
int sd_bus_call_async(
1839 sd_bus_message_handler_t callback
,
1843 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1844 _cleanup_bus_slot_unref_ sd_bus_slot
*s
= NULL
;
1847 assert_return(m
, -EINVAL
);
1848 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1849 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1850 assert_return(callback
, -EINVAL
);
1855 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1856 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1858 if (!BUS_IS_OPEN(bus
->state
))
1861 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1865 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1869 r
= bus_seal_message(bus
, m
, usec
);
1873 r
= bus_remarshal_message(bus
, &m
);
1877 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1881 s
->reply_callback
.callback
= callback
;
1883 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1884 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1886 s
->reply_callback
.cookie
= 0;
1890 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1891 if (s
->reply_callback
.timeout
!= 0) {
1892 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1894 s
->reply_callback
.timeout
= 0;
1899 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1910 int bus_ensure_running(sd_bus
*bus
) {
1915 if (bus
->state
== BUS_UNSET
|| bus
->state
== BUS_CLOSED
|| bus
->state
== BUS_CLOSING
)
1917 if (bus
->state
== BUS_RUNNING
)
1921 r
= sd_bus_process(bus
, NULL
);
1924 if (bus
->state
== BUS_RUNNING
)
1929 r
= sd_bus_wait(bus
, (uint64_t) -1);
1935 _public_
int sd_bus_call(
1939 sd_bus_error
*error
,
1940 sd_bus_message
**reply
) {
1942 _cleanup_bus_message_unref_ sd_bus_message
*m
= sd_bus_message_ref(_m
);
1948 assert_return(m
, -EINVAL
);
1949 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1950 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1951 assert_return(!bus_error_is_dirty(error
), -EINVAL
);
1956 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1957 assert_return(!bus
->is_kernel
|| !(bus
->hello_flags
& KDBUS_HELLO_MONITOR
), -EROFS
);
1959 if (!BUS_IS_OPEN(bus
->state
))
1962 r
= bus_ensure_running(bus
);
1966 i
= bus
->rqueue_size
;
1968 r
= bus_seal_message(bus
, m
, usec
);
1972 r
= bus_remarshal_message(bus
, &m
);
1976 r
= bus_send_internal(bus
, m
, &cookie
, true);
1980 timeout
= calc_elapse(m
->timeout
);
1985 while (i
< bus
->rqueue_size
) {
1986 sd_bus_message
*incoming
= NULL
;
1988 incoming
= bus
->rqueue
[i
];
1990 if (incoming
->reply_cookie
== cookie
) {
1991 /* Found a match! */
1993 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
1996 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
1998 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2002 sd_bus_message_unref(incoming
);
2007 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2009 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
)
2010 r
= sd_bus_error_copy(error
, &incoming
->error
);
2014 sd_bus_message_unref(incoming
);
2017 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
2020 streq(bus
->unique_name
, incoming
->sender
)) {
2022 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
2025 /* Our own message? Somebody is trying
2026 * to send its own client a message,
2027 * let's not dead-lock, let's fail
2030 sd_bus_message_unref(incoming
);
2034 /* Try to read more, right-away */
2038 r
= bus_read_message(bus
, false, 0);
2040 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2041 bus_enter_closing(bus
);
2053 n
= now(CLOCK_MONOTONIC
);
2059 left
= (uint64_t) -1;
2061 r
= bus_poll(bus
, true, left
);
2067 r
= dispatch_wqueue(bus
);
2069 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2070 bus_enter_closing(bus
);
2079 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
2081 assert_return(bus
, -EINVAL
);
2082 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
2083 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2085 return bus
->input_fd
;
2088 _public_
int sd_bus_get_events(sd_bus
*bus
) {
2091 assert_return(bus
, -EINVAL
);
2092 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2094 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2097 if (bus
->state
== BUS_OPENING
)
2099 else if (bus
->state
== BUS_AUTHENTICATING
) {
2101 if (bus_socket_auth_needs_write(bus
))
2106 } else if (bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
) {
2107 if (bus
->rqueue_size
<= 0)
2109 if (bus
->wqueue_size
> 0)
2116 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2117 struct reply_callback
*c
;
2119 assert_return(bus
, -EINVAL
);
2120 assert_return(timeout_usec
, -EINVAL
);
2121 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2123 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2126 if (bus
->track_queue
) {
2131 if (bus
->state
== BUS_CLOSING
) {
2136 if (bus
->state
== BUS_AUTHENTICATING
) {
2137 *timeout_usec
= bus
->auth_timeout
;
2141 if (bus
->state
!= BUS_RUNNING
&& bus
->state
!= BUS_HELLO
) {
2142 *timeout_usec
= (uint64_t) -1;
2146 if (bus
->rqueue_size
> 0) {
2151 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2153 *timeout_usec
= (uint64_t) -1;
2157 if (c
->timeout
== 0) {
2158 *timeout_usec
= (uint64_t) -1;
2162 *timeout_usec
= c
->timeout
;
2166 static int process_timeout(sd_bus
*bus
) {
2167 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2168 _cleanup_bus_message_unref_ sd_bus_message
* m
= NULL
;
2169 struct reply_callback
*c
;
2176 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2180 n
= now(CLOCK_MONOTONIC
);
2184 r
= bus_message_new_synthetic_error(
2187 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2192 r
= bus_seal_synthetic_message(bus
, m
);
2196 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2199 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2202 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2204 bus
->iteration_counter
++;
2206 bus
->current_message
= m
;
2207 bus
->current_slot
= sd_bus_slot_ref(slot
);
2208 bus
->current_handler
= c
->callback
;
2209 bus
->current_userdata
= slot
->userdata
;
2210 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2211 bus
->current_userdata
= NULL
;
2212 bus
->current_handler
= NULL
;
2213 bus
->current_slot
= NULL
;
2214 bus
->current_message
= NULL
;
2216 if (slot
->floating
) {
2217 bus_slot_disconnect(slot
);
2218 sd_bus_slot_unref(slot
);
2221 sd_bus_slot_unref(slot
);
2223 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2226 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2230 if (bus
->state
!= BUS_HELLO
)
2233 /* Let's make sure the first message on the bus is the HELLO
2234 * reply. But note that we don't actually parse the message
2235 * here (we leave that to the usual handling), we just verify
2236 * we don't let any earlier msg through. */
2238 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2239 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2242 if (m
->reply_cookie
!= 1)
2248 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2249 _cleanup_bus_message_unref_ sd_bus_message
*synthetic_reply
= NULL
;
2250 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2251 struct reply_callback
*c
;
2258 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_RETURN
&&
2259 m
->header
->type
!= SD_BUS_MESSAGE_METHOD_ERROR
)
2262 if (bus
->is_kernel
&& (bus
->hello_flags
& KDBUS_HELLO_MONITOR
))
2265 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2268 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2274 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2276 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2278 /* If the reply contained a file descriptor which we
2279 * didn't want we pass an error instead. */
2281 r
= bus_message_new_synthetic_error(
2284 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2289 /* Copy over original timestamp */
2290 synthetic_reply
->realtime
= m
->realtime
;
2291 synthetic_reply
->monotonic
= m
->monotonic
;
2292 synthetic_reply
->seqnum
= m
->seqnum
;
2294 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2298 m
= synthetic_reply
;
2300 r
= sd_bus_message_rewind(m
, true);
2305 if (c
->timeout
!= 0) {
2306 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2310 bus
->current_slot
= sd_bus_slot_ref(slot
);
2311 bus
->current_handler
= c
->callback
;
2312 bus
->current_userdata
= slot
->userdata
;
2313 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2314 bus
->current_userdata
= NULL
;
2315 bus
->current_handler
= NULL
;
2316 bus
->current_slot
= NULL
;
2318 if (slot
->floating
) {
2319 bus_slot_disconnect(slot
);
2320 sd_bus_slot_unref(slot
);
2323 sd_bus_slot_unref(slot
);
2325 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2328 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2329 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2330 struct filter_callback
*l
;
2337 bus
->filter_callbacks_modified
= false;
2339 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2342 if (bus
->filter_callbacks_modified
)
2345 /* Don't run this more than once per iteration */
2346 if (l
->last_iteration
== bus
->iteration_counter
)
2349 l
->last_iteration
= bus
->iteration_counter
;
2351 r
= sd_bus_message_rewind(m
, true);
2355 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2357 bus
->current_slot
= sd_bus_slot_ref(slot
);
2358 bus
->current_handler
= l
->callback
;
2359 bus
->current_userdata
= slot
->userdata
;
2360 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2361 bus
->current_userdata
= NULL
;
2362 bus
->current_handler
= NULL
;
2363 bus
->current_slot
= sd_bus_slot_unref(slot
);
2365 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2371 } while (bus
->filter_callbacks_modified
);
2376 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2383 bus
->match_callbacks_modified
= false;
2385 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2389 } while (bus
->match_callbacks_modified
);
2394 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2395 _cleanup_bus_message_unref_ sd_bus_message
*reply
= NULL
;
2401 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2404 if (bus
->manual_peer_interface
)
2407 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2410 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2413 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2416 if (streq_ptr(m
->member
, "Ping"))
2417 r
= sd_bus_message_new_method_return(m
, &reply
);
2418 else if (streq_ptr(m
->member
, "GetMachineId")) {
2422 r
= sd_id128_get_machine(&id
);
2426 r
= sd_bus_message_new_method_return(m
, &reply
);
2430 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2432 r
= sd_bus_message_new_method_errorf(
2434 SD_BUS_ERROR_UNKNOWN_METHOD
,
2435 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2441 r
= sd_bus_send(bus
, reply
, NULL
);
2448 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2452 /* If we got a message with a file descriptor which we didn't
2453 * want to accept, then let's drop it. How can this even
2454 * happen? For example, when the kernel queues a message into
2455 * an activatable names's queue which allows fds, and then is
2456 * delivered to us later even though we ourselves did not
2459 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2465 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2468 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2469 return 1; /* just eat it up */
2471 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2474 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2480 bus
->current_message
= m
;
2481 bus
->iteration_counter
++;
2483 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error=%s",
2484 bus_message_type_to_string(m
->header
->type
),
2485 strna(sd_bus_message_get_sender(m
)),
2486 strna(sd_bus_message_get_destination(m
)),
2487 strna(sd_bus_message_get_path(m
)),
2488 strna(sd_bus_message_get_interface(m
)),
2489 strna(sd_bus_message_get_member(m
)),
2490 BUS_MESSAGE_COOKIE(m
),
2492 strna(m
->error
.message
));
2494 r
= process_hello(bus
, m
);
2498 r
= process_reply(bus
, m
);
2502 r
= process_fd_check(bus
, m
);
2506 r
= process_filter(bus
, m
);
2510 r
= process_match(bus
, m
);
2514 r
= process_builtin(bus
, m
);
2518 r
= bus_process_object(bus
, m
);
2521 bus
->current_message
= NULL
;
2525 static int dispatch_track(sd_bus
*bus
) {
2528 if (!bus
->track_queue
)
2531 bus_track_dispatch(bus
->track_queue
);
2535 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2536 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2540 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
2542 r
= process_timeout(bus
);
2546 r
= dispatch_wqueue(bus
);
2550 r
= dispatch_track(bus
);
2554 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2560 r
= process_message(bus
, m
);
2565 r
= sd_bus_message_rewind(m
, true);
2574 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2576 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2577 strna(sd_bus_message_get_sender(m
)),
2578 strna(sd_bus_message_get_path(m
)),
2579 strna(sd_bus_message_get_interface(m
)),
2580 strna(sd_bus_message_get_member(m
)));
2582 r
= sd_bus_reply_method_errorf(
2584 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2585 "Unknown object '%s'.", m
->path
);
2599 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2600 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
2601 struct reply_callback
*c
;
2605 assert(bus
->state
== BUS_CLOSING
);
2607 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2609 _cleanup_bus_error_free_ sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2612 /* First, fail all outstanding method calls */
2613 r
= bus_message_new_synthetic_error(
2616 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2621 r
= bus_seal_synthetic_message(bus
, m
);
2625 if (c
->timeout
!= 0) {
2626 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2630 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2633 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2635 bus
->iteration_counter
++;
2637 bus
->current_message
= m
;
2638 bus
->current_slot
= sd_bus_slot_ref(slot
);
2639 bus
->current_handler
= c
->callback
;
2640 bus
->current_userdata
= slot
->userdata
;
2641 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2642 bus
->current_userdata
= NULL
;
2643 bus
->current_handler
= NULL
;
2644 bus
->current_slot
= NULL
;
2645 bus
->current_message
= NULL
;
2647 if (slot
->floating
) {
2648 bus_slot_disconnect(slot
);
2649 sd_bus_slot_unref(slot
);
2652 sd_bus_slot_unref(slot
);
2654 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2657 /* Then, synthesize a Disconnected message */
2658 r
= sd_bus_message_new_signal(
2661 "/org/freedesktop/DBus/Local",
2662 "org.freedesktop.DBus.Local",
2667 bus_message_set_sender_local(bus
, m
);
2669 r
= bus_seal_synthetic_message(bus
, m
);
2675 bus
->current_message
= m
;
2676 bus
->iteration_counter
++;
2678 r
= process_filter(bus
, m
);
2682 r
= process_match(bus
, m
);
2694 bus
->current_message
= NULL
;
2699 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2700 BUS_DONT_DESTROY(bus
);
2703 /* Returns 0 when we didn't do anything. This should cause the
2704 * caller to invoke sd_bus_wait() before returning the next
2705 * time. Returns > 0 when we did something, which possibly
2706 * means *ret is filled in with an unprocessed message. */
2708 assert_return(bus
, -EINVAL
);
2709 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2711 /* We don't allow recursively invoking sd_bus_process(). */
2712 assert_return(!bus
->current_message
, -EBUSY
);
2713 assert(!bus
->current_slot
);
2715 switch (bus
->state
) {
2724 r
= bus_socket_process_opening(bus
);
2725 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2726 bus_enter_closing(bus
);
2734 case BUS_AUTHENTICATING
:
2735 r
= bus_socket_process_authenticating(bus
);
2736 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2737 bus_enter_closing(bus
);
2749 r
= process_running(bus
, hint_priority
, priority
, ret
);
2750 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2751 bus_enter_closing(bus
);
2761 return process_closing(bus
, ret
);
2764 assert_not_reached("Unknown state");
2767 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2768 return bus_process_internal(bus
, false, 0, ret
);
2771 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2772 return bus_process_internal(bus
, true, priority
, ret
);
2775 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2776 struct pollfd p
[2] = {};
2779 usec_t m
= USEC_INFINITY
;
2783 if (bus
->state
== BUS_CLOSING
)
2786 if (!BUS_IS_OPEN(bus
->state
))
2789 e
= sd_bus_get_events(bus
);
2794 /* The caller really needs some more data, he doesn't
2795 * care about what's already read, or any timeouts
2796 * except its own. */
2800 /* The caller wants to process if there's something to
2801 * process, but doesn't care otherwise */
2803 r
= sd_bus_get_timeout(bus
, &until
);
2808 nw
= now(CLOCK_MONOTONIC
);
2809 m
= until
> nw
? until
- nw
: 0;
2813 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2816 p
[0].fd
= bus
->input_fd
;
2817 if (bus
->output_fd
== bus
->input_fd
) {
2821 p
[0].events
= e
& POLLIN
;
2822 p
[1].fd
= bus
->output_fd
;
2823 p
[1].events
= e
& POLLOUT
;
2827 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2831 return r
> 0 ? 1 : 0;
2834 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2836 assert_return(bus
, -EINVAL
);
2837 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2839 if (bus
->state
== BUS_CLOSING
)
2842 if (!BUS_IS_OPEN(bus
->state
))
2845 if (bus
->rqueue_size
> 0)
2848 return bus_poll(bus
, false, timeout_usec
);
2851 _public_
int sd_bus_flush(sd_bus
*bus
) {
2854 assert_return(bus
, -EINVAL
);
2855 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2857 if (bus
->state
== BUS_CLOSING
)
2860 if (!BUS_IS_OPEN(bus
->state
))
2863 r
= bus_ensure_running(bus
);
2867 if (bus
->wqueue_size
<= 0)
2871 r
= dispatch_wqueue(bus
);
2873 if (r
== -ENOTCONN
|| r
== -ECONNRESET
|| r
== -EPIPE
|| r
== -ESHUTDOWN
) {
2874 bus_enter_closing(bus
);
2881 if (bus
->wqueue_size
<= 0)
2884 r
= bus_poll(bus
, false, (uint64_t) -1);
2890 _public_
int sd_bus_add_filter(
2893 sd_bus_message_handler_t callback
,
2898 assert_return(bus
, -EINVAL
);
2899 assert_return(callback
, -EINVAL
);
2900 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2902 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2906 s
->filter_callback
.callback
= callback
;
2908 bus
->filter_callbacks_modified
= true;
2909 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2917 _public_
int sd_bus_add_match(
2921 sd_bus_message_handler_t callback
,
2924 struct bus_match_component
*components
= NULL
;
2925 unsigned n_components
= 0;
2926 sd_bus_slot
*s
= NULL
;
2929 assert_return(bus
, -EINVAL
);
2930 assert_return(match
, -EINVAL
);
2931 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2933 r
= bus_match_parse(match
, &components
, &n_components
);
2937 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2943 s
->match_callback
.callback
= callback
;
2944 s
->match_callback
.cookie
= ++bus
->match_cookie
;
2946 if (bus
->bus_client
) {
2948 if (!bus
->is_kernel
) {
2949 /* When this is not a kernel transport, we
2950 * store the original match string, so that we
2951 * can use it to remove the match again */
2953 s
->match_callback
.match_string
= strdup(match
);
2954 if (!s
->match_callback
.match_string
) {
2960 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
, s
->match_callback
.cookie
);
2965 bus
->match_callbacks_modified
= true;
2966 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
2975 bus_match_parse_free(components
, n_components
);
2976 sd_bus_slot_unref(s
);
2981 int bus_remove_match_by_string(
2984 sd_bus_message_handler_t callback
,
2987 struct bus_match_component
*components
= NULL
;
2988 unsigned n_components
= 0;
2989 struct match_callback
*c
;
2992 assert_return(bus
, -EINVAL
);
2993 assert_return(match
, -EINVAL
);
2994 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2996 r
= bus_match_parse(match
, &components
, &n_components
);
3000 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
3004 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
3007 bus_match_parse_free(components
, n_components
);
3012 bool bus_pid_changed(sd_bus
*bus
) {
3015 /* We don't support people creating a bus connection and
3016 * keeping it around over a fork(). Let's complain. */
3018 return bus
->original_pid
!= getpid();
3021 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
3022 sd_bus
*bus
= userdata
;
3027 r
= sd_bus_process(bus
, NULL
);
3034 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
3035 sd_bus
*bus
= userdata
;
3040 r
= sd_bus_process(bus
, NULL
);
3047 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
3048 sd_bus
*bus
= userdata
;
3055 e
= sd_bus_get_events(bus
);
3059 if (bus
->output_fd
!= bus
->input_fd
) {
3061 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
3065 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
3069 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
3074 r
= sd_bus_get_timeout(bus
, &until
);
3080 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3085 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3092 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3093 sd_bus
*bus
= userdata
;
3103 static int attach_io_events(sd_bus
*bus
) {
3108 if (bus
->input_fd
< 0)
3114 if (!bus
->input_io_event_source
) {
3115 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3119 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3123 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3127 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3129 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3134 if (bus
->output_fd
!= bus
->input_fd
) {
3135 assert(bus
->output_fd
>= 0);
3137 if (!bus
->output_io_event_source
) {
3138 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3142 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3146 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3148 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3157 static void detach_io_events(sd_bus
*bus
) {
3160 if (bus
->input_io_event_source
) {
3161 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3162 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3165 if (bus
->output_io_event_source
) {
3166 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3167 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3171 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3174 assert_return(bus
, -EINVAL
);
3175 assert_return(!bus
->event
, -EBUSY
);
3177 assert(!bus
->input_io_event_source
);
3178 assert(!bus
->output_io_event_source
);
3179 assert(!bus
->time_event_source
);
3182 bus
->event
= sd_event_ref(event
);
3184 r
= sd_event_default(&bus
->event
);
3189 bus
->event_priority
= priority
;
3191 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3195 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3199 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3203 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3207 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3211 r
= attach_io_events(bus
);
3218 sd_bus_detach_event(bus
);
3222 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3223 assert_return(bus
, -EINVAL
);
3228 detach_io_events(bus
);
3230 if (bus
->time_event_source
) {
3231 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3232 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3235 if (bus
->quit_event_source
) {
3236 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3237 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3240 bus
->event
= sd_event_unref(bus
->event
);
3244 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3245 assert_return(bus
, NULL
);
3250 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3251 assert_return(bus
, NULL
);
3253 return bus
->current_message
;
3256 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3257 assert_return(bus
, NULL
);
3259 return bus
->current_slot
;
3262 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3263 assert_return(bus
, NULL
);
3265 return bus
->current_handler
;
3268 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3269 assert_return(bus
, NULL
);
3271 return bus
->current_userdata
;
3274 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3279 assert(default_bus
);
3282 return !!*default_bus
;
3285 *ret
= sd_bus_ref(*default_bus
);
3293 b
->default_bus_ptr
= default_bus
;
3301 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3302 static thread_local sd_bus
*default_system_bus
= NULL
;
3304 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3307 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3308 static thread_local sd_bus
*default_user_bus
= NULL
;
3310 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3313 _public_
int sd_bus_default(sd_bus
**ret
) {
3317 /* Let's try our best to reuse another cached connection. If
3318 * the starter bus type is set, connect via our normal
3319 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3320 * we can share the connection with the user/system default
3323 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3325 if (streq(e
, "system"))
3326 return sd_bus_default_system(ret
);
3327 else if (STR_IN_SET(e
, "user", "session"))
3328 return sd_bus_default_user(ret
);
3331 /* No type is specified, so we have not other option than to
3332 * use the starter address if it is set. */
3334 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3336 static thread_local sd_bus
*default_starter_bus
= NULL
;
3338 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3341 /* Finally, if nothing is set use the cached connection for
3342 * the right scope */
3344 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3345 return sd_bus_default_user(ret
);
3347 return sd_bus_default_system(ret
);
3350 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3351 assert_return(b
, -EINVAL
);
3352 assert_return(tid
, -EINVAL
);
3353 assert_return(!bus_pid_changed(b
), -ECHILD
);
3361 return sd_event_get_tid(b
->event
, tid
);
3366 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3367 _cleanup_free_
char *e
= NULL
;
3370 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3371 assert_return(external_id
, -EINVAL
);
3372 assert_return(ret_path
, -EINVAL
);
3374 e
= bus_label_escape(external_id
);
3378 ret
= strjoin(prefix
, "/", e
, NULL
);
3386 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3390 assert_return(object_path_is_valid(path
), -EINVAL
);
3391 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3392 assert_return(external_id
, -EINVAL
);
3394 e
= object_path_startswith(path
, prefix
);
3396 *external_id
= NULL
;
3400 ret
= bus_label_unescape(e
);
3408 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3411 assert_return(bus
, -EINVAL
);
3412 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3414 if (!bus
->is_kernel
)
3417 if (!BUS_IS_OPEN(bus
->state
))
3420 if (bus
->rqueue_size
> 0)
3423 if (bus
->wqueue_size
> 0)
3426 r
= bus_kernel_try_close(bus
);
3434 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3435 assert_return(bus
, -EINVAL
);
3436 assert_return(description
, -EINVAL
);
3437 assert_return(bus
->description
, -ENXIO
);
3438 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3440 *description
= bus
->description
;
3444 int bus_get_root_path(sd_bus
*bus
) {
3447 if (bus
->cgroup_root
)
3450 r
= cg_get_root_path(&bus
->cgroup_root
);
3452 bus
->cgroup_root
= strdup("/");
3453 if (!bus
->cgroup_root
)
3462 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3465 assert_return(bus
, -EINVAL
);
3466 assert_return(scope
, -EINVAL
);
3467 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3469 if (bus
->is_kernel
) {
3470 _cleanup_free_
char *n
= NULL
;
3473 r
= bus_kernel_get_bus_name(bus
, &n
);
3477 if (streq(n
, "0-system")) {
3482 dash
= strchr(n
, '-');
3483 if (streq_ptr(dash
, "-user")) {
3494 if (bus
->is_system
) {
3502 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3504 assert_return(bus
, -EINVAL
);
3505 assert_return(address
, -EINVAL
);
3506 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3509 *address
= bus
->address
;
3516 int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3517 assert_return(bus
, -EINVAL
);
3518 assert_return(mask
, -EINVAL
);
3519 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3521 *mask
= bus
->creds_mask
;
3525 int sd_bus_is_bus_client(sd_bus
*bus
) {
3526 assert_return(bus
, -EINVAL
);
3527 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3529 return bus
->bus_client
;
3532 int sd_bus_is_server(sd_bus
*bus
) {
3533 assert_return(bus
, -EINVAL
);
3534 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3536 return bus
->is_server
;
3539 int sd_bus_is_anonymous(sd_bus
*bus
) {
3540 assert_return(bus
, -EINVAL
);
3541 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3543 return bus
->anonymous_auth
;
3546 int sd_bus_is_trusted(sd_bus
*bus
) {
3547 assert_return(bus
, -EINVAL
);
3548 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3550 return bus
->trusted
;
3553 int sd_bus_is_monitor(sd_bus
*bus
) {
3554 assert_return(bus
, -EINVAL
);
3555 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3557 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);