1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
31 #include "alloc-util.h"
32 #include "bus-container.h"
33 #include "bus-control.h"
34 #include "bus-internal.h"
35 #include "bus-kernel.h"
36 #include "bus-label.h"
37 #include "bus-message.h"
38 #include "bus-objects.h"
39 #include "bus-protocol.h"
41 #include "bus-socket.h"
42 #include "bus-track.h"
45 #include "cgroup-util.h"
48 #include "hexdecoct.h"
49 #include "hostname-util.h"
52 #include "parse-util.h"
53 #include "string-util.h"
57 #define log_debug_bus_message(m) \
59 sd_bus_message *_mm = (m); \
60 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error-name=%s error-message=%s", \
61 bus_message_type_to_string(_mm->header->type), \
62 strna(sd_bus_message_get_sender(_mm)), \
63 strna(sd_bus_message_get_destination(_mm)), \
64 strna(sd_bus_message_get_path(_mm)), \
65 strna(sd_bus_message_get_interface(_mm)), \
66 strna(sd_bus_message_get_member(_mm)), \
67 BUS_MESSAGE_COOKIE(_mm), \
69 strna(_mm->error.name), \
70 strna(_mm->error.message)); \
73 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
);
74 static int attach_io_events(sd_bus
*b
);
75 static void detach_io_events(sd_bus
*b
);
77 static thread_local sd_bus
*default_system_bus
= NULL
;
78 static thread_local sd_bus
*default_user_bus
= NULL
;
79 static thread_local sd_bus
*default_starter_bus
= NULL
;
81 static void bus_close_fds(sd_bus
*b
) {
86 if (b
->input_fd
!= b
->output_fd
)
87 safe_close(b
->output_fd
);
88 b
->output_fd
= b
->input_fd
= safe_close(b
->input_fd
);
91 static void bus_reset_queues(sd_bus
*b
) {
94 while (b
->rqueue_size
> 0)
95 sd_bus_message_unref(b
->rqueue
[--b
->rqueue_size
]);
97 b
->rqueue
= mfree(b
->rqueue
);
98 b
->rqueue_allocated
= 0;
100 while (b
->wqueue_size
> 0)
101 sd_bus_message_unref(b
->wqueue
[--b
->wqueue_size
]);
103 b
->wqueue
= mfree(b
->wqueue
);
104 b
->wqueue_allocated
= 0;
107 static void bus_free(sd_bus
*b
) {
111 assert(!b
->track_queue
);
114 b
->state
= BUS_CLOSED
;
116 sd_bus_detach_event(b
);
118 while ((s
= b
->slots
)) {
119 /* At this point only floating slots can still be
120 * around, because the non-floating ones keep a
121 * reference to the bus, and we thus couldn't be
122 * destructing right now... We forcibly disconnect the
123 * slots here, so that they still can be referenced by
124 * apps, but are dead. */
127 bus_slot_disconnect(s
);
128 sd_bus_slot_unref(s
);
131 if (b
->default_bus_ptr
)
132 *b
->default_bus_ptr
= NULL
;
138 free(b
->unique_name
);
139 free(b
->auth_buffer
);
142 free(b
->cgroup_root
);
143 free(b
->description
);
146 strv_free(b
->exec_argv
);
148 close_many(b
->fds
, b
->n_fds
);
153 ordered_hashmap_free_free(b
->reply_callbacks
);
154 prioq_free(b
->reply_callbacks_prioq
);
156 assert(b
->match_callbacks
.type
== BUS_MATCH_ROOT
);
157 bus_match_free(&b
->match_callbacks
);
159 hashmap_free_free(b
->vtable_methods
);
160 hashmap_free_free(b
->vtable_properties
);
162 assert(hashmap_isempty(b
->nodes
));
163 hashmap_free(b
->nodes
);
167 assert_se(pthread_mutex_destroy(&b
->memfd_cache_mutex
) == 0);
172 _public_
int sd_bus_new(sd_bus
**ret
) {
175 assert_return(ret
, -EINVAL
);
181 r
->n_ref
= REFCNT_INIT
;
182 r
->input_fd
= r
->output_fd
= -1;
183 r
->message_version
= 1;
184 r
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
185 r
->hello_flags
|= KDBUS_HELLO_ACCEPT_FD
;
186 r
->attach_flags
|= KDBUS_ATTACH_NAMES
;
187 r
->original_pid
= getpid_cached();
189 assert_se(pthread_mutex_init(&r
->memfd_cache_mutex
, NULL
) == 0);
191 /* We guarantee that wqueue always has space for at least one
193 if (!GREEDY_REALLOC(r
->wqueue
, r
->wqueue_allocated
, 1)) {
202 _public_
int sd_bus_set_address(sd_bus
*bus
, const char *address
) {
205 assert_return(bus
, -EINVAL
);
206 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
207 assert_return(address
, -EINVAL
);
208 assert_return(!bus_pid_changed(bus
), -ECHILD
);
220 _public_
int sd_bus_set_fd(sd_bus
*bus
, int input_fd
, int output_fd
) {
221 assert_return(bus
, -EINVAL
);
222 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
223 assert_return(input_fd
>= 0, -EBADF
);
224 assert_return(output_fd
>= 0, -EBADF
);
225 assert_return(!bus_pid_changed(bus
), -ECHILD
);
227 bus
->input_fd
= input_fd
;
228 bus
->output_fd
= output_fd
;
232 _public_
int sd_bus_set_exec(sd_bus
*bus
, const char *path
, char *const argv
[]) {
235 assert_return(bus
, -EINVAL
);
236 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
237 assert_return(path
, -EINVAL
);
238 assert_return(!strv_isempty(argv
), -EINVAL
);
239 assert_return(!bus_pid_changed(bus
), -ECHILD
);
251 free(bus
->exec_path
);
252 strv_free(bus
->exec_argv
);
260 _public_
int sd_bus_set_bus_client(sd_bus
*bus
, int b
) {
261 assert_return(bus
, -EINVAL
);
262 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
263 assert_return(!bus_pid_changed(bus
), -ECHILD
);
265 bus
->bus_client
= !!b
;
269 _public_
int sd_bus_set_monitor(sd_bus
*bus
, int b
) {
270 assert_return(bus
, -EINVAL
);
271 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
272 assert_return(!bus_pid_changed(bus
), -ECHILD
);
274 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_MONITOR
, b
);
278 _public_
int sd_bus_negotiate_fds(sd_bus
*bus
, int b
) {
279 assert_return(bus
, -EINVAL
);
280 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
281 assert_return(!bus_pid_changed(bus
), -ECHILD
);
283 SET_FLAG(bus
->hello_flags
, KDBUS_HELLO_ACCEPT_FD
, b
);
287 _public_
int sd_bus_negotiate_timestamp(sd_bus
*bus
, int b
) {
289 assert_return(bus
, -EINVAL
);
290 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
291 assert_return(!bus_pid_changed(bus
), -ECHILD
);
293 new_flags
= bus
->attach_flags
;
294 SET_FLAG(new_flags
, KDBUS_ATTACH_TIMESTAMP
, b
);
296 if (bus
->attach_flags
== new_flags
)
299 bus
->attach_flags
= new_flags
;
304 _public_
int sd_bus_negotiate_creds(sd_bus
*bus
, int b
, uint64_t mask
) {
307 assert_return(bus
, -EINVAL
);
308 assert_return(mask
<= _SD_BUS_CREDS_ALL
, -EINVAL
);
309 assert_return(!IN_SET(bus
->state
, BUS_CLOSING
, BUS_CLOSED
), -EPERM
);
310 assert_return(!bus_pid_changed(bus
), -ECHILD
);
312 SET_FLAG(bus
->creds_mask
, mask
, b
);
314 /* The well knowns we need unconditionally, so that matches can work */
315 bus
->creds_mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
|SD_BUS_CREDS_UNIQUE_NAME
;
317 /* Make sure we don't lose the timestamp flag */
318 new_flags
= (bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) | attach_flags_to_kdbus(bus
->creds_mask
);
319 if (bus
->attach_flags
== new_flags
)
322 bus
->attach_flags
= new_flags
;
327 _public_
int sd_bus_set_server(sd_bus
*bus
, int b
, sd_id128_t server_id
) {
328 assert_return(bus
, -EINVAL
);
329 assert_return(b
|| sd_id128_equal(server_id
, SD_ID128_NULL
), -EINVAL
);
330 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
331 assert_return(!bus_pid_changed(bus
), -ECHILD
);
333 bus
->is_server
= !!b
;
334 bus
->server_id
= server_id
;
338 _public_
int sd_bus_set_anonymous(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
);
343 bus
->anonymous_auth
= !!b
;
347 _public_
int sd_bus_set_trusted(sd_bus
*bus
, int b
) {
348 assert_return(bus
, -EINVAL
);
349 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
350 assert_return(!bus_pid_changed(bus
), -ECHILD
);
356 _public_
int sd_bus_set_description(sd_bus
*bus
, const char *description
) {
357 assert_return(bus
, -EINVAL
);
358 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
359 assert_return(!bus_pid_changed(bus
), -ECHILD
);
361 return free_and_strdup(&bus
->description
, description
);
364 _public_
int sd_bus_set_allow_interactive_authorization(sd_bus
*bus
, int b
) {
365 assert_return(bus
, -EINVAL
);
366 assert_return(!bus_pid_changed(bus
), -ECHILD
);
368 bus
->allow_interactive_authorization
= !!b
;
372 _public_
int sd_bus_get_allow_interactive_authorization(sd_bus
*bus
) {
373 assert_return(bus
, -EINVAL
);
374 assert_return(!bus_pid_changed(bus
), -ECHILD
);
376 return bus
->allow_interactive_authorization
;
379 static int hello_callback(sd_bus_message
*reply
, void *userdata
, sd_bus_error
*error
) {
387 assert(IN_SET(bus
->state
, BUS_HELLO
, BUS_CLOSING
));
389 r
= sd_bus_message_get_errno(reply
);
393 r
= sd_bus_message_read(reply
, "s", &s
);
397 if (!service_name_is_valid(s
) || s
[0] != ':')
400 bus
->unique_name
= strdup(s
);
401 if (!bus
->unique_name
)
404 if (bus
->state
== BUS_HELLO
)
405 bus
->state
= BUS_RUNNING
;
410 static int bus_send_hello(sd_bus
*bus
) {
411 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
416 if (!bus
->bus_client
)
419 r
= sd_bus_message_new_method_call(
422 "org.freedesktop.DBus",
423 "/org/freedesktop/DBus",
424 "org.freedesktop.DBus",
429 return sd_bus_call_async(bus
, NULL
, m
, hello_callback
, NULL
, 0);
432 int bus_start_running(sd_bus
*bus
) {
435 if (bus
->bus_client
) {
436 bus
->state
= BUS_HELLO
;
440 bus
->state
= BUS_RUNNING
;
444 static int parse_address_key(const char **p
, const char *key
, char **value
) {
445 size_t l
, n
= 0, allocated
= 0;
455 if (strncmp(*p
, key
, l
) != 0)
468 while (!IN_SET(*a
, ';', ',', 0)) {
486 c
= (char) ((x
<< 4) | y
);
493 if (!GREEDY_REALLOC(r
, allocated
, n
+ 2))
517 static void skip_address_key(const char **p
) {
521 *p
+= strcspn(*p
, ",");
527 static int parse_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
528 _cleanup_free_
char *path
= NULL
, *abstract
= NULL
;
537 while (!IN_SET(**p
, 0, ';')) {
538 r
= parse_address_key(p
, "guid", guid
);
544 r
= parse_address_key(p
, "path", &path
);
550 r
= parse_address_key(p
, "abstract", &abstract
);
559 if (!path
&& !abstract
)
562 if (path
&& abstract
)
567 if (l
> sizeof(b
->sockaddr
.un
.sun_path
))
570 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
571 strncpy(b
->sockaddr
.un
.sun_path
, path
, sizeof(b
->sockaddr
.un
.sun_path
));
572 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + l
;
573 } else if (abstract
) {
574 l
= strlen(abstract
);
575 if (l
> sizeof(b
->sockaddr
.un
.sun_path
) - 1)
578 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
579 b
->sockaddr
.un
.sun_path
[0] = 0;
580 strncpy(b
->sockaddr
.un
.sun_path
+1, abstract
, sizeof(b
->sockaddr
.un
.sun_path
)-1);
581 b
->sockaddr_size
= offsetof(struct sockaddr_un
, sun_path
) + 1 + l
;
589 static int parse_tcp_address(sd_bus
*b
, const char **p
, char **guid
) {
590 _cleanup_free_
char *host
= NULL
, *port
= NULL
, *family
= NULL
;
592 struct addrinfo
*result
, hints
= {
593 .ai_socktype
= SOCK_STREAM
,
594 .ai_flags
= AI_ADDRCONFIG
,
602 while (!IN_SET(**p
, 0, ';')) {
603 r
= parse_address_key(p
, "guid", guid
);
609 r
= parse_address_key(p
, "host", &host
);
615 r
= parse_address_key(p
, "port", &port
);
621 r
= parse_address_key(p
, "family", &family
);
634 if (streq(family
, "ipv4"))
635 hints
.ai_family
= AF_INET
;
636 else if (streq(family
, "ipv6"))
637 hints
.ai_family
= AF_INET6
;
642 r
= getaddrinfo(host
, port
, &hints
, &result
);
646 return -EADDRNOTAVAIL
;
648 memcpy(&b
->sockaddr
, result
->ai_addr
, result
->ai_addrlen
);
649 b
->sockaddr_size
= result
->ai_addrlen
;
651 freeaddrinfo(result
);
658 static int parse_exec_address(sd_bus
*b
, const char **p
, char **guid
) {
660 unsigned n_argv
= 0, j
;
662 size_t allocated
= 0;
670 while (!IN_SET(**p
, 0, ';')) {
671 r
= parse_address_key(p
, "guid", guid
);
677 r
= parse_address_key(p
, "path", &path
);
683 if (startswith(*p
, "argv")) {
687 ul
= strtoul(*p
+ 4, (char**) p
, 10);
688 if (errno
> 0 || **p
!= '=' || ul
> 256) {
696 if (!GREEDY_REALLOC0(argv
, allocated
, ul
+ 2)) {
704 r
= parse_address_key(p
, NULL
, argv
+ ul
);
719 /* Make sure there are no holes in the array, with the
720 * exception of argv[0] */
721 for (j
= 1; j
< n_argv
; j
++)
727 if (argv
&& argv
[0] == NULL
) {
728 argv
[0] = strdup(path
);
743 for (j
= 0; j
< n_argv
; j
++)
751 static int parse_container_unix_address(sd_bus
*b
, const char **p
, char **guid
) {
752 _cleanup_free_
char *machine
= NULL
, *pid
= NULL
;
760 while (!IN_SET(**p
, 0, ';')) {
761 r
= parse_address_key(p
, "guid", guid
);
767 r
= parse_address_key(p
, "machine", &machine
);
773 r
= parse_address_key(p
, "pid", &pid
);
782 if (!machine
== !pid
)
786 if (!machine_name_is_valid(machine
))
790 b
->machine
= machine
;
793 b
->machine
= mfree(b
->machine
);
797 r
= parse_pid(pid
, &b
->nspid
);
803 b
->sockaddr
.un
.sun_family
= AF_UNIX
;
804 strncpy(b
->sockaddr
.un
.sun_path
, "/var/run/dbus/system_bus_socket", sizeof(b
->sockaddr
.un
.sun_path
));
805 b
->sockaddr_size
= SOCKADDR_UN_LEN(b
->sockaddr
.un
);
811 static void bus_reset_parsed_address(sd_bus
*b
) {
815 b
->sockaddr_size
= 0;
816 b
->exec_argv
= strv_free(b
->exec_argv
);
817 b
->exec_path
= mfree(b
->exec_path
);
818 b
->server_id
= SD_ID128_NULL
;
819 b
->machine
= mfree(b
->machine
);
823 static int bus_parse_next_address(sd_bus
*b
) {
824 _cleanup_free_
char *guid
= NULL
;
832 if (b
->address
[b
->address_index
] == 0)
835 bus_reset_parsed_address(b
);
837 a
= b
->address
+ b
->address_index
;
846 if (startswith(a
, "unix:")) {
849 r
= parse_unix_address(b
, &a
, &guid
);
854 } else if (startswith(a
, "tcp:")) {
857 r
= parse_tcp_address(b
, &a
, &guid
);
863 } else if (startswith(a
, "unixexec:")) {
866 r
= parse_exec_address(b
, &a
, &guid
);
872 } else if (startswith(a
, "x-machine-unix:")) {
875 r
= parse_container_unix_address(b
, &a
, &guid
);
888 r
= sd_id128_from_string(guid
, &b
->server_id
);
893 b
->address_index
= a
- b
->address
;
897 static int bus_start_address(sd_bus
*b
) {
905 /* If you provide multiple different bus-addresses, we
906 * try all of them in order and use the first one that
910 r
= bus_socket_exec(b
);
912 else if ((b
->nspid
> 0 || b
->machine
) && b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
913 r
= bus_container_connect_socket(b
);
915 else if (b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
)
916 r
= bus_socket_connect(b
);
922 r
= attach_io_events(b
);
927 b
->last_connect_error
= -r
;
930 r
= bus_parse_next_address(b
);
934 return b
->last_connect_error
> 0 ? -b
->last_connect_error
: -ECONNREFUSED
;
938 int bus_next_address(sd_bus
*b
) {
941 bus_reset_parsed_address(b
);
942 return bus_start_address(b
);
945 static int bus_start_fd(sd_bus
*b
) {
950 assert(b
->input_fd
>= 0);
951 assert(b
->output_fd
>= 0);
953 r
= fd_nonblock(b
->input_fd
, true);
957 r
= fd_cloexec(b
->input_fd
, true);
961 if (b
->input_fd
!= b
->output_fd
) {
962 r
= fd_nonblock(b
->output_fd
, true);
966 r
= fd_cloexec(b
->output_fd
, true);
971 if (fstat(b
->input_fd
, &st
) < 0)
974 return bus_socket_take_fd(b
);
977 _public_
int sd_bus_start(sd_bus
*bus
) {
980 assert_return(bus
, -EINVAL
);
981 assert_return(bus
->state
== BUS_UNSET
, -EPERM
);
982 assert_return(!bus_pid_changed(bus
), -ECHILD
);
984 bus
->state
= BUS_OPENING
;
986 if (bus
->is_server
&& bus
->bus_client
)
989 if (bus
->input_fd
>= 0)
990 r
= bus_start_fd(bus
);
991 else if (bus
->address
|| bus
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
|| bus
->exec_path
|| bus
->machine
)
992 r
= bus_start_address(bus
);
1001 return bus_send_hello(bus
);
1004 _public_
int sd_bus_open(sd_bus
**ret
) {
1009 assert_return(ret
, -EINVAL
);
1011 /* Let's connect to the starter bus if it is set, and
1012 * otherwise to the bus that is appropropriate for the scope
1013 * we are running in */
1015 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
1017 if (streq(e
, "system"))
1018 return sd_bus_open_system(ret
);
1019 else if (STR_IN_SET(e
, "session", "user"))
1020 return sd_bus_open_user(ret
);
1023 e
= secure_getenv("DBUS_STARTER_ADDRESS");
1025 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
1026 return sd_bus_open_user(ret
);
1028 return sd_bus_open_system(ret
);
1035 r
= sd_bus_set_address(b
, e
);
1039 b
->bus_client
= true;
1041 /* We don't know whether the bus is trusted or not, so better
1042 * be safe, and authenticate everything */
1044 b
->is_local
= false;
1045 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1046 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1048 r
= sd_bus_start(b
);
1060 int bus_set_address_system(sd_bus
*b
) {
1064 e
= secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1066 return sd_bus_set_address(b
, e
);
1068 return sd_bus_set_address(b
, DEFAULT_SYSTEM_BUS_ADDRESS
);
1071 _public_
int sd_bus_open_system(sd_bus
**ret
) {
1075 assert_return(ret
, -EINVAL
);
1081 r
= bus_set_address_system(b
);
1085 b
->bus_client
= true;
1086 b
->is_system
= true;
1088 /* Let's do per-method access control on the system bus. We
1089 * need the caller's UID and capability set for that. */
1091 b
->attach_flags
|= KDBUS_ATTACH_CAPS
| KDBUS_ATTACH_CREDS
;
1092 b
->creds_mask
|= SD_BUS_CREDS_UID
| SD_BUS_CREDS_EUID
| SD_BUS_CREDS_EFFECTIVE_CAPS
;
1095 r
= sd_bus_start(b
);
1107 int bus_set_address_user(sd_bus
*b
) {
1109 _cleanup_free_
char *ee
= NULL
, *s
= NULL
;
1113 e
= secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1115 return sd_bus_set_address(b
, e
);
1117 e
= secure_getenv("XDG_RUNTIME_DIR");
1121 ee
= bus_address_escape(e
);
1125 if (asprintf(&s
, UNIX_USER_BUS_ADDRESS_FMT
, ee
) < 0)
1134 _public_
int sd_bus_open_user(sd_bus
**ret
) {
1138 assert_return(ret
, -EINVAL
);
1144 r
= bus_set_address_user(b
);
1148 b
->bus_client
= true;
1151 /* We don't do any per-method access control on the user
1156 r
= sd_bus_start(b
);
1168 int bus_set_address_system_remote(sd_bus
*b
, const char *host
) {
1169 _cleanup_free_
char *e
= NULL
;
1170 char *m
= NULL
, *c
= NULL
;
1175 /* Let's see if we shall enter some container */
1176 m
= strchr(host
, ':');
1180 /* Let's make sure this is not a port of some kind,
1181 * and is a valid machine name. */
1182 if (!in_charset(m
, "0123456789") && machine_name_is_valid(m
)) {
1185 /* Cut out the host part */
1186 t
= strndupa(host
, m
- host
- 1);
1187 e
= bus_address_escape(t
);
1191 c
= strjoina(",argv5=--machine=", m
);
1196 e
= bus_address_escape(host
);
1201 b
->address
= strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e
, ",argv4=systemd-stdio-bridge", c
);
1208 _public_
int sd_bus_open_system_remote(sd_bus
**ret
, const char *host
) {
1212 assert_return(host
, -EINVAL
);
1213 assert_return(ret
, -EINVAL
);
1215 r
= sd_bus_new(&bus
);
1219 r
= bus_set_address_system_remote(bus
, host
);
1223 bus
->bus_client
= true;
1224 bus
->trusted
= false;
1225 bus
->is_system
= true;
1226 bus
->is_local
= false;
1228 r
= sd_bus_start(bus
);
1240 int bus_set_address_system_machine(sd_bus
*b
, const char *machine
) {
1241 _cleanup_free_
char *e
= NULL
;
1246 e
= bus_address_escape(machine
);
1250 b
->address
= strjoin("x-machine-unix:machine=", e
);
1257 _public_
int sd_bus_open_system_machine(sd_bus
**ret
, const char *machine
) {
1261 assert_return(machine
, -EINVAL
);
1262 assert_return(ret
, -EINVAL
);
1263 assert_return(machine_name_is_valid(machine
), -EINVAL
);
1265 r
= sd_bus_new(&bus
);
1269 r
= bus_set_address_system_machine(bus
, machine
);
1273 bus
->bus_client
= true;
1274 bus
->trusted
= false;
1275 bus
->is_system
= true;
1276 bus
->is_local
= false;
1278 r
= sd_bus_start(bus
);
1290 _public_
void sd_bus_close(sd_bus
*bus
) {
1294 if (bus
->state
== BUS_CLOSED
)
1296 if (bus_pid_changed(bus
))
1299 bus
->state
= BUS_CLOSED
;
1301 sd_bus_detach_event(bus
);
1303 /* Drop all queued messages so that they drop references to
1304 * the bus object and the bus may be freed */
1305 bus_reset_queues(bus
);
1310 _public_ sd_bus
* sd_bus_flush_close_unref(sd_bus
*bus
) {
1318 return sd_bus_unref(bus
);
1321 static void bus_enter_closing(sd_bus
*bus
) {
1324 if (!IN_SET(bus
->state
, BUS_OPENING
, BUS_AUTHENTICATING
, BUS_HELLO
, BUS_RUNNING
))
1327 bus
->state
= BUS_CLOSING
;
1330 _public_ sd_bus
*sd_bus_ref(sd_bus
*bus
) {
1335 assert_se(REFCNT_INC(bus
->n_ref
) >= 2);
1340 _public_ sd_bus
*sd_bus_unref(sd_bus
*bus
) {
1346 i
= REFCNT_DEC(bus
->n_ref
);
1354 _public_
int sd_bus_is_open(sd_bus
*bus
) {
1356 assert_return(bus
, -EINVAL
);
1357 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1359 return BUS_IS_OPEN(bus
->state
);
1362 _public_
int sd_bus_can_send(sd_bus
*bus
, char type
) {
1365 assert_return(bus
, -EINVAL
);
1366 assert_return(bus
->state
!= BUS_UNSET
, -ENOTCONN
);
1367 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1369 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
1372 if (type
== SD_BUS_TYPE_UNIX_FD
) {
1373 if (!(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
1376 r
= bus_ensure_running(bus
);
1380 return bus
->can_fds
;
1383 return bus_type_is_valid(type
);
1386 _public_
int sd_bus_get_bus_id(sd_bus
*bus
, sd_id128_t
*id
) {
1389 assert_return(bus
, -EINVAL
);
1390 assert_return(id
, -EINVAL
);
1391 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1393 r
= bus_ensure_running(bus
);
1397 *id
= bus
->server_id
;
1401 static int bus_seal_message(sd_bus
*b
, sd_bus_message
*m
, usec_t timeout
) {
1406 /* If we copy the same message to multiple
1407 * destinations, avoid using the same cookie
1409 b
->cookie
= MAX(b
->cookie
, BUS_MESSAGE_COOKIE(m
));
1414 timeout
= BUS_DEFAULT_TIMEOUT
;
1416 return sd_bus_message_seal(m
, ++b
->cookie
, timeout
);
1419 static int bus_remarshal_message(sd_bus
*b
, sd_bus_message
**m
) {
1420 bool remarshal
= false;
1424 /* wrong packet version */
1425 if (b
->message_version
!= 0 && b
->message_version
!= (*m
)->header
->version
)
1428 /* wrong packet endianness */
1429 if (b
->message_endian
!= 0 && b
->message_endian
!= (*m
)->header
->endian
)
1432 return remarshal
? bus_message_remarshal(b
, m
) : 0;
1435 int bus_seal_synthetic_message(sd_bus
*b
, sd_bus_message
*m
) {
1439 /* Fake some timestamps, if they were requested, and not
1440 * already initialized */
1441 if (b
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
) {
1442 if (m
->realtime
<= 0)
1443 m
->realtime
= now(CLOCK_REALTIME
);
1445 if (m
->monotonic
<= 0)
1446 m
->monotonic
= now(CLOCK_MONOTONIC
);
1449 /* The bus specification says the serial number cannot be 0,
1450 * hence let's fill something in for synthetic messages. Since
1451 * synthetic messages might have a fake sender and we don't
1452 * want to interfere with the real sender's serial numbers we
1453 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1454 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1455 * even though kdbus can do 64bit. */
1456 return sd_bus_message_seal(m
, 0xFFFFFFFFULL
, 0);
1459 static int bus_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
, size_t *idx
) {
1465 r
= bus_socket_write_message(bus
, m
, idx
);
1469 if (*idx
>= BUS_MESSAGE_SIZE(m
))
1470 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64
" reply_cookie=%" PRIu64
" error-name=%s error-message=%s",
1471 bus_message_type_to_string(m
->header
->type
),
1472 strna(sd_bus_message_get_sender(m
)),
1473 strna(sd_bus_message_get_destination(m
)),
1474 strna(sd_bus_message_get_path(m
)),
1475 strna(sd_bus_message_get_interface(m
)),
1476 strna(sd_bus_message_get_member(m
)),
1477 BUS_MESSAGE_COOKIE(m
),
1479 strna(m
->error
.name
),
1480 strna(m
->error
.message
));
1485 static int dispatch_wqueue(sd_bus
*bus
) {
1489 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
1491 while (bus
->wqueue_size
> 0) {
1493 r
= bus_write_message(bus
, bus
->wqueue
[0], false, &bus
->windex
);
1497 /* Didn't do anything this time */
1499 else if (bus
->windex
>= BUS_MESSAGE_SIZE(bus
->wqueue
[0])) {
1500 /* Fully written. Let's drop the entry from
1503 * This isn't particularly optimized, but
1504 * well, this is supposed to be our worst-case
1505 * buffer only, and the socket buffer is
1506 * supposed to be our primary buffer, and if
1507 * it got full, then all bets are off
1511 sd_bus_message_unref(bus
->wqueue
[0]);
1512 memmove(bus
->wqueue
, bus
->wqueue
+ 1, sizeof(sd_bus_message
*) * bus
->wqueue_size
);
1522 static int bus_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1525 return bus_socket_read_message(bus
);
1528 int bus_rqueue_make_room(sd_bus
*bus
) {
1531 if (bus
->rqueue_size
>= BUS_RQUEUE_MAX
)
1534 if (!GREEDY_REALLOC(bus
->rqueue
, bus
->rqueue_allocated
, bus
->rqueue_size
+ 1))
1540 static int dispatch_rqueue(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**m
) {
1545 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
1547 /* Note that the priority logic is only available on kdbus,
1548 * where the rqueue is unused. We check the rqueue here
1549 * anyway, because it's simple... */
1552 if (bus
->rqueue_size
> 0) {
1553 /* Dispatch a queued message */
1555 *m
= bus
->rqueue
[0];
1557 memmove(bus
->rqueue
, bus
->rqueue
+ 1, sizeof(sd_bus_message
*) * bus
->rqueue_size
);
1561 /* Try to read a new message */
1562 r
= bus_read_message(bus
, hint_priority
, priority
);
1572 static int bus_send_internal(sd_bus
*bus
, sd_bus_message
*_m
, uint64_t *cookie
, bool hint_sync_call
) {
1573 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
1576 assert_return(m
, -EINVAL
);
1581 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1583 if (!BUS_IS_OPEN(bus
->state
))
1587 r
= sd_bus_can_send(bus
, SD_BUS_TYPE_UNIX_FD
);
1594 /* If the cookie number isn't kept, then we know that no reply
1596 if (!cookie
&& !m
->sealed
)
1597 m
->header
->flags
|= BUS_MESSAGE_NO_REPLY_EXPECTED
;
1599 r
= bus_seal_message(bus
, m
, 0);
1603 /* Remarshall if we have to. This will possibly unref the
1604 * message and place a replacement in m */
1605 r
= bus_remarshal_message(bus
, &m
);
1609 /* If this is a reply and no reply was requested, then let's
1610 * suppress this, if we can */
1614 if (IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
) && bus
->wqueue_size
<= 0) {
1617 r
= bus_write_message(bus
, m
, hint_sync_call
, &idx
);
1619 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
1620 bus_enter_closing(bus
);
1627 if (idx
< BUS_MESSAGE_SIZE(m
)) {
1628 /* Wasn't fully written. So let's remember how
1629 * much was written. Note that the first entry
1630 * of the wqueue array is always allocated so
1631 * that we always can remember how much was
1633 bus
->wqueue
[0] = sd_bus_message_ref(m
);
1634 bus
->wqueue_size
= 1;
1639 /* Just append it to the queue. */
1641 if (bus
->wqueue_size
>= BUS_WQUEUE_MAX
)
1644 if (!GREEDY_REALLOC(bus
->wqueue
, bus
->wqueue_allocated
, bus
->wqueue_size
+ 1))
1647 bus
->wqueue
[bus
->wqueue_size
++] = sd_bus_message_ref(m
);
1652 *cookie
= BUS_MESSAGE_COOKIE(m
);
1657 _public_
int sd_bus_send(sd_bus
*bus
, sd_bus_message
*m
, uint64_t *cookie
) {
1658 return bus_send_internal(bus
, m
, cookie
, false);
1661 _public_
int sd_bus_send_to(sd_bus
*bus
, sd_bus_message
*m
, const char *destination
, uint64_t *cookie
) {
1664 assert_return(m
, -EINVAL
);
1669 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1671 if (!BUS_IS_OPEN(bus
->state
))
1674 if (!streq_ptr(m
->destination
, destination
)) {
1679 r
= sd_bus_message_set_destination(m
, destination
);
1684 return sd_bus_send(bus
, m
, cookie
);
1687 static usec_t
calc_elapse(uint64_t usec
) {
1688 if (usec
== (uint64_t) -1)
1691 return now(CLOCK_MONOTONIC
) + usec
;
1694 static int timeout_compare(const void *a
, const void *b
) {
1695 const struct reply_callback
*x
= a
, *y
= b
;
1697 if (x
->timeout
!= 0 && y
->timeout
== 0)
1700 if (x
->timeout
== 0 && y
->timeout
!= 0)
1703 if (x
->timeout
< y
->timeout
)
1706 if (x
->timeout
> y
->timeout
)
1712 _public_
int sd_bus_call_async(
1716 sd_bus_message_handler_t callback
,
1720 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
1721 _cleanup_(sd_bus_slot_unrefp
) sd_bus_slot
*s
= NULL
;
1724 assert_return(m
, -EINVAL
);
1725 assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
);
1726 assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
);
1727 assert_return(callback
, -EINVAL
);
1732 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1734 if (!BUS_IS_OPEN(bus
->state
))
1737 r
= ordered_hashmap_ensure_allocated(&bus
->reply_callbacks
, &uint64_hash_ops
);
1741 r
= prioq_ensure_allocated(&bus
->reply_callbacks_prioq
, timeout_compare
);
1745 r
= bus_seal_message(bus
, m
, usec
);
1749 r
= bus_remarshal_message(bus
, &m
);
1753 s
= bus_slot_allocate(bus
, !slot
, BUS_REPLY_CALLBACK
, sizeof(struct reply_callback
), userdata
);
1757 s
->reply_callback
.callback
= callback
;
1759 s
->reply_callback
.cookie
= BUS_MESSAGE_COOKIE(m
);
1760 r
= ordered_hashmap_put(bus
->reply_callbacks
, &s
->reply_callback
.cookie
, &s
->reply_callback
);
1762 s
->reply_callback
.cookie
= 0;
1766 s
->reply_callback
.timeout
= calc_elapse(m
->timeout
);
1767 if (s
->reply_callback
.timeout
!= 0) {
1768 r
= prioq_put(bus
->reply_callbacks_prioq
, &s
->reply_callback
, &s
->reply_callback
.prioq_idx
);
1770 s
->reply_callback
.timeout
= 0;
1775 r
= sd_bus_send(bus
, m
, &s
->reply_callback
.cookie
);
1786 int bus_ensure_running(sd_bus
*bus
) {
1791 if (IN_SET(bus
->state
, BUS_UNSET
, BUS_CLOSED
, BUS_CLOSING
))
1793 if (bus
->state
== BUS_RUNNING
)
1797 r
= sd_bus_process(bus
, NULL
);
1800 if (bus
->state
== BUS_RUNNING
)
1805 r
= sd_bus_wait(bus
, (uint64_t) -1);
1811 _public_
int sd_bus_call(
1815 sd_bus_error
*error
,
1816 sd_bus_message
**reply
) {
1818 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= sd_bus_message_ref(_m
);
1824 bus_assert_return(m
, -EINVAL
, error
);
1825 bus_assert_return(m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
, -EINVAL
, error
);
1826 bus_assert_return(!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
), -EINVAL
, error
);
1827 bus_assert_return(!bus_error_is_dirty(error
), -EINVAL
, error
);
1832 bus_assert_return(!bus_pid_changed(bus
), -ECHILD
, error
);
1834 if (!BUS_IS_OPEN(bus
->state
)) {
1839 r
= bus_ensure_running(bus
);
1843 i
= bus
->rqueue_size
;
1845 r
= bus_seal_message(bus
, m
, usec
);
1849 r
= bus_remarshal_message(bus
, &m
);
1853 r
= bus_send_internal(bus
, m
, &cookie
, true);
1857 timeout
= calc_elapse(m
->timeout
);
1862 while (i
< bus
->rqueue_size
) {
1863 sd_bus_message
*incoming
= NULL
;
1865 incoming
= bus
->rqueue
[i
];
1867 if (incoming
->reply_cookie
== cookie
) {
1868 /* Found a match! */
1870 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
1872 log_debug_bus_message(incoming
);
1874 if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_RETURN
) {
1876 if (incoming
->n_fds
<= 0 || (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
1880 sd_bus_message_unref(incoming
);
1885 r
= sd_bus_error_setf(error
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1886 sd_bus_message_unref(incoming
);
1889 } else if (incoming
->header
->type
== SD_BUS_MESSAGE_METHOD_ERROR
) {
1890 r
= sd_bus_error_copy(error
, &incoming
->error
);
1891 sd_bus_message_unref(incoming
);
1898 } else if (BUS_MESSAGE_COOKIE(incoming
) == cookie
&&
1901 streq(bus
->unique_name
, incoming
->sender
)) {
1903 memmove(bus
->rqueue
+ i
, bus
->rqueue
+ i
+ 1, sizeof(sd_bus_message
*) * (bus
->rqueue_size
- i
- 1));
1906 /* Our own message? Somebody is trying
1907 * to send its own client a message,
1908 * let's not dead-lock, let's fail
1911 sd_bus_message_unref(incoming
);
1916 /* Try to read more, right-away */
1920 r
= bus_read_message(bus
, false, 0);
1922 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
1923 bus_enter_closing(bus
);
1935 n
= now(CLOCK_MONOTONIC
);
1943 left
= (uint64_t) -1;
1945 r
= bus_poll(bus
, true, left
);
1953 r
= dispatch_wqueue(bus
);
1955 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
1956 bus_enter_closing(bus
);
1965 return sd_bus_error_set_errno(error
, r
);
1968 _public_
int sd_bus_get_fd(sd_bus
*bus
) {
1970 assert_return(bus
, -EINVAL
);
1971 assert_return(bus
->input_fd
== bus
->output_fd
, -EPERM
);
1972 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1974 return bus
->input_fd
;
1977 _public_
int sd_bus_get_events(sd_bus
*bus
) {
1980 assert_return(bus
, -EINVAL
);
1981 assert_return(!bus_pid_changed(bus
), -ECHILD
);
1983 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
1986 if (bus
->state
== BUS_OPENING
)
1988 else if (bus
->state
== BUS_AUTHENTICATING
) {
1990 if (bus_socket_auth_needs_write(bus
))
1995 } else if (IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
)) {
1996 if (bus
->rqueue_size
<= 0)
1998 if (bus
->wqueue_size
> 0)
2005 _public_
int sd_bus_get_timeout(sd_bus
*bus
, uint64_t *timeout_usec
) {
2006 struct reply_callback
*c
;
2008 assert_return(bus
, -EINVAL
);
2009 assert_return(timeout_usec
, -EINVAL
);
2010 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2012 if (!BUS_IS_OPEN(bus
->state
) && bus
->state
!= BUS_CLOSING
)
2015 if (bus
->track_queue
) {
2020 if (bus
->state
== BUS_CLOSING
) {
2025 if (bus
->state
== BUS_AUTHENTICATING
) {
2026 *timeout_usec
= bus
->auth_timeout
;
2030 if (!IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
)) {
2031 *timeout_usec
= (uint64_t) -1;
2035 if (bus
->rqueue_size
> 0) {
2040 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2042 *timeout_usec
= (uint64_t) -1;
2046 if (c
->timeout
== 0) {
2047 *timeout_usec
= (uint64_t) -1;
2051 *timeout_usec
= c
->timeout
;
2055 static int process_timeout(sd_bus
*bus
) {
2056 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2057 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
* m
= NULL
;
2058 struct reply_callback
*c
;
2065 c
= prioq_peek(bus
->reply_callbacks_prioq
);
2069 n
= now(CLOCK_MONOTONIC
);
2073 r
= bus_message_new_synthetic_error(
2076 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out"),
2081 r
= bus_seal_synthetic_message(bus
, m
);
2085 assert_se(prioq_pop(bus
->reply_callbacks_prioq
) == c
);
2088 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2091 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2093 bus
->iteration_counter
++;
2095 bus
->current_message
= m
;
2096 bus
->current_slot
= sd_bus_slot_ref(slot
);
2097 bus
->current_handler
= c
->callback
;
2098 bus
->current_userdata
= slot
->userdata
;
2099 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2100 bus
->current_userdata
= NULL
;
2101 bus
->current_handler
= NULL
;
2102 bus
->current_slot
= NULL
;
2103 bus
->current_message
= NULL
;
2105 if (slot
->floating
) {
2106 bus_slot_disconnect(slot
);
2107 sd_bus_slot_unref(slot
);
2110 sd_bus_slot_unref(slot
);
2112 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2115 static int process_hello(sd_bus
*bus
, sd_bus_message
*m
) {
2119 if (bus
->state
!= BUS_HELLO
)
2122 /* Let's make sure the first message on the bus is the HELLO
2123 * reply. But note that we don't actually parse the message
2124 * here (we leave that to the usual handling), we just verify
2125 * we don't let any earlier msg through. */
2127 if (!IN_SET(m
->header
->type
, SD_BUS_MESSAGE_METHOD_RETURN
, SD_BUS_MESSAGE_METHOD_ERROR
))
2130 if (m
->reply_cookie
!= 1)
2136 static int process_reply(sd_bus
*bus
, sd_bus_message
*m
) {
2137 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*synthetic_reply
= NULL
;
2138 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2139 struct reply_callback
*c
;
2146 if (!IN_SET(m
->header
->type
, SD_BUS_MESSAGE_METHOD_RETURN
, SD_BUS_MESSAGE_METHOD_ERROR
))
2149 if (m
->destination
&& bus
->unique_name
&& !streq_ptr(m
->destination
, bus
->unique_name
))
2152 c
= ordered_hashmap_remove(bus
->reply_callbacks
, &m
->reply_cookie
);
2158 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2160 if (m
->n_fds
> 0 && !(bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)) {
2162 /* If the reply contained a file descriptor which we
2163 * didn't want we pass an error instead. */
2165 r
= bus_message_new_synthetic_error(
2168 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Reply message contained file descriptor"),
2173 /* Copy over original timestamp */
2174 synthetic_reply
->realtime
= m
->realtime
;
2175 synthetic_reply
->monotonic
= m
->monotonic
;
2176 synthetic_reply
->seqnum
= m
->seqnum
;
2178 r
= bus_seal_synthetic_message(bus
, synthetic_reply
);
2182 m
= synthetic_reply
;
2184 r
= sd_bus_message_rewind(m
, true);
2189 if (c
->timeout
!= 0) {
2190 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2194 bus
->current_slot
= sd_bus_slot_ref(slot
);
2195 bus
->current_handler
= c
->callback
;
2196 bus
->current_userdata
= slot
->userdata
;
2197 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2198 bus
->current_userdata
= NULL
;
2199 bus
->current_handler
= NULL
;
2200 bus
->current_slot
= NULL
;
2202 if (slot
->floating
) {
2203 bus_slot_disconnect(slot
);
2204 sd_bus_slot_unref(slot
);
2207 sd_bus_slot_unref(slot
);
2209 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2212 static int process_filter(sd_bus
*bus
, sd_bus_message
*m
) {
2213 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2214 struct filter_callback
*l
;
2221 bus
->filter_callbacks_modified
= false;
2223 LIST_FOREACH(callbacks
, l
, bus
->filter_callbacks
) {
2226 if (bus
->filter_callbacks_modified
)
2229 /* Don't run this more than once per iteration */
2230 if (l
->last_iteration
== bus
->iteration_counter
)
2233 l
->last_iteration
= bus
->iteration_counter
;
2235 r
= sd_bus_message_rewind(m
, true);
2239 slot
= container_of(l
, sd_bus_slot
, filter_callback
);
2241 bus
->current_slot
= sd_bus_slot_ref(slot
);
2242 bus
->current_handler
= l
->callback
;
2243 bus
->current_userdata
= slot
->userdata
;
2244 r
= l
->callback(m
, slot
->userdata
, &error_buffer
);
2245 bus
->current_userdata
= NULL
;
2246 bus
->current_handler
= NULL
;
2247 bus
->current_slot
= sd_bus_slot_unref(slot
);
2249 r
= bus_maybe_reply_error(m
, r
, &error_buffer
);
2255 } while (bus
->filter_callbacks_modified
);
2260 static int process_match(sd_bus
*bus
, sd_bus_message
*m
) {
2267 bus
->match_callbacks_modified
= false;
2269 r
= bus_match_run(bus
, &bus
->match_callbacks
, m
);
2273 } while (bus
->match_callbacks_modified
);
2278 static int process_builtin(sd_bus
*bus
, sd_bus_message
*m
) {
2279 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*reply
= NULL
;
2285 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2288 if (bus
->manual_peer_interface
)
2291 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2294 if (!streq_ptr(m
->interface
, "org.freedesktop.DBus.Peer"))
2297 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
2300 if (streq_ptr(m
->member
, "Ping"))
2301 r
= sd_bus_message_new_method_return(m
, &reply
);
2302 else if (streq_ptr(m
->member
, "GetMachineId")) {
2306 r
= sd_id128_get_machine(&id
);
2310 r
= sd_bus_message_new_method_return(m
, &reply
);
2314 r
= sd_bus_message_append(reply
, "s", sd_id128_to_string(id
, sid
));
2316 r
= sd_bus_message_new_method_errorf(
2318 SD_BUS_ERROR_UNKNOWN_METHOD
,
2319 "Unknown method '%s' on interface '%s'.", m
->member
, m
->interface
);
2325 r
= sd_bus_send(bus
, reply
, NULL
);
2332 static int process_fd_check(sd_bus
*bus
, sd_bus_message
*m
) {
2336 /* If we got a message with a file descriptor which we didn't
2337 * want to accept, then let's drop it. How can this even
2338 * happen? For example, when the kernel queues a message into
2339 * an activatable names's queue which allows fds, and then is
2340 * delivered to us later even though we ourselves did not
2343 if (bus
->hello_flags
& KDBUS_HELLO_MONITOR
)
2349 if (bus
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
2352 if (m
->header
->type
!= SD_BUS_MESSAGE_METHOD_CALL
)
2353 return 1; /* just eat it up */
2355 return sd_bus_reply_method_errorf(m
, SD_BUS_ERROR_INCONSISTENT_MESSAGE
, "Message contains file descriptors, which I cannot accept. Sorry.");
2358 static int process_message(sd_bus
*bus
, sd_bus_message
*m
) {
2364 bus
->current_message
= m
;
2365 bus
->iteration_counter
++;
2367 log_debug_bus_message(m
);
2369 r
= process_hello(bus
, m
);
2373 r
= process_reply(bus
, m
);
2377 r
= process_fd_check(bus
, m
);
2381 r
= process_filter(bus
, m
);
2385 r
= process_match(bus
, m
);
2389 r
= process_builtin(bus
, m
);
2393 r
= bus_process_object(bus
, m
);
2396 bus
->current_message
= NULL
;
2400 static int dispatch_track(sd_bus
*bus
) {
2403 if (!bus
->track_queue
)
2406 bus_track_dispatch(bus
->track_queue
);
2410 static int process_running(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2411 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2415 assert(IN_SET(bus
->state
, BUS_RUNNING
, BUS_HELLO
));
2417 r
= process_timeout(bus
);
2421 r
= dispatch_wqueue(bus
);
2425 r
= dispatch_track(bus
);
2429 r
= dispatch_rqueue(bus
, hint_priority
, priority
, &m
);
2435 r
= process_message(bus
, m
);
2440 r
= sd_bus_message_rewind(m
, true);
2449 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
) {
2451 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2452 strna(sd_bus_message_get_sender(m
)),
2453 strna(sd_bus_message_get_path(m
)),
2454 strna(sd_bus_message_get_interface(m
)),
2455 strna(sd_bus_message_get_member(m
)));
2457 r
= sd_bus_reply_method_errorf(
2459 SD_BUS_ERROR_UNKNOWN_OBJECT
,
2460 "Unknown object '%s'.", m
->path
);
2474 static int bus_exit_now(sd_bus
*bus
) {
2477 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2478 * sd_event_exit(), otherwise invokes libc exit(). */
2480 if (bus
->exited
) /* did we already exit? */
2482 if (!bus
->exit_triggered
) /* was the exit condition triggered? */
2484 if (!bus
->exit_on_disconnect
) /* Shall we actually exit on disconnection? */
2487 bus
->exited
= true; /* never exit more than once */
2489 log_debug("Bus connection disconnected, exiting.");
2492 return sd_event_exit(bus
->event
, EXIT_FAILURE
);
2496 assert_not_reached("exit() didn't exit?");
2499 static int process_closing_reply_callback(sd_bus
*bus
, struct reply_callback
*c
) {
2500 _cleanup_(sd_bus_error_free
) sd_bus_error error_buffer
= SD_BUS_ERROR_NULL
;
2501 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2508 r
= bus_message_new_synthetic_error(
2511 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Connection terminated"),
2516 r
= bus_seal_synthetic_message(bus
, m
);
2520 if (c
->timeout
!= 0) {
2521 prioq_remove(bus
->reply_callbacks_prioq
, c
, &c
->prioq_idx
);
2525 ordered_hashmap_remove(bus
->reply_callbacks
, &c
->cookie
);
2528 slot
= container_of(c
, sd_bus_slot
, reply_callback
);
2530 bus
->iteration_counter
++;
2532 bus
->current_message
= m
;
2533 bus
->current_slot
= sd_bus_slot_ref(slot
);
2534 bus
->current_handler
= c
->callback
;
2535 bus
->current_userdata
= slot
->userdata
;
2536 r
= c
->callback(m
, slot
->userdata
, &error_buffer
);
2537 bus
->current_userdata
= NULL
;
2538 bus
->current_handler
= NULL
;
2539 bus
->current_slot
= NULL
;
2540 bus
->current_message
= NULL
;
2542 if (slot
->floating
) {
2543 bus_slot_disconnect(slot
);
2544 sd_bus_slot_unref(slot
);
2547 sd_bus_slot_unref(slot
);
2549 return bus_maybe_reply_error(m
, r
, &error_buffer
);
2552 static int process_closing(sd_bus
*bus
, sd_bus_message
**ret
) {
2553 _cleanup_(sd_bus_message_unrefp
) sd_bus_message
*m
= NULL
;
2554 struct reply_callback
*c
;
2558 assert(bus
->state
== BUS_CLOSING
);
2560 /* First, fail all outstanding method calls */
2561 c
= ordered_hashmap_first(bus
->reply_callbacks
);
2563 return process_closing_reply_callback(bus
, c
);
2565 /* Then, fake-drop all remaining bus tracking references */
2567 bus_track_close(bus
->tracks
);
2571 /* Then, synthesize a Disconnected message */
2572 r
= sd_bus_message_new_signal(
2575 "/org/freedesktop/DBus/Local",
2576 "org.freedesktop.DBus.Local",
2581 bus_message_set_sender_local(bus
, m
);
2583 r
= bus_seal_synthetic_message(bus
, m
);
2589 bus
->current_message
= m
;
2590 bus
->iteration_counter
++;
2592 r
= process_filter(bus
, m
);
2596 r
= process_match(bus
, m
);
2600 /* Nothing else to do, exit now, if the condition holds */
2601 bus
->exit_triggered
= true;
2602 (void) bus_exit_now(bus
);
2612 bus
->current_message
= NULL
;
2617 static int bus_process_internal(sd_bus
*bus
, bool hint_priority
, int64_t priority
, sd_bus_message
**ret
) {
2618 BUS_DONT_DESTROY(bus
);
2621 /* Returns 0 when we didn't do anything. This should cause the
2622 * caller to invoke sd_bus_wait() before returning the next
2623 * time. Returns > 0 when we did something, which possibly
2624 * means *ret is filled in with an unprocessed message. */
2626 assert_return(bus
, -EINVAL
);
2627 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2629 /* We don't allow recursively invoking sd_bus_process(). */
2630 assert_return(!bus
->current_message
, -EBUSY
);
2631 assert(!bus
->current_slot
);
2633 switch (bus
->state
) {
2642 r
= bus_socket_process_opening(bus
);
2643 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2644 bus_enter_closing(bus
);
2652 case BUS_AUTHENTICATING
:
2653 r
= bus_socket_process_authenticating(bus
);
2654 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2655 bus_enter_closing(bus
);
2667 r
= process_running(bus
, hint_priority
, priority
, ret
);
2668 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2669 bus_enter_closing(bus
);
2679 return process_closing(bus
, ret
);
2682 assert_not_reached("Unknown state");
2685 _public_
int sd_bus_process(sd_bus
*bus
, sd_bus_message
**ret
) {
2686 return bus_process_internal(bus
, false, 0, ret
);
2689 _public_
int sd_bus_process_priority(sd_bus
*bus
, int64_t priority
, sd_bus_message
**ret
) {
2690 return bus_process_internal(bus
, true, priority
, ret
);
2693 static int bus_poll(sd_bus
*bus
, bool need_more
, uint64_t timeout_usec
) {
2694 struct pollfd p
[2] = {};
2697 usec_t m
= USEC_INFINITY
;
2701 if (bus
->state
== BUS_CLOSING
)
2704 if (!BUS_IS_OPEN(bus
->state
))
2707 e
= sd_bus_get_events(bus
);
2712 /* The caller really needs some more data, he doesn't
2713 * care about what's already read, or any timeouts
2714 * except its own. */
2718 /* The caller wants to process if there's something to
2719 * process, but doesn't care otherwise */
2721 r
= sd_bus_get_timeout(bus
, &until
);
2726 nw
= now(CLOCK_MONOTONIC
);
2727 m
= until
> nw
? until
- nw
: 0;
2731 if (timeout_usec
!= (uint64_t) -1 && (m
== (uint64_t) -1 || timeout_usec
< m
))
2734 p
[0].fd
= bus
->input_fd
;
2735 if (bus
->output_fd
== bus
->input_fd
) {
2739 p
[0].events
= e
& POLLIN
;
2740 p
[1].fd
= bus
->output_fd
;
2741 p
[1].events
= e
& POLLOUT
;
2745 r
= ppoll(p
, n
, m
== (uint64_t) -1 ? NULL
: timespec_store(&ts
, m
), NULL
);
2749 return r
> 0 ? 1 : 0;
2752 _public_
int sd_bus_wait(sd_bus
*bus
, uint64_t timeout_usec
) {
2754 assert_return(bus
, -EINVAL
);
2755 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2757 if (bus
->state
== BUS_CLOSING
)
2760 if (!BUS_IS_OPEN(bus
->state
))
2763 if (bus
->rqueue_size
> 0)
2766 return bus_poll(bus
, false, timeout_usec
);
2769 _public_
int sd_bus_flush(sd_bus
*bus
) {
2772 assert_return(bus
, -EINVAL
);
2773 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2775 if (bus
->state
== BUS_CLOSING
)
2778 if (!BUS_IS_OPEN(bus
->state
))
2781 r
= bus_ensure_running(bus
);
2785 if (bus
->wqueue_size
<= 0)
2789 r
= dispatch_wqueue(bus
);
2791 if (IN_SET(r
, -ENOTCONN
, -ECONNRESET
, -EPIPE
, -ESHUTDOWN
)) {
2792 bus_enter_closing(bus
);
2799 if (bus
->wqueue_size
<= 0)
2802 r
= bus_poll(bus
, false, (uint64_t) -1);
2808 _public_
int sd_bus_add_filter(
2811 sd_bus_message_handler_t callback
,
2816 assert_return(bus
, -EINVAL
);
2817 assert_return(callback
, -EINVAL
);
2818 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2820 s
= bus_slot_allocate(bus
, !slot
, BUS_FILTER_CALLBACK
, sizeof(struct filter_callback
), userdata
);
2824 s
->filter_callback
.callback
= callback
;
2826 bus
->filter_callbacks_modified
= true;
2827 LIST_PREPEND(callbacks
, bus
->filter_callbacks
, &s
->filter_callback
);
2835 _public_
int sd_bus_add_match(
2839 sd_bus_message_handler_t callback
,
2842 struct bus_match_component
*components
= NULL
;
2843 unsigned n_components
= 0;
2844 sd_bus_slot
*s
= NULL
;
2847 assert_return(bus
, -EINVAL
);
2848 assert_return(match
, -EINVAL
);
2849 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2851 r
= bus_match_parse(match
, &components
, &n_components
);
2855 s
= bus_slot_allocate(bus
, !slot
, BUS_MATCH_CALLBACK
, sizeof(struct match_callback
), userdata
);
2861 s
->match_callback
.callback
= callback
;
2863 if (bus
->bus_client
) {
2864 enum bus_match_scope scope
;
2866 scope
= bus_match_get_scope(components
, n_components
);
2868 /* Do not install server-side matches for matches
2869 * against the local service, interface or bus path. */
2870 if (scope
!= BUS_MATCH_LOCAL
) {
2872 /* We store the original match string, so that
2873 * we can use it to remove the match again. */
2875 s
->match_callback
.match_string
= strdup(match
);
2876 if (!s
->match_callback
.match_string
) {
2881 r
= bus_add_match_internal(bus
, s
->match_callback
.match_string
, components
, n_components
);
2885 s
->match_added
= true;
2889 bus
->match_callbacks_modified
= true;
2890 r
= bus_match_add(&bus
->match_callbacks
, components
, n_components
, &s
->match_callback
);
2899 bus_match_parse_free(components
, n_components
);
2900 sd_bus_slot_unref(s
);
2905 int bus_remove_match_by_string(
2908 sd_bus_message_handler_t callback
,
2911 struct bus_match_component
*components
= NULL
;
2912 unsigned n_components
= 0;
2913 struct match_callback
*c
;
2916 assert_return(bus
, -EINVAL
);
2917 assert_return(match
, -EINVAL
);
2918 assert_return(!bus_pid_changed(bus
), -ECHILD
);
2920 r
= bus_match_parse(match
, &components
, &n_components
);
2924 r
= bus_match_find(&bus
->match_callbacks
, components
, n_components
, NULL
, NULL
, &c
);
2928 sd_bus_slot_unref(container_of(c
, sd_bus_slot
, match_callback
));
2931 bus_match_parse_free(components
, n_components
);
2936 bool bus_pid_changed(sd_bus
*bus
) {
2939 /* We don't support people creating a bus connection and
2940 * keeping it around over a fork(). Let's complain. */
2942 return bus
->original_pid
!= getpid_cached();
2945 static int io_callback(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
2946 sd_bus
*bus
= userdata
;
2951 r
= sd_bus_process(bus
, NULL
);
2958 static int time_callback(sd_event_source
*s
, uint64_t usec
, void *userdata
) {
2959 sd_bus
*bus
= userdata
;
2964 r
= sd_bus_process(bus
, NULL
);
2971 static int prepare_callback(sd_event_source
*s
, void *userdata
) {
2972 sd_bus
*bus
= userdata
;
2979 e
= sd_bus_get_events(bus
);
2983 if (bus
->output_fd
!= bus
->input_fd
) {
2985 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
& POLLIN
);
2989 r
= sd_event_source_set_io_events(bus
->output_io_event_source
, e
& POLLOUT
);
2993 r
= sd_event_source_set_io_events(bus
->input_io_event_source
, e
);
2998 r
= sd_bus_get_timeout(bus
, &until
);
3004 j
= sd_event_source_set_time(bus
->time_event_source
, until
);
3009 r
= sd_event_source_set_enabled(bus
->time_event_source
, r
> 0);
3016 static int quit_callback(sd_event_source
*event
, void *userdata
) {
3017 sd_bus
*bus
= userdata
;
3027 static int attach_io_events(sd_bus
*bus
) {
3032 if (bus
->input_fd
< 0)
3038 if (!bus
->input_io_event_source
) {
3039 r
= sd_event_add_io(bus
->event
, &bus
->input_io_event_source
, bus
->input_fd
, 0, io_callback
, bus
);
3043 r
= sd_event_source_set_prepare(bus
->input_io_event_source
, prepare_callback
);
3047 r
= sd_event_source_set_priority(bus
->input_io_event_source
, bus
->event_priority
);
3051 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-input");
3053 r
= sd_event_source_set_io_fd(bus
->input_io_event_source
, bus
->input_fd
);
3058 if (bus
->output_fd
!= bus
->input_fd
) {
3059 assert(bus
->output_fd
>= 0);
3061 if (!bus
->output_io_event_source
) {
3062 r
= sd_event_add_io(bus
->event
, &bus
->output_io_event_source
, bus
->output_fd
, 0, io_callback
, bus
);
3066 r
= sd_event_source_set_priority(bus
->output_io_event_source
, bus
->event_priority
);
3070 r
= sd_event_source_set_description(bus
->input_io_event_source
, "bus-output");
3072 r
= sd_event_source_set_io_fd(bus
->output_io_event_source
, bus
->output_fd
);
3081 static void detach_io_events(sd_bus
*bus
) {
3084 if (bus
->input_io_event_source
) {
3085 sd_event_source_set_enabled(bus
->input_io_event_source
, SD_EVENT_OFF
);
3086 bus
->input_io_event_source
= sd_event_source_unref(bus
->input_io_event_source
);
3089 if (bus
->output_io_event_source
) {
3090 sd_event_source_set_enabled(bus
->output_io_event_source
, SD_EVENT_OFF
);
3091 bus
->output_io_event_source
= sd_event_source_unref(bus
->output_io_event_source
);
3095 _public_
int sd_bus_attach_event(sd_bus
*bus
, sd_event
*event
, int priority
) {
3098 assert_return(bus
, -EINVAL
);
3099 assert_return(!bus
->event
, -EBUSY
);
3101 assert(!bus
->input_io_event_source
);
3102 assert(!bus
->output_io_event_source
);
3103 assert(!bus
->time_event_source
);
3106 bus
->event
= sd_event_ref(event
);
3108 r
= sd_event_default(&bus
->event
);
3113 bus
->event_priority
= priority
;
3115 r
= sd_event_add_time(bus
->event
, &bus
->time_event_source
, CLOCK_MONOTONIC
, 0, 0, time_callback
, bus
);
3119 r
= sd_event_source_set_priority(bus
->time_event_source
, priority
);
3123 r
= sd_event_source_set_description(bus
->time_event_source
, "bus-time");
3127 r
= sd_event_add_exit(bus
->event
, &bus
->quit_event_source
, quit_callback
, bus
);
3131 r
= sd_event_source_set_description(bus
->quit_event_source
, "bus-exit");
3135 r
= attach_io_events(bus
);
3142 sd_bus_detach_event(bus
);
3146 _public_
int sd_bus_detach_event(sd_bus
*bus
) {
3147 assert_return(bus
, -EINVAL
);
3152 detach_io_events(bus
);
3154 if (bus
->time_event_source
) {
3155 sd_event_source_set_enabled(bus
->time_event_source
, SD_EVENT_OFF
);
3156 bus
->time_event_source
= sd_event_source_unref(bus
->time_event_source
);
3159 if (bus
->quit_event_source
) {
3160 sd_event_source_set_enabled(bus
->quit_event_source
, SD_EVENT_OFF
);
3161 bus
->quit_event_source
= sd_event_source_unref(bus
->quit_event_source
);
3164 bus
->event
= sd_event_unref(bus
->event
);
3168 _public_ sd_event
* sd_bus_get_event(sd_bus
*bus
) {
3169 assert_return(bus
, NULL
);
3174 _public_ sd_bus_message
* sd_bus_get_current_message(sd_bus
*bus
) {
3175 assert_return(bus
, NULL
);
3177 return bus
->current_message
;
3180 _public_ sd_bus_slot
* sd_bus_get_current_slot(sd_bus
*bus
) {
3181 assert_return(bus
, NULL
);
3183 return bus
->current_slot
;
3186 _public_ sd_bus_message_handler_t
sd_bus_get_current_handler(sd_bus
*bus
) {
3187 assert_return(bus
, NULL
);
3189 return bus
->current_handler
;
3192 _public_
void* sd_bus_get_current_userdata(sd_bus
*bus
) {
3193 assert_return(bus
, NULL
);
3195 return bus
->current_userdata
;
3198 static int bus_default(int (*bus_open
)(sd_bus
**), sd_bus
**default_bus
, sd_bus
**ret
) {
3203 assert(default_bus
);
3206 return !!*default_bus
;
3209 *ret
= sd_bus_ref(*default_bus
);
3217 b
->default_bus_ptr
= default_bus
;
3225 _public_
int sd_bus_default_system(sd_bus
**ret
) {
3226 return bus_default(sd_bus_open_system
, &default_system_bus
, ret
);
3230 _public_
int sd_bus_default_user(sd_bus
**ret
) {
3231 return bus_default(sd_bus_open_user
, &default_user_bus
, ret
);
3234 _public_
int sd_bus_default(sd_bus
**ret
) {
3238 /* Let's try our best to reuse another cached connection. If
3239 * the starter bus type is set, connect via our normal
3240 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3241 * we can share the connection with the user/system default
3244 e
= secure_getenv("DBUS_STARTER_BUS_TYPE");
3246 if (streq(e
, "system"))
3247 return sd_bus_default_system(ret
);
3248 else if (STR_IN_SET(e
, "user", "session"))
3249 return sd_bus_default_user(ret
);
3252 /* No type is specified, so we have not other option than to
3253 * use the starter address if it is set. */
3255 e
= secure_getenv("DBUS_STARTER_ADDRESS");
3258 return bus_default(sd_bus_open
, &default_starter_bus
, ret
);
3261 /* Finally, if nothing is set use the cached connection for
3262 * the right scope */
3264 if (cg_pid_get_owner_uid(0, NULL
) >= 0)
3265 return sd_bus_default_user(ret
);
3267 return sd_bus_default_system(ret
);
3270 _public_
int sd_bus_get_tid(sd_bus
*b
, pid_t
*tid
) {
3271 assert_return(b
, -EINVAL
);
3272 assert_return(tid
, -EINVAL
);
3273 assert_return(!bus_pid_changed(b
), -ECHILD
);
3281 return sd_event_get_tid(b
->event
, tid
);
3286 _public_
int sd_bus_path_encode(const char *prefix
, const char *external_id
, char **ret_path
) {
3287 _cleanup_free_
char *e
= NULL
;
3290 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3291 assert_return(external_id
, -EINVAL
);
3292 assert_return(ret_path
, -EINVAL
);
3294 e
= bus_label_escape(external_id
);
3298 ret
= strjoin(prefix
, "/", e
);
3306 _public_
int sd_bus_path_decode(const char *path
, const char *prefix
, char **external_id
) {
3310 assert_return(object_path_is_valid(path
), -EINVAL
);
3311 assert_return(object_path_is_valid(prefix
), -EINVAL
);
3312 assert_return(external_id
, -EINVAL
);
3314 e
= object_path_startswith(path
, prefix
);
3316 *external_id
= NULL
;
3320 ret
= bus_label_unescape(e
);
3328 _public_
int sd_bus_path_encode_many(char **out
, const char *path_template
, ...) {
3329 _cleanup_strv_free_
char **labels
= NULL
;
3330 char *path
, *path_pos
, **label_pos
;
3331 const char *sep
, *template_pos
;
3336 assert_return(out
, -EINVAL
);
3337 assert_return(path_template
, -EINVAL
);
3339 path_length
= strlen(path_template
);
3341 va_start(list
, path_template
);
3342 for (sep
= strchr(path_template
, '%'); sep
; sep
= strchr(sep
+ 1, '%')) {
3346 arg
= va_arg(list
, const char *);
3352 label
= bus_label_escape(arg
);
3358 r
= strv_consume(&labels
, label
);
3364 /* add label length, but account for the format character */
3365 path_length
+= strlen(label
) - 1;
3369 path
= malloc(path_length
+ 1);
3376 for (template_pos
= path_template
; *template_pos
; ) {
3377 sep
= strchrnul(template_pos
, '%');
3378 path_pos
= mempcpy(path_pos
, template_pos
, sep
- template_pos
);
3382 path_pos
= stpcpy(path_pos
, *label_pos
++);
3383 template_pos
= sep
+ 1;
3391 _public_
int sd_bus_path_decode_many(const char *path
, const char *path_template
, ...) {
3392 _cleanup_strv_free_
char **labels
= NULL
;
3393 const char *template_pos
, *path_pos
;
3399 * This decodes an object-path based on a template argument. The
3400 * template consists of a verbatim path, optionally including special
3403 * - Each occurrence of '%' in the template matches an arbitrary
3404 * substring of a label in the given path. At most one such
3405 * directive is allowed per label. For each such directive, the
3406 * caller must provide an output parameter (char **) via va_arg. If
3407 * NULL is passed, the given label is verified, but not returned.
3408 * For each matched label, the *decoded* label is stored in the
3409 * passed output argument, and the caller is responsible to free
3410 * it. Note that the output arguments are only modified if the
3411 * actualy path matched the template. Otherwise, they're left
3414 * This function returns <0 on error, 0 if the path does not match the
3415 * template, 1 if it matched.
3418 assert_return(path
, -EINVAL
);
3419 assert_return(path_template
, -EINVAL
);
3423 for (template_pos
= path_template
; *template_pos
; ) {
3428 /* verify everything until the next '%' matches verbatim */
3429 sep
= strchrnul(template_pos
, '%');
3430 length
= sep
- template_pos
;
3431 if (strncmp(path_pos
, template_pos
, length
))
3435 template_pos
+= length
;
3440 /* We found the next '%' character. Everything up until here
3441 * matched. We now skip ahead to the end of this label and make
3442 * sure it matches the tail of the label in the path. Then we
3443 * decode the string in-between and save it for later use. */
3445 ++template_pos
; /* skip over '%' */
3447 sep
= strchrnul(template_pos
, '/');
3448 length
= sep
- template_pos
; /* length of suffix to match verbatim */
3450 /* verify the suffixes match */
3451 sep
= strchrnul(path_pos
, '/');
3452 if (sep
- path_pos
< (ssize_t
)length
||
3453 strncmp(sep
- length
, template_pos
, length
))
3456 template_pos
+= length
; /* skip over matched label */
3457 length
= sep
- path_pos
- length
; /* length of sub-label to decode */
3459 /* store unescaped label for later use */
3460 label
= bus_label_unescape_n(path_pos
, length
);
3464 r
= strv_consume(&labels
, label
);
3468 path_pos
= sep
; /* skip decoded label and suffix */
3471 /* end of template must match end of path */
3475 /* copy the labels over to the caller */
3476 va_start(list
, path_template
);
3477 for (label_pos
= labels
; label_pos
&& *label_pos
; ++label_pos
) {
3480 arg
= va_arg(list
, char **);
3493 _public_
int sd_bus_try_close(sd_bus
*bus
) {
3494 assert_return(bus
, -EINVAL
);
3495 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3500 _public_
int sd_bus_get_description(sd_bus
*bus
, const char **description
) {
3501 assert_return(bus
, -EINVAL
);
3502 assert_return(description
, -EINVAL
);
3503 assert_return(bus
->description
, -ENXIO
);
3504 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3506 *description
= bus
->description
;
3510 int bus_get_root_path(sd_bus
*bus
) {
3513 if (bus
->cgroup_root
)
3516 r
= cg_get_root_path(&bus
->cgroup_root
);
3518 bus
->cgroup_root
= strdup("/");
3519 if (!bus
->cgroup_root
)
3528 _public_
int sd_bus_get_scope(sd_bus
*bus
, const char **scope
) {
3529 assert_return(bus
, -EINVAL
);
3530 assert_return(scope
, -EINVAL
);
3531 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3538 if (bus
->is_system
) {
3546 _public_
int sd_bus_get_address(sd_bus
*bus
, const char **address
) {
3548 assert_return(bus
, -EINVAL
);
3549 assert_return(address
, -EINVAL
);
3550 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3553 *address
= bus
->address
;
3560 _public_
int sd_bus_get_creds_mask(sd_bus
*bus
, uint64_t *mask
) {
3561 assert_return(bus
, -EINVAL
);
3562 assert_return(mask
, -EINVAL
);
3563 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3565 *mask
= bus
->creds_mask
;
3569 _public_
int sd_bus_is_bus_client(sd_bus
*bus
) {
3570 assert_return(bus
, -EINVAL
);
3571 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3573 return bus
->bus_client
;
3576 _public_
int sd_bus_is_server(sd_bus
*bus
) {
3577 assert_return(bus
, -EINVAL
);
3578 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3580 return bus
->is_server
;
3583 _public_
int sd_bus_is_anonymous(sd_bus
*bus
) {
3584 assert_return(bus
, -EINVAL
);
3585 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3587 return bus
->anonymous_auth
;
3590 _public_
int sd_bus_is_trusted(sd_bus
*bus
) {
3591 assert_return(bus
, -EINVAL
);
3592 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3594 return bus
->trusted
;
3597 _public_
int sd_bus_is_monitor(sd_bus
*bus
) {
3598 assert_return(bus
, -EINVAL
);
3599 assert_return(!bus_pid_changed(bus
), -ECHILD
);
3601 return !!(bus
->hello_flags
& KDBUS_HELLO_MONITOR
);
3604 static void flush_close(sd_bus
*bus
) {
3608 /* Flushes and closes the specified bus. We take a ref before,
3609 * to ensure the flushing does not cause the bus to be
3612 sd_bus_flush_close_unref(sd_bus_ref(bus
));
3615 _public_
void sd_bus_default_flush_close(void) {
3616 flush_close(default_starter_bus
);
3617 flush_close(default_user_bus
);
3618 flush_close(default_system_bus
);
3621 _public_
int sd_bus_set_exit_on_disconnect(sd_bus
*bus
, int b
) {
3622 assert_return(bus
, -EINVAL
);
3624 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3625 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3626 * from the client side. */
3627 bus
->exit_on_disconnect
= b
;
3629 /* If the exit condition was triggered already, exit immediately. */
3630 return bus_exit_now(bus
);
3633 _public_
int sd_bus_get_exit_on_disconnect(sd_bus
*bus
) {
3634 assert_return(bus
, -EINVAL
);
3636 return bus
->exit_on_disconnect
;