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 "process-util.h"
54 #include "string-util.h"
58 /// Additional includes needed by elogind
59 #include "process-util.h"
61 #define log_debug_bus_message(m) \
63 sd_bus_message *_mm = (m); \
64 log_debug("Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " signature=%s error-name=%s error-message=%s", \
65 bus_message_type_to_string(_mm->header->type), \
66 strna(sd_bus_message_get_sender(_mm)), \
67 strna(sd_bus_message_get_destination(_mm)), \
68 strna(sd_bus_message_get_path(_mm)), \
69 strna(sd_bus_message_get_interface(_mm)), \
70 strna(sd_bus_message_get_member(_mm)), \
71 BUS_MESSAGE_COOKIE(_mm), \
73 strna(_mm->root_container.signature), \
74 strna(_mm->error.name), \
75 strna(_mm->error.message)); \
78 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
79 static void bus_detach_io_events(sd_bus *b);
80 static void bus_detach_inotify_event(sd_bus *b);
82 static thread_local sd_bus *default_system_bus = NULL;
83 #if 0 /// UNNEEDED by elogind
84 static thread_local sd_bus *default_user_bus = NULL;
86 static thread_local sd_bus *default_starter_bus = NULL;
88 static sd_bus **bus_choose_default(int (**bus_open)(sd_bus **)) {
91 /* Let's try our best to reuse another cached connection. If
92 * the starter bus type is set, connect via our normal
93 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
94 * we can share the connection with the user/system default
97 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
99 if (streq(e, "system")) {
101 *bus_open = sd_bus_open_system;
102 return &default_system_bus;
103 } else if (STR_IN_SET(e, "user", "session")) {
105 *bus_open = sd_bus_open_user;
106 return &default_user_bus;
110 /* No type is specified, so we have not other option than to
111 * use the starter address if it is set. */
112 e = secure_getenv("DBUS_STARTER_ADDRESS");
115 *bus_open = sd_bus_open;
116 return &default_starter_bus;
119 /* Finally, if nothing is set use the cached connection for
122 if (cg_pid_get_owner_uid(0, NULL) >= 0) {
124 *bus_open = sd_bus_open_user;
125 return &default_user_bus;
128 *bus_open = sd_bus_open_system;
129 return &default_system_bus;
133 sd_bus *bus_resolve(sd_bus *bus) {
134 switch ((uintptr_t) bus) {
135 case (uintptr_t) SD_BUS_DEFAULT:
136 return *(bus_choose_default(NULL));
137 case (uintptr_t) SD_BUS_DEFAULT_USER:
138 return default_user_bus;
139 case (uintptr_t) SD_BUS_DEFAULT_SYSTEM:
140 return default_system_bus;
146 void bus_close_io_fds(sd_bus *b) {
149 bus_detach_io_events(b);
151 if (b->input_fd != b->output_fd)
152 safe_close(b->output_fd);
153 b->output_fd = b->input_fd = safe_close(b->input_fd);
156 void bus_close_inotify_fd(sd_bus *b) {
159 bus_detach_inotify_event(b);
161 b->inotify_fd = safe_close(b->inotify_fd);
162 b->inotify_watches = mfree(b->inotify_watches);
163 b->n_inotify_watches = 0;
166 static void bus_reset_queues(sd_bus *b) {
169 while (b->rqueue_size > 0)
170 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
172 b->rqueue = mfree(b->rqueue);
173 b->rqueue_allocated = 0;
175 while (b->wqueue_size > 0)
176 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
178 b->wqueue = mfree(b->wqueue);
179 b->wqueue_allocated = 0;
182 static void bus_free(sd_bus *b) {
186 assert(!b->track_queue);
189 b->state = BUS_CLOSED;
191 sd_bus_detach_event(b);
193 while ((s = b->slots)) {
194 /* At this point only floating slots can still be
195 * around, because the non-floating ones keep a
196 * reference to the bus, and we thus couldn't be
197 * destructing right now... We forcibly disconnect the
198 * slots here, so that they still can be referenced by
199 * apps, but are dead. */
202 bus_slot_disconnect(s);
203 sd_bus_slot_unref(s);
206 if (b->default_bus_ptr)
207 *b->default_bus_ptr = NULL;
210 bus_close_inotify_fd(b);
215 free(b->unique_name);
216 free(b->auth_buffer);
219 free(b->cgroup_root);
220 free(b->description);
221 free(b->patch_sender);
224 strv_free(b->exec_argv);
226 close_many(b->fds, b->n_fds);
231 ordered_hashmap_free_free(b->reply_callbacks);
232 prioq_free(b->reply_callbacks_prioq);
234 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
235 bus_match_free(&b->match_callbacks);
237 hashmap_free_free(b->vtable_methods);
238 hashmap_free_free(b->vtable_properties);
240 assert(hashmap_isempty(b->nodes));
241 hashmap_free(b->nodes);
245 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
250 _public_ int sd_bus_new(sd_bus **ret) {
253 assert_return(ret, -EINVAL);
259 r->n_ref = REFCNT_INIT;
260 r->input_fd = r->output_fd = -1;
262 r->message_version = 1;
263 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
265 r->original_pid = getpid_cached();
266 r->n_groups = (size_t) -1;
268 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
270 /* We guarantee that wqueue always has space for at least one
272 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
281 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
284 assert_return(bus, -EINVAL);
285 assert_return(bus = bus_resolve(bus), -ENOPKG);
286 assert_return(bus->state == BUS_UNSET, -EPERM);
287 assert_return(address, -EINVAL);
288 assert_return(!bus_pid_changed(bus), -ECHILD);
300 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
301 assert_return(bus, -EINVAL);
302 assert_return(bus = bus_resolve(bus), -ENOPKG);
303 assert_return(bus->state == BUS_UNSET, -EPERM);
304 assert_return(input_fd >= 0, -EBADF);
305 assert_return(output_fd >= 0, -EBADF);
306 assert_return(!bus_pid_changed(bus), -ECHILD);
308 bus->input_fd = input_fd;
309 bus->output_fd = output_fd;
313 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
316 assert_return(bus, -EINVAL);
317 assert_return(bus = bus_resolve(bus), -ENOPKG);
318 assert_return(bus->state == BUS_UNSET, -EPERM);
319 assert_return(path, -EINVAL);
320 assert_return(!strv_isempty(argv), -EINVAL);
321 assert_return(!bus_pid_changed(bus), -ECHILD);
333 free(bus->exec_path);
334 strv_free(bus->exec_argv);
342 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
343 assert_return(bus, -EINVAL);
344 assert_return(bus = bus_resolve(bus), -ENOPKG);
345 assert_return(bus->state == BUS_UNSET, -EPERM);
346 assert_return(!bus->patch_sender, -EPERM);
347 assert_return(!bus_pid_changed(bus), -ECHILD);
349 bus->bus_client = !!b;
353 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
354 assert_return(bus, -EINVAL);
355 assert_return(bus = bus_resolve(bus), -ENOPKG);
356 assert_return(bus->state == BUS_UNSET, -EPERM);
357 assert_return(!bus_pid_changed(bus), -ECHILD);
363 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
364 assert_return(bus, -EINVAL);
365 assert_return(bus = bus_resolve(bus), -ENOPKG);
366 assert_return(bus->state == BUS_UNSET, -EPERM);
367 assert_return(!bus_pid_changed(bus), -ECHILD);
373 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
374 assert_return(bus, -EINVAL);
375 assert_return(bus = bus_resolve(bus), -ENOPKG);
376 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
377 assert_return(!bus_pid_changed(bus), -ECHILD);
379 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
380 * replies, and maybe one day classic D-Bus learns this too */
381 bus->attach_timestamp = b;
386 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
387 assert_return(bus, -EINVAL);
388 assert_return(bus = bus_resolve(bus), -ENOPKG);
389 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
390 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
391 assert_return(!bus_pid_changed(bus), -ECHILD);
393 SET_FLAG(bus->creds_mask, mask, b);
395 /* The well knowns we need unconditionally, so that matches can work */
396 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
401 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
402 assert_return(bus, -EINVAL);
403 assert_return(bus = bus_resolve(bus), -ENOPKG);
404 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
405 assert_return(bus->state == BUS_UNSET, -EPERM);
406 assert_return(!bus_pid_changed(bus), -ECHILD);
408 bus->is_server = !!b;
409 bus->server_id = server_id;
413 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
414 assert_return(bus, -EINVAL);
415 assert_return(bus = bus_resolve(bus), -ENOPKG);
416 assert_return(bus->state == BUS_UNSET, -EPERM);
417 assert_return(!bus_pid_changed(bus), -ECHILD);
419 bus->anonymous_auth = !!b;
423 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
424 assert_return(bus, -EINVAL);
425 assert_return(bus = bus_resolve(bus), -ENOPKG);
426 assert_return(bus->state == BUS_UNSET, -EPERM);
427 assert_return(!bus_pid_changed(bus), -ECHILD);
433 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
434 assert_return(bus, -EINVAL);
435 assert_return(bus = bus_resolve(bus), -ENOPKG);
436 assert_return(bus->state == BUS_UNSET, -EPERM);
437 assert_return(!bus_pid_changed(bus), -ECHILD);
439 return free_and_strdup(&bus->description, description);
442 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
443 assert_return(bus, -EINVAL);
444 assert_return(bus = bus_resolve(bus), -ENOPKG);
445 assert_return(!bus_pid_changed(bus), -ECHILD);
447 bus->allow_interactive_authorization = !!b;
451 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
452 assert_return(bus, -EINVAL);
453 assert_return(bus = bus_resolve(bus), -ENOPKG);
454 assert_return(!bus_pid_changed(bus), -ECHILD);
456 return bus->allow_interactive_authorization;
459 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
460 assert_return(bus, -EINVAL);
461 assert_return(bus = bus_resolve(bus), -ENOPKG);
462 assert_return(bus->state == BUS_UNSET, -EPERM);
463 assert_return(!bus_pid_changed(bus), -ECHILD);
469 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
470 assert_return(bus, -EINVAL);
471 assert_return(bus = bus_resolve(bus), -ENOPKG);
472 assert_return(!bus_pid_changed(bus), -ECHILD);
474 return bus->watch_bind;
477 _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) {
478 assert_return(bus, -EINVAL);
479 assert_return(bus = bus_resolve(bus), -ENOPKG);
480 assert_return(bus->state == BUS_UNSET, -EPERM);
481 assert_return(!bus_pid_changed(bus), -ECHILD);
483 bus->connected_signal = b;
487 _public_ int sd_bus_get_connected_signal(sd_bus *bus) {
488 assert_return(bus, -EINVAL);
489 assert_return(bus = bus_resolve(bus), -ENOPKG);
490 assert_return(!bus_pid_changed(bus), -ECHILD);
492 return bus->connected_signal;
495 static int synthesize_connected_signal(sd_bus *bus) {
496 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
501 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
502 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
503 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
505 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
506 * that works independently from whether we connected to a full bus or just a direct connection. */
508 if (!bus->connected_signal)
511 r = sd_bus_message_new_signal(
514 "/org/freedesktop/DBus/Local",
515 "org.freedesktop.DBus.Local",
520 bus_message_set_sender_local(bus, m);
522 r = bus_seal_synthetic_message(bus, m);
526 r = bus_rqueue_make_room(bus);
530 /* Insert at the very front */
531 memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size);
539 void bus_set_state(sd_bus *bus, enum bus_state state) {
541 static const char * const table[_BUS_STATE_MAX] = {
542 [BUS_UNSET] = "UNSET",
543 [BUS_WATCH_BIND] = "WATCH_BIND",
544 [BUS_OPENING] = "OPENING",
545 [BUS_AUTHENTICATING] = "AUTHENTICATING",
546 [BUS_HELLO] = "HELLO",
547 [BUS_RUNNING] = "RUNNING",
548 [BUS_CLOSING] = "CLOSING",
549 [BUS_CLOSED] = "CLOSED",
553 assert(state < _BUS_STATE_MAX);
555 if (state == bus->state)
558 log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state]);
562 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
571 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
573 r = sd_bus_message_get_errno(reply);
577 r = sd_bus_message_read(reply, "s", &s);
581 if (!service_name_is_valid(s) || s[0] != ':')
588 free_and_replace(bus->unique_name, t);
590 if (bus->state == BUS_HELLO) {
591 bus_set_state(bus, BUS_RUNNING);
593 r = synthesize_connected_signal(bus);
601 static int bus_send_hello(sd_bus *bus) {
602 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
607 if (!bus->bus_client)
610 r = sd_bus_message_new_method_call(
613 "org.freedesktop.DBus",
614 "/org/freedesktop/DBus",
615 "org.freedesktop.DBus",
620 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
623 int bus_start_running(sd_bus *bus) {
624 struct reply_callback *c;
630 assert(bus->state < BUS_HELLO);
632 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
633 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
634 * adding a fixed value to all entries should not alter the internal order. */
636 n = now(CLOCK_MONOTONIC);
637 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
638 if (c->timeout_usec == 0)
641 c->timeout_usec = usec_add(n, c->timeout_usec);
644 if (bus->bus_client) {
645 bus_set_state(bus, BUS_HELLO);
649 bus_set_state(bus, BUS_RUNNING);
651 r = synthesize_connected_signal(bus);
658 static int parse_address_key(const char **p, const char *key, char **value) {
659 size_t l, n = 0, allocated = 0;
669 if (strncmp(*p, key, l) != 0)
682 while (!IN_SET(*a, ';', ',', 0)) {
700 c = (char) ((x << 4) | y);
707 if (!GREEDY_REALLOC(r, allocated, n + 2))
731 static void skip_address_key(const char **p) {
735 *p += strcspn(*p, ",");
741 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
742 _cleanup_free_ char *path = NULL, *abstract = NULL;
751 while (!IN_SET(**p, 0, ';')) {
752 r = parse_address_key(p, "guid", guid);
758 r = parse_address_key(p, "path", &path);
764 r = parse_address_key(p, "abstract", &abstract);
773 if (!path && !abstract)
776 if (path && abstract)
781 if (l > sizeof(b->sockaddr.un.sun_path))
784 b->sockaddr.un.sun_family = AF_UNIX;
785 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
786 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
787 } else if (abstract) {
788 l = strlen(abstract);
789 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
792 b->sockaddr.un.sun_family = AF_UNIX;
793 b->sockaddr.un.sun_path[0] = 0;
794 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
795 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
803 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
804 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
806 struct addrinfo *result, hints = {
807 .ai_socktype = SOCK_STREAM,
808 .ai_flags = AI_ADDRCONFIG,
816 while (!IN_SET(**p, 0, ';')) {
817 r = parse_address_key(p, "guid", guid);
823 r = parse_address_key(p, "host", &host);
829 r = parse_address_key(p, "port", &port);
835 r = parse_address_key(p, "family", &family);
848 if (streq(family, "ipv4"))
849 hints.ai_family = AF_INET;
850 else if (streq(family, "ipv6"))
851 hints.ai_family = AF_INET6;
856 r = getaddrinfo(host, port, &hints, &result);
860 return -EADDRNOTAVAIL;
862 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
863 b->sockaddr_size = result->ai_addrlen;
865 freeaddrinfo(result);
872 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
874 unsigned n_argv = 0, j;
876 size_t allocated = 0;
884 while (!IN_SET(**p, 0, ';')) {
885 r = parse_address_key(p, "guid", guid);
891 r = parse_address_key(p, "path", &path);
897 if (startswith(*p, "argv")) {
901 ul = strtoul(*p + 4, (char**) p, 10);
902 if (errno > 0 || **p != '=' || ul > 256) {
910 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
918 r = parse_address_key(p, NULL, argv + ul);
933 /* Make sure there are no holes in the array, with the
934 * exception of argv[0] */
935 for (j = 1; j < n_argv; j++)
941 if (argv && argv[0] == NULL) {
942 argv[0] = strdup(path);
957 for (j = 0; j < n_argv; j++)
965 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
966 _cleanup_free_ char *machine = NULL, *pid = NULL;
974 while (!IN_SET(**p, 0, ';')) {
975 r = parse_address_key(p, "guid", guid);
981 r = parse_address_key(p, "machine", &machine);
987 r = parse_address_key(p, "pid", &pid);
996 if (!machine == !pid)
1000 if (!machine_name_is_valid(machine))
1003 free_and_replace(b->machine, machine);
1005 b->machine = mfree(b->machine);
1009 r = parse_pid(pid, &b->nspid);
1015 b->sockaddr.un.sun_family = AF_UNIX;
1016 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
1017 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
1018 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
1019 b->is_local = false;
1024 static void bus_reset_parsed_address(sd_bus *b) {
1028 b->sockaddr_size = 0;
1029 b->exec_argv = strv_free(b->exec_argv);
1030 b->exec_path = mfree(b->exec_path);
1031 b->server_id = SD_ID128_NULL;
1032 b->machine = mfree(b->machine);
1036 static int bus_parse_next_address(sd_bus *b) {
1037 _cleanup_free_ char *guid = NULL;
1045 if (b->address[b->address_index] == 0)
1048 bus_reset_parsed_address(b);
1050 a = b->address + b->address_index;
1059 if (startswith(a, "unix:")) {
1062 r = parse_unix_address(b, &a, &guid);
1067 } else if (startswith(a, "tcp:")) {
1070 r = parse_tcp_address(b, &a, &guid);
1076 } else if (startswith(a, "unixexec:")) {
1079 r = parse_exec_address(b, &a, &guid);
1085 } else if (startswith(a, "x-machine-unix:")) {
1088 r = parse_container_unix_address(b, &a, &guid);
1101 r = sd_id128_from_string(guid, &b->server_id);
1106 b->address_index = a - b->address;
1110 static int bus_start_address(sd_bus *b) {
1116 bus_close_io_fds(b);
1117 bus_close_inotify_fd(b);
1119 /* If you provide multiple different bus-addresses, we
1120 * try all of them in order and use the first one that
1124 r = bus_socket_exec(b);
1125 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1126 r = bus_container_connect_socket(b);
1127 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1128 r = bus_socket_connect(b);
1135 q = bus_attach_io_events(b);
1139 q = bus_attach_inotify_event(b);
1146 b->last_connect_error = -r;
1149 r = bus_parse_next_address(b);
1153 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1157 int bus_next_address(sd_bus *b) {
1160 bus_reset_parsed_address(b);
1161 return bus_start_address(b);
1164 static int bus_start_fd(sd_bus *b) {
1169 assert(b->input_fd >= 0);
1170 assert(b->output_fd >= 0);
1172 r = fd_nonblock(b->input_fd, true);
1176 r = fd_cloexec(b->input_fd, true);
1180 if (b->input_fd != b->output_fd) {
1181 r = fd_nonblock(b->output_fd, true);
1185 r = fd_cloexec(b->output_fd, true);
1190 if (fstat(b->input_fd, &st) < 0)
1193 return bus_socket_take_fd(b);
1196 _public_ int sd_bus_start(sd_bus *bus) {
1199 assert_return(bus, -EINVAL);
1200 assert_return(bus = bus_resolve(bus), -ENOPKG);
1201 assert_return(bus->state == BUS_UNSET, -EPERM);
1202 assert_return(!bus_pid_changed(bus), -ECHILD);
1204 bus_set_state(bus, BUS_OPENING);
1206 if (bus->is_server && bus->bus_client)
1209 if (bus->input_fd >= 0)
1210 r = bus_start_fd(bus);
1211 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1212 r = bus_start_address(bus);
1221 return bus_send_hello(bus);
1224 _public_ int sd_bus_open(sd_bus **ret) {
1229 assert_return(ret, -EINVAL);
1231 /* Let's connect to the starter bus if it is set, and
1232 * otherwise to the bus that is appropropriate for the scope
1233 * we are running in */
1235 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1237 if (streq(e, "system"))
1238 return sd_bus_open_system(ret);
1239 #if 0 /// elogind does not support systemd user instances
1240 else if (STR_IN_SET(e, "session", "user"))
1241 return sd_bus_open_user(ret);
1245 e = secure_getenv("DBUS_STARTER_ADDRESS");
1247 #if 0 /// elogind does not support systemd user instances
1248 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1249 return sd_bus_open_user(ret);
1252 return sd_bus_open_system(ret);
1259 r = sd_bus_set_address(b, e);
1263 b->bus_client = true;
1265 /* We don't know whether the bus is trusted or not, so better
1266 * be safe, and authenticate everything */
1268 b->is_local = false;
1269 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1271 r = sd_bus_start(b);
1283 int bus_set_address_system(sd_bus *b) {
1287 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1289 return sd_bus_set_address(b, e);
1291 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1294 _public_ int sd_bus_open_system(sd_bus **ret) {
1298 assert_return(ret, -EINVAL);
1304 r = bus_set_address_system(b);
1308 b->bus_client = true;
1309 b->is_system = true;
1311 /* Let's do per-method access control on the system bus. We
1312 * need the caller's UID and capability set for that. */
1314 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1317 r = sd_bus_start(b);
1329 #if 0 /// elogind can not open/use a user bus
1330 int bus_set_address_user(sd_bus *b) {
1332 _cleanup_free_ char *ee = NULL, *s = NULL;
1336 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1338 return sd_bus_set_address(b, e);
1340 e = secure_getenv("XDG_RUNTIME_DIR");
1344 ee = bus_address_escape(e);
1348 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1358 _public_ int sd_bus_open_user(sd_bus **ret) {
1359 #if 0 /// elogind does not support user buses
1363 assert_return(ret, -EINVAL);
1369 r = bus_set_address_user(b);
1373 b->bus_client = true;
1376 /* We don't do any per-method access control on the user
1381 r = sd_bus_start(b);
1392 return sd_bus_open_system(ret);
1396 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1397 _cleanup_free_ char *e = NULL;
1398 char *m = NULL, *c = NULL, *a;
1403 /* Let's see if we shall enter some container */
1404 m = strchr(host, ':');
1408 /* Let's make sure this is not a port of some kind,
1409 * and is a valid machine name. */
1410 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1413 /* Cut out the host part */
1414 t = strndupa(host, m - host - 1);
1415 e = bus_address_escape(t);
1419 c = strjoina(",argv5=--machine=", m);
1424 e = bus_address_escape(host);
1429 a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=elogind-stdio-bridge", c);
1433 free_and_replace(b->address, a);
1438 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1442 assert_return(host, -EINVAL);
1443 assert_return(ret, -EINVAL);
1445 r = sd_bus_new(&bus);
1449 r = bus_set_address_system_remote(bus, host);
1453 bus->bus_client = true;
1454 bus->trusted = false;
1455 bus->is_system = true;
1456 bus->is_local = false;
1458 r = sd_bus_start(bus);
1470 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1471 _cleanup_free_ char *e = NULL;
1477 e = bus_address_escape(machine);
1481 a = strjoin("x-machine-unix:machine=", e);
1485 free_and_replace(b->address, a);
1490 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1494 assert_return(machine, -EINVAL);
1495 assert_return(ret, -EINVAL);
1496 assert_return(machine_name_is_valid(machine), -EINVAL);
1498 r = sd_bus_new(&bus);
1502 r = bus_set_address_system_machine(bus, machine);
1506 bus->bus_client = true;
1507 bus->trusted = false;
1508 bus->is_system = true;
1509 bus->is_local = false;
1511 r = sd_bus_start(bus);
1523 _public_ void sd_bus_close(sd_bus *bus) {
1527 if (bus->state == BUS_CLOSED)
1529 if (bus_pid_changed(bus))
1532 bus_set_state(bus, BUS_CLOSED);
1534 sd_bus_detach_event(bus);
1536 /* Drop all queued messages so that they drop references to
1537 * the bus object and the bus may be freed */
1538 bus_reset_queues(bus);
1540 bus_close_io_fds(bus);
1541 bus_close_inotify_fd(bus);
1544 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1552 return sd_bus_unref(bus);
1555 void bus_enter_closing(sd_bus *bus) {
1558 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1561 bus_set_state(bus, BUS_CLOSING);
1564 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1569 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1574 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1580 i = REFCNT_DEC(bus->n_ref);
1588 _public_ int sd_bus_is_open(sd_bus *bus) {
1590 assert_return(bus, -EINVAL);
1591 assert_return(bus = bus_resolve(bus), -ENOPKG);
1592 assert_return(!bus_pid_changed(bus), -ECHILD);
1594 return BUS_IS_OPEN(bus->state);
1597 _public_ int sd_bus_is_ready(sd_bus *bus) {
1598 assert_return(bus, -EINVAL);
1599 assert_return(bus = bus_resolve(bus), -ENOPKG);
1600 assert_return(!bus_pid_changed(bus), -ECHILD);
1602 return bus->state == BUS_RUNNING;
1605 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1608 assert_return(bus, -EINVAL);
1609 assert_return(bus = bus_resolve(bus), -ENOPKG);
1610 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1611 assert_return(!bus_pid_changed(bus), -ECHILD);
1613 if (bus->is_monitor)
1616 if (type == SD_BUS_TYPE_UNIX_FD) {
1617 if (!bus->accept_fd)
1620 r = bus_ensure_running(bus);
1624 return bus->can_fds;
1627 return bus_type_is_valid(type);
1630 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1633 assert_return(bus, -EINVAL);
1634 assert_return(bus = bus_resolve(bus), -ENOPKG);
1635 assert_return(id, -EINVAL);
1636 assert_return(!bus_pid_changed(bus), -ECHILD);
1638 r = bus_ensure_running(bus);
1642 *id = bus->server_id;
1646 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1653 /* If we copy the same message to multiple
1654 * destinations, avoid using the same cookie
1656 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1661 timeout = BUS_DEFAULT_TIMEOUT;
1663 if (!m->sender && b->patch_sender) {
1664 r = sd_bus_message_set_sender(m, b->patch_sender);
1669 return sd_bus_message_seal(m, ++b->cookie, timeout);
1672 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1673 bool remarshal = false;
1677 /* wrong packet version */
1678 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1681 /* wrong packet endianness */
1682 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1685 return remarshal ? bus_message_remarshal(b, m) : 0;
1688 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1692 /* Fake some timestamps, if they were requested, and not
1693 * already initialized */
1694 if (b->attach_timestamp) {
1695 if (m->realtime <= 0)
1696 m->realtime = now(CLOCK_REALTIME);
1698 if (m->monotonic <= 0)
1699 m->monotonic = now(CLOCK_MONOTONIC);
1702 /* The bus specification says the serial number cannot be 0,
1703 * hence let's fill something in for synthetic messages. Since
1704 * synthetic messages might have a fake sender and we don't
1705 * want to interfere with the real sender's serial numbers we
1706 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1707 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1708 * even though kdbus can do 64bit. */
1709 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1712 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1718 r = bus_socket_write_message(bus, m, idx);
1722 if (*idx >= BUS_MESSAGE_SIZE(m))
1723 log_debug("Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " signature=%s error-name=%s error-message=%s",
1724 bus_message_type_to_string(m->header->type),
1725 strna(sd_bus_message_get_sender(m)),
1726 strna(sd_bus_message_get_destination(m)),
1727 strna(sd_bus_message_get_path(m)),
1728 strna(sd_bus_message_get_interface(m)),
1729 strna(sd_bus_message_get_member(m)),
1730 BUS_MESSAGE_COOKIE(m),
1732 strna(m->root_container.signature),
1733 strna(m->error.name),
1734 strna(m->error.message));
1739 static int dispatch_wqueue(sd_bus *bus) {
1743 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1745 while (bus->wqueue_size > 0) {
1747 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1751 /* Didn't do anything this time */
1753 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1754 /* Fully written. Let's drop the entry from
1757 * This isn't particularly optimized, but
1758 * well, this is supposed to be our worst-case
1759 * buffer only, and the socket buffer is
1760 * supposed to be our primary buffer, and if
1761 * it got full, then all bets are off
1765 sd_bus_message_unref(bus->wqueue[0]);
1766 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1776 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1779 return bus_socket_read_message(bus);
1782 int bus_rqueue_make_room(sd_bus *bus) {
1785 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1788 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1794 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1799 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1801 /* Note that the priority logic is only available on kdbus,
1802 * where the rqueue is unused. We check the rqueue here
1803 * anyway, because it's simple... */
1806 if (bus->rqueue_size > 0) {
1807 /* Dispatch a queued message */
1809 *m = bus->rqueue[0];
1811 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1815 /* Try to read a new message */
1816 r = bus_read_message(bus, hint_priority, priority);
1826 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1827 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1830 assert_return(m, -EINVAL);
1835 assert_return(!bus_pid_changed(bus), -ECHILD);
1837 if (!BUS_IS_OPEN(bus->state))
1841 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1848 /* If the cookie number isn't kept, then we know that no reply
1850 if (!cookie && !m->sealed)
1851 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1853 r = bus_seal_message(bus, m, 0);
1857 /* Remarshall if we have to. This will possibly unref the
1858 * message and place a replacement in m */
1859 r = bus_remarshal_message(bus, &m);
1863 /* If this is a reply and no reply was requested, then let's
1864 * suppress this, if we can */
1868 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1871 r = bus_write_message(bus, m, &idx);
1873 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1874 bus_enter_closing(bus);
1881 if (idx < BUS_MESSAGE_SIZE(m)) {
1882 /* Wasn't fully written. So let's remember how
1883 * much was written. Note that the first entry
1884 * of the wqueue array is always allocated so
1885 * that we always can remember how much was
1887 bus->wqueue[0] = sd_bus_message_ref(m);
1888 bus->wqueue_size = 1;
1893 /* Just append it to the queue. */
1895 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1898 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1901 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1906 *cookie = BUS_MESSAGE_COOKIE(m);
1911 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1914 assert_return(m, -EINVAL);
1919 assert_return(!bus_pid_changed(bus), -ECHILD);
1921 if (!BUS_IS_OPEN(bus->state))
1924 if (!streq_ptr(m->destination, destination)) {
1929 r = sd_bus_message_set_destination(m, destination);
1934 return sd_bus_send(bus, m, cookie);
1937 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1940 if (usec == (uint64_t) -1)
1943 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1944 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1945 * relative timestamp, and afterwards the absolute one. */
1947 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1950 return now(CLOCK_MONOTONIC) + usec;
1953 static int timeout_compare(const void *a, const void *b) {
1954 const struct reply_callback *x = a, *y = b;
1956 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1959 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1962 if (x->timeout_usec < y->timeout_usec)
1965 if (x->timeout_usec > y->timeout_usec)
1971 _public_ int sd_bus_call_async(
1975 sd_bus_message_handler_t callback,
1979 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1980 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1983 assert_return(m, -EINVAL);
1984 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1985 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
1990 assert_return(!bus_pid_changed(bus), -ECHILD);
1992 if (!BUS_IS_OPEN(bus->state))
1995 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
1996 if (!callback && !slot && !m->sealed)
1997 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1999 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
2003 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
2007 r = bus_seal_message(bus, m, usec);
2011 r = bus_remarshal_message(bus, &m);
2015 if (slot || callback) {
2016 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
2020 s->reply_callback.callback = callback;
2022 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
2023 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
2025 s->reply_callback.cookie = 0;
2029 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
2030 if (s->reply_callback.timeout_usec != 0) {
2031 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
2033 s->reply_callback.timeout_usec = 0;
2039 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
2050 int bus_ensure_running(sd_bus *bus) {
2055 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
2057 if (bus->state == BUS_RUNNING)
2061 r = sd_bus_process(bus, NULL);
2064 if (bus->state == BUS_RUNNING)
2069 r = sd_bus_wait(bus, (uint64_t) -1);
2075 _public_ int sd_bus_call(
2079 sd_bus_error *error,
2080 sd_bus_message **reply) {
2082 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2088 bus_assert_return(m, -EINVAL, error);
2089 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2090 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2091 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2096 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2098 if (!BUS_IS_OPEN(bus->state)) {
2103 r = bus_ensure_running(bus);
2107 i = bus->rqueue_size;
2109 r = bus_seal_message(bus, m, usec);
2113 r = bus_remarshal_message(bus, &m);
2117 r = sd_bus_send(bus, m, &cookie);
2121 timeout = calc_elapse(bus, m->timeout);
2126 while (i < bus->rqueue_size) {
2127 sd_bus_message *incoming = NULL;
2129 incoming = bus->rqueue[i];
2131 if (incoming->reply_cookie == cookie) {
2132 /* Found a match! */
2134 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2136 log_debug_bus_message(incoming);
2138 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2140 if (incoming->n_fds <= 0 || bus->accept_fd) {
2144 sd_bus_message_unref(incoming);
2149 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2150 sd_bus_message_unref(incoming);
2153 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2154 r = sd_bus_error_copy(error, &incoming->error);
2155 sd_bus_message_unref(incoming);
2162 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2165 streq(bus->unique_name, incoming->sender)) {
2167 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2170 /* Our own message? Somebody is trying
2171 * to send its own client a message,
2172 * let's not dead-lock, let's fail
2175 sd_bus_message_unref(incoming);
2180 /* Try to read more, right-away */
2184 r = bus_read_message(bus, false, 0);
2186 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2187 bus_enter_closing(bus);
2199 n = now(CLOCK_MONOTONIC);
2207 left = (uint64_t) -1;
2209 r = bus_poll(bus, true, left);
2217 r = dispatch_wqueue(bus);
2219 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2220 bus_enter_closing(bus);
2229 return sd_bus_error_set_errno(error, r);
2232 _public_ int sd_bus_get_fd(sd_bus *bus) {
2234 assert_return(bus, -EINVAL);
2235 assert_return(bus = bus_resolve(bus), -ENOPKG);
2236 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2237 assert_return(!bus_pid_changed(bus), -ECHILD);
2239 if (bus->state == BUS_CLOSED)
2242 if (bus->inotify_fd >= 0)
2243 return bus->inotify_fd;
2245 if (bus->input_fd >= 0)
2246 return bus->input_fd;
2251 _public_ int sd_bus_get_events(sd_bus *bus) {
2254 assert_return(bus, -EINVAL);
2255 assert_return(bus = bus_resolve(bus), -ENOPKG);
2256 assert_return(!bus_pid_changed(bus), -ECHILD);
2258 switch (bus->state) {
2264 case BUS_WATCH_BIND:
2272 case BUS_AUTHENTICATING:
2273 if (bus_socket_auth_needs_write(bus))
2281 if (bus->rqueue_size <= 0)
2283 if (bus->wqueue_size > 0)
2291 assert_not_reached("Unknown state");
2297 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2298 struct reply_callback *c;
2300 assert_return(bus, -EINVAL);
2301 assert_return(bus = bus_resolve(bus), -ENOPKG);
2302 assert_return(timeout_usec, -EINVAL);
2303 assert_return(!bus_pid_changed(bus), -ECHILD);
2305 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2308 if (bus->track_queue) {
2313 switch (bus->state) {
2315 case BUS_AUTHENTICATING:
2316 *timeout_usec = bus->auth_timeout;
2321 if (bus->rqueue_size > 0) {
2326 c = prioq_peek(bus->reply_callbacks_prioq);
2328 *timeout_usec = (uint64_t) -1;
2332 if (c->timeout_usec == 0) {
2333 *timeout_usec = (uint64_t) -1;
2337 *timeout_usec = c->timeout_usec;
2344 case BUS_WATCH_BIND:
2346 *timeout_usec = (uint64_t) -1;
2350 assert_not_reached("Unknown or unexpected stat");
2354 static int process_timeout(sd_bus *bus) {
2355 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2356 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2357 struct reply_callback *c;
2364 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2366 c = prioq_peek(bus->reply_callbacks_prioq);
2370 n = now(CLOCK_MONOTONIC);
2371 if (c->timeout_usec > n)
2374 r = bus_message_new_synthetic_error(
2377 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2382 r = bus_seal_synthetic_message(bus, m);
2386 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2387 c->timeout_usec = 0;
2389 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2392 slot = container_of(c, sd_bus_slot, reply_callback);
2394 bus->iteration_counter++;
2396 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2398 bus->current_message = m;
2399 bus->current_slot = sd_bus_slot_ref(slot);
2400 bus->current_handler = c->callback;
2401 bus->current_userdata = slot->userdata;
2402 r = c->callback(m, slot->userdata, &error_buffer);
2403 bus->current_userdata = NULL;
2404 bus->current_handler = NULL;
2405 bus->current_slot = NULL;
2406 bus->current_message = NULL;
2408 if (slot->floating) {
2409 bus_slot_disconnect(slot);
2410 sd_bus_slot_unref(slot);
2413 sd_bus_slot_unref(slot);
2415 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2416 * and ignore the callback handler's return value. */
2420 return bus_maybe_reply_error(m, r, &error_buffer);
2423 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2427 if (bus->state != BUS_HELLO)
2430 /* Let's make sure the first message on the bus is the HELLO
2431 * reply. But note that we don't actually parse the message
2432 * here (we leave that to the usual handling), we just verify
2433 * we don't let any earlier msg through. */
2435 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2438 if (m->reply_cookie != 1)
2444 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2445 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2446 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2447 struct reply_callback *c;
2455 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2458 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2461 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2467 slot = container_of(c, sd_bus_slot, reply_callback);
2469 if (m->n_fds > 0 && !bus->accept_fd) {
2471 /* If the reply contained a file descriptor which we
2472 * didn't want we pass an error instead. */
2474 r = bus_message_new_synthetic_error(
2477 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2482 /* Copy over original timestamp */
2483 synthetic_reply->realtime = m->realtime;
2484 synthetic_reply->monotonic = m->monotonic;
2485 synthetic_reply->seqnum = m->seqnum;
2487 r = bus_seal_synthetic_message(bus, synthetic_reply);
2491 m = synthetic_reply;
2493 r = sd_bus_message_rewind(m, true);
2498 if (c->timeout_usec != 0) {
2499 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2500 c->timeout_usec = 0;
2503 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2505 bus->current_slot = sd_bus_slot_ref(slot);
2506 bus->current_handler = c->callback;
2507 bus->current_userdata = slot->userdata;
2508 r = c->callback(m, slot->userdata, &error_buffer);
2509 bus->current_userdata = NULL;
2510 bus->current_handler = NULL;
2511 bus->current_slot = NULL;
2513 if (slot->floating) {
2514 bus_slot_disconnect(slot);
2515 sd_bus_slot_unref(slot);
2518 sd_bus_slot_unref(slot);
2520 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2521 * ignore the callback handler's return value. */
2525 return bus_maybe_reply_error(m, r, &error_buffer);
2528 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2529 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2530 struct filter_callback *l;
2537 bus->filter_callbacks_modified = false;
2539 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2542 if (bus->filter_callbacks_modified)
2545 /* Don't run this more than once per iteration */
2546 if (l->last_iteration == bus->iteration_counter)
2549 l->last_iteration = bus->iteration_counter;
2551 r = sd_bus_message_rewind(m, true);
2555 slot = container_of(l, sd_bus_slot, filter_callback);
2557 bus->current_slot = sd_bus_slot_ref(slot);
2558 bus->current_handler = l->callback;
2559 bus->current_userdata = slot->userdata;
2560 r = l->callback(m, slot->userdata, &error_buffer);
2561 bus->current_userdata = NULL;
2562 bus->current_handler = NULL;
2563 bus->current_slot = sd_bus_slot_unref(slot);
2565 r = bus_maybe_reply_error(m, r, &error_buffer);
2571 } while (bus->filter_callbacks_modified);
2576 static int process_match(sd_bus *bus, sd_bus_message *m) {
2583 bus->match_callbacks_modified = false;
2585 r = bus_match_run(bus, &bus->match_callbacks, m);
2589 } while (bus->match_callbacks_modified);
2594 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2595 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2601 if (bus->is_monitor)
2604 if (bus->manual_peer_interface)
2607 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2610 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2613 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2616 if (streq_ptr(m->member, "Ping"))
2617 r = sd_bus_message_new_method_return(m, &reply);
2618 else if (streq_ptr(m->member, "GetMachineId")) {
2622 r = sd_id128_get_machine(&id);
2626 r = sd_bus_message_new_method_return(m, &reply);
2630 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2632 r = sd_bus_message_new_method_errorf(
2634 SD_BUS_ERROR_UNKNOWN_METHOD,
2635 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2641 r = sd_bus_send(bus, reply, NULL);
2648 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2652 /* If we got a message with a file descriptor which we didn't
2653 * want to accept, then let's drop it. How can this even
2654 * happen? For example, when the kernel queues a message into
2655 * an activatable names's queue which allows fds, and then is
2656 * delivered to us later even though we ourselves did not
2659 if (bus->is_monitor)
2668 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2669 return 1; /* just eat it up */
2671 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2674 static int process_message(sd_bus *bus, sd_bus_message *m) {
2680 bus->current_message = m;
2681 bus->iteration_counter++;
2683 log_debug_bus_message(m);
2685 r = process_hello(bus, m);
2689 r = process_reply(bus, m);
2693 r = process_fd_check(bus, m);
2697 r = process_filter(bus, m);
2701 r = process_match(bus, m);
2705 r = process_builtin(bus, m);
2709 r = bus_process_object(bus, m);
2712 bus->current_message = NULL;
2716 static int dispatch_track(sd_bus *bus) {
2719 if (!bus->track_queue)
2722 bus_track_dispatch(bus->track_queue);
2726 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2727 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2731 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2733 r = process_timeout(bus);
2737 r = dispatch_wqueue(bus);
2741 r = dispatch_track(bus);
2745 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2751 r = process_message(bus, m);
2756 r = sd_bus_message_rewind(m, true);
2765 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2767 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2768 strna(sd_bus_message_get_sender(m)),
2769 strna(sd_bus_message_get_path(m)),
2770 strna(sd_bus_message_get_interface(m)),
2771 strna(sd_bus_message_get_member(m)));
2773 r = sd_bus_reply_method_errorf(
2775 SD_BUS_ERROR_UNKNOWN_OBJECT,
2776 "Unknown object '%s'.", m->path);
2790 static int bus_exit_now(sd_bus *bus) {
2793 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2794 * sd_event_exit(), otherwise invokes libc exit(). */
2796 if (bus->exited) /* did we already exit? */
2798 if (!bus->exit_triggered) /* was the exit condition triggered? */
2800 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2803 bus->exited = true; /* never exit more than once */
2805 log_debug("Bus connection disconnected, exiting.");
2808 return sd_event_exit(bus->event, EXIT_FAILURE);
2812 assert_not_reached("exit() didn't exit?");
2815 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2816 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2817 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2824 r = bus_message_new_synthetic_error(
2827 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2832 r = bus_seal_synthetic_message(bus, m);
2836 if (c->timeout_usec != 0) {
2837 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2838 c->timeout_usec = 0;
2841 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2844 slot = container_of(c, sd_bus_slot, reply_callback);
2846 bus->iteration_counter++;
2848 bus->current_message = m;
2849 bus->current_slot = sd_bus_slot_ref(slot);
2850 bus->current_handler = c->callback;
2851 bus->current_userdata = slot->userdata;
2852 r = c->callback(m, slot->userdata, &error_buffer);
2853 bus->current_userdata = NULL;
2854 bus->current_handler = NULL;
2855 bus->current_slot = NULL;
2856 bus->current_message = NULL;
2858 if (slot->floating) {
2859 bus_slot_disconnect(slot);
2860 sd_bus_slot_unref(slot);
2863 sd_bus_slot_unref(slot);
2865 return bus_maybe_reply_error(m, r, &error_buffer);
2868 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2869 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2870 struct reply_callback *c;
2874 assert(bus->state == BUS_CLOSING);
2876 /* First, fail all outstanding method calls */
2877 c = ordered_hashmap_first(bus->reply_callbacks);
2879 return process_closing_reply_callback(bus, c);
2881 /* Then, fake-drop all remaining bus tracking references */
2883 bus_track_close(bus->tracks);
2887 /* Then, synthesize a Disconnected message */
2888 r = sd_bus_message_new_signal(
2891 "/org/freedesktop/DBus/Local",
2892 "org.freedesktop.DBus.Local",
2897 bus_message_set_sender_local(bus, m);
2899 r = bus_seal_synthetic_message(bus, m);
2905 bus->current_message = m;
2906 bus->iteration_counter++;
2908 r = process_filter(bus, m);
2912 r = process_match(bus, m);
2916 /* Nothing else to do, exit now, if the condition holds */
2917 bus->exit_triggered = true;
2918 (void) bus_exit_now(bus);
2928 bus->current_message = NULL;
2933 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2934 BUS_DONT_DESTROY(bus);
2937 /* Returns 0 when we didn't do anything. This should cause the
2938 * caller to invoke sd_bus_wait() before returning the next
2939 * time. Returns > 0 when we did something, which possibly
2940 * means *ret is filled in with an unprocessed message. */
2942 assert_return(bus, -EINVAL);
2943 assert_return(bus = bus_resolve(bus), -ENOPKG);
2944 assert_return(!bus_pid_changed(bus), -ECHILD);
2946 /* We don't allow recursively invoking sd_bus_process(). */
2947 assert_return(!bus->current_message, -EBUSY);
2948 assert(!bus->current_slot);
2950 switch (bus->state) {
2958 case BUS_WATCH_BIND:
2959 r = bus_socket_process_watch_bind(bus);
2963 r = bus_socket_process_opening(bus);
2966 case BUS_AUTHENTICATING:
2967 r = bus_socket_process_authenticating(bus);
2972 r = process_running(bus, hint_priority, priority, ret);
2976 /* This branch initializes *ret, hence we don't use the generic error checking below */
2980 return process_closing(bus, ret);
2983 assert_not_reached("Unknown state");
2986 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2987 bus_enter_closing(bus);
2998 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2999 return bus_process_internal(bus, false, 0, ret);
3002 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
3003 return bus_process_internal(bus, true, priority, ret);
3006 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
3007 struct pollfd p[2] = {};
3010 usec_t m = USEC_INFINITY;
3014 if (bus->state == BUS_CLOSING)
3017 if (!BUS_IS_OPEN(bus->state))
3020 if (bus->state == BUS_WATCH_BIND) {
3021 assert(bus->inotify_fd >= 0);
3023 p[0].events = POLLIN;
3024 p[0].fd = bus->inotify_fd;
3029 e = sd_bus_get_events(bus);
3034 /* The caller really needs some more data, he doesn't
3035 * care about what's already read, or any timeouts
3036 * except its own. */
3040 /* The caller wants to process if there's something to
3041 * process, but doesn't care otherwise */
3043 r = sd_bus_get_timeout(bus, &until);
3047 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
3050 p[0].fd = bus->input_fd;
3051 if (bus->output_fd == bus->input_fd) {
3055 p[0].events = e & POLLIN;
3056 p[1].fd = bus->output_fd;
3057 p[1].events = e & POLLOUT;
3062 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
3065 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
3069 return r > 0 ? 1 : 0;
3072 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
3074 assert_return(bus, -EINVAL);
3075 assert_return(bus = bus_resolve(bus), -ENOPKG);
3076 assert_return(!bus_pid_changed(bus), -ECHILD);
3078 if (bus->state == BUS_CLOSING)
3081 if (!BUS_IS_OPEN(bus->state))
3084 if (bus->rqueue_size > 0)
3087 return bus_poll(bus, false, timeout_usec);
3090 _public_ int sd_bus_flush(sd_bus *bus) {
3093 assert_return(bus, -EINVAL);
3094 assert_return(bus = bus_resolve(bus), -ENOPKG);
3095 assert_return(!bus_pid_changed(bus), -ECHILD);
3097 if (bus->state == BUS_CLOSING)
3100 if (!BUS_IS_OPEN(bus->state))
3103 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3104 if (bus->state == BUS_WATCH_BIND)
3107 r = bus_ensure_running(bus);
3111 if (bus->wqueue_size <= 0)
3115 r = dispatch_wqueue(bus);
3117 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3118 bus_enter_closing(bus);
3125 if (bus->wqueue_size <= 0)
3128 r = bus_poll(bus, false, (uint64_t) -1);
3134 _public_ int sd_bus_add_filter(
3137 sd_bus_message_handler_t callback,
3142 assert_return(bus, -EINVAL);
3143 assert_return(bus = bus_resolve(bus), -ENOPKG);
3144 assert_return(callback, -EINVAL);
3145 assert_return(!bus_pid_changed(bus), -ECHILD);
3147 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3151 s->filter_callback.callback = callback;
3153 bus->filter_callbacks_modified = true;
3154 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3162 static int add_match_callback(
3165 sd_bus_error *ret_error) {
3167 sd_bus_slot *match_slot = userdata;
3168 bool failed = false;
3174 sd_bus_slot_ref(match_slot);
3176 if (sd_bus_message_is_method_error(m, NULL)) {
3177 log_debug_errno(sd_bus_message_get_errno(m),
3178 "Unable to add match %s, failing connection: %s",
3179 match_slot->match_callback.match_string,
3180 sd_bus_message_get_error(m)->message);
3184 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3186 if (match_slot->match_callback.install_callback) {
3189 bus = sd_bus_message_get_bus(m);
3191 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3192 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3195 assert(bus->current_slot == match_slot->match_callback.install_slot);
3196 assert(bus->current_handler == add_match_callback);
3197 assert(bus->current_userdata == userdata);
3199 bus->current_slot = match_slot;
3200 bus->current_handler = match_slot->match_callback.install_callback;
3201 bus->current_userdata = match_slot->userdata;
3203 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3205 bus->current_slot = match_slot->match_callback.install_slot;
3206 bus->current_handler = add_match_callback;
3207 bus->current_userdata = userdata;
3209 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3211 if (failed) /* Generic failure handling: destroy the connection */
3212 bus_enter_closing(sd_bus_message_get_bus(m));
3217 if (failed && match_slot->floating) {
3218 bus_slot_disconnect(match_slot);
3219 sd_bus_slot_unref(match_slot);
3222 sd_bus_slot_unref(match_slot);
3227 static int bus_add_match_full(
3232 sd_bus_message_handler_t callback,
3233 sd_bus_message_handler_t install_callback,
3236 struct bus_match_component *components = NULL;
3237 unsigned n_components = 0;
3238 sd_bus_slot *s = NULL;
3241 assert_return(bus, -EINVAL);
3242 assert_return(bus = bus_resolve(bus), -ENOPKG);
3243 assert_return(match, -EINVAL);
3244 assert_return(!bus_pid_changed(bus), -ECHILD);
3246 r = bus_match_parse(match, &components, &n_components);
3250 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3256 s->match_callback.callback = callback;
3257 s->match_callback.install_callback = install_callback;
3259 if (bus->bus_client) {
3260 enum bus_match_scope scope;
3262 scope = bus_match_get_scope(components, n_components);
3264 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3265 if (scope != BUS_MATCH_LOCAL) {
3267 /* We store the original match string, so that we can use it to remove the match again. */
3269 s->match_callback.match_string = strdup(match);
3270 if (!s->match_callback.match_string) {
3276 r = bus_add_match_internal_async(bus,
3277 &s->match_callback.install_slot,
3278 s->match_callback.match_string,
3282 r = bus_add_match_internal(bus, s->match_callback.match_string);
3286 s->match_added = true;
3290 bus->match_callbacks_modified = true;
3291 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3300 bus_match_parse_free(components, n_components);
3301 sd_bus_slot_unref(s);
3306 #if 0 /// UNNEEDED by elogind
3308 _public_ int sd_bus_add_match(
3312 sd_bus_message_handler_t callback,
3315 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3318 _public_ int sd_bus_add_match_async(
3322 sd_bus_message_handler_t callback,
3323 sd_bus_message_handler_t install_callback,
3326 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3329 bool bus_pid_changed(sd_bus *bus) {
3332 /* We don't support people creating a bus connection and
3333 * keeping it around over a fork(). Let's complain. */
3335 return bus->original_pid != getpid_cached();
3338 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3339 sd_bus *bus = userdata;
3344 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3346 r = sd_bus_process(bus, NULL);
3348 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3349 bus_enter_closing(bus);
3355 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3356 sd_bus *bus = userdata;
3361 r = sd_bus_process(bus, NULL);
3363 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3364 bus_enter_closing(bus);
3370 static int prepare_callback(sd_event_source *s, void *userdata) {
3371 sd_bus *bus = userdata;
3378 e = sd_bus_get_events(bus);
3384 if (bus->output_fd != bus->input_fd) {
3386 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3390 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3392 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3396 r = sd_bus_get_timeout(bus, &until);
3402 j = sd_event_source_set_time(bus->time_event_source, until);
3409 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3416 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3417 bus_enter_closing(bus);
3422 static int quit_callback(sd_event_source *event, void *userdata) {
3423 sd_bus *bus = userdata;
3433 int bus_attach_io_events(sd_bus *bus) {
3438 if (bus->input_fd < 0)
3444 if (!bus->input_io_event_source) {
3445 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3449 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3453 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3457 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3459 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3464 if (bus->output_fd != bus->input_fd) {
3465 assert(bus->output_fd >= 0);
3467 if (!bus->output_io_event_source) {
3468 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3472 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3476 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3478 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3487 static void bus_detach_io_events(sd_bus *bus) {
3490 if (bus->input_io_event_source) {
3491 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3492 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3495 if (bus->output_io_event_source) {
3496 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3497 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3501 int bus_attach_inotify_event(sd_bus *bus) {
3506 if (bus->inotify_fd < 0)
3512 if (!bus->inotify_event_source) {
3513 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3517 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3521 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3523 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3530 static void bus_detach_inotify_event(sd_bus *bus) {
3533 if (bus->inotify_event_source) {
3534 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3535 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3539 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3542 assert_return(bus, -EINVAL);
3543 assert_return(bus = bus_resolve(bus), -ENOPKG);
3544 assert_return(!bus->event, -EBUSY);
3546 assert(!bus->input_io_event_source);
3547 assert(!bus->output_io_event_source);
3548 assert(!bus->time_event_source);
3551 bus->event = sd_event_ref(event);
3553 r = sd_event_default(&bus->event);
3558 bus->event_priority = priority;
3560 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3564 r = sd_event_source_set_priority(bus->time_event_source, priority);
3568 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3572 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3576 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3580 r = bus_attach_io_events(bus);
3584 r = bus_attach_inotify_event(bus);
3591 sd_bus_detach_event(bus);
3595 _public_ int sd_bus_detach_event(sd_bus *bus) {
3596 assert_return(bus, -EINVAL);
3597 assert_return(bus = bus_resolve(bus), -ENOPKG);
3602 bus_detach_io_events(bus);
3603 bus_detach_inotify_event(bus);
3605 if (bus->time_event_source) {
3606 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3607 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3610 if (bus->quit_event_source) {
3611 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3612 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3615 bus->event = sd_event_unref(bus->event);
3619 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3620 assert_return(bus, NULL);
3625 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3626 assert_return(bus, NULL);
3628 return bus->current_message;
3631 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3632 assert_return(bus, NULL);
3634 return bus->current_slot;
3637 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3638 assert_return(bus, NULL);
3640 return bus->current_handler;
3643 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3644 assert_return(bus, NULL);
3646 return bus->current_userdata;
3649 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3654 assert(default_bus);
3657 return !!*default_bus;
3660 *ret = sd_bus_ref(*default_bus);
3668 b->default_bus_ptr = default_bus;
3676 _public_ int sd_bus_default_system(sd_bus **ret) {
3677 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3681 _public_ int sd_bus_default_user(sd_bus **ret) {
3682 #if 0 /// elogind does not support user buses
3683 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3685 return sd_bus_default_system(ret);
3689 _public_ int sd_bus_default(sd_bus **ret) {
3690 int (*bus_open)(sd_bus **) = NULL;
3693 #if 0 /// elogind does not support systemd units
3696 #if 0 /// elogind does not support systemd user instances
3698 busp = bus_choose_default(&bus_open);
3699 return bus_default(bus_open, busp, ret);
3702 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3703 assert_return(b, -EINVAL);
3704 assert_return(tid, -EINVAL);
3705 assert_return(!bus_pid_changed(b), -ECHILD);
3713 return sd_event_get_tid(b->event, tid);
3718 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3719 _cleanup_free_ char *e = NULL;
3722 assert_return(object_path_is_valid(prefix), -EINVAL);
3723 assert_return(external_id, -EINVAL);
3724 assert_return(ret_path, -EINVAL);
3726 e = bus_label_escape(external_id);
3730 ret = strjoin(prefix, "/", e);
3738 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3742 assert_return(object_path_is_valid(path), -EINVAL);
3743 assert_return(object_path_is_valid(prefix), -EINVAL);
3744 assert_return(external_id, -EINVAL);
3746 e = object_path_startswith(path, prefix);
3748 *external_id = NULL;
3752 ret = bus_label_unescape(e);
3760 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3761 _cleanup_strv_free_ char **labels = NULL;
3762 char *path, *path_pos, **label_pos;
3763 const char *sep, *template_pos;
3768 assert_return(out, -EINVAL);
3769 assert_return(path_template, -EINVAL);
3771 path_length = strlen(path_template);
3773 va_start(list, path_template);
3774 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3778 arg = va_arg(list, const char *);
3784 label = bus_label_escape(arg);
3790 r = strv_consume(&labels, label);
3796 /* add label length, but account for the format character */
3797 path_length += strlen(label) - 1;
3801 path = malloc(path_length + 1);
3808 for (template_pos = path_template; *template_pos; ) {
3809 sep = strchrnul(template_pos, '%');
3810 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3814 path_pos = stpcpy(path_pos, *label_pos++);
3815 template_pos = sep + 1;
3823 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3824 _cleanup_strv_free_ char **labels = NULL;
3825 const char *template_pos, *path_pos;
3831 * This decodes an object-path based on a template argument. The
3832 * template consists of a verbatim path, optionally including special
3835 * - Each occurrence of '%' in the template matches an arbitrary
3836 * substring of a label in the given path. At most one such
3837 * directive is allowed per label. For each such directive, the
3838 * caller must provide an output parameter (char **) via va_arg. If
3839 * NULL is passed, the given label is verified, but not returned.
3840 * For each matched label, the *decoded* label is stored in the
3841 * passed output argument, and the caller is responsible to free
3842 * it. Note that the output arguments are only modified if the
3843 * actualy path matched the template. Otherwise, they're left
3846 * This function returns <0 on error, 0 if the path does not match the
3847 * template, 1 if it matched.
3850 assert_return(path, -EINVAL);
3851 assert_return(path_template, -EINVAL);
3855 for (template_pos = path_template; *template_pos; ) {
3860 /* verify everything until the next '%' matches verbatim */
3861 sep = strchrnul(template_pos, '%');
3862 length = sep - template_pos;
3863 if (strncmp(path_pos, template_pos, length))
3867 template_pos += length;
3872 /* We found the next '%' character. Everything up until here
3873 * matched. We now skip ahead to the end of this label and make
3874 * sure it matches the tail of the label in the path. Then we
3875 * decode the string in-between and save it for later use. */
3877 ++template_pos; /* skip over '%' */
3879 sep = strchrnul(template_pos, '/');
3880 length = sep - template_pos; /* length of suffix to match verbatim */
3882 /* verify the suffixes match */
3883 sep = strchrnul(path_pos, '/');
3884 if (sep - path_pos < (ssize_t)length ||
3885 strncmp(sep - length, template_pos, length))
3888 template_pos += length; /* skip over matched label */
3889 length = sep - path_pos - length; /* length of sub-label to decode */
3891 /* store unescaped label for later use */
3892 label = bus_label_unescape_n(path_pos, length);
3896 r = strv_consume(&labels, label);
3900 path_pos = sep; /* skip decoded label and suffix */
3903 /* end of template must match end of path */
3907 /* copy the labels over to the caller */
3908 va_start(list, path_template);
3909 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3912 arg = va_arg(list, char **);
3920 labels = mfree(labels);
3924 _public_ int sd_bus_try_close(sd_bus *bus) {
3925 assert_return(bus, -EINVAL);
3926 assert_return(bus = bus_resolve(bus), -ENOPKG);
3927 assert_return(!bus_pid_changed(bus), -ECHILD);
3932 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3933 assert_return(bus, -EINVAL);
3934 assert_return(bus = bus_resolve(bus), -ENOPKG);
3935 assert_return(description, -EINVAL);
3936 assert_return(bus->description, -ENXIO);
3937 assert_return(!bus_pid_changed(bus), -ECHILD);
3939 *description = bus->description;
3943 int bus_get_root_path(sd_bus *bus) {
3946 if (bus->cgroup_root)
3949 r = cg_get_root_path(&bus->cgroup_root);
3951 bus->cgroup_root = strdup("/");
3952 if (!bus->cgroup_root)
3961 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3962 assert_return(bus, -EINVAL);
3963 assert_return(bus = bus_resolve(bus), -ENOPKG);
3964 assert_return(scope, -EINVAL);
3965 assert_return(!bus_pid_changed(bus), -ECHILD);
3972 if (bus->is_system) {
3980 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3982 assert_return(bus, -EINVAL);
3983 assert_return(bus = bus_resolve(bus), -ENOPKG);
3984 assert_return(address, -EINVAL);
3985 assert_return(!bus_pid_changed(bus), -ECHILD);
3988 *address = bus->address;
3995 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3996 assert_return(bus, -EINVAL);
3997 assert_return(bus = bus_resolve(bus), -ENOPKG);
3998 assert_return(mask, -EINVAL);
3999 assert_return(!bus_pid_changed(bus), -ECHILD);
4001 *mask = bus->creds_mask;
4005 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
4006 assert_return(bus, -EINVAL);
4007 assert_return(bus = bus_resolve(bus), -ENOPKG);
4008 assert_return(!bus_pid_changed(bus), -ECHILD);
4010 return bus->bus_client;
4013 _public_ int sd_bus_is_server(sd_bus *bus) {
4014 assert_return(bus, -EINVAL);
4015 assert_return(bus = bus_resolve(bus), -ENOPKG);
4016 assert_return(!bus_pid_changed(bus), -ECHILD);
4018 return bus->is_server;
4021 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
4022 assert_return(bus, -EINVAL);
4023 assert_return(bus = bus_resolve(bus), -ENOPKG);
4024 assert_return(!bus_pid_changed(bus), -ECHILD);
4026 return bus->anonymous_auth;
4029 _public_ int sd_bus_is_trusted(sd_bus *bus) {
4030 assert_return(bus, -EINVAL);
4031 assert_return(bus = bus_resolve(bus), -ENOPKG);
4032 assert_return(!bus_pid_changed(bus), -ECHILD);
4034 return bus->trusted;
4037 _public_ int sd_bus_is_monitor(sd_bus *bus) {
4038 assert_return(bus, -EINVAL);
4039 assert_return(bus = bus_resolve(bus), -ENOPKG);
4040 assert_return(!bus_pid_changed(bus), -ECHILD);
4042 return bus->is_monitor;
4045 static void flush_close(sd_bus *bus) {
4049 /* Flushes and closes the specified bus. We take a ref before,
4050 * to ensure the flushing does not cause the bus to be
4053 sd_bus_flush_close_unref(sd_bus_ref(bus));
4056 _public_ void sd_bus_default_flush_close(void) {
4057 flush_close(default_starter_bus);
4058 #if 0 /// elogind does not support user buses
4059 flush_close(default_user_bus);
4061 flush_close(default_system_bus);
4064 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
4065 assert_return(bus, -EINVAL);
4066 assert_return(bus = bus_resolve(bus), -ENOPKG);
4068 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4069 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4070 * from the client side. */
4071 bus->exit_on_disconnect = b;
4073 /* If the exit condition was triggered already, exit immediately. */
4074 return bus_exit_now(bus);
4077 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
4078 assert_return(bus, -EINVAL);
4079 assert_return(bus = bus_resolve(bus), -ENOPKG);
4081 return bus->exit_on_disconnect;
4084 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4085 assert_return(bus, -EINVAL);
4086 assert_return(bus = bus_resolve(bus), -ENOPKG);
4087 assert_return(!bus->bus_client, -EPERM);
4088 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4090 return free_and_strdup(&bus->patch_sender, sender);
4093 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4094 assert_return(bus, -EINVAL);
4095 assert_return(bus = bus_resolve(bus), -ENOPKG);
4096 assert_return(ret, -EINVAL);
4098 if (!bus->patch_sender)
4101 *ret = bus->patch_sender;