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);
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);
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);
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);
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 int bus_start_address(sd_bus *b) {
1109 bus_close_io_fds(b);
1110 bus_close_inotify_fd(b);
1112 /* If you provide multiple different bus-addresses, we
1113 * try all of them in order and use the first one that
1117 r = bus_socket_exec(b);
1118 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1119 r = bus_container_connect_socket(b);
1120 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1121 r = bus_socket_connect(b);
1128 q = bus_attach_io_events(b);
1132 q = bus_attach_inotify_event(b);
1139 b->last_connect_error = -r;
1142 r = bus_parse_next_address(b);
1146 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1150 int bus_next_address(sd_bus *b) {
1153 bus_reset_parsed_address(b);
1154 return bus_start_address(b);
1157 static int bus_start_fd(sd_bus *b) {
1162 assert(b->input_fd >= 0);
1163 assert(b->output_fd >= 0);
1165 r = fd_nonblock(b->input_fd, true);
1169 r = fd_cloexec(b->input_fd, true);
1173 if (b->input_fd != b->output_fd) {
1174 r = fd_nonblock(b->output_fd, true);
1178 r = fd_cloexec(b->output_fd, true);
1183 if (fstat(b->input_fd, &st) < 0)
1186 return bus_socket_take_fd(b);
1189 _public_ int sd_bus_start(sd_bus *bus) {
1192 assert_return(bus, -EINVAL);
1193 assert_return(bus = bus_resolve(bus), -ENOPKG);
1194 assert_return(bus->state == BUS_UNSET, -EPERM);
1195 assert_return(!bus_pid_changed(bus), -ECHILD);
1197 bus_set_state(bus, BUS_OPENING);
1199 if (bus->is_server && bus->bus_client)
1202 if (bus->input_fd >= 0)
1203 r = bus_start_fd(bus);
1204 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1205 r = bus_start_address(bus);
1214 return bus_send_hello(bus);
1217 _public_ int sd_bus_open(sd_bus **ret) {
1222 assert_return(ret, -EINVAL);
1224 /* Let's connect to the starter bus if it is set, and
1225 * otherwise to the bus that is appropropriate for the scope
1226 * we are running in */
1228 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1230 if (streq(e, "system"))
1231 return sd_bus_open_system(ret);
1232 #if 0 /// elogind does not support systemd user instances
1233 else if (STR_IN_SET(e, "session", "user"))
1234 return sd_bus_open_user(ret);
1238 e = secure_getenv("DBUS_STARTER_ADDRESS");
1240 #if 0 /// elogind does not support systemd user instances
1241 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1242 return sd_bus_open_user(ret);
1245 return sd_bus_open_system(ret);
1252 r = sd_bus_set_address(b, e);
1256 b->bus_client = true;
1258 /* We don't know whether the bus is trusted or not, so better
1259 * be safe, and authenticate everything */
1261 b->is_local = false;
1262 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1264 r = sd_bus_start(b);
1276 int bus_set_address_system(sd_bus *b) {
1280 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1282 return sd_bus_set_address(b, e);
1284 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1287 _public_ int sd_bus_open_system(sd_bus **ret) {
1291 assert_return(ret, -EINVAL);
1297 r = bus_set_address_system(b);
1301 b->bus_client = true;
1302 b->is_system = true;
1304 /* Let's do per-method access control on the system bus. We
1305 * need the caller's UID and capability set for that. */
1307 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1310 r = sd_bus_start(b);
1322 #if 0 /// elogind can not open/use a user bus
1323 int bus_set_address_user(sd_bus *b) {
1325 _cleanup_free_ char *ee = NULL, *s = NULL;
1329 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1331 return sd_bus_set_address(b, e);
1333 e = secure_getenv("XDG_RUNTIME_DIR");
1337 ee = bus_address_escape(e);
1341 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1351 _public_ int sd_bus_open_user(sd_bus **ret) {
1352 #if 0 /// elogind does not support user buses
1356 assert_return(ret, -EINVAL);
1362 r = bus_set_address_user(b);
1366 b->bus_client = true;
1369 /* We don't do any per-method access control on the user
1374 r = sd_bus_start(b);
1385 return sd_bus_open_system(ret);
1389 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1390 _cleanup_free_ char *e = NULL;
1391 char *m = NULL, *c = NULL, *a;
1396 /* Let's see if we shall enter some container */
1397 m = strchr(host, ':');
1401 /* Let's make sure this is not a port of some kind,
1402 * and is a valid machine name. */
1403 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1406 /* Cut out the host part */
1407 t = strndupa(host, m - host - 1);
1408 e = bus_address_escape(t);
1412 c = strjoina(",argv5=--machine=", m);
1417 e = bus_address_escape(host);
1422 a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=elogind-stdio-bridge", c);
1426 free_and_replace(b->address, a);
1431 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1435 assert_return(host, -EINVAL);
1436 assert_return(ret, -EINVAL);
1438 r = sd_bus_new(&bus);
1442 r = bus_set_address_system_remote(bus, host);
1446 bus->bus_client = true;
1447 bus->trusted = false;
1448 bus->is_system = true;
1449 bus->is_local = false;
1451 r = sd_bus_start(bus);
1463 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1464 _cleanup_free_ char *e = NULL;
1470 e = bus_address_escape(machine);
1474 a = strjoin("x-machine-unix:machine=", e);
1478 free_and_replace(b->address, a);
1483 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1487 assert_return(machine, -EINVAL);
1488 assert_return(ret, -EINVAL);
1489 assert_return(machine_name_is_valid(machine), -EINVAL);
1491 r = sd_bus_new(&bus);
1495 r = bus_set_address_system_machine(bus, machine);
1499 bus->bus_client = true;
1500 bus->trusted = false;
1501 bus->is_system = true;
1502 bus->is_local = false;
1504 r = sd_bus_start(bus);
1516 _public_ void sd_bus_close(sd_bus *bus) {
1520 if (bus->state == BUS_CLOSED)
1522 if (bus_pid_changed(bus))
1525 bus_set_state(bus, BUS_CLOSED);
1527 sd_bus_detach_event(bus);
1529 /* Drop all queued messages so that they drop references to
1530 * the bus object and the bus may be freed */
1531 bus_reset_queues(bus);
1533 bus_close_io_fds(bus);
1534 bus_close_inotify_fd(bus);
1537 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1545 return sd_bus_unref(bus);
1548 void bus_enter_closing(sd_bus *bus) {
1551 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1554 bus_set_state(bus, BUS_CLOSING);
1557 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1562 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1567 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1573 i = REFCNT_DEC(bus->n_ref);
1581 _public_ int sd_bus_is_open(sd_bus *bus) {
1583 assert_return(bus, -EINVAL);
1584 assert_return(bus = bus_resolve(bus), -ENOPKG);
1585 assert_return(!bus_pid_changed(bus), -ECHILD);
1587 return BUS_IS_OPEN(bus->state);
1590 _public_ int sd_bus_is_ready(sd_bus *bus) {
1591 assert_return(bus, -EINVAL);
1592 assert_return(bus = bus_resolve(bus), -ENOPKG);
1593 assert_return(!bus_pid_changed(bus), -ECHILD);
1595 return bus->state == BUS_RUNNING;
1598 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1601 assert_return(bus, -EINVAL);
1602 assert_return(bus = bus_resolve(bus), -ENOPKG);
1603 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1604 assert_return(!bus_pid_changed(bus), -ECHILD);
1606 if (bus->is_monitor)
1609 if (type == SD_BUS_TYPE_UNIX_FD) {
1610 if (!bus->accept_fd)
1613 r = bus_ensure_running(bus);
1617 return bus->can_fds;
1620 return bus_type_is_valid(type);
1623 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1626 assert_return(bus, -EINVAL);
1627 assert_return(bus = bus_resolve(bus), -ENOPKG);
1628 assert_return(id, -EINVAL);
1629 assert_return(!bus_pid_changed(bus), -ECHILD);
1631 r = bus_ensure_running(bus);
1635 *id = bus->server_id;
1639 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1646 /* If we copy the same message to multiple
1647 * destinations, avoid using the same cookie
1649 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1654 timeout = BUS_DEFAULT_TIMEOUT;
1656 if (!m->sender && b->patch_sender) {
1657 r = sd_bus_message_set_sender(m, b->patch_sender);
1662 return sd_bus_message_seal(m, ++b->cookie, timeout);
1665 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1666 bool remarshal = false;
1670 /* wrong packet version */
1671 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1674 /* wrong packet endianness */
1675 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1678 return remarshal ? bus_message_remarshal(b, m) : 0;
1681 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1685 /* Fake some timestamps, if they were requested, and not
1686 * already initialized */
1687 if (b->attach_timestamp) {
1688 if (m->realtime <= 0)
1689 m->realtime = now(CLOCK_REALTIME);
1691 if (m->monotonic <= 0)
1692 m->monotonic = now(CLOCK_MONOTONIC);
1695 /* The bus specification says the serial number cannot be 0,
1696 * hence let's fill something in for synthetic messages. Since
1697 * synthetic messages might have a fake sender and we don't
1698 * want to interfere with the real sender's serial numbers we
1699 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1700 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1701 * even though kdbus can do 64bit. */
1702 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1705 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1711 r = bus_socket_write_message(bus, m, idx);
1715 if (*idx >= BUS_MESSAGE_SIZE(m))
1716 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",
1717 bus_message_type_to_string(m->header->type),
1718 strna(sd_bus_message_get_sender(m)),
1719 strna(sd_bus_message_get_destination(m)),
1720 strna(sd_bus_message_get_path(m)),
1721 strna(sd_bus_message_get_interface(m)),
1722 strna(sd_bus_message_get_member(m)),
1723 BUS_MESSAGE_COOKIE(m),
1725 strna(m->root_container.signature),
1726 strna(m->error.name),
1727 strna(m->error.message));
1732 static int dispatch_wqueue(sd_bus *bus) {
1736 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1738 while (bus->wqueue_size > 0) {
1740 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1744 /* Didn't do anything this time */
1746 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1747 /* Fully written. Let's drop the entry from
1750 * This isn't particularly optimized, but
1751 * well, this is supposed to be our worst-case
1752 * buffer only, and the socket buffer is
1753 * supposed to be our primary buffer, and if
1754 * it got full, then all bets are off
1758 sd_bus_message_unref(bus->wqueue[0]);
1759 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1769 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1772 return bus_socket_read_message(bus);
1775 int bus_rqueue_make_room(sd_bus *bus) {
1778 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1781 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1787 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1792 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1794 /* Note that the priority logic is only available on kdbus,
1795 * where the rqueue is unused. We check the rqueue here
1796 * anyway, because it's simple... */
1799 if (bus->rqueue_size > 0) {
1800 /* Dispatch a queued message */
1802 *m = bus->rqueue[0];
1804 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1808 /* Try to read a new message */
1809 r = bus_read_message(bus, hint_priority, priority);
1819 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1820 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1823 assert_return(m, -EINVAL);
1828 assert_return(!bus_pid_changed(bus), -ECHILD);
1830 if (!BUS_IS_OPEN(bus->state))
1834 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1841 /* If the cookie number isn't kept, then we know that no reply
1843 if (!cookie && !m->sealed)
1844 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1846 r = bus_seal_message(bus, m, 0);
1850 /* Remarshall if we have to. This will possibly unref the
1851 * message and place a replacement in m */
1852 r = bus_remarshal_message(bus, &m);
1856 /* If this is a reply and no reply was requested, then let's
1857 * suppress this, if we can */
1861 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1864 r = bus_write_message(bus, m, &idx);
1866 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1867 bus_enter_closing(bus);
1874 if (idx < BUS_MESSAGE_SIZE(m)) {
1875 /* Wasn't fully written. So let's remember how
1876 * much was written. Note that the first entry
1877 * of the wqueue array is always allocated so
1878 * that we always can remember how much was
1880 bus->wqueue[0] = sd_bus_message_ref(m);
1881 bus->wqueue_size = 1;
1886 /* Just append it to the queue. */
1888 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1891 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1894 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1899 *cookie = BUS_MESSAGE_COOKIE(m);
1904 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1907 assert_return(m, -EINVAL);
1912 assert_return(!bus_pid_changed(bus), -ECHILD);
1914 if (!BUS_IS_OPEN(bus->state))
1917 if (!streq_ptr(m->destination, destination)) {
1922 r = sd_bus_message_set_destination(m, destination);
1927 return sd_bus_send(bus, m, cookie);
1930 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1933 if (usec == (uint64_t) -1)
1936 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1937 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1938 * relative timestamp, and afterwards the absolute one. */
1940 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1943 return now(CLOCK_MONOTONIC) + usec;
1946 static int timeout_compare(const void *a, const void *b) {
1947 const struct reply_callback *x = a, *y = b;
1949 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1952 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1955 if (x->timeout_usec < y->timeout_usec)
1958 if (x->timeout_usec > y->timeout_usec)
1964 _public_ int sd_bus_call_async(
1968 sd_bus_message_handler_t callback,
1972 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1973 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1976 assert_return(m, -EINVAL);
1977 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1978 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
1983 assert_return(!bus_pid_changed(bus), -ECHILD);
1985 if (!BUS_IS_OPEN(bus->state))
1988 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
1989 if (!callback && !slot && !m->sealed)
1990 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1992 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1996 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
2000 r = bus_seal_message(bus, m, usec);
2004 r = bus_remarshal_message(bus, &m);
2008 if (slot || callback) {
2009 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
2013 s->reply_callback.callback = callback;
2015 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
2016 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
2018 s->reply_callback.cookie = 0;
2022 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
2023 if (s->reply_callback.timeout_usec != 0) {
2024 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
2026 s->reply_callback.timeout_usec = 0;
2032 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
2043 int bus_ensure_running(sd_bus *bus) {
2048 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
2050 if (bus->state == BUS_RUNNING)
2054 r = sd_bus_process(bus, NULL);
2057 if (bus->state == BUS_RUNNING)
2062 r = sd_bus_wait(bus, (uint64_t) -1);
2068 _public_ int sd_bus_call(
2072 sd_bus_error *error,
2073 sd_bus_message **reply) {
2075 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2081 bus_assert_return(m, -EINVAL, error);
2082 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2083 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2084 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2089 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2091 if (!BUS_IS_OPEN(bus->state)) {
2096 r = bus_ensure_running(bus);
2100 i = bus->rqueue_size;
2102 r = bus_seal_message(bus, m, usec);
2106 r = bus_remarshal_message(bus, &m);
2110 r = sd_bus_send(bus, m, &cookie);
2114 timeout = calc_elapse(bus, m->timeout);
2119 while (i < bus->rqueue_size) {
2120 sd_bus_message *incoming = NULL;
2122 incoming = bus->rqueue[i];
2124 if (incoming->reply_cookie == cookie) {
2125 /* Found a match! */
2127 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2129 log_debug_bus_message(incoming);
2131 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2133 if (incoming->n_fds <= 0 || bus->accept_fd) {
2137 sd_bus_message_unref(incoming);
2142 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2143 sd_bus_message_unref(incoming);
2146 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2147 r = sd_bus_error_copy(error, &incoming->error);
2148 sd_bus_message_unref(incoming);
2155 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2158 streq(bus->unique_name, incoming->sender)) {
2160 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2163 /* Our own message? Somebody is trying
2164 * to send its own client a message,
2165 * let's not dead-lock, let's fail
2168 sd_bus_message_unref(incoming);
2173 /* Try to read more, right-away */
2177 r = bus_read_message(bus, false, 0);
2179 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2180 bus_enter_closing(bus);
2192 n = now(CLOCK_MONOTONIC);
2200 left = (uint64_t) -1;
2202 r = bus_poll(bus, true, left);
2210 r = dispatch_wqueue(bus);
2212 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2213 bus_enter_closing(bus);
2222 return sd_bus_error_set_errno(error, r);
2225 _public_ int sd_bus_get_fd(sd_bus *bus) {
2227 assert_return(bus, -EINVAL);
2228 assert_return(bus = bus_resolve(bus), -ENOPKG);
2229 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2230 assert_return(!bus_pid_changed(bus), -ECHILD);
2232 if (bus->state == BUS_CLOSED)
2235 if (bus->inotify_fd >= 0)
2236 return bus->inotify_fd;
2238 if (bus->input_fd >= 0)
2239 return bus->input_fd;
2244 _public_ int sd_bus_get_events(sd_bus *bus) {
2247 assert_return(bus, -EINVAL);
2248 assert_return(bus = bus_resolve(bus), -ENOPKG);
2249 assert_return(!bus_pid_changed(bus), -ECHILD);
2251 switch (bus->state) {
2257 case BUS_WATCH_BIND:
2265 case BUS_AUTHENTICATING:
2266 if (bus_socket_auth_needs_write(bus))
2274 if (bus->rqueue_size <= 0)
2276 if (bus->wqueue_size > 0)
2284 assert_not_reached("Unknown state");
2290 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2291 struct reply_callback *c;
2293 assert_return(bus, -EINVAL);
2294 assert_return(bus = bus_resolve(bus), -ENOPKG);
2295 assert_return(timeout_usec, -EINVAL);
2296 assert_return(!bus_pid_changed(bus), -ECHILD);
2298 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2301 if (bus->track_queue) {
2306 switch (bus->state) {
2308 case BUS_AUTHENTICATING:
2309 *timeout_usec = bus->auth_timeout;
2314 if (bus->rqueue_size > 0) {
2319 c = prioq_peek(bus->reply_callbacks_prioq);
2321 *timeout_usec = (uint64_t) -1;
2325 if (c->timeout_usec == 0) {
2326 *timeout_usec = (uint64_t) -1;
2330 *timeout_usec = c->timeout_usec;
2337 case BUS_WATCH_BIND:
2339 *timeout_usec = (uint64_t) -1;
2343 assert_not_reached("Unknown or unexpected stat");
2347 static int process_timeout(sd_bus *bus) {
2348 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2349 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2350 struct reply_callback *c;
2357 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2359 c = prioq_peek(bus->reply_callbacks_prioq);
2363 n = now(CLOCK_MONOTONIC);
2364 if (c->timeout_usec > n)
2367 r = bus_message_new_synthetic_error(
2370 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2375 r = bus_seal_synthetic_message(bus, m);
2379 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2380 c->timeout_usec = 0;
2382 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2385 slot = container_of(c, sd_bus_slot, reply_callback);
2387 bus->iteration_counter++;
2389 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2391 bus->current_message = m;
2392 bus->current_slot = sd_bus_slot_ref(slot);
2393 bus->current_handler = c->callback;
2394 bus->current_userdata = slot->userdata;
2395 r = c->callback(m, slot->userdata, &error_buffer);
2396 bus->current_userdata = NULL;
2397 bus->current_handler = NULL;
2398 bus->current_slot = NULL;
2399 bus->current_message = NULL;
2401 if (slot->floating) {
2402 bus_slot_disconnect(slot);
2403 sd_bus_slot_unref(slot);
2406 sd_bus_slot_unref(slot);
2408 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2409 * and ignore the callback handler's return value. */
2413 return bus_maybe_reply_error(m, r, &error_buffer);
2416 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2420 if (bus->state != BUS_HELLO)
2423 /* Let's make sure the first message on the bus is the HELLO
2424 * reply. But note that we don't actually parse the message
2425 * here (we leave that to the usual handling), we just verify
2426 * we don't let any earlier msg through. */
2428 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2431 if (m->reply_cookie != 1)
2437 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2438 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2439 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2440 struct reply_callback *c;
2448 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2451 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2454 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2460 slot = container_of(c, sd_bus_slot, reply_callback);
2462 if (m->n_fds > 0 && !bus->accept_fd) {
2464 /* If the reply contained a file descriptor which we
2465 * didn't want we pass an error instead. */
2467 r = bus_message_new_synthetic_error(
2470 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2475 /* Copy over original timestamp */
2476 synthetic_reply->realtime = m->realtime;
2477 synthetic_reply->monotonic = m->monotonic;
2478 synthetic_reply->seqnum = m->seqnum;
2480 r = bus_seal_synthetic_message(bus, synthetic_reply);
2484 m = synthetic_reply;
2486 r = sd_bus_message_rewind(m, true);
2491 if (c->timeout_usec != 0) {
2492 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2493 c->timeout_usec = 0;
2496 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2498 bus->current_slot = sd_bus_slot_ref(slot);
2499 bus->current_handler = c->callback;
2500 bus->current_userdata = slot->userdata;
2501 r = c->callback(m, slot->userdata, &error_buffer);
2502 bus->current_userdata = NULL;
2503 bus->current_handler = NULL;
2504 bus->current_slot = NULL;
2506 if (slot->floating) {
2507 bus_slot_disconnect(slot);
2508 sd_bus_slot_unref(slot);
2511 sd_bus_slot_unref(slot);
2513 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2514 * ignore the callback handler's return value. */
2518 return bus_maybe_reply_error(m, r, &error_buffer);
2521 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2522 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2523 struct filter_callback *l;
2530 bus->filter_callbacks_modified = false;
2532 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2535 if (bus->filter_callbacks_modified)
2538 /* Don't run this more than once per iteration */
2539 if (l->last_iteration == bus->iteration_counter)
2542 l->last_iteration = bus->iteration_counter;
2544 r = sd_bus_message_rewind(m, true);
2548 slot = container_of(l, sd_bus_slot, filter_callback);
2550 bus->current_slot = sd_bus_slot_ref(slot);
2551 bus->current_handler = l->callback;
2552 bus->current_userdata = slot->userdata;
2553 r = l->callback(m, slot->userdata, &error_buffer);
2554 bus->current_userdata = NULL;
2555 bus->current_handler = NULL;
2556 bus->current_slot = sd_bus_slot_unref(slot);
2558 r = bus_maybe_reply_error(m, r, &error_buffer);
2564 } while (bus->filter_callbacks_modified);
2569 static int process_match(sd_bus *bus, sd_bus_message *m) {
2576 bus->match_callbacks_modified = false;
2578 r = bus_match_run(bus, &bus->match_callbacks, m);
2582 } while (bus->match_callbacks_modified);
2587 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2588 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2594 if (bus->is_monitor)
2597 if (bus->manual_peer_interface)
2600 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2603 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2606 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2609 if (streq_ptr(m->member, "Ping"))
2610 r = sd_bus_message_new_method_return(m, &reply);
2611 else if (streq_ptr(m->member, "GetMachineId")) {
2615 r = sd_id128_get_machine(&id);
2619 r = sd_bus_message_new_method_return(m, &reply);
2623 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2625 r = sd_bus_message_new_method_errorf(
2627 SD_BUS_ERROR_UNKNOWN_METHOD,
2628 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2634 r = sd_bus_send(bus, reply, NULL);
2641 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2645 /* If we got a message with a file descriptor which we didn't
2646 * want to accept, then let's drop it. How can this even
2647 * happen? For example, when the kernel queues a message into
2648 * an activatable names's queue which allows fds, and then is
2649 * delivered to us later even though we ourselves did not
2652 if (bus->is_monitor)
2661 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2662 return 1; /* just eat it up */
2664 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2667 static int process_message(sd_bus *bus, sd_bus_message *m) {
2673 bus->current_message = m;
2674 bus->iteration_counter++;
2676 log_debug_bus_message(m);
2678 r = process_hello(bus, m);
2682 r = process_reply(bus, m);
2686 r = process_fd_check(bus, m);
2690 r = process_filter(bus, m);
2694 r = process_match(bus, m);
2698 r = process_builtin(bus, m);
2702 r = bus_process_object(bus, m);
2705 bus->current_message = NULL;
2709 static int dispatch_track(sd_bus *bus) {
2712 if (!bus->track_queue)
2715 bus_track_dispatch(bus->track_queue);
2719 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2720 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2724 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2726 r = process_timeout(bus);
2730 r = dispatch_wqueue(bus);
2734 r = dispatch_track(bus);
2738 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2744 r = process_message(bus, m);
2749 r = sd_bus_message_rewind(m, true);
2758 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2760 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2761 strna(sd_bus_message_get_sender(m)),
2762 strna(sd_bus_message_get_path(m)),
2763 strna(sd_bus_message_get_interface(m)),
2764 strna(sd_bus_message_get_member(m)));
2766 r = sd_bus_reply_method_errorf(
2768 SD_BUS_ERROR_UNKNOWN_OBJECT,
2769 "Unknown object '%s'.", m->path);
2783 static int bus_exit_now(sd_bus *bus) {
2786 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2787 * sd_event_exit(), otherwise invokes libc exit(). */
2789 if (bus->exited) /* did we already exit? */
2791 if (!bus->exit_triggered) /* was the exit condition triggered? */
2793 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2796 bus->exited = true; /* never exit more than once */
2798 log_debug("Bus connection disconnected, exiting.");
2801 return sd_event_exit(bus->event, EXIT_FAILURE);
2805 assert_not_reached("exit() didn't exit?");
2808 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2809 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2810 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2817 r = bus_message_new_synthetic_error(
2820 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2825 r = bus_seal_synthetic_message(bus, m);
2829 if (c->timeout_usec != 0) {
2830 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2831 c->timeout_usec = 0;
2834 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2837 slot = container_of(c, sd_bus_slot, reply_callback);
2839 bus->iteration_counter++;
2841 bus->current_message = m;
2842 bus->current_slot = sd_bus_slot_ref(slot);
2843 bus->current_handler = c->callback;
2844 bus->current_userdata = slot->userdata;
2845 r = c->callback(m, slot->userdata, &error_buffer);
2846 bus->current_userdata = NULL;
2847 bus->current_handler = NULL;
2848 bus->current_slot = NULL;
2849 bus->current_message = NULL;
2851 if (slot->floating) {
2852 bus_slot_disconnect(slot);
2853 sd_bus_slot_unref(slot);
2856 sd_bus_slot_unref(slot);
2858 return bus_maybe_reply_error(m, r, &error_buffer);
2861 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2862 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2863 struct reply_callback *c;
2867 assert(bus->state == BUS_CLOSING);
2869 /* First, fail all outstanding method calls */
2870 c = ordered_hashmap_first(bus->reply_callbacks);
2872 return process_closing_reply_callback(bus, c);
2874 /* Then, fake-drop all remaining bus tracking references */
2876 bus_track_close(bus->tracks);
2880 /* Then, synthesize a Disconnected message */
2881 r = sd_bus_message_new_signal(
2884 "/org/freedesktop/DBus/Local",
2885 "org.freedesktop.DBus.Local",
2890 bus_message_set_sender_local(bus, m);
2892 r = bus_seal_synthetic_message(bus, m);
2898 bus->current_message = m;
2899 bus->iteration_counter++;
2901 r = process_filter(bus, m);
2905 r = process_match(bus, m);
2909 /* Nothing else to do, exit now, if the condition holds */
2910 bus->exit_triggered = true;
2911 (void) bus_exit_now(bus);
2921 bus->current_message = NULL;
2926 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2927 BUS_DONT_DESTROY(bus);
2930 /* Returns 0 when we didn't do anything. This should cause the
2931 * caller to invoke sd_bus_wait() before returning the next
2932 * time. Returns > 0 when we did something, which possibly
2933 * means *ret is filled in with an unprocessed message. */
2935 assert_return(bus, -EINVAL);
2936 assert_return(bus = bus_resolve(bus), -ENOPKG);
2937 assert_return(!bus_pid_changed(bus), -ECHILD);
2939 /* We don't allow recursively invoking sd_bus_process(). */
2940 assert_return(!bus->current_message, -EBUSY);
2941 assert(!bus->current_slot);
2943 switch (bus->state) {
2951 case BUS_WATCH_BIND:
2952 r = bus_socket_process_watch_bind(bus);
2956 r = bus_socket_process_opening(bus);
2959 case BUS_AUTHENTICATING:
2960 r = bus_socket_process_authenticating(bus);
2965 r = process_running(bus, hint_priority, priority, ret);
2969 /* This branch initializes *ret, hence we don't use the generic error checking below */
2973 return process_closing(bus, ret);
2976 assert_not_reached("Unknown state");
2979 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2980 bus_enter_closing(bus);
2991 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2992 return bus_process_internal(bus, false, 0, ret);
2995 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2996 return bus_process_internal(bus, true, priority, ret);
2999 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
3000 struct pollfd p[2] = {};
3003 usec_t m = USEC_INFINITY;
3007 if (bus->state == BUS_CLOSING)
3010 if (!BUS_IS_OPEN(bus->state))
3013 if (bus->state == BUS_WATCH_BIND) {
3014 assert(bus->inotify_fd >= 0);
3016 p[0].events = POLLIN;
3017 p[0].fd = bus->inotify_fd;
3022 e = sd_bus_get_events(bus);
3027 /* The caller really needs some more data, he doesn't
3028 * care about what's already read, or any timeouts
3029 * except its own. */
3033 /* The caller wants to process if there's something to
3034 * process, but doesn't care otherwise */
3036 r = sd_bus_get_timeout(bus, &until);
3040 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
3043 p[0].fd = bus->input_fd;
3044 if (bus->output_fd == bus->input_fd) {
3048 p[0].events = e & POLLIN;
3049 p[1].fd = bus->output_fd;
3050 p[1].events = e & POLLOUT;
3055 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
3058 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
3062 return r > 0 ? 1 : 0;
3065 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
3067 assert_return(bus, -EINVAL);
3068 assert_return(bus = bus_resolve(bus), -ENOPKG);
3069 assert_return(!bus_pid_changed(bus), -ECHILD);
3071 if (bus->state == BUS_CLOSING)
3074 if (!BUS_IS_OPEN(bus->state))
3077 if (bus->rqueue_size > 0)
3080 return bus_poll(bus, false, timeout_usec);
3083 _public_ int sd_bus_flush(sd_bus *bus) {
3086 assert_return(bus, -EINVAL);
3087 assert_return(bus = bus_resolve(bus), -ENOPKG);
3088 assert_return(!bus_pid_changed(bus), -ECHILD);
3090 if (bus->state == BUS_CLOSING)
3093 if (!BUS_IS_OPEN(bus->state))
3096 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3097 if (bus->state == BUS_WATCH_BIND)
3100 r = bus_ensure_running(bus);
3104 if (bus->wqueue_size <= 0)
3108 r = dispatch_wqueue(bus);
3110 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3111 bus_enter_closing(bus);
3118 if (bus->wqueue_size <= 0)
3121 r = bus_poll(bus, false, (uint64_t) -1);
3127 _public_ int sd_bus_add_filter(
3130 sd_bus_message_handler_t callback,
3135 assert_return(bus, -EINVAL);
3136 assert_return(bus = bus_resolve(bus), -ENOPKG);
3137 assert_return(callback, -EINVAL);
3138 assert_return(!bus_pid_changed(bus), -ECHILD);
3140 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3144 s->filter_callback.callback = callback;
3146 bus->filter_callbacks_modified = true;
3147 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3155 static int add_match_callback(
3158 sd_bus_error *ret_error) {
3160 sd_bus_slot *match_slot = userdata;
3161 bool failed = false;
3167 sd_bus_slot_ref(match_slot);
3169 if (sd_bus_message_is_method_error(m, NULL)) {
3170 log_debug_errno(sd_bus_message_get_errno(m),
3171 "Unable to add match %s, failing connection: %s",
3172 match_slot->match_callback.match_string,
3173 sd_bus_message_get_error(m)->message);
3177 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3179 if (match_slot->match_callback.install_callback) {
3182 bus = sd_bus_message_get_bus(m);
3184 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3185 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3188 assert(bus->current_slot == match_slot->match_callback.install_slot);
3189 assert(bus->current_handler == add_match_callback);
3190 assert(bus->current_userdata == userdata);
3192 bus->current_slot = match_slot;
3193 bus->current_handler = match_slot->match_callback.install_callback;
3194 bus->current_userdata = match_slot->userdata;
3196 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3198 bus->current_slot = match_slot->match_callback.install_slot;
3199 bus->current_handler = add_match_callback;
3200 bus->current_userdata = userdata;
3202 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3204 if (failed) /* Generic failure handling: destroy the connection */
3205 bus_enter_closing(sd_bus_message_get_bus(m));
3210 if (failed && match_slot->floating) {
3211 bus_slot_disconnect(match_slot);
3212 sd_bus_slot_unref(match_slot);
3215 sd_bus_slot_unref(match_slot);
3220 static int bus_add_match_full(
3225 sd_bus_message_handler_t callback,
3226 sd_bus_message_handler_t install_callback,
3229 struct bus_match_component *components = NULL;
3230 unsigned n_components = 0;
3231 sd_bus_slot *s = NULL;
3234 assert_return(bus, -EINVAL);
3235 assert_return(bus = bus_resolve(bus), -ENOPKG);
3236 assert_return(match, -EINVAL);
3237 assert_return(!bus_pid_changed(bus), -ECHILD);
3239 r = bus_match_parse(match, &components, &n_components);
3243 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3249 s->match_callback.callback = callback;
3250 s->match_callback.install_callback = install_callback;
3252 if (bus->bus_client) {
3253 enum bus_match_scope scope;
3255 scope = bus_match_get_scope(components, n_components);
3257 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3258 if (scope != BUS_MATCH_LOCAL) {
3260 /* We store the original match string, so that we can use it to remove the match again. */
3262 s->match_callback.match_string = strdup(match);
3263 if (!s->match_callback.match_string) {
3269 r = bus_add_match_internal_async(bus,
3270 &s->match_callback.install_slot,
3271 s->match_callback.match_string,
3275 r = bus_add_match_internal(bus, s->match_callback.match_string);
3279 s->match_added = true;
3283 bus->match_callbacks_modified = true;
3284 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3293 bus_match_parse_free(components, n_components);
3294 sd_bus_slot_unref(s);
3299 #if 0 /// UNNEEDED by elogind
3301 _public_ int sd_bus_add_match(
3305 sd_bus_message_handler_t callback,
3308 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3311 _public_ int sd_bus_add_match_async(
3315 sd_bus_message_handler_t callback,
3316 sd_bus_message_handler_t install_callback,
3319 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3322 bool bus_pid_changed(sd_bus *bus) {
3325 /* We don't support people creating a bus connection and
3326 * keeping it around over a fork(). Let's complain. */
3328 return bus->original_pid != getpid_cached();
3331 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3332 sd_bus *bus = userdata;
3337 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3339 r = sd_bus_process(bus, NULL);
3341 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3342 bus_enter_closing(bus);
3348 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3349 sd_bus *bus = userdata;
3354 r = sd_bus_process(bus, NULL);
3356 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3357 bus_enter_closing(bus);
3363 static int prepare_callback(sd_event_source *s, void *userdata) {
3364 sd_bus *bus = userdata;
3371 e = sd_bus_get_events(bus);
3377 if (bus->output_fd != bus->input_fd) {
3379 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3383 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3385 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3389 r = sd_bus_get_timeout(bus, &until);
3395 j = sd_event_source_set_time(bus->time_event_source, until);
3402 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3409 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3410 bus_enter_closing(bus);
3415 static int quit_callback(sd_event_source *event, void *userdata) {
3416 sd_bus *bus = userdata;
3426 int bus_attach_io_events(sd_bus *bus) {
3431 if (bus->input_fd < 0)
3437 if (!bus->input_io_event_source) {
3438 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3442 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3446 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3450 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3452 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3457 if (bus->output_fd != bus->input_fd) {
3458 assert(bus->output_fd >= 0);
3460 if (!bus->output_io_event_source) {
3461 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3465 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3469 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3471 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3480 static void bus_detach_io_events(sd_bus *bus) {
3483 if (bus->input_io_event_source) {
3484 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3485 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3488 if (bus->output_io_event_source) {
3489 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3490 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3494 int bus_attach_inotify_event(sd_bus *bus) {
3499 if (bus->inotify_fd < 0)
3505 if (!bus->inotify_event_source) {
3506 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3510 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3514 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3516 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3523 static void bus_detach_inotify_event(sd_bus *bus) {
3526 if (bus->inotify_event_source) {
3527 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3528 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3532 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3535 assert_return(bus, -EINVAL);
3536 assert_return(bus = bus_resolve(bus), -ENOPKG);
3537 assert_return(!bus->event, -EBUSY);
3539 assert(!bus->input_io_event_source);
3540 assert(!bus->output_io_event_source);
3541 assert(!bus->time_event_source);
3544 bus->event = sd_event_ref(event);
3546 r = sd_event_default(&bus->event);
3551 bus->event_priority = priority;
3553 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3557 r = sd_event_source_set_priority(bus->time_event_source, priority);
3561 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3565 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3569 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3573 r = bus_attach_io_events(bus);
3577 r = bus_attach_inotify_event(bus);
3584 sd_bus_detach_event(bus);
3588 _public_ int sd_bus_detach_event(sd_bus *bus) {
3589 assert_return(bus, -EINVAL);
3590 assert_return(bus = bus_resolve(bus), -ENOPKG);
3595 bus_detach_io_events(bus);
3596 bus_detach_inotify_event(bus);
3598 if (bus->time_event_source) {
3599 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3600 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3603 if (bus->quit_event_source) {
3604 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3605 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3608 bus->event = sd_event_unref(bus->event);
3612 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3613 assert_return(bus, NULL);
3618 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3619 assert_return(bus, NULL);
3621 return bus->current_message;
3624 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3625 assert_return(bus, NULL);
3627 return bus->current_slot;
3630 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3631 assert_return(bus, NULL);
3633 return bus->current_handler;
3636 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3637 assert_return(bus, NULL);
3639 return bus->current_userdata;
3642 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3647 assert(default_bus);
3650 return !!*default_bus;
3653 *ret = sd_bus_ref(*default_bus);
3661 b->default_bus_ptr = default_bus;
3669 _public_ int sd_bus_default_system(sd_bus **ret) {
3670 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3674 _public_ int sd_bus_default_user(sd_bus **ret) {
3675 #if 0 /// elogind does not support user buses
3676 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3678 return sd_bus_default_system(ret);
3682 _public_ int sd_bus_default(sd_bus **ret) {
3683 int (*bus_open)(sd_bus **) = NULL;
3686 #if 0 /// elogind does not support systemd units
3689 #if 0 /// elogind does not support systemd user instances
3691 busp = bus_choose_default(&bus_open);
3692 return bus_default(bus_open, busp, ret);
3695 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3696 assert_return(b, -EINVAL);
3697 assert_return(tid, -EINVAL);
3698 assert_return(!bus_pid_changed(b), -ECHILD);
3706 return sd_event_get_tid(b->event, tid);
3711 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3712 _cleanup_free_ char *e = NULL;
3715 assert_return(object_path_is_valid(prefix), -EINVAL);
3716 assert_return(external_id, -EINVAL);
3717 assert_return(ret_path, -EINVAL);
3719 e = bus_label_escape(external_id);
3723 ret = strjoin(prefix, "/", e);
3731 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3735 assert_return(object_path_is_valid(path), -EINVAL);
3736 assert_return(object_path_is_valid(prefix), -EINVAL);
3737 assert_return(external_id, -EINVAL);
3739 e = object_path_startswith(path, prefix);
3741 *external_id = NULL;
3745 ret = bus_label_unescape(e);
3753 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3754 _cleanup_strv_free_ char **labels = NULL;
3755 char *path, *path_pos, **label_pos;
3756 const char *sep, *template_pos;
3761 assert_return(out, -EINVAL);
3762 assert_return(path_template, -EINVAL);
3764 path_length = strlen(path_template);
3766 va_start(list, path_template);
3767 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3771 arg = va_arg(list, const char *);
3777 label = bus_label_escape(arg);
3783 r = strv_consume(&labels, label);
3789 /* add label length, but account for the format character */
3790 path_length += strlen(label) - 1;
3794 path = malloc(path_length + 1);
3801 for (template_pos = path_template; *template_pos; ) {
3802 sep = strchrnul(template_pos, '%');
3803 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3807 path_pos = stpcpy(path_pos, *label_pos++);
3808 template_pos = sep + 1;
3816 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3817 _cleanup_strv_free_ char **labels = NULL;
3818 const char *template_pos, *path_pos;
3824 * This decodes an object-path based on a template argument. The
3825 * template consists of a verbatim path, optionally including special
3828 * - Each occurrence of '%' in the template matches an arbitrary
3829 * substring of a label in the given path. At most one such
3830 * directive is allowed per label. For each such directive, the
3831 * caller must provide an output parameter (char **) via va_arg. If
3832 * NULL is passed, the given label is verified, but not returned.
3833 * For each matched label, the *decoded* label is stored in the
3834 * passed output argument, and the caller is responsible to free
3835 * it. Note that the output arguments are only modified if the
3836 * actualy path matched the template. Otherwise, they're left
3839 * This function returns <0 on error, 0 if the path does not match the
3840 * template, 1 if it matched.
3843 assert_return(path, -EINVAL);
3844 assert_return(path_template, -EINVAL);
3848 for (template_pos = path_template; *template_pos; ) {
3853 /* verify everything until the next '%' matches verbatim */
3854 sep = strchrnul(template_pos, '%');
3855 length = sep - template_pos;
3856 if (strncmp(path_pos, template_pos, length))
3860 template_pos += length;
3865 /* We found the next '%' character. Everything up until here
3866 * matched. We now skip ahead to the end of this label and make
3867 * sure it matches the tail of the label in the path. Then we
3868 * decode the string in-between and save it for later use. */
3870 ++template_pos; /* skip over '%' */
3872 sep = strchrnul(template_pos, '/');
3873 length = sep - template_pos; /* length of suffix to match verbatim */
3875 /* verify the suffixes match */
3876 sep = strchrnul(path_pos, '/');
3877 if (sep - path_pos < (ssize_t)length ||
3878 strncmp(sep - length, template_pos, length))
3881 template_pos += length; /* skip over matched label */
3882 length = sep - path_pos - length; /* length of sub-label to decode */
3884 /* store unescaped label for later use */
3885 label = bus_label_unescape_n(path_pos, length);
3889 r = strv_consume(&labels, label);
3893 path_pos = sep; /* skip decoded label and suffix */
3896 /* end of template must match end of path */
3900 /* copy the labels over to the caller */
3901 va_start(list, path_template);
3902 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3905 arg = va_arg(list, char **);
3913 labels = mfree(labels);
3917 _public_ int sd_bus_try_close(sd_bus *bus) {
3918 assert_return(bus, -EINVAL);
3919 assert_return(bus = bus_resolve(bus), -ENOPKG);
3920 assert_return(!bus_pid_changed(bus), -ECHILD);
3925 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3926 assert_return(bus, -EINVAL);
3927 assert_return(bus = bus_resolve(bus), -ENOPKG);
3928 assert_return(description, -EINVAL);
3929 assert_return(bus->description, -ENXIO);
3930 assert_return(!bus_pid_changed(bus), -ECHILD);
3932 *description = bus->description;
3936 int bus_get_root_path(sd_bus *bus) {
3939 if (bus->cgroup_root)
3942 r = cg_get_root_path(&bus->cgroup_root);
3944 bus->cgroup_root = strdup("/");
3945 if (!bus->cgroup_root)
3954 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3955 assert_return(bus, -EINVAL);
3956 assert_return(bus = bus_resolve(bus), -ENOPKG);
3957 assert_return(scope, -EINVAL);
3958 assert_return(!bus_pid_changed(bus), -ECHILD);
3965 if (bus->is_system) {
3973 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3975 assert_return(bus, -EINVAL);
3976 assert_return(bus = bus_resolve(bus), -ENOPKG);
3977 assert_return(address, -EINVAL);
3978 assert_return(!bus_pid_changed(bus), -ECHILD);
3981 *address = bus->address;
3988 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3989 assert_return(bus, -EINVAL);
3990 assert_return(bus = bus_resolve(bus), -ENOPKG);
3991 assert_return(mask, -EINVAL);
3992 assert_return(!bus_pid_changed(bus), -ECHILD);
3994 *mask = bus->creds_mask;
3998 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3999 assert_return(bus, -EINVAL);
4000 assert_return(bus = bus_resolve(bus), -ENOPKG);
4001 assert_return(!bus_pid_changed(bus), -ECHILD);
4003 return bus->bus_client;
4006 _public_ int sd_bus_is_server(sd_bus *bus) {
4007 assert_return(bus, -EINVAL);
4008 assert_return(bus = bus_resolve(bus), -ENOPKG);
4009 assert_return(!bus_pid_changed(bus), -ECHILD);
4011 return bus->is_server;
4014 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
4015 assert_return(bus, -EINVAL);
4016 assert_return(bus = bus_resolve(bus), -ENOPKG);
4017 assert_return(!bus_pid_changed(bus), -ECHILD);
4019 return bus->anonymous_auth;
4022 _public_ int sd_bus_is_trusted(sd_bus *bus) {
4023 assert_return(bus, -EINVAL);
4024 assert_return(bus = bus_resolve(bus), -ENOPKG);
4025 assert_return(!bus_pid_changed(bus), -ECHILD);
4027 return bus->trusted;
4030 _public_ int sd_bus_is_monitor(sd_bus *bus) {
4031 assert_return(bus, -EINVAL);
4032 assert_return(bus = bus_resolve(bus), -ENOPKG);
4033 assert_return(!bus_pid_changed(bus), -ECHILD);
4035 return bus->is_monitor;
4038 static void flush_close(sd_bus *bus) {
4042 /* Flushes and closes the specified bus. We take a ref before,
4043 * to ensure the flushing does not cause the bus to be
4046 sd_bus_flush_close_unref(sd_bus_ref(bus));
4049 _public_ void sd_bus_default_flush_close(void) {
4050 flush_close(default_starter_bus);
4051 #if 0 /// elogind does not support user buses
4052 flush_close(default_user_bus);
4054 flush_close(default_system_bus);
4057 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
4058 assert_return(bus, -EINVAL);
4059 assert_return(bus = bus_resolve(bus), -ENOPKG);
4061 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4062 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4063 * from the client side. */
4064 bus->exit_on_disconnect = b;
4066 /* If the exit condition was triggered already, exit immediately. */
4067 return bus_exit_now(bus);
4070 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
4071 assert_return(bus, -EINVAL);
4072 assert_return(bus = bus_resolve(bus), -ENOPKG);
4074 return bus->exit_on_disconnect;
4077 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4078 assert_return(bus, -EINVAL);
4079 assert_return(bus = bus_resolve(bus), -ENOPKG);
4080 assert_return(!bus->bus_client, -EPERM);
4081 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4083 return free_and_strdup(&bus->patch_sender, sender);
4086 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4087 assert_return(bus, -EINVAL);
4088 assert_return(bus = bus_resolve(bus), -ENOPKG);
4089 assert_return(ret, -EINVAL);
4091 if (!bus->patch_sender)
4094 *ret = bus->patch_sender;