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)
1360 _public_ int sd_bus_open_user(sd_bus **ret) {
1361 #if 0 /// elogind does not support user buses
1365 assert_return(ret, -EINVAL);
1371 r = bus_set_address_user(b);
1375 b->bus_client = true;
1378 /* We don't do any per-method access control on the user
1383 r = sd_bus_start(b);
1394 return sd_bus_open_system(ret);
1398 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1399 _cleanup_free_ char *e = NULL;
1400 char *m = NULL, *c = NULL, *a;
1405 /* Let's see if we shall enter some container */
1406 m = strchr(host, ':');
1410 /* Let's make sure this is not a port of some kind,
1411 * and is a valid machine name. */
1412 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1415 /* Cut out the host part */
1416 t = strndupa(host, m - host - 1);
1417 e = bus_address_escape(t);
1421 c = strjoina(",argv5=--machine=", m);
1426 e = bus_address_escape(host);
1431 a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=elogind-stdio-bridge", c);
1435 free_and_replace(b->address, a);
1440 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1444 assert_return(host, -EINVAL);
1445 assert_return(ret, -EINVAL);
1447 r = sd_bus_new(&bus);
1451 r = bus_set_address_system_remote(bus, host);
1455 bus->bus_client = true;
1456 bus->trusted = false;
1457 bus->is_system = true;
1458 bus->is_local = false;
1460 r = sd_bus_start(bus);
1472 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1473 _cleanup_free_ char *e = NULL;
1479 e = bus_address_escape(machine);
1483 a = strjoin("x-machine-unix:machine=", e);
1487 free_and_replace(b->address, a);
1492 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1496 assert_return(machine, -EINVAL);
1497 assert_return(ret, -EINVAL);
1498 assert_return(machine_name_is_valid(machine), -EINVAL);
1500 r = sd_bus_new(&bus);
1504 r = bus_set_address_system_machine(bus, machine);
1508 bus->bus_client = true;
1509 bus->trusted = false;
1510 bus->is_system = true;
1511 bus->is_local = false;
1513 r = sd_bus_start(bus);
1525 _public_ void sd_bus_close(sd_bus *bus) {
1529 if (bus->state == BUS_CLOSED)
1531 if (bus_pid_changed(bus))
1534 /* Don't leave ssh hanging around */
1537 bus_set_state(bus, BUS_CLOSED);
1539 sd_bus_detach_event(bus);
1541 /* Drop all queued messages so that they drop references to
1542 * the bus object and the bus may be freed */
1543 bus_reset_queues(bus);
1545 bus_close_io_fds(bus);
1546 bus_close_inotify_fd(bus);
1549 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1554 /* Have to do this before flush() to prevent hang */
1560 return sd_bus_unref(bus);
1563 void bus_enter_closing(sd_bus *bus) {
1566 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1569 bus_set_state(bus, BUS_CLOSING);
1572 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1577 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1582 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1588 i = REFCNT_DEC(bus->n_ref);
1596 _public_ int sd_bus_is_open(sd_bus *bus) {
1598 assert_return(bus, -EINVAL);
1599 assert_return(bus = bus_resolve(bus), -ENOPKG);
1600 assert_return(!bus_pid_changed(bus), -ECHILD);
1602 return BUS_IS_OPEN(bus->state);
1605 _public_ int sd_bus_is_ready(sd_bus *bus) {
1606 assert_return(bus, -EINVAL);
1607 assert_return(bus = bus_resolve(bus), -ENOPKG);
1608 assert_return(!bus_pid_changed(bus), -ECHILD);
1610 return bus->state == BUS_RUNNING;
1613 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1616 assert_return(bus, -EINVAL);
1617 assert_return(bus = bus_resolve(bus), -ENOPKG);
1618 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1619 assert_return(!bus_pid_changed(bus), -ECHILD);
1621 if (bus->is_monitor)
1624 if (type == SD_BUS_TYPE_UNIX_FD) {
1625 if (!bus->accept_fd)
1628 r = bus_ensure_running(bus);
1632 return bus->can_fds;
1635 return bus_type_is_valid(type);
1638 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1641 assert_return(bus, -EINVAL);
1642 assert_return(bus = bus_resolve(bus), -ENOPKG);
1643 assert_return(id, -EINVAL);
1644 assert_return(!bus_pid_changed(bus), -ECHILD);
1646 r = bus_ensure_running(bus);
1650 *id = bus->server_id;
1654 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1661 /* If we copy the same message to multiple
1662 * destinations, avoid using the same cookie
1664 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1669 timeout = BUS_DEFAULT_TIMEOUT;
1671 if (!m->sender && b->patch_sender) {
1672 r = sd_bus_message_set_sender(m, b->patch_sender);
1677 return sd_bus_message_seal(m, ++b->cookie, timeout);
1680 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1681 bool remarshal = false;
1685 /* wrong packet version */
1686 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1689 /* wrong packet endianness */
1690 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1693 return remarshal ? bus_message_remarshal(b, m) : 0;
1696 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1700 /* Fake some timestamps, if they were requested, and not
1701 * already initialized */
1702 if (b->attach_timestamp) {
1703 if (m->realtime <= 0)
1704 m->realtime = now(CLOCK_REALTIME);
1706 if (m->monotonic <= 0)
1707 m->monotonic = now(CLOCK_MONOTONIC);
1710 /* The bus specification says the serial number cannot be 0,
1711 * hence let's fill something in for synthetic messages. Since
1712 * synthetic messages might have a fake sender and we don't
1713 * want to interfere with the real sender's serial numbers we
1714 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1715 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1716 * even though kdbus can do 64bit. */
1717 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1720 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1726 r = bus_socket_write_message(bus, m, idx);
1730 if (*idx >= BUS_MESSAGE_SIZE(m))
1731 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",
1732 bus_message_type_to_string(m->header->type),
1733 strna(sd_bus_message_get_sender(m)),
1734 strna(sd_bus_message_get_destination(m)),
1735 strna(sd_bus_message_get_path(m)),
1736 strna(sd_bus_message_get_interface(m)),
1737 strna(sd_bus_message_get_member(m)),
1738 BUS_MESSAGE_COOKIE(m),
1740 strna(m->root_container.signature),
1741 strna(m->error.name),
1742 strna(m->error.message));
1747 static int dispatch_wqueue(sd_bus *bus) {
1751 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1753 while (bus->wqueue_size > 0) {
1755 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1759 /* Didn't do anything this time */
1761 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1762 /* Fully written. Let's drop the entry from
1765 * This isn't particularly optimized, but
1766 * well, this is supposed to be our worst-case
1767 * buffer only, and the socket buffer is
1768 * supposed to be our primary buffer, and if
1769 * it got full, then all bets are off
1773 sd_bus_message_unref(bus->wqueue[0]);
1774 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1784 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1787 return bus_socket_read_message(bus);
1790 int bus_rqueue_make_room(sd_bus *bus) {
1793 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1796 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1802 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1807 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1809 /* Note that the priority logic is only available on kdbus,
1810 * where the rqueue is unused. We check the rqueue here
1811 * anyway, because it's simple... */
1814 if (bus->rqueue_size > 0) {
1815 /* Dispatch a queued message */
1817 *m = bus->rqueue[0];
1819 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1823 /* Try to read a new message */
1824 r = bus_read_message(bus, hint_priority, priority);
1834 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1835 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1838 assert_return(m, -EINVAL);
1843 assert_return(!bus_pid_changed(bus), -ECHILD);
1845 if (!BUS_IS_OPEN(bus->state))
1849 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1856 /* If the cookie number isn't kept, then we know that no reply
1858 if (!cookie && !m->sealed)
1859 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1861 r = bus_seal_message(bus, m, 0);
1865 /* Remarshall if we have to. This will possibly unref the
1866 * message and place a replacement in m */
1867 r = bus_remarshal_message(bus, &m);
1871 /* If this is a reply and no reply was requested, then let's
1872 * suppress this, if we can */
1876 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1879 r = bus_write_message(bus, m, &idx);
1881 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1882 bus_enter_closing(bus);
1889 if (idx < BUS_MESSAGE_SIZE(m)) {
1890 /* Wasn't fully written. So let's remember how
1891 * much was written. Note that the first entry
1892 * of the wqueue array is always allocated so
1893 * that we always can remember how much was
1895 bus->wqueue[0] = sd_bus_message_ref(m);
1896 bus->wqueue_size = 1;
1901 /* Just append it to the queue. */
1903 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1906 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1909 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1914 *cookie = BUS_MESSAGE_COOKIE(m);
1919 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1922 assert_return(m, -EINVAL);
1927 assert_return(!bus_pid_changed(bus), -ECHILD);
1929 if (!BUS_IS_OPEN(bus->state))
1932 if (!streq_ptr(m->destination, destination)) {
1937 r = sd_bus_message_set_destination(m, destination);
1942 return sd_bus_send(bus, m, cookie);
1945 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1948 if (usec == (uint64_t) -1)
1951 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1952 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1953 * relative timestamp, and afterwards the absolute one. */
1955 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1958 return now(CLOCK_MONOTONIC) + usec;
1961 static int timeout_compare(const void *a, const void *b) {
1962 const struct reply_callback *x = a, *y = b;
1964 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1967 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1970 if (x->timeout_usec < y->timeout_usec)
1973 if (x->timeout_usec > y->timeout_usec)
1979 _public_ int sd_bus_call_async(
1983 sd_bus_message_handler_t callback,
1987 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1988 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1991 assert_return(m, -EINVAL);
1992 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1993 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
1998 assert_return(!bus_pid_changed(bus), -ECHILD);
2000 if (!BUS_IS_OPEN(bus->state))
2003 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
2004 if (!callback && !slot && !m->sealed)
2005 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
2007 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
2011 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
2015 r = bus_seal_message(bus, m, usec);
2019 r = bus_remarshal_message(bus, &m);
2023 if (slot || callback) {
2024 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
2028 s->reply_callback.callback = callback;
2030 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
2031 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
2033 s->reply_callback.cookie = 0;
2037 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
2038 if (s->reply_callback.timeout_usec != 0) {
2039 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
2041 s->reply_callback.timeout_usec = 0;
2047 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
2058 int bus_ensure_running(sd_bus *bus) {
2063 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
2065 if (bus->state == BUS_RUNNING)
2069 r = sd_bus_process(bus, NULL);
2072 if (bus->state == BUS_RUNNING)
2077 r = sd_bus_wait(bus, (uint64_t) -1);
2083 _public_ int sd_bus_call(
2087 sd_bus_error *error,
2088 sd_bus_message **reply) {
2090 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2096 bus_assert_return(m, -EINVAL, error);
2097 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2098 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2099 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2104 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2106 if (!BUS_IS_OPEN(bus->state)) {
2111 r = bus_ensure_running(bus);
2115 i = bus->rqueue_size;
2117 r = bus_seal_message(bus, m, usec);
2121 r = bus_remarshal_message(bus, &m);
2125 r = sd_bus_send(bus, m, &cookie);
2129 timeout = calc_elapse(bus, m->timeout);
2134 while (i < bus->rqueue_size) {
2135 sd_bus_message *incoming = NULL;
2137 incoming = bus->rqueue[i];
2139 if (incoming->reply_cookie == cookie) {
2140 /* Found a match! */
2142 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2144 log_debug_bus_message(incoming);
2146 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2148 if (incoming->n_fds <= 0 || bus->accept_fd) {
2152 sd_bus_message_unref(incoming);
2157 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2158 sd_bus_message_unref(incoming);
2161 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2162 r = sd_bus_error_copy(error, &incoming->error);
2163 sd_bus_message_unref(incoming);
2170 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2173 streq(bus->unique_name, incoming->sender)) {
2175 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2178 /* Our own message? Somebody is trying
2179 * to send its own client a message,
2180 * let's not dead-lock, let's fail
2183 sd_bus_message_unref(incoming);
2188 /* Try to read more, right-away */
2192 r = bus_read_message(bus, false, 0);
2194 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2195 bus_enter_closing(bus);
2207 n = now(CLOCK_MONOTONIC);
2215 left = (uint64_t) -1;
2217 r = bus_poll(bus, true, left);
2225 r = dispatch_wqueue(bus);
2227 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2228 bus_enter_closing(bus);
2237 return sd_bus_error_set_errno(error, r);
2240 _public_ int sd_bus_get_fd(sd_bus *bus) {
2242 assert_return(bus, -EINVAL);
2243 assert_return(bus = bus_resolve(bus), -ENOPKG);
2244 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2245 assert_return(!bus_pid_changed(bus), -ECHILD);
2247 if (bus->state == BUS_CLOSED)
2250 if (bus->inotify_fd >= 0)
2251 return bus->inotify_fd;
2253 if (bus->input_fd >= 0)
2254 return bus->input_fd;
2259 _public_ int sd_bus_get_events(sd_bus *bus) {
2262 assert_return(bus, -EINVAL);
2263 assert_return(bus = bus_resolve(bus), -ENOPKG);
2264 assert_return(!bus_pid_changed(bus), -ECHILD);
2266 switch (bus->state) {
2272 case BUS_WATCH_BIND:
2280 case BUS_AUTHENTICATING:
2281 if (bus_socket_auth_needs_write(bus))
2289 if (bus->rqueue_size <= 0)
2291 if (bus->wqueue_size > 0)
2299 assert_not_reached("Unknown state");
2305 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2306 struct reply_callback *c;
2308 assert_return(bus, -EINVAL);
2309 assert_return(bus = bus_resolve(bus), -ENOPKG);
2310 assert_return(timeout_usec, -EINVAL);
2311 assert_return(!bus_pid_changed(bus), -ECHILD);
2313 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2316 if (bus->track_queue) {
2321 switch (bus->state) {
2323 case BUS_AUTHENTICATING:
2324 *timeout_usec = bus->auth_timeout;
2329 if (bus->rqueue_size > 0) {
2334 c = prioq_peek(bus->reply_callbacks_prioq);
2336 *timeout_usec = (uint64_t) -1;
2340 if (c->timeout_usec == 0) {
2341 *timeout_usec = (uint64_t) -1;
2345 *timeout_usec = c->timeout_usec;
2352 case BUS_WATCH_BIND:
2354 *timeout_usec = (uint64_t) -1;
2358 assert_not_reached("Unknown or unexpected stat");
2362 static int process_timeout(sd_bus *bus) {
2363 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2364 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2365 struct reply_callback *c;
2372 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2374 c = prioq_peek(bus->reply_callbacks_prioq);
2378 n = now(CLOCK_MONOTONIC);
2379 if (c->timeout_usec > n)
2382 r = bus_message_new_synthetic_error(
2385 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2390 r = bus_seal_synthetic_message(bus, m);
2394 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2395 c->timeout_usec = 0;
2397 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2400 slot = container_of(c, sd_bus_slot, reply_callback);
2402 bus->iteration_counter++;
2404 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2406 bus->current_message = m;
2407 bus->current_slot = sd_bus_slot_ref(slot);
2408 bus->current_handler = c->callback;
2409 bus->current_userdata = slot->userdata;
2410 r = c->callback(m, slot->userdata, &error_buffer);
2411 bus->current_userdata = NULL;
2412 bus->current_handler = NULL;
2413 bus->current_slot = NULL;
2414 bus->current_message = NULL;
2416 if (slot->floating) {
2417 bus_slot_disconnect(slot);
2418 sd_bus_slot_unref(slot);
2421 sd_bus_slot_unref(slot);
2423 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2424 * and ignore the callback handler's return value. */
2428 return bus_maybe_reply_error(m, r, &error_buffer);
2431 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2435 if (bus->state != BUS_HELLO)
2438 /* Let's make sure the first message on the bus is the HELLO
2439 * reply. But note that we don't actually parse the message
2440 * here (we leave that to the usual handling), we just verify
2441 * we don't let any earlier msg through. */
2443 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2446 if (m->reply_cookie != 1)
2452 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2453 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2454 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2455 struct reply_callback *c;
2463 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2466 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2469 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2475 slot = container_of(c, sd_bus_slot, reply_callback);
2477 if (m->n_fds > 0 && !bus->accept_fd) {
2479 /* If the reply contained a file descriptor which we
2480 * didn't want we pass an error instead. */
2482 r = bus_message_new_synthetic_error(
2485 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2490 /* Copy over original timestamp */
2491 synthetic_reply->realtime = m->realtime;
2492 synthetic_reply->monotonic = m->monotonic;
2493 synthetic_reply->seqnum = m->seqnum;
2495 r = bus_seal_synthetic_message(bus, synthetic_reply);
2499 m = synthetic_reply;
2501 r = sd_bus_message_rewind(m, true);
2506 if (c->timeout_usec != 0) {
2507 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2508 c->timeout_usec = 0;
2511 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2513 bus->current_slot = sd_bus_slot_ref(slot);
2514 bus->current_handler = c->callback;
2515 bus->current_userdata = slot->userdata;
2516 r = c->callback(m, slot->userdata, &error_buffer);
2517 bus->current_userdata = NULL;
2518 bus->current_handler = NULL;
2519 bus->current_slot = NULL;
2521 if (slot->floating) {
2522 bus_slot_disconnect(slot);
2523 sd_bus_slot_unref(slot);
2526 sd_bus_slot_unref(slot);
2528 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2529 * ignore the callback handler's return value. */
2533 return bus_maybe_reply_error(m, r, &error_buffer);
2536 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2537 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2538 struct filter_callback *l;
2545 bus->filter_callbacks_modified = false;
2547 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2550 if (bus->filter_callbacks_modified)
2553 /* Don't run this more than once per iteration */
2554 if (l->last_iteration == bus->iteration_counter)
2557 l->last_iteration = bus->iteration_counter;
2559 r = sd_bus_message_rewind(m, true);
2563 slot = container_of(l, sd_bus_slot, filter_callback);
2565 bus->current_slot = sd_bus_slot_ref(slot);
2566 bus->current_handler = l->callback;
2567 bus->current_userdata = slot->userdata;
2568 r = l->callback(m, slot->userdata, &error_buffer);
2569 bus->current_userdata = NULL;
2570 bus->current_handler = NULL;
2571 bus->current_slot = sd_bus_slot_unref(slot);
2573 r = bus_maybe_reply_error(m, r, &error_buffer);
2579 } while (bus->filter_callbacks_modified);
2584 static int process_match(sd_bus *bus, sd_bus_message *m) {
2591 bus->match_callbacks_modified = false;
2593 r = bus_match_run(bus, &bus->match_callbacks, m);
2597 } while (bus->match_callbacks_modified);
2602 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2603 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2609 if (bus->is_monitor)
2612 if (bus->manual_peer_interface)
2615 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2618 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2621 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2624 if (streq_ptr(m->member, "Ping"))
2625 r = sd_bus_message_new_method_return(m, &reply);
2626 else if (streq_ptr(m->member, "GetMachineId")) {
2630 r = sd_id128_get_machine(&id);
2634 r = sd_bus_message_new_method_return(m, &reply);
2638 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2640 r = sd_bus_message_new_method_errorf(
2642 SD_BUS_ERROR_UNKNOWN_METHOD,
2643 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2649 r = sd_bus_send(bus, reply, NULL);
2656 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2660 /* If we got a message with a file descriptor which we didn't
2661 * want to accept, then let's drop it. How can this even
2662 * happen? For example, when the kernel queues a message into
2663 * an activatable names's queue which allows fds, and then is
2664 * delivered to us later even though we ourselves did not
2667 if (bus->is_monitor)
2676 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2677 return 1; /* just eat it up */
2679 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2682 static int process_message(sd_bus *bus, sd_bus_message *m) {
2688 bus->current_message = m;
2689 bus->iteration_counter++;
2691 log_debug_bus_message(m);
2693 r = process_hello(bus, m);
2697 r = process_reply(bus, m);
2701 r = process_fd_check(bus, m);
2705 r = process_filter(bus, m);
2709 r = process_match(bus, m);
2713 r = process_builtin(bus, m);
2717 r = bus_process_object(bus, m);
2720 bus->current_message = NULL;
2724 static int dispatch_track(sd_bus *bus) {
2727 if (!bus->track_queue)
2730 bus_track_dispatch(bus->track_queue);
2734 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2735 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2739 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2741 r = process_timeout(bus);
2745 r = dispatch_wqueue(bus);
2749 r = dispatch_track(bus);
2753 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2759 r = process_message(bus, m);
2764 r = sd_bus_message_rewind(m, true);
2773 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2775 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2776 strna(sd_bus_message_get_sender(m)),
2777 strna(sd_bus_message_get_path(m)),
2778 strna(sd_bus_message_get_interface(m)),
2779 strna(sd_bus_message_get_member(m)));
2781 r = sd_bus_reply_method_errorf(
2783 SD_BUS_ERROR_UNKNOWN_OBJECT,
2784 "Unknown object '%s'.", m->path);
2798 static int bus_exit_now(sd_bus *bus) {
2801 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2802 * sd_event_exit(), otherwise invokes libc exit(). */
2804 if (bus->exited) /* did we already exit? */
2806 if (!bus->exit_triggered) /* was the exit condition triggered? */
2808 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2811 bus->exited = true; /* never exit more than once */
2813 log_debug("Bus connection disconnected, exiting.");
2816 return sd_event_exit(bus->event, EXIT_FAILURE);
2820 assert_not_reached("exit() didn't exit?");
2823 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2824 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2825 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2832 r = bus_message_new_synthetic_error(
2835 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2840 r = bus_seal_synthetic_message(bus, m);
2844 if (c->timeout_usec != 0) {
2845 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2846 c->timeout_usec = 0;
2849 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2852 slot = container_of(c, sd_bus_slot, reply_callback);
2854 bus->iteration_counter++;
2856 bus->current_message = m;
2857 bus->current_slot = sd_bus_slot_ref(slot);
2858 bus->current_handler = c->callback;
2859 bus->current_userdata = slot->userdata;
2860 r = c->callback(m, slot->userdata, &error_buffer);
2861 bus->current_userdata = NULL;
2862 bus->current_handler = NULL;
2863 bus->current_slot = NULL;
2864 bus->current_message = NULL;
2866 if (slot->floating) {
2867 bus_slot_disconnect(slot);
2868 sd_bus_slot_unref(slot);
2871 sd_bus_slot_unref(slot);
2873 return bus_maybe_reply_error(m, r, &error_buffer);
2876 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2877 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2878 struct reply_callback *c;
2882 assert(bus->state == BUS_CLOSING);
2884 /* First, fail all outstanding method calls */
2885 c = ordered_hashmap_first(bus->reply_callbacks);
2887 return process_closing_reply_callback(bus, c);
2889 /* Then, fake-drop all remaining bus tracking references */
2891 bus_track_close(bus->tracks);
2895 /* Then, synthesize a Disconnected message */
2896 r = sd_bus_message_new_signal(
2899 "/org/freedesktop/DBus/Local",
2900 "org.freedesktop.DBus.Local",
2905 bus_message_set_sender_local(bus, m);
2907 r = bus_seal_synthetic_message(bus, m);
2913 bus->current_message = m;
2914 bus->iteration_counter++;
2916 r = process_filter(bus, m);
2920 r = process_match(bus, m);
2924 /* Nothing else to do, exit now, if the condition holds */
2925 bus->exit_triggered = true;
2926 (void) bus_exit_now(bus);
2936 bus->current_message = NULL;
2941 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2942 BUS_DONT_DESTROY(bus);
2945 /* Returns 0 when we didn't do anything. This should cause the
2946 * caller to invoke sd_bus_wait() before returning the next
2947 * time. Returns > 0 when we did something, which possibly
2948 * means *ret is filled in with an unprocessed message. */
2950 assert_return(bus, -EINVAL);
2951 assert_return(bus = bus_resolve(bus), -ENOPKG);
2952 assert_return(!bus_pid_changed(bus), -ECHILD);
2954 /* We don't allow recursively invoking sd_bus_process(). */
2955 assert_return(!bus->current_message, -EBUSY);
2956 assert(!bus->current_slot);
2958 switch (bus->state) {
2966 case BUS_WATCH_BIND:
2967 r = bus_socket_process_watch_bind(bus);
2971 r = bus_socket_process_opening(bus);
2974 case BUS_AUTHENTICATING:
2975 r = bus_socket_process_authenticating(bus);
2980 r = process_running(bus, hint_priority, priority, ret);
2984 /* This branch initializes *ret, hence we don't use the generic error checking below */
2988 return process_closing(bus, ret);
2991 assert_not_reached("Unknown state");
2994 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2995 bus_enter_closing(bus);
3006 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
3007 return bus_process_internal(bus, false, 0, ret);
3010 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
3011 return bus_process_internal(bus, true, priority, ret);
3014 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
3015 struct pollfd p[2] = {};
3018 usec_t m = USEC_INFINITY;
3022 if (bus->state == BUS_CLOSING)
3025 if (!BUS_IS_OPEN(bus->state))
3028 if (bus->state == BUS_WATCH_BIND) {
3029 assert(bus->inotify_fd >= 0);
3031 p[0].events = POLLIN;
3032 p[0].fd = bus->inotify_fd;
3037 e = sd_bus_get_events(bus);
3042 /* The caller really needs some more data, he doesn't
3043 * care about what's already read, or any timeouts
3044 * except its own. */
3048 /* The caller wants to process if there's something to
3049 * process, but doesn't care otherwise */
3051 r = sd_bus_get_timeout(bus, &until);
3055 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
3058 p[0].fd = bus->input_fd;
3059 if (bus->output_fd == bus->input_fd) {
3063 p[0].events = e & POLLIN;
3064 p[1].fd = bus->output_fd;
3065 p[1].events = e & POLLOUT;
3070 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
3073 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
3077 return r > 0 ? 1 : 0;
3080 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
3082 assert_return(bus, -EINVAL);
3083 assert_return(bus = bus_resolve(bus), -ENOPKG);
3084 assert_return(!bus_pid_changed(bus), -ECHILD);
3086 if (bus->state == BUS_CLOSING)
3089 if (!BUS_IS_OPEN(bus->state))
3092 if (bus->rqueue_size > 0)
3095 return bus_poll(bus, false, timeout_usec);
3098 _public_ int sd_bus_flush(sd_bus *bus) {
3101 assert_return(bus, -EINVAL);
3102 assert_return(bus = bus_resolve(bus), -ENOPKG);
3103 assert_return(!bus_pid_changed(bus), -ECHILD);
3105 if (bus->state == BUS_CLOSING)
3108 if (!BUS_IS_OPEN(bus->state))
3111 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3112 if (bus->state == BUS_WATCH_BIND)
3115 r = bus_ensure_running(bus);
3119 if (bus->wqueue_size <= 0)
3123 r = dispatch_wqueue(bus);
3125 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3126 bus_enter_closing(bus);
3133 if (bus->wqueue_size <= 0)
3136 r = bus_poll(bus, false, (uint64_t) -1);
3142 _public_ int sd_bus_add_filter(
3145 sd_bus_message_handler_t callback,
3150 assert_return(bus, -EINVAL);
3151 assert_return(bus = bus_resolve(bus), -ENOPKG);
3152 assert_return(callback, -EINVAL);
3153 assert_return(!bus_pid_changed(bus), -ECHILD);
3155 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3159 s->filter_callback.callback = callback;
3161 bus->filter_callbacks_modified = true;
3162 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3170 static int add_match_callback(
3173 sd_bus_error *ret_error) {
3175 sd_bus_slot *match_slot = userdata;
3176 bool failed = false;
3182 sd_bus_slot_ref(match_slot);
3184 if (sd_bus_message_is_method_error(m, NULL)) {
3185 log_debug_errno(sd_bus_message_get_errno(m),
3186 "Unable to add match %s, failing connection: %s",
3187 match_slot->match_callback.match_string,
3188 sd_bus_message_get_error(m)->message);
3192 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3194 if (match_slot->match_callback.install_callback) {
3197 bus = sd_bus_message_get_bus(m);
3199 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3200 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3203 assert(bus->current_slot == match_slot->match_callback.install_slot);
3204 assert(bus->current_handler == add_match_callback);
3205 assert(bus->current_userdata == userdata);
3207 bus->current_slot = match_slot;
3208 bus->current_handler = match_slot->match_callback.install_callback;
3209 bus->current_userdata = match_slot->userdata;
3211 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3213 bus->current_slot = match_slot->match_callback.install_slot;
3214 bus->current_handler = add_match_callback;
3215 bus->current_userdata = userdata;
3217 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3219 if (failed) /* Generic failure handling: destroy the connection */
3220 bus_enter_closing(sd_bus_message_get_bus(m));
3225 if (failed && match_slot->floating) {
3226 bus_slot_disconnect(match_slot);
3227 sd_bus_slot_unref(match_slot);
3230 sd_bus_slot_unref(match_slot);
3235 static int bus_add_match_full(
3240 sd_bus_message_handler_t callback,
3241 sd_bus_message_handler_t install_callback,
3244 struct bus_match_component *components = NULL;
3245 unsigned n_components = 0;
3246 sd_bus_slot *s = NULL;
3249 assert_return(bus, -EINVAL);
3250 assert_return(bus = bus_resolve(bus), -ENOPKG);
3251 assert_return(match, -EINVAL);
3252 assert_return(!bus_pid_changed(bus), -ECHILD);
3254 r = bus_match_parse(match, &components, &n_components);
3258 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3264 s->match_callback.callback = callback;
3265 s->match_callback.install_callback = install_callback;
3267 if (bus->bus_client) {
3268 enum bus_match_scope scope;
3270 scope = bus_match_get_scope(components, n_components);
3272 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3273 if (scope != BUS_MATCH_LOCAL) {
3275 /* We store the original match string, so that we can use it to remove the match again. */
3277 s->match_callback.match_string = strdup(match);
3278 if (!s->match_callback.match_string) {
3284 r = bus_add_match_internal_async(bus,
3285 &s->match_callback.install_slot,
3286 s->match_callback.match_string,
3290 r = bus_add_match_internal(bus, s->match_callback.match_string);
3294 s->match_added = true;
3298 bus->match_callbacks_modified = true;
3299 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3308 bus_match_parse_free(components, n_components);
3309 sd_bus_slot_unref(s);
3314 #if 0 /// UNNEEDED by elogind
3316 _public_ int sd_bus_add_match(
3320 sd_bus_message_handler_t callback,
3323 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3326 _public_ int sd_bus_add_match_async(
3330 sd_bus_message_handler_t callback,
3331 sd_bus_message_handler_t install_callback,
3334 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3337 bool bus_pid_changed(sd_bus *bus) {
3340 /* We don't support people creating a bus connection and
3341 * keeping it around over a fork(). Let's complain. */
3343 return bus->original_pid != getpid_cached();
3346 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3347 sd_bus *bus = userdata;
3352 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
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 time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3364 sd_bus *bus = userdata;
3369 r = sd_bus_process(bus, NULL);
3371 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3372 bus_enter_closing(bus);
3378 static int prepare_callback(sd_event_source *s, void *userdata) {
3379 sd_bus *bus = userdata;
3386 e = sd_bus_get_events(bus);
3392 if (bus->output_fd != bus->input_fd) {
3394 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3398 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3400 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3404 r = sd_bus_get_timeout(bus, &until);
3410 j = sd_event_source_set_time(bus->time_event_source, until);
3417 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3424 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3425 bus_enter_closing(bus);
3430 static int quit_callback(sd_event_source *event, void *userdata) {
3431 sd_bus *bus = userdata;
3441 int bus_attach_io_events(sd_bus *bus) {
3446 if (bus->input_fd < 0)
3452 if (!bus->input_io_event_source) {
3453 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3457 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3461 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3465 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3467 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3472 if (bus->output_fd != bus->input_fd) {
3473 assert(bus->output_fd >= 0);
3475 if (!bus->output_io_event_source) {
3476 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3480 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3484 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3486 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3495 static void bus_detach_io_events(sd_bus *bus) {
3498 if (bus->input_io_event_source) {
3499 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3500 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3503 if (bus->output_io_event_source) {
3504 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3505 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3509 int bus_attach_inotify_event(sd_bus *bus) {
3514 if (bus->inotify_fd < 0)
3520 if (!bus->inotify_event_source) {
3521 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3525 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3529 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3531 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3538 static void bus_detach_inotify_event(sd_bus *bus) {
3541 if (bus->inotify_event_source) {
3542 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3543 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3547 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3550 assert_return(bus, -EINVAL);
3551 assert_return(bus = bus_resolve(bus), -ENOPKG);
3552 assert_return(!bus->event, -EBUSY);
3554 assert(!bus->input_io_event_source);
3555 assert(!bus->output_io_event_source);
3556 assert(!bus->time_event_source);
3559 bus->event = sd_event_ref(event);
3561 r = sd_event_default(&bus->event);
3566 bus->event_priority = priority;
3568 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3572 r = sd_event_source_set_priority(bus->time_event_source, priority);
3576 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3580 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3584 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3588 r = bus_attach_io_events(bus);
3592 r = bus_attach_inotify_event(bus);
3599 sd_bus_detach_event(bus);
3603 _public_ int sd_bus_detach_event(sd_bus *bus) {
3604 assert_return(bus, -EINVAL);
3605 assert_return(bus = bus_resolve(bus), -ENOPKG);
3610 bus_detach_io_events(bus);
3611 bus_detach_inotify_event(bus);
3613 if (bus->time_event_source) {
3614 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3615 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3618 if (bus->quit_event_source) {
3619 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3620 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3623 bus->event = sd_event_unref(bus->event);
3627 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3628 assert_return(bus, NULL);
3633 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3634 assert_return(bus, NULL);
3636 return bus->current_message;
3639 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3640 assert_return(bus, NULL);
3642 return bus->current_slot;
3645 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3646 assert_return(bus, NULL);
3648 return bus->current_handler;
3651 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3652 assert_return(bus, NULL);
3654 return bus->current_userdata;
3657 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3662 assert(default_bus);
3665 return !!*default_bus;
3668 *ret = sd_bus_ref(*default_bus);
3676 b->default_bus_ptr = default_bus;
3684 _public_ int sd_bus_default_system(sd_bus **ret) {
3685 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3689 _public_ int sd_bus_default_user(sd_bus **ret) {
3690 #if 0 /// elogind does not support user buses
3691 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3693 return sd_bus_default_system(ret);
3697 _public_ int sd_bus_default(sd_bus **ret) {
3698 int (*bus_open)(sd_bus **) = NULL;
3701 busp = bus_choose_default(&bus_open);
3702 return bus_default(bus_open, busp, ret);
3705 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3706 assert_return(b, -EINVAL);
3707 assert_return(tid, -EINVAL);
3708 assert_return(!bus_pid_changed(b), -ECHILD);
3716 return sd_event_get_tid(b->event, tid);
3721 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3722 _cleanup_free_ char *e = NULL;
3725 assert_return(object_path_is_valid(prefix), -EINVAL);
3726 assert_return(external_id, -EINVAL);
3727 assert_return(ret_path, -EINVAL);
3729 e = bus_label_escape(external_id);
3733 ret = strjoin(prefix, "/", e);
3741 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3745 assert_return(object_path_is_valid(path), -EINVAL);
3746 assert_return(object_path_is_valid(prefix), -EINVAL);
3747 assert_return(external_id, -EINVAL);
3749 e = object_path_startswith(path, prefix);
3751 *external_id = NULL;
3755 ret = bus_label_unescape(e);
3763 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3764 _cleanup_strv_free_ char **labels = NULL;
3765 char *path, *path_pos, **label_pos;
3766 const char *sep, *template_pos;
3771 assert_return(out, -EINVAL);
3772 assert_return(path_template, -EINVAL);
3774 path_length = strlen(path_template);
3776 va_start(list, path_template);
3777 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3781 arg = va_arg(list, const char *);
3787 label = bus_label_escape(arg);
3793 r = strv_consume(&labels, label);
3799 /* add label length, but account for the format character */
3800 path_length += strlen(label) - 1;
3804 path = malloc(path_length + 1);
3811 for (template_pos = path_template; *template_pos; ) {
3812 sep = strchrnul(template_pos, '%');
3813 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3817 path_pos = stpcpy(path_pos, *label_pos++);
3818 template_pos = sep + 1;
3826 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3827 _cleanup_strv_free_ char **labels = NULL;
3828 const char *template_pos, *path_pos;
3834 * This decodes an object-path based on a template argument. The
3835 * template consists of a verbatim path, optionally including special
3838 * - Each occurrence of '%' in the template matches an arbitrary
3839 * substring of a label in the given path. At most one such
3840 * directive is allowed per label. For each such directive, the
3841 * caller must provide an output parameter (char **) via va_arg. If
3842 * NULL is passed, the given label is verified, but not returned.
3843 * For each matched label, the *decoded* label is stored in the
3844 * passed output argument, and the caller is responsible to free
3845 * it. Note that the output arguments are only modified if the
3846 * actualy path matched the template. Otherwise, they're left
3849 * This function returns <0 on error, 0 if the path does not match the
3850 * template, 1 if it matched.
3853 assert_return(path, -EINVAL);
3854 assert_return(path_template, -EINVAL);
3858 for (template_pos = path_template; *template_pos; ) {
3863 /* verify everything until the next '%' matches verbatim */
3864 sep = strchrnul(template_pos, '%');
3865 length = sep - template_pos;
3866 if (strncmp(path_pos, template_pos, length))
3870 template_pos += length;
3875 /* We found the next '%' character. Everything up until here
3876 * matched. We now skip ahead to the end of this label and make
3877 * sure it matches the tail of the label in the path. Then we
3878 * decode the string in-between and save it for later use. */
3880 ++template_pos; /* skip over '%' */
3882 sep = strchrnul(template_pos, '/');
3883 length = sep - template_pos; /* length of suffix to match verbatim */
3885 /* verify the suffixes match */
3886 sep = strchrnul(path_pos, '/');
3887 if (sep - path_pos < (ssize_t)length ||
3888 strncmp(sep - length, template_pos, length))
3891 template_pos += length; /* skip over matched label */
3892 length = sep - path_pos - length; /* length of sub-label to decode */
3894 /* store unescaped label for later use */
3895 label = bus_label_unescape_n(path_pos, length);
3899 r = strv_consume(&labels, label);
3903 path_pos = sep; /* skip decoded label and suffix */
3906 /* end of template must match end of path */
3910 /* copy the labels over to the caller */
3911 va_start(list, path_template);
3912 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3915 arg = va_arg(list, char **);
3923 labels = mfree(labels);
3927 _public_ int sd_bus_try_close(sd_bus *bus) {
3928 assert_return(bus, -EINVAL);
3929 assert_return(bus = bus_resolve(bus), -ENOPKG);
3930 assert_return(!bus_pid_changed(bus), -ECHILD);
3935 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3936 assert_return(bus, -EINVAL);
3937 assert_return(bus = bus_resolve(bus), -ENOPKG);
3938 assert_return(description, -EINVAL);
3939 assert_return(bus->description, -ENXIO);
3940 assert_return(!bus_pid_changed(bus), -ECHILD);
3942 if (bus->description)
3943 *description = bus->description;
3944 else if (bus->is_system)
3945 *description = "system";
3946 else if (bus->is_user)
3947 *description = "user";
3949 *description = NULL;
3954 int bus_get_root_path(sd_bus *bus) {
3957 if (bus->cgroup_root)
3960 r = cg_get_root_path(&bus->cgroup_root);
3962 bus->cgroup_root = strdup("/");
3963 if (!bus->cgroup_root)
3972 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3973 assert_return(bus, -EINVAL);
3974 assert_return(bus = bus_resolve(bus), -ENOPKG);
3975 assert_return(scope, -EINVAL);
3976 assert_return(!bus_pid_changed(bus), -ECHILD);
3983 if (bus->is_system) {
3991 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3993 assert_return(bus, -EINVAL);
3994 assert_return(bus = bus_resolve(bus), -ENOPKG);
3995 assert_return(address, -EINVAL);
3996 assert_return(!bus_pid_changed(bus), -ECHILD);
3999 *address = bus->address;
4006 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
4007 assert_return(bus, -EINVAL);
4008 assert_return(bus = bus_resolve(bus), -ENOPKG);
4009 assert_return(mask, -EINVAL);
4010 assert_return(!bus_pid_changed(bus), -ECHILD);
4012 *mask = bus->creds_mask;
4016 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
4017 assert_return(bus, -EINVAL);
4018 assert_return(bus = bus_resolve(bus), -ENOPKG);
4019 assert_return(!bus_pid_changed(bus), -ECHILD);
4021 return bus->bus_client;
4024 _public_ int sd_bus_is_server(sd_bus *bus) {
4025 assert_return(bus, -EINVAL);
4026 assert_return(bus = bus_resolve(bus), -ENOPKG);
4027 assert_return(!bus_pid_changed(bus), -ECHILD);
4029 return bus->is_server;
4032 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
4033 assert_return(bus, -EINVAL);
4034 assert_return(bus = bus_resolve(bus), -ENOPKG);
4035 assert_return(!bus_pid_changed(bus), -ECHILD);
4037 return bus->anonymous_auth;
4040 _public_ int sd_bus_is_trusted(sd_bus *bus) {
4041 assert_return(bus, -EINVAL);
4042 assert_return(bus = bus_resolve(bus), -ENOPKG);
4043 assert_return(!bus_pid_changed(bus), -ECHILD);
4045 return bus->trusted;
4048 _public_ int sd_bus_is_monitor(sd_bus *bus) {
4049 assert_return(bus, -EINVAL);
4050 assert_return(bus = bus_resolve(bus), -ENOPKG);
4051 assert_return(!bus_pid_changed(bus), -ECHILD);
4053 return bus->is_monitor;
4056 static void flush_close(sd_bus *bus) {
4060 /* Flushes and closes the specified bus. We take a ref before,
4061 * to ensure the flushing does not cause the bus to be
4064 sd_bus_flush_close_unref(sd_bus_ref(bus));
4067 _public_ void sd_bus_default_flush_close(void) {
4068 flush_close(default_starter_bus);
4069 #if 0 /// elogind does not support user buses
4070 flush_close(default_user_bus);
4072 flush_close(default_system_bus);
4075 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
4076 assert_return(bus, -EINVAL);
4077 assert_return(bus = bus_resolve(bus), -ENOPKG);
4079 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4080 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4081 * from the client side. */
4082 bus->exit_on_disconnect = b;
4084 /* If the exit condition was triggered already, exit immediately. */
4085 return bus_exit_now(bus);
4088 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
4089 assert_return(bus, -EINVAL);
4090 assert_return(bus = bus_resolve(bus), -ENOPKG);
4092 return bus->exit_on_disconnect;
4095 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4096 assert_return(bus, -EINVAL);
4097 assert_return(bus = bus_resolve(bus), -ENOPKG);
4098 assert_return(!bus->bus_client, -EPERM);
4099 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4101 return free_and_strdup(&bus->patch_sender, sender);
4104 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4105 assert_return(bus, -EINVAL);
4106 assert_return(bus = bus_resolve(bus), -ENOPKG);
4107 assert_return(ret, -EINVAL);
4109 if (!bus->patch_sender)
4112 *ret = bus->patch_sender;
4116 _public_ int sd_bus_get_n_queued_read(sd_bus *bus, uint64_t *ret) {
4117 assert_return(bus, -EINVAL);
4118 assert_return(bus = bus_resolve(bus), -ENOPKG);
4119 assert_return(!bus_pid_changed(bus), -ECHILD);
4120 assert_return(ret, -EINVAL);
4122 *ret = bus->rqueue_size;
4126 _public_ int sd_bus_get_n_queued_write(sd_bus *bus, uint64_t *ret) {
4127 assert_return(bus, -EINVAL);
4128 assert_return(bus = bus_resolve(bus), -ENOPKG);
4129 assert_return(!bus_pid_changed(bus), -ECHILD);
4130 assert_return(ret, -EINVAL);
4132 *ret = bus->wqueue_size;