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/>.
28 //#include <sys/wait.h>
33 #include "alloc-util.h"
34 #include "bus-container.h"
35 #include "bus-control.h"
36 #include "bus-internal.h"
37 #include "bus-kernel.h"
38 #include "bus-label.h"
39 #include "bus-message.h"
40 #include "bus-objects.h"
41 #include "bus-protocol.h"
43 #include "bus-socket.h"
44 #include "bus-track.h"
47 #include "cgroup-util.h"
50 #include "hexdecoct.h"
51 #include "hostname-util.h"
54 #include "parse-util.h"
55 //#include "process-util.h"
56 #include "string-util.h"
60 /// Additional includes needed by elogind
61 #include "process-util.h"
63 #define log_debug_bus_message(m) \
65 sd_bus_message *_mm = (m); \
66 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", \
67 bus_message_type_to_string(_mm->header->type), \
68 strna(sd_bus_message_get_sender(_mm)), \
69 strna(sd_bus_message_get_destination(_mm)), \
70 strna(sd_bus_message_get_path(_mm)), \
71 strna(sd_bus_message_get_interface(_mm)), \
72 strna(sd_bus_message_get_member(_mm)), \
73 BUS_MESSAGE_COOKIE(_mm), \
75 strna(_mm->root_container.signature), \
76 strna(_mm->error.name), \
77 strna(_mm->error.message)); \
80 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
81 static void bus_detach_io_events(sd_bus *b);
82 static void bus_detach_inotify_event(sd_bus *b);
84 static thread_local sd_bus *default_system_bus = NULL;
85 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);
294 free_and_replace(bus->address, a);
299 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
300 assert_return(bus, -EINVAL);
301 assert_return(bus = bus_resolve(bus), -ENOPKG);
302 assert_return(bus->state == BUS_UNSET, -EPERM);
303 assert_return(input_fd >= 0, -EBADF);
304 assert_return(output_fd >= 0, -EBADF);
305 assert_return(!bus_pid_changed(bus), -ECHILD);
307 bus->input_fd = input_fd;
308 bus->output_fd = output_fd;
312 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
315 assert_return(bus, -EINVAL);
316 assert_return(bus = bus_resolve(bus), -ENOPKG);
317 assert_return(bus->state == BUS_UNSET, -EPERM);
318 assert_return(path, -EINVAL);
319 assert_return(!strv_isempty(argv), -EINVAL);
320 assert_return(!bus_pid_changed(bus), -ECHILD);
332 free_and_replace(bus->exec_path, p);
334 strv_free(bus->exec_argv);
340 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
341 assert_return(bus, -EINVAL);
342 assert_return(bus = bus_resolve(bus), -ENOPKG);
343 assert_return(bus->state == BUS_UNSET, -EPERM);
344 assert_return(!bus->patch_sender, -EPERM);
345 assert_return(!bus_pid_changed(bus), -ECHILD);
347 bus->bus_client = !!b;
351 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
352 assert_return(bus, -EINVAL);
353 assert_return(bus = bus_resolve(bus), -ENOPKG);
354 assert_return(bus->state == BUS_UNSET, -EPERM);
355 assert_return(!bus_pid_changed(bus), -ECHILD);
357 bus->is_monitor = !!b;
361 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
362 assert_return(bus, -EINVAL);
363 assert_return(bus = bus_resolve(bus), -ENOPKG);
364 assert_return(bus->state == BUS_UNSET, -EPERM);
365 assert_return(!bus_pid_changed(bus), -ECHILD);
367 bus->accept_fd = !!b;
371 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
372 assert_return(bus, -EINVAL);
373 assert_return(bus = bus_resolve(bus), -ENOPKG);
374 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
375 assert_return(!bus_pid_changed(bus), -ECHILD);
377 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
378 * replies, and maybe one day classic D-Bus learns this too */
379 bus->attach_timestamp = !!b;
384 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
385 assert_return(bus, -EINVAL);
386 assert_return(bus = bus_resolve(bus), -ENOPKG);
387 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
388 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
389 assert_return(!bus_pid_changed(bus), -ECHILD);
391 SET_FLAG(bus->creds_mask, mask, b);
393 /* The well knowns we need unconditionally, so that matches can work */
394 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
399 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
400 assert_return(bus, -EINVAL);
401 assert_return(bus = bus_resolve(bus), -ENOPKG);
402 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
403 assert_return(bus->state == BUS_UNSET, -EPERM);
404 assert_return(!bus_pid_changed(bus), -ECHILD);
406 bus->is_server = !!b;
407 bus->server_id = server_id;
411 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
412 assert_return(bus, -EINVAL);
413 assert_return(bus = bus_resolve(bus), -ENOPKG);
414 assert_return(bus->state == BUS_UNSET, -EPERM);
415 assert_return(!bus_pid_changed(bus), -ECHILD);
417 bus->anonymous_auth = !!b;
421 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
422 assert_return(bus, -EINVAL);
423 assert_return(bus = bus_resolve(bus), -ENOPKG);
424 assert_return(bus->state == BUS_UNSET, -EPERM);
425 assert_return(!bus_pid_changed(bus), -ECHILD);
431 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
432 assert_return(bus, -EINVAL);
433 assert_return(bus = bus_resolve(bus), -ENOPKG);
434 assert_return(bus->state == BUS_UNSET, -EPERM);
435 assert_return(!bus_pid_changed(bus), -ECHILD);
437 return free_and_strdup(&bus->description, description);
440 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
441 assert_return(bus, -EINVAL);
442 assert_return(bus = bus_resolve(bus), -ENOPKG);
443 assert_return(!bus_pid_changed(bus), -ECHILD);
445 bus->allow_interactive_authorization = !!b;
449 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
450 assert_return(bus, -EINVAL);
451 assert_return(bus = bus_resolve(bus), -ENOPKG);
452 assert_return(!bus_pid_changed(bus), -ECHILD);
454 return bus->allow_interactive_authorization;
457 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
458 assert_return(bus, -EINVAL);
459 assert_return(bus = bus_resolve(bus), -ENOPKG);
460 assert_return(bus->state == BUS_UNSET, -EPERM);
461 assert_return(!bus_pid_changed(bus), -ECHILD);
463 bus->watch_bind = !!b;
467 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
468 assert_return(bus, -EINVAL);
469 assert_return(bus = bus_resolve(bus), -ENOPKG);
470 assert_return(!bus_pid_changed(bus), -ECHILD);
472 return bus->watch_bind;
475 _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) {
476 assert_return(bus, -EINVAL);
477 assert_return(bus = bus_resolve(bus), -ENOPKG);
478 assert_return(bus->state == BUS_UNSET, -EPERM);
479 assert_return(!bus_pid_changed(bus), -ECHILD);
481 bus->connected_signal = !!b;
485 _public_ int sd_bus_get_connected_signal(sd_bus *bus) {
486 assert_return(bus, -EINVAL);
487 assert_return(bus = bus_resolve(bus), -ENOPKG);
488 assert_return(!bus_pid_changed(bus), -ECHILD);
490 return bus->connected_signal;
493 static int synthesize_connected_signal(sd_bus *bus) {
494 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
499 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
500 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
501 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
503 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
504 * that works independently from whether we connected to a full bus or just a direct connection. */
506 if (!bus->connected_signal)
509 r = sd_bus_message_new_signal(
512 "/org/freedesktop/DBus/Local",
513 "org.freedesktop.DBus.Local",
518 bus_message_set_sender_local(bus, m);
520 r = bus_seal_synthetic_message(bus, m);
524 r = bus_rqueue_make_room(bus);
528 /* Insert at the very front */
529 memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size);
537 void bus_set_state(sd_bus *bus, enum bus_state state) {
539 static const char * const table[_BUS_STATE_MAX] = {
540 [BUS_UNSET] = "UNSET",
541 [BUS_WATCH_BIND] = "WATCH_BIND",
542 [BUS_OPENING] = "OPENING",
543 [BUS_AUTHENTICATING] = "AUTHENTICATING",
544 [BUS_HELLO] = "HELLO",
545 [BUS_RUNNING] = "RUNNING",
546 [BUS_CLOSING] = "CLOSING",
547 [BUS_CLOSED] = "CLOSED",
551 assert(state < _BUS_STATE_MAX);
553 if (state == bus->state)
556 log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state]);
560 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
569 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
571 r = sd_bus_message_get_errno(reply);
575 r = sd_bus_message_read(reply, "s", &s);
579 if (!service_name_is_valid(s) || s[0] != ':')
586 free_and_replace(bus->unique_name, t);
588 if (bus->state == BUS_HELLO) {
589 bus_set_state(bus, BUS_RUNNING);
591 r = synthesize_connected_signal(bus);
599 static int bus_send_hello(sd_bus *bus) {
600 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
605 if (!bus->bus_client)
608 r = sd_bus_message_new_method_call(
611 "org.freedesktop.DBus",
612 "/org/freedesktop/DBus",
613 "org.freedesktop.DBus",
618 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
621 int bus_start_running(sd_bus *bus) {
622 struct reply_callback *c;
628 assert(bus->state < BUS_HELLO);
630 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
631 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
632 * adding a fixed value to all entries should not alter the internal order. */
634 n = now(CLOCK_MONOTONIC);
635 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
636 if (c->timeout_usec == 0)
639 c->timeout_usec = usec_add(n, c->timeout_usec);
642 if (bus->bus_client) {
643 bus_set_state(bus, BUS_HELLO);
647 bus_set_state(bus, BUS_RUNNING);
649 r = synthesize_connected_signal(bus);
656 static int parse_address_key(const char **p, const char *key, char **value) {
657 size_t l, n = 0, allocated = 0;
658 _cleanup_free_ char *r = NULL;
667 if (strncmp(*p, key, l) != 0)
680 while (!IN_SET(*a, ';', ',', 0)) {
694 c = (char) ((x << 4) | y);
701 if (!GREEDY_REALLOC(r, allocated, n + 2))
719 free_and_replace(*value, r);
724 static void skip_address_key(const char **p) {
728 *p += strcspn(*p, ",");
734 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
735 _cleanup_free_ char *path = NULL, *abstract = NULL;
744 while (!IN_SET(**p, 0, ';')) {
745 r = parse_address_key(p, "guid", guid);
751 r = parse_address_key(p, "path", &path);
757 r = parse_address_key(p, "abstract", &abstract);
766 if (!path && !abstract)
769 if (path && abstract)
774 if (l > sizeof(b->sockaddr.un.sun_path))
777 b->sockaddr.un.sun_family = AF_UNIX;
778 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
779 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
780 } else if (abstract) {
781 l = strlen(abstract);
782 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
785 b->sockaddr.un.sun_family = AF_UNIX;
786 b->sockaddr.un.sun_path[0] = 0;
787 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
788 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
796 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
797 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
799 struct addrinfo *result, hints = {
800 .ai_socktype = SOCK_STREAM,
801 .ai_flags = AI_ADDRCONFIG,
809 while (!IN_SET(**p, 0, ';')) {
810 r = parse_address_key(p, "guid", guid);
816 r = parse_address_key(p, "host", &host);
822 r = parse_address_key(p, "port", &port);
828 r = parse_address_key(p, "family", &family);
841 if (streq(family, "ipv4"))
842 hints.ai_family = AF_INET;
843 else if (streq(family, "ipv6"))
844 hints.ai_family = AF_INET6;
849 r = getaddrinfo(host, port, &hints, &result);
853 return -EADDRNOTAVAIL;
855 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
856 b->sockaddr_size = result->ai_addrlen;
858 freeaddrinfo(result);
865 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
867 unsigned n_argv = 0, j;
869 size_t allocated = 0;
877 while (!IN_SET(**p, 0, ';')) {
878 r = parse_address_key(p, "guid", guid);
884 r = parse_address_key(p, "path", &path);
890 if (startswith(*p, "argv")) {
894 ul = strtoul(*p + 4, (char**) p, 10);
895 if (errno > 0 || **p != '=' || ul > 256) {
903 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
911 r = parse_address_key(p, NULL, argv + ul);
926 /* Make sure there are no holes in the array, with the
927 * exception of argv[0] */
928 for (j = 1; j < n_argv; j++)
934 if (argv && argv[0] == NULL) {
935 argv[0] = strdup(path);
950 for (j = 0; j < n_argv; j++)
958 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
959 _cleanup_free_ char *machine = NULL, *pid = NULL;
967 while (!IN_SET(**p, 0, ';')) {
968 r = parse_address_key(p, "guid", guid);
974 r = parse_address_key(p, "machine", &machine);
980 r = parse_address_key(p, "pid", &pid);
989 if (!machine == !pid)
993 if (!machine_name_is_valid(machine))
996 free_and_replace(b->machine, machine);
998 b->machine = mfree(b->machine);
1002 r = parse_pid(pid, &b->nspid);
1008 b->sockaddr.un.sun_family = AF_UNIX;
1009 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
1010 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
1011 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
1012 b->is_local = false;
1017 static void bus_reset_parsed_address(sd_bus *b) {
1021 b->sockaddr_size = 0;
1022 b->exec_argv = strv_free(b->exec_argv);
1023 b->exec_path = mfree(b->exec_path);
1024 b->server_id = SD_ID128_NULL;
1025 b->machine = mfree(b->machine);
1029 static int bus_parse_next_address(sd_bus *b) {
1030 _cleanup_free_ char *guid = NULL;
1038 if (b->address[b->address_index] == 0)
1041 bus_reset_parsed_address(b);
1043 a = b->address + b->address_index;
1052 if (startswith(a, "unix:")) {
1055 r = parse_unix_address(b, &a, &guid);
1060 } else if (startswith(a, "tcp:")) {
1063 r = parse_tcp_address(b, &a, &guid);
1069 } else if (startswith(a, "unixexec:")) {
1072 r = parse_exec_address(b, &a, &guid);
1078 } else if (startswith(a, "x-machine-unix:")) {
1081 r = parse_container_unix_address(b, &a, &guid);
1094 r = sd_id128_from_string(guid, &b->server_id);
1099 b->address_index = a - b->address;
1103 static void bus_kill_exec(sd_bus *bus) {
1104 if (pid_is_valid(bus->busexec_pid) > 0) {
1105 sigterm_wait(bus->busexec_pid);
1106 bus->busexec_pid = 0;
1110 static int bus_start_address(sd_bus *b) {
1116 bus_close_io_fds(b);
1117 bus_close_inotify_fd(b);
1121 /* If you provide multiple different bus-addresses, we
1122 * try all of them in order and use the first one that
1126 r = bus_socket_exec(b);
1127 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1128 r = bus_container_connect_socket(b);
1129 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1130 r = bus_socket_connect(b);
1137 q = bus_attach_io_events(b);
1141 q = bus_attach_inotify_event(b);
1148 b->last_connect_error = -r;
1151 r = bus_parse_next_address(b);
1155 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1159 int bus_next_address(sd_bus *b) {
1162 bus_reset_parsed_address(b);
1163 return bus_start_address(b);
1166 static int bus_start_fd(sd_bus *b) {
1171 assert(b->input_fd >= 0);
1172 assert(b->output_fd >= 0);
1174 r = fd_nonblock(b->input_fd, true);
1178 r = fd_cloexec(b->input_fd, true);
1182 if (b->input_fd != b->output_fd) {
1183 r = fd_nonblock(b->output_fd, true);
1187 r = fd_cloexec(b->output_fd, true);
1192 if (fstat(b->input_fd, &st) < 0)
1195 return bus_socket_take_fd(b);
1198 _public_ int sd_bus_start(sd_bus *bus) {
1201 assert_return(bus, -EINVAL);
1202 assert_return(bus = bus_resolve(bus), -ENOPKG);
1203 assert_return(bus->state == BUS_UNSET, -EPERM);
1204 assert_return(!bus_pid_changed(bus), -ECHILD);
1206 bus_set_state(bus, BUS_OPENING);
1208 if (bus->is_server && bus->bus_client)
1211 if (bus->input_fd >= 0)
1212 r = bus_start_fd(bus);
1213 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1214 r = bus_start_address(bus);
1223 return bus_send_hello(bus);
1226 _public_ int sd_bus_open(sd_bus **ret) {
1231 assert_return(ret, -EINVAL);
1233 /* Let's connect to the starter bus if it is set, and
1234 * otherwise to the bus that is appropropriate for the scope
1235 * we are running in */
1237 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1239 if (streq(e, "system"))
1240 return sd_bus_open_system(ret);
1241 #if 0 /// elogind does not support systemd user instances
1242 else if (STR_IN_SET(e, "session", "user"))
1243 return sd_bus_open_user(ret);
1247 e = secure_getenv("DBUS_STARTER_ADDRESS");
1249 #if 0 /// elogind does not support systemd user instances
1250 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1251 return sd_bus_open_user(ret);
1254 return sd_bus_open_system(ret);
1261 r = sd_bus_set_address(b, e);
1265 b->bus_client = true;
1267 /* We don't know whether the bus is trusted or not, so better
1268 * be safe, and authenticate everything */
1270 b->is_local = false;
1271 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1273 r = sd_bus_start(b);
1285 int bus_set_address_system(sd_bus *b) {
1289 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1291 return sd_bus_set_address(b, e);
1293 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1296 _public_ int sd_bus_open_system(sd_bus **ret) {
1300 assert_return(ret, -EINVAL);
1306 r = bus_set_address_system(b);
1310 b->bus_client = true;
1311 b->is_system = true;
1313 /* Let's do per-method access control on the system bus. We
1314 * need the caller's UID and capability set for that. */
1316 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1319 r = sd_bus_start(b);
1331 #if 0 /// elogind can not open/use a user bus
1332 int bus_set_address_user(sd_bus *b) {
1334 _cleanup_free_ char *ee = NULL, *s = NULL;
1338 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1340 return sd_bus_set_address(b, e);
1342 e = secure_getenv("XDG_RUNTIME_DIR");
1346 ee = bus_address_escape(e);
1350 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1353 b->address = TAKE_PTR(s);
1359 _public_ int sd_bus_open_user(sd_bus **ret) {
1360 #if 0 /// elogind does not support user buses
1364 assert_return(ret, -EINVAL);
1370 r = bus_set_address_user(b);
1374 b->bus_client = true;
1377 /* We don't do any per-method access control on the user
1382 r = sd_bus_start(b);
1393 return sd_bus_open_system(ret);
1397 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1398 _cleanup_free_ char *e = NULL;
1399 char *m = NULL, *c = NULL, *a;
1404 /* Let's see if we shall enter some container */
1405 m = strchr(host, ':');
1409 /* Let's make sure this is not a port of some kind,
1410 * and is a valid machine name. */
1411 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1414 /* Cut out the host part */
1415 t = strndupa(host, m - host - 1);
1416 e = bus_address_escape(t);
1420 c = strjoina(",argv5=--machine=", m);
1425 e = bus_address_escape(host);
1430 a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=elogind-stdio-bridge", c);
1434 free_and_replace(b->address, a);
1439 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1443 assert_return(host, -EINVAL);
1444 assert_return(ret, -EINVAL);
1446 r = sd_bus_new(&bus);
1450 r = bus_set_address_system_remote(bus, host);
1454 bus->bus_client = true;
1455 bus->trusted = false;
1456 bus->is_system = true;
1457 bus->is_local = false;
1459 r = sd_bus_start(bus);
1471 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1472 _cleanup_free_ char *e = NULL;
1478 e = bus_address_escape(machine);
1482 a = strjoin("x-machine-unix:machine=", e);
1486 free_and_replace(b->address, a);
1491 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1495 assert_return(machine, -EINVAL);
1496 assert_return(ret, -EINVAL);
1497 assert_return(machine_name_is_valid(machine), -EINVAL);
1499 r = sd_bus_new(&bus);
1503 r = bus_set_address_system_machine(bus, machine);
1507 bus->bus_client = true;
1508 bus->trusted = false;
1509 bus->is_system = true;
1510 bus->is_local = false;
1512 r = sd_bus_start(bus);
1524 _public_ void sd_bus_close(sd_bus *bus) {
1528 if (bus->state == BUS_CLOSED)
1530 if (bus_pid_changed(bus))
1533 /* Don't leave ssh hanging around */
1536 bus_set_state(bus, BUS_CLOSED);
1538 sd_bus_detach_event(bus);
1540 /* Drop all queued messages so that they drop references to
1541 * the bus object and the bus may be freed */
1542 bus_reset_queues(bus);
1544 bus_close_io_fds(bus);
1545 bus_close_inotify_fd(bus);
1548 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1553 /* Have to do this before flush() to prevent hang */
1559 return sd_bus_unref(bus);
1562 void bus_enter_closing(sd_bus *bus) {
1565 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1568 bus_set_state(bus, BUS_CLOSING);
1571 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1576 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1581 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1587 i = REFCNT_DEC(bus->n_ref);
1595 _public_ int sd_bus_is_open(sd_bus *bus) {
1597 assert_return(bus, -EINVAL);
1598 assert_return(bus = bus_resolve(bus), -ENOPKG);
1599 assert_return(!bus_pid_changed(bus), -ECHILD);
1601 return BUS_IS_OPEN(bus->state);
1604 _public_ int sd_bus_is_ready(sd_bus *bus) {
1605 assert_return(bus, -EINVAL);
1606 assert_return(bus = bus_resolve(bus), -ENOPKG);
1607 assert_return(!bus_pid_changed(bus), -ECHILD);
1609 return bus->state == BUS_RUNNING;
1612 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1615 assert_return(bus, -EINVAL);
1616 assert_return(bus = bus_resolve(bus), -ENOPKG);
1617 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1618 assert_return(!bus_pid_changed(bus), -ECHILD);
1620 if (bus->is_monitor)
1623 if (type == SD_BUS_TYPE_UNIX_FD) {
1624 if (!bus->accept_fd)
1627 r = bus_ensure_running(bus);
1631 return bus->can_fds;
1634 return bus_type_is_valid(type);
1637 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1640 assert_return(bus, -EINVAL);
1641 assert_return(bus = bus_resolve(bus), -ENOPKG);
1642 assert_return(id, -EINVAL);
1643 assert_return(!bus_pid_changed(bus), -ECHILD);
1645 r = bus_ensure_running(bus);
1649 *id = bus->server_id;
1653 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1660 /* If we copy the same message to multiple
1661 * destinations, avoid using the same cookie
1663 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1668 timeout = BUS_DEFAULT_TIMEOUT;
1670 if (!m->sender && b->patch_sender) {
1671 r = sd_bus_message_set_sender(m, b->patch_sender);
1676 return sd_bus_message_seal(m, ++b->cookie, timeout);
1679 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1680 bool remarshal = false;
1684 /* wrong packet version */
1685 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1688 /* wrong packet endianness */
1689 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1692 return remarshal ? bus_message_remarshal(b, m) : 0;
1695 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1699 /* Fake some timestamps, if they were requested, and not
1700 * already initialized */
1701 if (b->attach_timestamp) {
1702 if (m->realtime <= 0)
1703 m->realtime = now(CLOCK_REALTIME);
1705 if (m->monotonic <= 0)
1706 m->monotonic = now(CLOCK_MONOTONIC);
1709 /* The bus specification says the serial number cannot be 0,
1710 * hence let's fill something in for synthetic messages. Since
1711 * synthetic messages might have a fake sender and we don't
1712 * want to interfere with the real sender's serial numbers we
1713 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1714 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1715 * even though kdbus can do 64bit. */
1716 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1719 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1725 r = bus_socket_write_message(bus, m, idx);
1729 if (*idx >= BUS_MESSAGE_SIZE(m))
1730 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",
1731 bus_message_type_to_string(m->header->type),
1732 strna(sd_bus_message_get_sender(m)),
1733 strna(sd_bus_message_get_destination(m)),
1734 strna(sd_bus_message_get_path(m)),
1735 strna(sd_bus_message_get_interface(m)),
1736 strna(sd_bus_message_get_member(m)),
1737 BUS_MESSAGE_COOKIE(m),
1739 strna(m->root_container.signature),
1740 strna(m->error.name),
1741 strna(m->error.message));
1746 static int dispatch_wqueue(sd_bus *bus) {
1750 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1752 while (bus->wqueue_size > 0) {
1754 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1758 /* Didn't do anything this time */
1760 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1761 /* Fully written. Let's drop the entry from
1764 * This isn't particularly optimized, but
1765 * well, this is supposed to be our worst-case
1766 * buffer only, and the socket buffer is
1767 * supposed to be our primary buffer, and if
1768 * it got full, then all bets are off
1772 sd_bus_message_unref(bus->wqueue[0]);
1773 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1783 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1786 return bus_socket_read_message(bus);
1789 int bus_rqueue_make_room(sd_bus *bus) {
1792 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1795 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1801 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1806 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1808 /* Note that the priority logic is only available on kdbus,
1809 * where the rqueue is unused. We check the rqueue here
1810 * anyway, because it's simple... */
1813 if (bus->rqueue_size > 0) {
1814 /* Dispatch a queued message */
1816 *m = bus->rqueue[0];
1818 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1822 /* Try to read a new message */
1823 r = bus_read_message(bus, hint_priority, priority);
1833 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1834 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1837 assert_return(m, -EINVAL);
1842 assert_return(!bus_pid_changed(bus), -ECHILD);
1844 if (!BUS_IS_OPEN(bus->state))
1848 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1855 /* If the cookie number isn't kept, then we know that no reply
1857 if (!cookie && !m->sealed)
1858 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1860 r = bus_seal_message(bus, m, 0);
1864 /* Remarshall if we have to. This will possibly unref the
1865 * message and place a replacement in m */
1866 r = bus_remarshal_message(bus, &m);
1870 /* If this is a reply and no reply was requested, then let's
1871 * suppress this, if we can */
1875 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1878 r = bus_write_message(bus, m, &idx);
1880 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1881 bus_enter_closing(bus);
1888 if (idx < BUS_MESSAGE_SIZE(m)) {
1889 /* Wasn't fully written. So let's remember how
1890 * much was written. Note that the first entry
1891 * of the wqueue array is always allocated so
1892 * that we always can remember how much was
1894 bus->wqueue[0] = sd_bus_message_ref(m);
1895 bus->wqueue_size = 1;
1900 /* Just append it to the queue. */
1902 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1905 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1908 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1913 *cookie = BUS_MESSAGE_COOKIE(m);
1918 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1921 assert_return(m, -EINVAL);
1926 assert_return(!bus_pid_changed(bus), -ECHILD);
1928 if (!BUS_IS_OPEN(bus->state))
1931 if (!streq_ptr(m->destination, destination)) {
1936 r = sd_bus_message_set_destination(m, destination);
1941 return sd_bus_send(bus, m, cookie);
1944 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1947 if (usec == (uint64_t) -1)
1950 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1951 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1952 * relative timestamp, and afterwards the absolute one. */
1954 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1957 return now(CLOCK_MONOTONIC) + usec;
1960 static int timeout_compare(const void *a, const void *b) {
1961 const struct reply_callback *x = a, *y = b;
1963 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1966 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1969 if (x->timeout_usec < y->timeout_usec)
1972 if (x->timeout_usec > y->timeout_usec)
1978 _public_ int sd_bus_call_async(
1982 sd_bus_message_handler_t callback,
1986 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1987 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1990 assert_return(m, -EINVAL);
1991 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1992 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
1997 assert_return(!bus_pid_changed(bus), -ECHILD);
1999 if (!BUS_IS_OPEN(bus->state))
2002 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
2003 if (!callback && !slot && !m->sealed)
2004 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
2006 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
2010 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
2014 r = bus_seal_message(bus, m, usec);
2018 r = bus_remarshal_message(bus, &m);
2022 if (slot || callback) {
2023 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
2027 s->reply_callback.callback = callback;
2029 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
2030 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
2032 s->reply_callback.cookie = 0;
2036 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
2037 if (s->reply_callback.timeout_usec != 0) {
2038 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
2040 s->reply_callback.timeout_usec = 0;
2046 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
2057 int bus_ensure_running(sd_bus *bus) {
2062 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
2064 if (bus->state == BUS_RUNNING)
2068 r = sd_bus_process(bus, NULL);
2071 if (bus->state == BUS_RUNNING)
2076 r = sd_bus_wait(bus, (uint64_t) -1);
2082 _public_ int sd_bus_call(
2086 sd_bus_error *error,
2087 sd_bus_message **reply) {
2089 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2095 bus_assert_return(m, -EINVAL, error);
2096 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2097 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2098 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2103 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2105 if (!BUS_IS_OPEN(bus->state)) {
2110 r = bus_ensure_running(bus);
2114 i = bus->rqueue_size;
2116 r = bus_seal_message(bus, m, usec);
2120 r = bus_remarshal_message(bus, &m);
2124 r = sd_bus_send(bus, m, &cookie);
2128 timeout = calc_elapse(bus, m->timeout);
2133 while (i < bus->rqueue_size) {
2134 sd_bus_message *incoming = NULL;
2136 incoming = bus->rqueue[i];
2138 if (incoming->reply_cookie == cookie) {
2139 /* Found a match! */
2141 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2143 log_debug_bus_message(incoming);
2145 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2147 if (incoming->n_fds <= 0 || bus->accept_fd) {
2151 sd_bus_message_unref(incoming);
2156 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2157 sd_bus_message_unref(incoming);
2160 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2161 r = sd_bus_error_copy(error, &incoming->error);
2162 sd_bus_message_unref(incoming);
2169 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2172 streq(bus->unique_name, incoming->sender)) {
2174 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2177 /* Our own message? Somebody is trying
2178 * to send its own client a message,
2179 * let's not dead-lock, let's fail
2182 sd_bus_message_unref(incoming);
2187 /* Try to read more, right-away */
2191 r = bus_read_message(bus, false, 0);
2193 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2194 bus_enter_closing(bus);
2206 n = now(CLOCK_MONOTONIC);
2214 left = (uint64_t) -1;
2216 r = bus_poll(bus, true, left);
2224 r = dispatch_wqueue(bus);
2226 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2227 bus_enter_closing(bus);
2236 return sd_bus_error_set_errno(error, r);
2239 _public_ int sd_bus_get_fd(sd_bus *bus) {
2241 assert_return(bus, -EINVAL);
2242 assert_return(bus = bus_resolve(bus), -ENOPKG);
2243 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2244 assert_return(!bus_pid_changed(bus), -ECHILD);
2246 if (bus->state == BUS_CLOSED)
2249 if (bus->inotify_fd >= 0)
2250 return bus->inotify_fd;
2252 if (bus->input_fd >= 0)
2253 return bus->input_fd;
2258 _public_ int sd_bus_get_events(sd_bus *bus) {
2261 assert_return(bus, -EINVAL);
2262 assert_return(bus = bus_resolve(bus), -ENOPKG);
2263 assert_return(!bus_pid_changed(bus), -ECHILD);
2265 switch (bus->state) {
2271 case BUS_WATCH_BIND:
2279 case BUS_AUTHENTICATING:
2280 if (bus_socket_auth_needs_write(bus))
2288 if (bus->rqueue_size <= 0)
2290 if (bus->wqueue_size > 0)
2298 assert_not_reached("Unknown state");
2304 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2305 struct reply_callback *c;
2307 assert_return(bus, -EINVAL);
2308 assert_return(bus = bus_resolve(bus), -ENOPKG);
2309 assert_return(timeout_usec, -EINVAL);
2310 assert_return(!bus_pid_changed(bus), -ECHILD);
2312 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2315 if (bus->track_queue) {
2320 switch (bus->state) {
2322 case BUS_AUTHENTICATING:
2323 *timeout_usec = bus->auth_timeout;
2328 if (bus->rqueue_size > 0) {
2333 c = prioq_peek(bus->reply_callbacks_prioq);
2335 *timeout_usec = (uint64_t) -1;
2339 if (c->timeout_usec == 0) {
2340 *timeout_usec = (uint64_t) -1;
2344 *timeout_usec = c->timeout_usec;
2351 case BUS_WATCH_BIND:
2353 *timeout_usec = (uint64_t) -1;
2357 assert_not_reached("Unknown or unexpected stat");
2361 static int process_timeout(sd_bus *bus) {
2362 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2363 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2364 struct reply_callback *c;
2371 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2373 c = prioq_peek(bus->reply_callbacks_prioq);
2377 n = now(CLOCK_MONOTONIC);
2378 if (c->timeout_usec > n)
2381 r = bus_message_new_synthetic_error(
2384 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2389 r = bus_seal_synthetic_message(bus, m);
2393 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2394 c->timeout_usec = 0;
2396 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2399 slot = container_of(c, sd_bus_slot, reply_callback);
2401 bus->iteration_counter++;
2403 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2405 bus->current_message = m;
2406 bus->current_slot = sd_bus_slot_ref(slot);
2407 bus->current_handler = c->callback;
2408 bus->current_userdata = slot->userdata;
2409 r = c->callback(m, slot->userdata, &error_buffer);
2410 bus->current_userdata = NULL;
2411 bus->current_handler = NULL;
2412 bus->current_slot = NULL;
2413 bus->current_message = NULL;
2415 if (slot->floating) {
2416 bus_slot_disconnect(slot);
2417 sd_bus_slot_unref(slot);
2420 sd_bus_slot_unref(slot);
2422 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2423 * and ignore the callback handler's return value. */
2427 return bus_maybe_reply_error(m, r, &error_buffer);
2430 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2434 if (bus->state != BUS_HELLO)
2437 /* Let's make sure the first message on the bus is the HELLO
2438 * reply. But note that we don't actually parse the message
2439 * here (we leave that to the usual handling), we just verify
2440 * we don't let any earlier msg through. */
2442 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2445 if (m->reply_cookie != 1)
2451 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2452 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2453 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2454 struct reply_callback *c;
2462 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2465 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2468 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2474 slot = container_of(c, sd_bus_slot, reply_callback);
2476 if (m->n_fds > 0 && !bus->accept_fd) {
2478 /* If the reply contained a file descriptor which we
2479 * didn't want we pass an error instead. */
2481 r = bus_message_new_synthetic_error(
2484 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2489 /* Copy over original timestamp */
2490 synthetic_reply->realtime = m->realtime;
2491 synthetic_reply->monotonic = m->monotonic;
2492 synthetic_reply->seqnum = m->seqnum;
2494 r = bus_seal_synthetic_message(bus, synthetic_reply);
2498 m = synthetic_reply;
2500 r = sd_bus_message_rewind(m, true);
2505 if (c->timeout_usec != 0) {
2506 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2507 c->timeout_usec = 0;
2510 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2512 bus->current_slot = sd_bus_slot_ref(slot);
2513 bus->current_handler = c->callback;
2514 bus->current_userdata = slot->userdata;
2515 r = c->callback(m, slot->userdata, &error_buffer);
2516 bus->current_userdata = NULL;
2517 bus->current_handler = NULL;
2518 bus->current_slot = NULL;
2520 if (slot->floating) {
2521 bus_slot_disconnect(slot);
2522 sd_bus_slot_unref(slot);
2525 sd_bus_slot_unref(slot);
2527 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2528 * ignore the callback handler's return value. */
2532 return bus_maybe_reply_error(m, r, &error_buffer);
2535 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2536 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2537 struct filter_callback *l;
2544 bus->filter_callbacks_modified = false;
2546 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2549 if (bus->filter_callbacks_modified)
2552 /* Don't run this more than once per iteration */
2553 if (l->last_iteration == bus->iteration_counter)
2556 l->last_iteration = bus->iteration_counter;
2558 r = sd_bus_message_rewind(m, true);
2562 slot = container_of(l, sd_bus_slot, filter_callback);
2564 bus->current_slot = sd_bus_slot_ref(slot);
2565 bus->current_handler = l->callback;
2566 bus->current_userdata = slot->userdata;
2567 r = l->callback(m, slot->userdata, &error_buffer);
2568 bus->current_userdata = NULL;
2569 bus->current_handler = NULL;
2570 bus->current_slot = sd_bus_slot_unref(slot);
2572 r = bus_maybe_reply_error(m, r, &error_buffer);
2578 } while (bus->filter_callbacks_modified);
2583 static int process_match(sd_bus *bus, sd_bus_message *m) {
2590 bus->match_callbacks_modified = false;
2592 r = bus_match_run(bus, &bus->match_callbacks, m);
2596 } while (bus->match_callbacks_modified);
2601 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2602 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2608 if (bus->is_monitor)
2611 if (bus->manual_peer_interface)
2614 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2617 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2620 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2623 if (streq_ptr(m->member, "Ping"))
2624 r = sd_bus_message_new_method_return(m, &reply);
2625 else if (streq_ptr(m->member, "GetMachineId")) {
2629 r = sd_id128_get_machine(&id);
2633 r = sd_bus_message_new_method_return(m, &reply);
2637 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2639 r = sd_bus_message_new_method_errorf(
2641 SD_BUS_ERROR_UNKNOWN_METHOD,
2642 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2648 r = sd_bus_send(bus, reply, NULL);
2655 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2659 /* If we got a message with a file descriptor which we didn't
2660 * want to accept, then let's drop it. How can this even
2661 * happen? For example, when the kernel queues a message into
2662 * an activatable names's queue which allows fds, and then is
2663 * delivered to us later even though we ourselves did not
2666 if (bus->is_monitor)
2675 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2676 return 1; /* just eat it up */
2678 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2681 static int process_message(sd_bus *bus, sd_bus_message *m) {
2687 bus->current_message = m;
2688 bus->iteration_counter++;
2690 log_debug_bus_message(m);
2692 r = process_hello(bus, m);
2696 r = process_reply(bus, m);
2700 r = process_fd_check(bus, m);
2704 r = process_filter(bus, m);
2708 r = process_match(bus, m);
2712 r = process_builtin(bus, m);
2716 r = bus_process_object(bus, m);
2719 bus->current_message = NULL;
2723 static int dispatch_track(sd_bus *bus) {
2726 if (!bus->track_queue)
2729 bus_track_dispatch(bus->track_queue);
2733 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2734 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2738 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2740 r = process_timeout(bus);
2744 r = dispatch_wqueue(bus);
2748 r = dispatch_track(bus);
2752 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2758 r = process_message(bus, m);
2763 r = sd_bus_message_rewind(m, true);
2772 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2774 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2775 strna(sd_bus_message_get_sender(m)),
2776 strna(sd_bus_message_get_path(m)),
2777 strna(sd_bus_message_get_interface(m)),
2778 strna(sd_bus_message_get_member(m)));
2780 r = sd_bus_reply_method_errorf(
2782 SD_BUS_ERROR_UNKNOWN_OBJECT,
2783 "Unknown object '%s'.", m->path);
2797 static int bus_exit_now(sd_bus *bus) {
2800 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2801 * sd_event_exit(), otherwise invokes libc exit(). */
2803 if (bus->exited) /* did we already exit? */
2805 if (!bus->exit_triggered) /* was the exit condition triggered? */
2807 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2810 bus->exited = true; /* never exit more than once */
2812 log_debug("Bus connection disconnected, exiting.");
2815 return sd_event_exit(bus->event, EXIT_FAILURE);
2819 assert_not_reached("exit() didn't exit?");
2822 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2823 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2824 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2831 r = bus_message_new_synthetic_error(
2834 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2839 r = bus_seal_synthetic_message(bus, m);
2843 if (c->timeout_usec != 0) {
2844 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2845 c->timeout_usec = 0;
2848 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2851 slot = container_of(c, sd_bus_slot, reply_callback);
2853 bus->iteration_counter++;
2855 bus->current_message = m;
2856 bus->current_slot = sd_bus_slot_ref(slot);
2857 bus->current_handler = c->callback;
2858 bus->current_userdata = slot->userdata;
2859 r = c->callback(m, slot->userdata, &error_buffer);
2860 bus->current_userdata = NULL;
2861 bus->current_handler = NULL;
2862 bus->current_slot = NULL;
2863 bus->current_message = NULL;
2865 if (slot->floating) {
2866 bus_slot_disconnect(slot);
2867 sd_bus_slot_unref(slot);
2870 sd_bus_slot_unref(slot);
2872 return bus_maybe_reply_error(m, r, &error_buffer);
2875 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2876 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2877 struct reply_callback *c;
2881 assert(bus->state == BUS_CLOSING);
2883 /* First, fail all outstanding method calls */
2884 c = ordered_hashmap_first(bus->reply_callbacks);
2886 return process_closing_reply_callback(bus, c);
2888 /* Then, fake-drop all remaining bus tracking references */
2890 bus_track_close(bus->tracks);
2894 /* Then, synthesize a Disconnected message */
2895 r = sd_bus_message_new_signal(
2898 "/org/freedesktop/DBus/Local",
2899 "org.freedesktop.DBus.Local",
2904 bus_message_set_sender_local(bus, m);
2906 r = bus_seal_synthetic_message(bus, m);
2912 bus->current_message = m;
2913 bus->iteration_counter++;
2915 r = process_filter(bus, m);
2919 r = process_match(bus, m);
2923 /* Nothing else to do, exit now, if the condition holds */
2924 bus->exit_triggered = true;
2925 (void) bus_exit_now(bus);
2935 bus->current_message = NULL;
2940 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2941 BUS_DONT_DESTROY(bus);
2944 /* Returns 0 when we didn't do anything. This should cause the
2945 * caller to invoke sd_bus_wait() before returning the next
2946 * time. Returns > 0 when we did something, which possibly
2947 * means *ret is filled in with an unprocessed message. */
2949 assert_return(bus, -EINVAL);
2950 assert_return(bus = bus_resolve(bus), -ENOPKG);
2951 assert_return(!bus_pid_changed(bus), -ECHILD);
2953 /* We don't allow recursively invoking sd_bus_process(). */
2954 assert_return(!bus->current_message, -EBUSY);
2955 assert(!bus->current_slot);
2957 switch (bus->state) {
2965 case BUS_WATCH_BIND:
2966 r = bus_socket_process_watch_bind(bus);
2970 r = bus_socket_process_opening(bus);
2973 case BUS_AUTHENTICATING:
2974 r = bus_socket_process_authenticating(bus);
2979 r = process_running(bus, hint_priority, priority, ret);
2983 /* This branch initializes *ret, hence we don't use the generic error checking below */
2987 return process_closing(bus, ret);
2990 assert_not_reached("Unknown state");
2993 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2994 bus_enter_closing(bus);
3005 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
3006 return bus_process_internal(bus, false, 0, ret);
3009 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
3010 return bus_process_internal(bus, true, priority, ret);
3013 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
3014 struct pollfd p[2] = {};
3017 usec_t m = USEC_INFINITY;
3021 if (bus->state == BUS_CLOSING)
3024 if (!BUS_IS_OPEN(bus->state))
3027 if (bus->state == BUS_WATCH_BIND) {
3028 assert(bus->inotify_fd >= 0);
3030 p[0].events = POLLIN;
3031 p[0].fd = bus->inotify_fd;
3036 e = sd_bus_get_events(bus);
3041 /* The caller really needs some more data, he doesn't
3042 * care about what's already read, or any timeouts
3043 * except its own. */
3047 /* The caller wants to process if there's something to
3048 * process, but doesn't care otherwise */
3050 r = sd_bus_get_timeout(bus, &until);
3054 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
3057 p[0].fd = bus->input_fd;
3058 if (bus->output_fd == bus->input_fd) {
3062 p[0].events = e & POLLIN;
3063 p[1].fd = bus->output_fd;
3064 p[1].events = e & POLLOUT;
3069 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
3072 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
3076 return r > 0 ? 1 : 0;
3079 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
3081 assert_return(bus, -EINVAL);
3082 assert_return(bus = bus_resolve(bus), -ENOPKG);
3083 assert_return(!bus_pid_changed(bus), -ECHILD);
3085 if (bus->state == BUS_CLOSING)
3088 if (!BUS_IS_OPEN(bus->state))
3091 if (bus->rqueue_size > 0)
3094 return bus_poll(bus, false, timeout_usec);
3097 _public_ int sd_bus_flush(sd_bus *bus) {
3100 assert_return(bus, -EINVAL);
3101 assert_return(bus = bus_resolve(bus), -ENOPKG);
3102 assert_return(!bus_pid_changed(bus), -ECHILD);
3104 if (bus->state == BUS_CLOSING)
3107 if (!BUS_IS_OPEN(bus->state))
3110 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3111 if (bus->state == BUS_WATCH_BIND)
3114 r = bus_ensure_running(bus);
3118 if (bus->wqueue_size <= 0)
3122 r = dispatch_wqueue(bus);
3124 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3125 bus_enter_closing(bus);
3132 if (bus->wqueue_size <= 0)
3135 r = bus_poll(bus, false, (uint64_t) -1);
3141 _public_ int sd_bus_add_filter(
3144 sd_bus_message_handler_t callback,
3149 assert_return(bus, -EINVAL);
3150 assert_return(bus = bus_resolve(bus), -ENOPKG);
3151 assert_return(callback, -EINVAL);
3152 assert_return(!bus_pid_changed(bus), -ECHILD);
3154 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3158 s->filter_callback.callback = callback;
3160 bus->filter_callbacks_modified = true;
3161 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3169 static int add_match_callback(
3172 sd_bus_error *ret_error) {
3174 sd_bus_slot *match_slot = userdata;
3175 bool failed = false;
3181 sd_bus_slot_ref(match_slot);
3183 if (sd_bus_message_is_method_error(m, NULL)) {
3184 log_debug_errno(sd_bus_message_get_errno(m),
3185 "Unable to add match %s, failing connection: %s",
3186 match_slot->match_callback.match_string,
3187 sd_bus_message_get_error(m)->message);
3191 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3193 if (match_slot->match_callback.install_callback) {
3196 bus = sd_bus_message_get_bus(m);
3198 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3199 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3202 assert(bus->current_slot == match_slot->match_callback.install_slot);
3203 assert(bus->current_handler == add_match_callback);
3204 assert(bus->current_userdata == userdata);
3206 bus->current_slot = match_slot;
3207 bus->current_handler = match_slot->match_callback.install_callback;
3208 bus->current_userdata = match_slot->userdata;
3210 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3212 bus->current_slot = match_slot->match_callback.install_slot;
3213 bus->current_handler = add_match_callback;
3214 bus->current_userdata = userdata;
3216 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3218 if (failed) /* Generic failure handling: destroy the connection */
3219 bus_enter_closing(sd_bus_message_get_bus(m));
3224 if (failed && match_slot->floating) {
3225 bus_slot_disconnect(match_slot);
3226 sd_bus_slot_unref(match_slot);
3229 sd_bus_slot_unref(match_slot);
3234 static int bus_add_match_full(
3239 sd_bus_message_handler_t callback,
3240 sd_bus_message_handler_t install_callback,
3243 struct bus_match_component *components = NULL;
3244 unsigned n_components = 0;
3245 sd_bus_slot *s = NULL;
3248 assert_return(bus, -EINVAL);
3249 assert_return(bus = bus_resolve(bus), -ENOPKG);
3250 assert_return(match, -EINVAL);
3251 assert_return(!bus_pid_changed(bus), -ECHILD);
3253 r = bus_match_parse(match, &components, &n_components);
3257 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3263 s->match_callback.callback = callback;
3264 s->match_callback.install_callback = install_callback;
3266 if (bus->bus_client) {
3267 enum bus_match_scope scope;
3269 scope = bus_match_get_scope(components, n_components);
3271 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3272 if (scope != BUS_MATCH_LOCAL) {
3274 /* We store the original match string, so that we can use it to remove the match again. */
3276 s->match_callback.match_string = strdup(match);
3277 if (!s->match_callback.match_string) {
3283 r = bus_add_match_internal_async(bus,
3284 &s->match_callback.install_slot,
3285 s->match_callback.match_string,
3289 r = bus_add_match_internal(bus, s->match_callback.match_string);
3293 s->match_added = true;
3297 bus->match_callbacks_modified = true;
3298 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3307 bus_match_parse_free(components, n_components);
3308 sd_bus_slot_unref(s);
3313 #if 0 /// UNNEEDED by elogind
3315 _public_ int sd_bus_add_match(
3319 sd_bus_message_handler_t callback,
3322 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3325 _public_ int sd_bus_add_match_async(
3329 sd_bus_message_handler_t callback,
3330 sd_bus_message_handler_t install_callback,
3333 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3336 bool bus_pid_changed(sd_bus *bus) {
3339 /* We don't support people creating a bus connection and
3340 * keeping it around over a fork(). Let's complain. */
3342 return bus->original_pid != getpid_cached();
3345 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3346 sd_bus *bus = userdata;
3351 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3353 r = sd_bus_process(bus, NULL);
3355 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3356 bus_enter_closing(bus);
3362 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3363 sd_bus *bus = userdata;
3368 r = sd_bus_process(bus, NULL);
3370 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3371 bus_enter_closing(bus);
3377 static int prepare_callback(sd_event_source *s, void *userdata) {
3378 sd_bus *bus = userdata;
3385 e = sd_bus_get_events(bus);
3391 if (bus->output_fd != bus->input_fd) {
3393 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3397 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3399 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3403 r = sd_bus_get_timeout(bus, &until);
3409 j = sd_event_source_set_time(bus->time_event_source, until);
3416 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3423 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3424 bus_enter_closing(bus);
3429 static int quit_callback(sd_event_source *event, void *userdata) {
3430 sd_bus *bus = userdata;
3440 int bus_attach_io_events(sd_bus *bus) {
3445 if (bus->input_fd < 0)
3451 if (!bus->input_io_event_source) {
3452 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3456 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3460 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3464 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3466 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3471 if (bus->output_fd != bus->input_fd) {
3472 assert(bus->output_fd >= 0);
3474 if (!bus->output_io_event_source) {
3475 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3479 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3483 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3485 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3494 static void bus_detach_io_events(sd_bus *bus) {
3497 if (bus->input_io_event_source) {
3498 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3499 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3502 if (bus->output_io_event_source) {
3503 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3504 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3508 int bus_attach_inotify_event(sd_bus *bus) {
3513 if (bus->inotify_fd < 0)
3519 if (!bus->inotify_event_source) {
3520 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3524 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3528 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3530 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3537 static void bus_detach_inotify_event(sd_bus *bus) {
3540 if (bus->inotify_event_source) {
3541 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3542 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3546 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3549 assert_return(bus, -EINVAL);
3550 assert_return(bus = bus_resolve(bus), -ENOPKG);
3551 assert_return(!bus->event, -EBUSY);
3553 assert(!bus->input_io_event_source);
3554 assert(!bus->output_io_event_source);
3555 assert(!bus->time_event_source);
3558 bus->event = sd_event_ref(event);
3560 r = sd_event_default(&bus->event);
3565 bus->event_priority = priority;
3567 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3571 r = sd_event_source_set_priority(bus->time_event_source, priority);
3575 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3579 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3583 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3587 r = bus_attach_io_events(bus);
3591 r = bus_attach_inotify_event(bus);
3598 sd_bus_detach_event(bus);
3602 _public_ int sd_bus_detach_event(sd_bus *bus) {
3603 assert_return(bus, -EINVAL);
3604 assert_return(bus = bus_resolve(bus), -ENOPKG);
3609 bus_detach_io_events(bus);
3610 bus_detach_inotify_event(bus);
3612 if (bus->time_event_source) {
3613 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3614 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3617 if (bus->quit_event_source) {
3618 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3619 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3622 bus->event = sd_event_unref(bus->event);
3626 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3627 assert_return(bus, NULL);
3632 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3633 assert_return(bus, NULL);
3635 return bus->current_message;
3638 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3639 assert_return(bus, NULL);
3641 return bus->current_slot;
3644 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3645 assert_return(bus, NULL);
3647 return bus->current_handler;
3650 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3651 assert_return(bus, NULL);
3653 return bus->current_userdata;
3656 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3661 assert(default_bus);
3664 return !!*default_bus;
3667 *ret = sd_bus_ref(*default_bus);
3675 b->default_bus_ptr = default_bus;
3683 _public_ int sd_bus_default_system(sd_bus **ret) {
3684 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3688 _public_ int sd_bus_default_user(sd_bus **ret) {
3689 #if 0 /// elogind does not support user buses
3690 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3692 return sd_bus_default_system(ret);
3696 _public_ int sd_bus_default(sd_bus **ret) {
3697 int (*bus_open)(sd_bus **) = NULL;
3700 busp = bus_choose_default(&bus_open);
3701 return bus_default(bus_open, busp, ret);
3704 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3705 assert_return(b, -EINVAL);
3706 assert_return(tid, -EINVAL);
3707 assert_return(!bus_pid_changed(b), -ECHILD);
3715 return sd_event_get_tid(b->event, tid);
3720 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3721 _cleanup_free_ char *e = NULL;
3724 assert_return(object_path_is_valid(prefix), -EINVAL);
3725 assert_return(external_id, -EINVAL);
3726 assert_return(ret_path, -EINVAL);
3728 e = bus_label_escape(external_id);
3732 ret = strjoin(prefix, "/", e);
3740 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3744 assert_return(object_path_is_valid(path), -EINVAL);
3745 assert_return(object_path_is_valid(prefix), -EINVAL);
3746 assert_return(external_id, -EINVAL);
3748 e = object_path_startswith(path, prefix);
3750 *external_id = NULL;
3754 ret = bus_label_unescape(e);
3762 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3763 _cleanup_strv_free_ char **labels = NULL;
3764 char *path, *path_pos, **label_pos;
3765 const char *sep, *template_pos;
3770 assert_return(out, -EINVAL);
3771 assert_return(path_template, -EINVAL);
3773 path_length = strlen(path_template);
3775 va_start(list, path_template);
3776 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3780 arg = va_arg(list, const char *);
3786 label = bus_label_escape(arg);
3792 r = strv_consume(&labels, label);
3798 /* add label length, but account for the format character */
3799 path_length += strlen(label) - 1;
3803 path = malloc(path_length + 1);
3810 for (template_pos = path_template; *template_pos; ) {
3811 sep = strchrnul(template_pos, '%');
3812 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3816 path_pos = stpcpy(path_pos, *label_pos++);
3817 template_pos = sep + 1;
3825 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3826 _cleanup_strv_free_ char **labels = NULL;
3827 const char *template_pos, *path_pos;
3833 * This decodes an object-path based on a template argument. The
3834 * template consists of a verbatim path, optionally including special
3837 * - Each occurrence of '%' in the template matches an arbitrary
3838 * substring of a label in the given path. At most one such
3839 * directive is allowed per label. For each such directive, the
3840 * caller must provide an output parameter (char **) via va_arg. If
3841 * NULL is passed, the given label is verified, but not returned.
3842 * For each matched label, the *decoded* label is stored in the
3843 * passed output argument, and the caller is responsible to free
3844 * it. Note that the output arguments are only modified if the
3845 * actualy path matched the template. Otherwise, they're left
3848 * This function returns <0 on error, 0 if the path does not match the
3849 * template, 1 if it matched.
3852 assert_return(path, -EINVAL);
3853 assert_return(path_template, -EINVAL);
3857 for (template_pos = path_template; *template_pos; ) {
3862 /* verify everything until the next '%' matches verbatim */
3863 sep = strchrnul(template_pos, '%');
3864 length = sep - template_pos;
3865 if (strncmp(path_pos, template_pos, length))
3869 template_pos += length;
3874 /* We found the next '%' character. Everything up until here
3875 * matched. We now skip ahead to the end of this label and make
3876 * sure it matches the tail of the label in the path. Then we
3877 * decode the string in-between and save it for later use. */
3879 ++template_pos; /* skip over '%' */
3881 sep = strchrnul(template_pos, '/');
3882 length = sep - template_pos; /* length of suffix to match verbatim */
3884 /* verify the suffixes match */
3885 sep = strchrnul(path_pos, '/');
3886 if (sep - path_pos < (ssize_t)length ||
3887 strncmp(sep - length, template_pos, length))
3890 template_pos += length; /* skip over matched label */
3891 length = sep - path_pos - length; /* length of sub-label to decode */
3893 /* store unescaped label for later use */
3894 label = bus_label_unescape_n(path_pos, length);
3898 r = strv_consume(&labels, label);
3902 path_pos = sep; /* skip decoded label and suffix */
3905 /* end of template must match end of path */
3909 /* copy the labels over to the caller */
3910 va_start(list, path_template);
3911 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3914 arg = va_arg(list, char **);
3922 labels = mfree(labels);
3926 _public_ int sd_bus_try_close(sd_bus *bus) {
3927 assert_return(bus, -EINVAL);
3928 assert_return(bus = bus_resolve(bus), -ENOPKG);
3929 assert_return(!bus_pid_changed(bus), -ECHILD);
3934 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3935 assert_return(bus, -EINVAL);
3936 assert_return(bus = bus_resolve(bus), -ENOPKG);
3937 assert_return(description, -EINVAL);
3938 assert_return(bus->description, -ENXIO);
3939 assert_return(!bus_pid_changed(bus), -ECHILD);
3941 if (bus->description)
3942 *description = bus->description;
3943 else if (bus->is_system)
3944 *description = "system";
3945 else if (bus->is_user)
3946 *description = "user";
3948 *description = NULL;
3953 int bus_get_root_path(sd_bus *bus) {
3956 if (bus->cgroup_root)
3959 r = cg_get_root_path(&bus->cgroup_root);
3961 bus->cgroup_root = strdup("/");
3962 if (!bus->cgroup_root)
3971 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3972 assert_return(bus, -EINVAL);
3973 assert_return(bus = bus_resolve(bus), -ENOPKG);
3974 assert_return(scope, -EINVAL);
3975 assert_return(!bus_pid_changed(bus), -ECHILD);
3982 if (bus->is_system) {
3990 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3992 assert_return(bus, -EINVAL);
3993 assert_return(bus = bus_resolve(bus), -ENOPKG);
3994 assert_return(address, -EINVAL);
3995 assert_return(!bus_pid_changed(bus), -ECHILD);
3998 *address = bus->address;
4005 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
4006 assert_return(bus, -EINVAL);
4007 assert_return(bus = bus_resolve(bus), -ENOPKG);
4008 assert_return(mask, -EINVAL);
4009 assert_return(!bus_pid_changed(bus), -ECHILD);
4011 *mask = bus->creds_mask;
4015 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
4016 assert_return(bus, -EINVAL);
4017 assert_return(bus = bus_resolve(bus), -ENOPKG);
4018 assert_return(!bus_pid_changed(bus), -ECHILD);
4020 return bus->bus_client;
4023 _public_ int sd_bus_is_server(sd_bus *bus) {
4024 assert_return(bus, -EINVAL);
4025 assert_return(bus = bus_resolve(bus), -ENOPKG);
4026 assert_return(!bus_pid_changed(bus), -ECHILD);
4028 return bus->is_server;
4031 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
4032 assert_return(bus, -EINVAL);
4033 assert_return(bus = bus_resolve(bus), -ENOPKG);
4034 assert_return(!bus_pid_changed(bus), -ECHILD);
4036 return bus->anonymous_auth;
4039 _public_ int sd_bus_is_trusted(sd_bus *bus) {
4040 assert_return(bus, -EINVAL);
4041 assert_return(bus = bus_resolve(bus), -ENOPKG);
4042 assert_return(!bus_pid_changed(bus), -ECHILD);
4044 return bus->trusted;
4047 _public_ int sd_bus_is_monitor(sd_bus *bus) {
4048 assert_return(bus, -EINVAL);
4049 assert_return(bus = bus_resolve(bus), -ENOPKG);
4050 assert_return(!bus_pid_changed(bus), -ECHILD);
4052 return bus->is_monitor;
4055 static void flush_close(sd_bus *bus) {
4059 /* Flushes and closes the specified bus. We take a ref before,
4060 * to ensure the flushing does not cause the bus to be
4063 sd_bus_flush_close_unref(sd_bus_ref(bus));
4066 _public_ void sd_bus_default_flush_close(void) {
4067 flush_close(default_starter_bus);
4068 #if 0 /// elogind does not support user buses
4069 flush_close(default_user_bus);
4071 flush_close(default_system_bus);
4074 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
4075 assert_return(bus, -EINVAL);
4076 assert_return(bus = bus_resolve(bus), -ENOPKG);
4078 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4079 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4080 * from the client side. */
4081 bus->exit_on_disconnect = b;
4083 /* If the exit condition was triggered already, exit immediately. */
4084 return bus_exit_now(bus);
4087 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
4088 assert_return(bus, -EINVAL);
4089 assert_return(bus = bus_resolve(bus), -ENOPKG);
4091 return bus->exit_on_disconnect;
4094 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4095 assert_return(bus, -EINVAL);
4096 assert_return(bus = bus_resolve(bus), -ENOPKG);
4097 assert_return(!bus->bus_client, -EPERM);
4098 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4100 return free_and_strdup(&bus->patch_sender, sender);
4103 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4104 assert_return(bus, -EINVAL);
4105 assert_return(bus = bus_resolve(bus), -ENOPKG);
4106 assert_return(ret, -EINVAL);
4108 if (!bus->patch_sender)
4111 *ret = bus->patch_sender;
4115 _public_ int sd_bus_get_n_queued_read(sd_bus *bus, uint64_t *ret) {
4116 assert_return(bus, -EINVAL);
4117 assert_return(bus = bus_resolve(bus), -ENOPKG);
4118 assert_return(!bus_pid_changed(bus), -ECHILD);
4119 assert_return(ret, -EINVAL);
4121 *ret = bus->rqueue_size;
4125 _public_ int sd_bus_get_n_queued_write(sd_bus *bus, uint64_t *ret) {
4126 assert_return(bus, -EINVAL);
4127 assert_return(bus = bus_resolve(bus), -ENOPKG);
4128 assert_return(!bus_pid_changed(bus), -ECHILD);
4129 assert_return(ret, -EINVAL);
4131 *ret = bus->wqueue_size;