1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
31 #include "alloc-util.h"
32 #include "bus-container.h"
33 #include "bus-control.h"
34 #include "bus-internal.h"
35 #include "bus-kernel.h"
36 #include "bus-label.h"
37 #include "bus-message.h"
38 #include "bus-objects.h"
39 #include "bus-protocol.h"
41 #include "bus-socket.h"
42 #include "bus-track.h"
45 #include "cgroup-util.h"
48 #include "hexdecoct.h"
49 #include "hostname-util.h"
52 #include "parse-util.h"
53 #include "string-util.h"
57 /// Additional includes needed by elogind
58 #include "process-util.h"
60 #define log_debug_bus_message(m) \
62 sd_bus_message *_mm = (m); \
63 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", \
64 bus_message_type_to_string(_mm->header->type), \
65 strna(sd_bus_message_get_sender(_mm)), \
66 strna(sd_bus_message_get_destination(_mm)), \
67 strna(sd_bus_message_get_path(_mm)), \
68 strna(sd_bus_message_get_interface(_mm)), \
69 strna(sd_bus_message_get_member(_mm)), \
70 BUS_MESSAGE_COOKIE(_mm), \
72 strna(_mm->root_container.signature), \
73 strna(_mm->error.name), \
74 strna(_mm->error.message)); \
77 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
78 static void bus_detach_io_events(sd_bus *b);
79 static void bus_detach_inotify_event(sd_bus *b);
81 static thread_local sd_bus *default_system_bus = NULL;
82 #if 0 /// UNNEEDED by elogind
83 static thread_local sd_bus *default_user_bus = NULL;
85 static thread_local sd_bus *default_starter_bus = NULL;
87 void bus_close_io_fds(sd_bus *b) {
90 bus_detach_io_events(b);
92 if (b->input_fd != b->output_fd)
93 safe_close(b->output_fd);
94 b->output_fd = b->input_fd = safe_close(b->input_fd);
97 void bus_close_inotify_fd(sd_bus *b) {
100 bus_detach_inotify_event(b);
102 b->inotify_fd = safe_close(b->inotify_fd);
103 b->inotify_watches = mfree(b->inotify_watches);
104 b->n_inotify_watches = 0;
107 static void bus_reset_queues(sd_bus *b) {
110 while (b->rqueue_size > 0)
111 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
113 b->rqueue = mfree(b->rqueue);
114 b->rqueue_allocated = 0;
116 while (b->wqueue_size > 0)
117 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
119 b->wqueue = mfree(b->wqueue);
120 b->wqueue_allocated = 0;
123 static void bus_free(sd_bus *b) {
127 assert(!b->track_queue);
130 b->state = BUS_CLOSED;
132 sd_bus_detach_event(b);
134 while ((s = b->slots)) {
135 /* At this point only floating slots can still be
136 * around, because the non-floating ones keep a
137 * reference to the bus, and we thus couldn't be
138 * destructing right now... We forcibly disconnect the
139 * slots here, so that they still can be referenced by
140 * apps, but are dead. */
143 bus_slot_disconnect(s);
144 sd_bus_slot_unref(s);
147 if (b->default_bus_ptr)
148 *b->default_bus_ptr = NULL;
151 bus_close_inotify_fd(b);
156 free(b->unique_name);
157 free(b->auth_buffer);
160 free(b->cgroup_root);
161 free(b->description);
164 strv_free(b->exec_argv);
166 close_many(b->fds, b->n_fds);
171 ordered_hashmap_free_free(b->reply_callbacks);
172 prioq_free(b->reply_callbacks_prioq);
174 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
175 bus_match_free(&b->match_callbacks);
177 hashmap_free_free(b->vtable_methods);
178 hashmap_free_free(b->vtable_properties);
180 assert(hashmap_isempty(b->nodes));
181 hashmap_free(b->nodes);
185 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
190 _public_ int sd_bus_new(sd_bus **ret) {
193 assert_return(ret, -EINVAL);
199 r->n_ref = REFCNT_INIT;
200 r->input_fd = r->output_fd = -1;
202 r->message_version = 1;
203 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
205 r->original_pid = getpid_cached();
206 r->n_groups = (size_t) -1;
208 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
210 /* We guarantee that wqueue always has space for at least one
212 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
221 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
224 assert_return(bus, -EINVAL);
225 assert_return(bus->state == BUS_UNSET, -EPERM);
226 assert_return(address, -EINVAL);
227 assert_return(!bus_pid_changed(bus), -ECHILD);
239 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
240 assert_return(bus, -EINVAL);
241 assert_return(bus->state == BUS_UNSET, -EPERM);
242 assert_return(input_fd >= 0, -EBADF);
243 assert_return(output_fd >= 0, -EBADF);
244 assert_return(!bus_pid_changed(bus), -ECHILD);
246 bus->input_fd = input_fd;
247 bus->output_fd = output_fd;
251 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
254 assert_return(bus, -EINVAL);
255 assert_return(bus->state == BUS_UNSET, -EPERM);
256 assert_return(path, -EINVAL);
257 assert_return(!strv_isempty(argv), -EINVAL);
258 assert_return(!bus_pid_changed(bus), -ECHILD);
270 free(bus->exec_path);
271 strv_free(bus->exec_argv);
279 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
280 assert_return(bus, -EINVAL);
281 assert_return(bus->state == BUS_UNSET, -EPERM);
282 assert_return(!bus_pid_changed(bus), -ECHILD);
284 bus->bus_client = !!b;
288 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
289 assert_return(bus, -EINVAL);
290 assert_return(bus->state == BUS_UNSET, -EPERM);
291 assert_return(!bus_pid_changed(bus), -ECHILD);
297 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
298 assert_return(bus, -EINVAL);
299 assert_return(bus->state == BUS_UNSET, -EPERM);
300 assert_return(!bus_pid_changed(bus), -ECHILD);
306 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
307 assert_return(bus, -EINVAL);
308 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
309 assert_return(!bus_pid_changed(bus), -ECHILD);
311 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
312 * replies, and maybe one day classic D-Bus learns this too */
313 bus->attach_timestamp = b;
318 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
319 assert_return(bus, -EINVAL);
320 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
321 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
322 assert_return(!bus_pid_changed(bus), -ECHILD);
324 SET_FLAG(bus->creds_mask, mask, b);
326 /* The well knowns we need unconditionally, so that matches can work */
327 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
332 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
333 assert_return(bus, -EINVAL);
334 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
335 assert_return(bus->state == BUS_UNSET, -EPERM);
336 assert_return(!bus_pid_changed(bus), -ECHILD);
338 bus->is_server = !!b;
339 bus->server_id = server_id;
343 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
344 assert_return(bus, -EINVAL);
345 assert_return(bus->state == BUS_UNSET, -EPERM);
346 assert_return(!bus_pid_changed(bus), -ECHILD);
348 bus->anonymous_auth = !!b;
352 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
353 assert_return(bus, -EINVAL);
354 assert_return(bus->state == BUS_UNSET, -EPERM);
355 assert_return(!bus_pid_changed(bus), -ECHILD);
361 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
362 assert_return(bus, -EINVAL);
363 assert_return(bus->state == BUS_UNSET, -EPERM);
364 assert_return(!bus_pid_changed(bus), -ECHILD);
366 return free_and_strdup(&bus->description, description);
369 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
370 assert_return(bus, -EINVAL);
371 assert_return(!bus_pid_changed(bus), -ECHILD);
373 bus->allow_interactive_authorization = !!b;
377 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
378 assert_return(bus, -EINVAL);
379 assert_return(!bus_pid_changed(bus), -ECHILD);
381 return bus->allow_interactive_authorization;
384 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
385 assert_return(bus, -EINVAL);
386 assert_return(bus->state == BUS_UNSET, -EPERM);
387 assert_return(!bus_pid_changed(bus), -ECHILD);
393 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
394 assert_return(bus, -EINVAL);
395 assert_return(!bus_pid_changed(bus), -ECHILD);
397 return bus->watch_bind;
400 _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) {
401 assert_return(bus, -EINVAL);
402 assert_return(bus->state == BUS_UNSET, -EPERM);
403 assert_return(!bus_pid_changed(bus), -ECHILD);
405 bus->connected_signal = b;
409 _public_ int sd_bus_get_connected_signal(sd_bus *bus) {
410 assert_return(bus, -EINVAL);
411 assert_return(!bus_pid_changed(bus), -ECHILD);
413 return bus->connected_signal;
416 static int synthesize_connected_signal(sd_bus *bus) {
417 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
422 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
423 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
424 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
426 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
427 * that works independently from whether we connected to a full bus or just a direct connection. */
429 if (!bus->connected_signal)
432 r = sd_bus_message_new_signal(
435 "/org/freedesktop/DBus/Local",
436 "org.freedesktop.DBus.Local",
441 bus_message_set_sender_local(bus, m);
443 r = bus_seal_synthetic_message(bus, m);
447 r = bus_rqueue_make_room(bus);
451 /* Insert at the very front */
452 memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size);
460 void bus_set_state(sd_bus *bus, enum bus_state state) {
462 static const char * const table[_BUS_STATE_MAX] = {
463 [BUS_UNSET] = "UNSET",
464 [BUS_WATCH_BIND] = "WATCH_BIND",
465 [BUS_OPENING] = "OPENING",
466 [BUS_AUTHENTICATING] = "AUTHENTICATING",
467 [BUS_HELLO] = "HELLO",
468 [BUS_RUNNING] = "RUNNING",
469 [BUS_CLOSING] = "CLOSING",
470 [BUS_CLOSED] = "CLOSED",
474 assert(state < _BUS_STATE_MAX);
476 if (state == bus->state)
479 log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state]);
483 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
491 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
493 r = sd_bus_message_get_errno(reply);
497 r = sd_bus_message_read(reply, "s", &s);
501 if (!service_name_is_valid(s) || s[0] != ':')
504 bus->unique_name = strdup(s);
505 if (!bus->unique_name)
508 if (bus->state == BUS_HELLO) {
509 bus_set_state(bus, BUS_RUNNING);
511 r = synthesize_connected_signal(bus);
519 static int bus_send_hello(sd_bus *bus) {
520 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
525 if (!bus->bus_client)
528 r = sd_bus_message_new_method_call(
531 "org.freedesktop.DBus",
532 "/org/freedesktop/DBus",
533 "org.freedesktop.DBus",
538 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
541 int bus_start_running(sd_bus *bus) {
542 struct reply_callback *c;
548 assert(bus->state < BUS_HELLO);
550 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
551 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
552 * adding a fixed value to all entries should not alter the internal order. */
554 n = now(CLOCK_MONOTONIC);
555 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
556 if (c->timeout_usec == 0)
559 c->timeout_usec = usec_add(n, c->timeout_usec);
562 if (bus->bus_client) {
563 bus_set_state(bus, BUS_HELLO);
567 bus_set_state(bus, BUS_RUNNING);
569 r = synthesize_connected_signal(bus);
576 static int parse_address_key(const char **p, const char *key, char **value) {
577 size_t l, n = 0, allocated = 0;
587 if (strncmp(*p, key, l) != 0)
600 while (!IN_SET(*a, ';', ',', 0)) {
618 c = (char) ((x << 4) | y);
625 if (!GREEDY_REALLOC(r, allocated, n + 2))
649 static void skip_address_key(const char **p) {
653 *p += strcspn(*p, ",");
659 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
660 _cleanup_free_ char *path = NULL, *abstract = NULL;
669 while (!IN_SET(**p, 0, ';')) {
670 r = parse_address_key(p, "guid", guid);
676 r = parse_address_key(p, "path", &path);
682 r = parse_address_key(p, "abstract", &abstract);
691 if (!path && !abstract)
694 if (path && abstract)
699 if (l > sizeof(b->sockaddr.un.sun_path))
702 b->sockaddr.un.sun_family = AF_UNIX;
703 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
704 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
705 } else if (abstract) {
706 l = strlen(abstract);
707 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
710 b->sockaddr.un.sun_family = AF_UNIX;
711 b->sockaddr.un.sun_path[0] = 0;
712 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
713 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
721 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
722 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
724 struct addrinfo *result, hints = {
725 .ai_socktype = SOCK_STREAM,
726 .ai_flags = AI_ADDRCONFIG,
734 while (!IN_SET(**p, 0, ';')) {
735 r = parse_address_key(p, "guid", guid);
741 r = parse_address_key(p, "host", &host);
747 r = parse_address_key(p, "port", &port);
753 r = parse_address_key(p, "family", &family);
766 if (streq(family, "ipv4"))
767 hints.ai_family = AF_INET;
768 else if (streq(family, "ipv6"))
769 hints.ai_family = AF_INET6;
774 r = getaddrinfo(host, port, &hints, &result);
778 return -EADDRNOTAVAIL;
780 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
781 b->sockaddr_size = result->ai_addrlen;
783 freeaddrinfo(result);
790 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
792 unsigned n_argv = 0, j;
794 size_t allocated = 0;
802 while (!IN_SET(**p, 0, ';')) {
803 r = parse_address_key(p, "guid", guid);
809 r = parse_address_key(p, "path", &path);
815 if (startswith(*p, "argv")) {
819 ul = strtoul(*p + 4, (char**) p, 10);
820 if (errno > 0 || **p != '=' || ul > 256) {
828 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
836 r = parse_address_key(p, NULL, argv + ul);
851 /* Make sure there are no holes in the array, with the
852 * exception of argv[0] */
853 for (j = 1; j < n_argv; j++)
859 if (argv && argv[0] == NULL) {
860 argv[0] = strdup(path);
875 for (j = 0; j < n_argv; j++)
883 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
884 _cleanup_free_ char *machine = NULL, *pid = NULL;
892 while (!IN_SET(**p, 0, ';')) {
893 r = parse_address_key(p, "guid", guid);
899 r = parse_address_key(p, "machine", &machine);
905 r = parse_address_key(p, "pid", &pid);
914 if (!machine == !pid)
918 if (!machine_name_is_valid(machine))
921 free_and_replace(b->machine, machine);
923 b->machine = mfree(b->machine);
927 r = parse_pid(pid, &b->nspid);
933 b->sockaddr.un.sun_family = AF_UNIX;
934 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
935 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
936 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
942 static void bus_reset_parsed_address(sd_bus *b) {
946 b->sockaddr_size = 0;
947 b->exec_argv = strv_free(b->exec_argv);
948 b->exec_path = mfree(b->exec_path);
949 b->server_id = SD_ID128_NULL;
950 b->machine = mfree(b->machine);
954 static int bus_parse_next_address(sd_bus *b) {
955 _cleanup_free_ char *guid = NULL;
963 if (b->address[b->address_index] == 0)
966 bus_reset_parsed_address(b);
968 a = b->address + b->address_index;
977 if (startswith(a, "unix:")) {
980 r = parse_unix_address(b, &a, &guid);
985 } else if (startswith(a, "tcp:")) {
988 r = parse_tcp_address(b, &a, &guid);
994 } else if (startswith(a, "unixexec:")) {
997 r = parse_exec_address(b, &a, &guid);
1003 } else if (startswith(a, "x-machine-unix:")) {
1006 r = parse_container_unix_address(b, &a, &guid);
1019 r = sd_id128_from_string(guid, &b->server_id);
1024 b->address_index = a - b->address;
1028 static int bus_start_address(sd_bus *b) {
1034 bus_close_io_fds(b);
1035 bus_close_inotify_fd(b);
1037 /* If you provide multiple different bus-addresses, we
1038 * try all of them in order and use the first one that
1042 r = bus_socket_exec(b);
1043 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1044 r = bus_container_connect_socket(b);
1045 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1046 r = bus_socket_connect(b);
1053 q = bus_attach_io_events(b);
1057 q = bus_attach_inotify_event(b);
1064 b->last_connect_error = -r;
1067 r = bus_parse_next_address(b);
1071 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1075 int bus_next_address(sd_bus *b) {
1078 bus_reset_parsed_address(b);
1079 return bus_start_address(b);
1082 static int bus_start_fd(sd_bus *b) {
1087 assert(b->input_fd >= 0);
1088 assert(b->output_fd >= 0);
1090 r = fd_nonblock(b->input_fd, true);
1094 r = fd_cloexec(b->input_fd, true);
1098 if (b->input_fd != b->output_fd) {
1099 r = fd_nonblock(b->output_fd, true);
1103 r = fd_cloexec(b->output_fd, true);
1108 if (fstat(b->input_fd, &st) < 0)
1111 return bus_socket_take_fd(b);
1114 _public_ int sd_bus_start(sd_bus *bus) {
1117 assert_return(bus, -EINVAL);
1118 assert_return(bus->state == BUS_UNSET, -EPERM);
1119 assert_return(!bus_pid_changed(bus), -ECHILD);
1121 bus_set_state(bus, BUS_OPENING);
1123 if (bus->is_server && bus->bus_client)
1126 if (bus->input_fd >= 0)
1127 r = bus_start_fd(bus);
1128 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1129 r = bus_start_address(bus);
1138 return bus_send_hello(bus);
1141 _public_ int sd_bus_open(sd_bus **ret) {
1146 assert_return(ret, -EINVAL);
1148 /* Let's connect to the starter bus if it is set, and
1149 * otherwise to the bus that is appropropriate for the scope
1150 * we are running in */
1152 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1154 if (streq(e, "system"))
1155 return sd_bus_open_system(ret);
1156 #if 0 /// elogind does not support systemd user instances
1157 else if (STR_IN_SET(e, "session", "user"))
1158 return sd_bus_open_user(ret);
1162 e = secure_getenv("DBUS_STARTER_ADDRESS");
1164 #if 0 /// elogind does not support systemd user instances
1165 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1166 return sd_bus_open_user(ret);
1169 return sd_bus_open_system(ret);
1176 r = sd_bus_set_address(b, e);
1180 b->bus_client = true;
1182 /* We don't know whether the bus is trusted or not, so better
1183 * be safe, and authenticate everything */
1185 b->is_local = false;
1186 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1188 r = sd_bus_start(b);
1200 int bus_set_address_system(sd_bus *b) {
1204 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1206 return sd_bus_set_address(b, e);
1208 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1211 _public_ int sd_bus_open_system(sd_bus **ret) {
1215 assert_return(ret, -EINVAL);
1221 r = bus_set_address_system(b);
1225 b->bus_client = true;
1226 b->is_system = true;
1228 /* Let's do per-method access control on the system bus. We
1229 * need the caller's UID and capability set for that. */
1231 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1234 r = sd_bus_start(b);
1246 #if 0 /// elogind can not open/use a user bus
1247 int bus_set_address_user(sd_bus *b) {
1249 _cleanup_free_ char *ee = NULL, *s = NULL;
1253 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1255 return sd_bus_set_address(b, e);
1257 e = secure_getenv("XDG_RUNTIME_DIR");
1261 ee = bus_address_escape(e);
1265 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1275 _public_ int sd_bus_open_user(sd_bus **ret) {
1276 #if 0 /// elogind does not support user buses
1280 assert_return(ret, -EINVAL);
1286 r = bus_set_address_user(b);
1290 b->bus_client = true;
1293 /* We don't do any per-method access control on the user
1298 r = sd_bus_start(b);
1309 return sd_bus_open_system(ret);
1313 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1314 _cleanup_free_ char *e = NULL;
1315 char *m = NULL, *c = NULL;
1320 /* Let's see if we shall enter some container */
1321 m = strchr(host, ':');
1325 /* Let's make sure this is not a port of some kind,
1326 * and is a valid machine name. */
1327 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1330 /* Cut out the host part */
1331 t = strndupa(host, m - host - 1);
1332 e = bus_address_escape(t);
1336 c = strjoina(",argv5=--machine=", m);
1341 e = bus_address_escape(host);
1346 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c);
1353 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1357 assert_return(host, -EINVAL);
1358 assert_return(ret, -EINVAL);
1360 r = sd_bus_new(&bus);
1364 r = bus_set_address_system_remote(bus, host);
1368 bus->bus_client = true;
1369 bus->trusted = false;
1370 bus->is_system = true;
1371 bus->is_local = false;
1373 r = sd_bus_start(bus);
1385 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1386 _cleanup_free_ char *e = NULL;
1391 e = bus_address_escape(machine);
1395 b->address = strjoin("x-machine-unix:machine=", e);
1402 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1406 assert_return(machine, -EINVAL);
1407 assert_return(ret, -EINVAL);
1408 assert_return(machine_name_is_valid(machine), -EINVAL);
1410 r = sd_bus_new(&bus);
1414 r = bus_set_address_system_machine(bus, machine);
1418 bus->bus_client = true;
1419 bus->trusted = false;
1420 bus->is_system = true;
1421 bus->is_local = false;
1423 r = sd_bus_start(bus);
1435 _public_ void sd_bus_close(sd_bus *bus) {
1439 if (bus->state == BUS_CLOSED)
1441 if (bus_pid_changed(bus))
1444 bus_set_state(bus, BUS_CLOSED);
1446 sd_bus_detach_event(bus);
1448 /* Drop all queued messages so that they drop references to
1449 * the bus object and the bus may be freed */
1450 bus_reset_queues(bus);
1452 bus_close_io_fds(bus);
1453 bus_close_inotify_fd(bus);
1456 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1464 return sd_bus_unref(bus);
1467 void bus_enter_closing(sd_bus *bus) {
1470 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1473 bus_set_state(bus, BUS_CLOSING);
1476 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1481 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1486 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1492 i = REFCNT_DEC(bus->n_ref);
1500 _public_ int sd_bus_is_open(sd_bus *bus) {
1502 assert_return(bus, -EINVAL);
1503 assert_return(!bus_pid_changed(bus), -ECHILD);
1505 return BUS_IS_OPEN(bus->state);
1508 _public_ int sd_bus_is_ready(sd_bus *bus) {
1509 assert_return(bus, -EINVAL);
1510 assert_return(!bus_pid_changed(bus), -ECHILD);
1512 return bus->state == BUS_RUNNING;
1515 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1518 assert_return(bus, -EINVAL);
1519 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1520 assert_return(!bus_pid_changed(bus), -ECHILD);
1522 if (bus->is_monitor)
1525 if (type == SD_BUS_TYPE_UNIX_FD) {
1526 if (!bus->accept_fd)
1529 r = bus_ensure_running(bus);
1533 return bus->can_fds;
1536 return bus_type_is_valid(type);
1539 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1542 assert_return(bus, -EINVAL);
1543 assert_return(id, -EINVAL);
1544 assert_return(!bus_pid_changed(bus), -ECHILD);
1546 r = bus_ensure_running(bus);
1550 *id = bus->server_id;
1554 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1559 /* If we copy the same message to multiple
1560 * destinations, avoid using the same cookie
1562 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1567 timeout = BUS_DEFAULT_TIMEOUT;
1569 return sd_bus_message_seal(m, ++b->cookie, timeout);
1572 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1573 bool remarshal = false;
1577 /* wrong packet version */
1578 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1581 /* wrong packet endianness */
1582 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1585 return remarshal ? bus_message_remarshal(b, m) : 0;
1588 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1592 /* Fake some timestamps, if they were requested, and not
1593 * already initialized */
1594 if (b->attach_timestamp) {
1595 if (m->realtime <= 0)
1596 m->realtime = now(CLOCK_REALTIME);
1598 if (m->monotonic <= 0)
1599 m->monotonic = now(CLOCK_MONOTONIC);
1602 /* The bus specification says the serial number cannot be 0,
1603 * hence let's fill something in for synthetic messages. Since
1604 * synthetic messages might have a fake sender and we don't
1605 * want to interfere with the real sender's serial numbers we
1606 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1607 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1608 * even though kdbus can do 64bit. */
1609 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1612 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1618 r = bus_socket_write_message(bus, m, idx);
1622 if (*idx >= BUS_MESSAGE_SIZE(m))
1623 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",
1624 bus_message_type_to_string(m->header->type),
1625 strna(sd_bus_message_get_sender(m)),
1626 strna(sd_bus_message_get_destination(m)),
1627 strna(sd_bus_message_get_path(m)),
1628 strna(sd_bus_message_get_interface(m)),
1629 strna(sd_bus_message_get_member(m)),
1630 BUS_MESSAGE_COOKIE(m),
1632 strna(m->root_container.signature),
1633 strna(m->error.name),
1634 strna(m->error.message));
1639 static int dispatch_wqueue(sd_bus *bus) {
1643 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1645 while (bus->wqueue_size > 0) {
1647 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1651 /* Didn't do anything this time */
1653 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1654 /* Fully written. Let's drop the entry from
1657 * This isn't particularly optimized, but
1658 * well, this is supposed to be our worst-case
1659 * buffer only, and the socket buffer is
1660 * supposed to be our primary buffer, and if
1661 * it got full, then all bets are off
1665 sd_bus_message_unref(bus->wqueue[0]);
1666 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1676 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1679 return bus_socket_read_message(bus);
1682 int bus_rqueue_make_room(sd_bus *bus) {
1685 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1688 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1694 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1699 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1701 /* Note that the priority logic is only available on kdbus,
1702 * where the rqueue is unused. We check the rqueue here
1703 * anyway, because it's simple... */
1706 if (bus->rqueue_size > 0) {
1707 /* Dispatch a queued message */
1709 *m = bus->rqueue[0];
1711 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1715 /* Try to read a new message */
1716 r = bus_read_message(bus, hint_priority, priority);
1726 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1727 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1730 assert_return(m, -EINVAL);
1735 assert_return(!bus_pid_changed(bus), -ECHILD);
1737 if (!BUS_IS_OPEN(bus->state))
1741 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1748 /* If the cookie number isn't kept, then we know that no reply
1750 if (!cookie && !m->sealed)
1751 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1753 r = bus_seal_message(bus, m, 0);
1757 /* Remarshall if we have to. This will possibly unref the
1758 * message and place a replacement in m */
1759 r = bus_remarshal_message(bus, &m);
1763 /* If this is a reply and no reply was requested, then let's
1764 * suppress this, if we can */
1768 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1771 r = bus_write_message(bus, m, hint_sync_call, &idx);
1773 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1774 bus_enter_closing(bus);
1781 if (idx < BUS_MESSAGE_SIZE(m)) {
1782 /* Wasn't fully written. So let's remember how
1783 * much was written. Note that the first entry
1784 * of the wqueue array is always allocated so
1785 * that we always can remember how much was
1787 bus->wqueue[0] = sd_bus_message_ref(m);
1788 bus->wqueue_size = 1;
1793 /* Just append it to the queue. */
1795 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1798 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1801 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1806 *cookie = BUS_MESSAGE_COOKIE(m);
1811 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1812 return bus_send_internal(bus, m, cookie, false);
1815 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1818 assert_return(m, -EINVAL);
1823 assert_return(!bus_pid_changed(bus), -ECHILD);
1825 if (!BUS_IS_OPEN(bus->state))
1828 if (!streq_ptr(m->destination, destination)) {
1833 r = sd_bus_message_set_destination(m, destination);
1838 return sd_bus_send(bus, m, cookie);
1841 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1844 if (usec == (uint64_t) -1)
1847 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1848 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1849 * relative timestamp, and afterwards the absolute one. */
1851 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1854 return now(CLOCK_MONOTONIC) + usec;
1857 static int timeout_compare(const void *a, const void *b) {
1858 const struct reply_callback *x = a, *y = b;
1860 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1863 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1866 if (x->timeout_usec < y->timeout_usec)
1869 if (x->timeout_usec > y->timeout_usec)
1875 _public_ int sd_bus_call_async(
1879 sd_bus_message_handler_t callback,
1883 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1884 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1887 assert_return(m, -EINVAL);
1888 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1889 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1890 assert_return(callback, -EINVAL);
1895 assert_return(!bus_pid_changed(bus), -ECHILD);
1897 if (!BUS_IS_OPEN(bus->state))
1900 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1904 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1908 r = bus_seal_message(bus, m, usec);
1912 r = bus_remarshal_message(bus, &m);
1916 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1920 s->reply_callback.callback = callback;
1922 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1923 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1925 s->reply_callback.cookie = 0;
1929 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
1930 if (s->reply_callback.timeout_usec != 0) {
1931 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1933 s->reply_callback.timeout_usec = 0;
1938 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1949 int bus_ensure_running(sd_bus *bus) {
1954 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
1956 if (bus->state == BUS_RUNNING)
1960 r = sd_bus_process(bus, NULL);
1963 if (bus->state == BUS_RUNNING)
1968 r = sd_bus_wait(bus, (uint64_t) -1);
1974 _public_ int sd_bus_call(
1978 sd_bus_error *error,
1979 sd_bus_message **reply) {
1981 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1987 bus_assert_return(m, -EINVAL, error);
1988 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
1989 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
1990 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
1995 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
1997 if (!BUS_IS_OPEN(bus->state)) {
2002 r = bus_ensure_running(bus);
2006 i = bus->rqueue_size;
2008 r = bus_seal_message(bus, m, usec);
2012 r = bus_remarshal_message(bus, &m);
2016 r = bus_send_internal(bus, m, &cookie, true);
2020 timeout = calc_elapse(bus, m->timeout);
2025 while (i < bus->rqueue_size) {
2026 sd_bus_message *incoming = NULL;
2028 incoming = bus->rqueue[i];
2030 if (incoming->reply_cookie == cookie) {
2031 /* Found a match! */
2033 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2035 log_debug_bus_message(incoming);
2037 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2039 if (incoming->n_fds <= 0 || bus->accept_fd) {
2043 sd_bus_message_unref(incoming);
2048 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2049 sd_bus_message_unref(incoming);
2052 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2053 r = sd_bus_error_copy(error, &incoming->error);
2054 sd_bus_message_unref(incoming);
2061 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2064 streq(bus->unique_name, incoming->sender)) {
2066 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2069 /* Our own message? Somebody is trying
2070 * to send its own client a message,
2071 * let's not dead-lock, let's fail
2074 sd_bus_message_unref(incoming);
2079 /* Try to read more, right-away */
2083 r = bus_read_message(bus, false, 0);
2085 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2086 bus_enter_closing(bus);
2098 n = now(CLOCK_MONOTONIC);
2106 left = (uint64_t) -1;
2108 r = bus_poll(bus, true, left);
2116 r = dispatch_wqueue(bus);
2118 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2119 bus_enter_closing(bus);
2128 return sd_bus_error_set_errno(error, r);
2131 _public_ int sd_bus_get_fd(sd_bus *bus) {
2133 assert_return(bus, -EINVAL);
2134 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2135 assert_return(!bus_pid_changed(bus), -ECHILD);
2137 if (bus->state == BUS_CLOSED)
2140 if (bus->inotify_fd >= 0)
2141 return bus->inotify_fd;
2143 if (bus->input_fd >= 0)
2144 return bus->input_fd;
2149 _public_ int sd_bus_get_events(sd_bus *bus) {
2152 assert_return(bus, -EINVAL);
2153 assert_return(!bus_pid_changed(bus), -ECHILD);
2155 switch (bus->state) {
2161 case BUS_WATCH_BIND:
2169 case BUS_AUTHENTICATING:
2170 if (bus_socket_auth_needs_write(bus))
2178 if (bus->rqueue_size <= 0)
2180 if (bus->wqueue_size > 0)
2188 assert_not_reached("Unknown state");
2194 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2195 struct reply_callback *c;
2197 assert_return(bus, -EINVAL);
2198 assert_return(timeout_usec, -EINVAL);
2199 assert_return(!bus_pid_changed(bus), -ECHILD);
2201 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2204 if (bus->track_queue) {
2209 switch (bus->state) {
2211 case BUS_AUTHENTICATING:
2212 *timeout_usec = bus->auth_timeout;
2217 if (bus->rqueue_size > 0) {
2222 c = prioq_peek(bus->reply_callbacks_prioq);
2224 *timeout_usec = (uint64_t) -1;
2228 if (c->timeout_usec == 0) {
2229 *timeout_usec = (uint64_t) -1;
2233 *timeout_usec = c->timeout_usec;
2240 case BUS_WATCH_BIND:
2242 *timeout_usec = (uint64_t) -1;
2246 assert_not_reached("Unknown or unexpected stat");
2250 static int process_timeout(sd_bus *bus) {
2251 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2252 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2253 struct reply_callback *c;
2260 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2262 c = prioq_peek(bus->reply_callbacks_prioq);
2266 n = now(CLOCK_MONOTONIC);
2267 if (c->timeout_usec > n)
2270 r = bus_message_new_synthetic_error(
2273 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2278 r = bus_seal_synthetic_message(bus, m);
2282 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2283 c->timeout_usec = 0;
2285 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2288 slot = container_of(c, sd_bus_slot, reply_callback);
2290 bus->iteration_counter++;
2292 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2294 bus->current_message = m;
2295 bus->current_slot = sd_bus_slot_ref(slot);
2296 bus->current_handler = c->callback;
2297 bus->current_userdata = slot->userdata;
2298 r = c->callback(m, slot->userdata, &error_buffer);
2299 bus->current_userdata = NULL;
2300 bus->current_handler = NULL;
2301 bus->current_slot = NULL;
2302 bus->current_message = NULL;
2304 if (slot->floating) {
2305 bus_slot_disconnect(slot);
2306 sd_bus_slot_unref(slot);
2309 sd_bus_slot_unref(slot);
2311 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2312 * and ignore the callback handler's return value. */
2316 return bus_maybe_reply_error(m, r, &error_buffer);
2319 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2323 if (bus->state != BUS_HELLO)
2326 /* Let's make sure the first message on the bus is the HELLO
2327 * reply. But note that we don't actually parse the message
2328 * here (we leave that to the usual handling), we just verify
2329 * we don't let any earlier msg through. */
2331 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2334 if (m->reply_cookie != 1)
2340 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2341 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2342 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2343 struct reply_callback *c;
2351 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2354 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2357 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2363 slot = container_of(c, sd_bus_slot, reply_callback);
2365 if (m->n_fds > 0 && !bus->accept_fd) {
2367 /* If the reply contained a file descriptor which we
2368 * didn't want we pass an error instead. */
2370 r = bus_message_new_synthetic_error(
2373 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2378 /* Copy over original timestamp */
2379 synthetic_reply->realtime = m->realtime;
2380 synthetic_reply->monotonic = m->monotonic;
2381 synthetic_reply->seqnum = m->seqnum;
2383 r = bus_seal_synthetic_message(bus, synthetic_reply);
2387 m = synthetic_reply;
2389 r = sd_bus_message_rewind(m, true);
2394 if (c->timeout_usec != 0) {
2395 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2396 c->timeout_usec = 0;
2399 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2401 bus->current_slot = sd_bus_slot_ref(slot);
2402 bus->current_handler = c->callback;
2403 bus->current_userdata = slot->userdata;
2404 r = c->callback(m, slot->userdata, &error_buffer);
2405 bus->current_userdata = NULL;
2406 bus->current_handler = NULL;
2407 bus->current_slot = NULL;
2409 if (slot->floating) {
2410 bus_slot_disconnect(slot);
2411 sd_bus_slot_unref(slot);
2414 sd_bus_slot_unref(slot);
2416 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2417 * ignore the callback handler's return value. */
2421 return bus_maybe_reply_error(m, r, &error_buffer);
2424 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2425 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2426 struct filter_callback *l;
2433 bus->filter_callbacks_modified = false;
2435 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2438 if (bus->filter_callbacks_modified)
2441 /* Don't run this more than once per iteration */
2442 if (l->last_iteration == bus->iteration_counter)
2445 l->last_iteration = bus->iteration_counter;
2447 r = sd_bus_message_rewind(m, true);
2451 slot = container_of(l, sd_bus_slot, filter_callback);
2453 bus->current_slot = sd_bus_slot_ref(slot);
2454 bus->current_handler = l->callback;
2455 bus->current_userdata = slot->userdata;
2456 r = l->callback(m, slot->userdata, &error_buffer);
2457 bus->current_userdata = NULL;
2458 bus->current_handler = NULL;
2459 bus->current_slot = sd_bus_slot_unref(slot);
2461 r = bus_maybe_reply_error(m, r, &error_buffer);
2467 } while (bus->filter_callbacks_modified);
2472 static int process_match(sd_bus *bus, sd_bus_message *m) {
2479 bus->match_callbacks_modified = false;
2481 r = bus_match_run(bus, &bus->match_callbacks, m);
2485 } while (bus->match_callbacks_modified);
2490 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2491 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2497 if (bus->is_monitor)
2500 if (bus->manual_peer_interface)
2503 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2506 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2509 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2512 if (streq_ptr(m->member, "Ping"))
2513 r = sd_bus_message_new_method_return(m, &reply);
2514 else if (streq_ptr(m->member, "GetMachineId")) {
2518 r = sd_id128_get_machine(&id);
2522 r = sd_bus_message_new_method_return(m, &reply);
2526 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2528 r = sd_bus_message_new_method_errorf(
2530 SD_BUS_ERROR_UNKNOWN_METHOD,
2531 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2537 r = sd_bus_send(bus, reply, NULL);
2544 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2548 /* If we got a message with a file descriptor which we didn't
2549 * want to accept, then let's drop it. How can this even
2550 * happen? For example, when the kernel queues a message into
2551 * an activatable names's queue which allows fds, and then is
2552 * delivered to us later even though we ourselves did not
2555 if (bus->is_monitor)
2564 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2565 return 1; /* just eat it up */
2567 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2570 static int process_message(sd_bus *bus, sd_bus_message *m) {
2576 bus->current_message = m;
2577 bus->iteration_counter++;
2579 log_debug_bus_message(m);
2581 r = process_hello(bus, m);
2585 r = process_reply(bus, m);
2589 r = process_fd_check(bus, m);
2593 r = process_filter(bus, m);
2597 r = process_match(bus, m);
2601 r = process_builtin(bus, m);
2605 r = bus_process_object(bus, m);
2608 bus->current_message = NULL;
2612 static int dispatch_track(sd_bus *bus) {
2615 if (!bus->track_queue)
2618 bus_track_dispatch(bus->track_queue);
2622 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2623 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2627 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2629 r = process_timeout(bus);
2633 r = dispatch_wqueue(bus);
2637 r = dispatch_track(bus);
2641 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2647 r = process_message(bus, m);
2652 r = sd_bus_message_rewind(m, true);
2661 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2663 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2664 strna(sd_bus_message_get_sender(m)),
2665 strna(sd_bus_message_get_path(m)),
2666 strna(sd_bus_message_get_interface(m)),
2667 strna(sd_bus_message_get_member(m)));
2669 r = sd_bus_reply_method_errorf(
2671 SD_BUS_ERROR_UNKNOWN_OBJECT,
2672 "Unknown object '%s'.", m->path);
2686 static int bus_exit_now(sd_bus *bus) {
2689 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2690 * sd_event_exit(), otherwise invokes libc exit(). */
2692 if (bus->exited) /* did we already exit? */
2694 if (!bus->exit_triggered) /* was the exit condition triggered? */
2696 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2699 bus->exited = true; /* never exit more than once */
2701 log_debug("Bus connection disconnected, exiting.");
2704 return sd_event_exit(bus->event, EXIT_FAILURE);
2708 assert_not_reached("exit() didn't exit?");
2711 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2712 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2713 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2720 r = bus_message_new_synthetic_error(
2723 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2728 r = bus_seal_synthetic_message(bus, m);
2732 if (c->timeout_usec != 0) {
2733 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2734 c->timeout_usec = 0;
2737 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2740 slot = container_of(c, sd_bus_slot, reply_callback);
2742 bus->iteration_counter++;
2744 bus->current_message = m;
2745 bus->current_slot = sd_bus_slot_ref(slot);
2746 bus->current_handler = c->callback;
2747 bus->current_userdata = slot->userdata;
2748 r = c->callback(m, slot->userdata, &error_buffer);
2749 bus->current_userdata = NULL;
2750 bus->current_handler = NULL;
2751 bus->current_slot = NULL;
2752 bus->current_message = NULL;
2754 if (slot->floating) {
2755 bus_slot_disconnect(slot);
2756 sd_bus_slot_unref(slot);
2759 sd_bus_slot_unref(slot);
2761 return bus_maybe_reply_error(m, r, &error_buffer);
2764 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2765 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2766 struct reply_callback *c;
2770 assert(bus->state == BUS_CLOSING);
2772 /* First, fail all outstanding method calls */
2773 c = ordered_hashmap_first(bus->reply_callbacks);
2775 return process_closing_reply_callback(bus, c);
2777 /* Then, fake-drop all remaining bus tracking references */
2779 bus_track_close(bus->tracks);
2783 /* Then, synthesize a Disconnected message */
2784 r = sd_bus_message_new_signal(
2787 "/org/freedesktop/DBus/Local",
2788 "org.freedesktop.DBus.Local",
2793 bus_message_set_sender_local(bus, m);
2795 r = bus_seal_synthetic_message(bus, m);
2801 bus->current_message = m;
2802 bus->iteration_counter++;
2804 r = process_filter(bus, m);
2808 r = process_match(bus, m);
2812 /* Nothing else to do, exit now, if the condition holds */
2813 bus->exit_triggered = true;
2814 (void) bus_exit_now(bus);
2824 bus->current_message = NULL;
2829 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2830 BUS_DONT_DESTROY(bus);
2833 /* Returns 0 when we didn't do anything. This should cause the
2834 * caller to invoke sd_bus_wait() before returning the next
2835 * time. Returns > 0 when we did something, which possibly
2836 * means *ret is filled in with an unprocessed message. */
2838 assert_return(bus, -EINVAL);
2839 assert_return(!bus_pid_changed(bus), -ECHILD);
2841 /* We don't allow recursively invoking sd_bus_process(). */
2842 assert_return(!bus->current_message, -EBUSY);
2843 assert(!bus->current_slot);
2845 switch (bus->state) {
2853 case BUS_WATCH_BIND:
2854 r = bus_socket_process_watch_bind(bus);
2858 r = bus_socket_process_opening(bus);
2861 case BUS_AUTHENTICATING:
2862 r = bus_socket_process_authenticating(bus);
2867 r = process_running(bus, hint_priority, priority, ret);
2871 /* This branch initializes *ret, hence we don't use the generic error checking below */
2875 return process_closing(bus, ret);
2878 assert_not_reached("Unknown state");
2881 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2882 bus_enter_closing(bus);
2893 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2894 return bus_process_internal(bus, false, 0, ret);
2897 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2898 return bus_process_internal(bus, true, priority, ret);
2901 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2902 struct pollfd p[2] = {};
2905 usec_t m = USEC_INFINITY;
2909 if (bus->state == BUS_CLOSING)
2912 if (!BUS_IS_OPEN(bus->state))
2915 if (bus->state == BUS_WATCH_BIND) {
2916 assert(bus->inotify_fd >= 0);
2918 p[0].events = POLLIN;
2919 p[0].fd = bus->inotify_fd;
2924 e = sd_bus_get_events(bus);
2929 /* The caller really needs some more data, he doesn't
2930 * care about what's already read, or any timeouts
2931 * except its own. */
2935 /* The caller wants to process if there's something to
2936 * process, but doesn't care otherwise */
2938 r = sd_bus_get_timeout(bus, &until);
2942 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
2945 p[0].fd = bus->input_fd;
2946 if (bus->output_fd == bus->input_fd) {
2950 p[0].events = e & POLLIN;
2951 p[1].fd = bus->output_fd;
2952 p[1].events = e & POLLOUT;
2957 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
2960 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
2964 return r > 0 ? 1 : 0;
2967 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2969 assert_return(bus, -EINVAL);
2970 assert_return(!bus_pid_changed(bus), -ECHILD);
2972 if (bus->state == BUS_CLOSING)
2975 if (!BUS_IS_OPEN(bus->state))
2978 if (bus->rqueue_size > 0)
2981 return bus_poll(bus, false, timeout_usec);
2984 _public_ int sd_bus_flush(sd_bus *bus) {
2987 assert_return(bus, -EINVAL);
2988 assert_return(!bus_pid_changed(bus), -ECHILD);
2990 if (bus->state == BUS_CLOSING)
2993 if (!BUS_IS_OPEN(bus->state))
2996 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
2997 if (bus->state == BUS_WATCH_BIND)
3000 r = bus_ensure_running(bus);
3004 if (bus->wqueue_size <= 0)
3008 r = dispatch_wqueue(bus);
3010 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3011 bus_enter_closing(bus);
3018 if (bus->wqueue_size <= 0)
3021 r = bus_poll(bus, false, (uint64_t) -1);
3027 _public_ int sd_bus_add_filter(
3030 sd_bus_message_handler_t callback,
3035 assert_return(bus, -EINVAL);
3036 assert_return(callback, -EINVAL);
3037 assert_return(!bus_pid_changed(bus), -ECHILD);
3039 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3043 s->filter_callback.callback = callback;
3045 bus->filter_callbacks_modified = true;
3046 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3054 static int add_match_callback(
3057 sd_bus_error *ret_error) {
3059 sd_bus_slot *match_slot = userdata;
3060 bool failed = false;
3066 sd_bus_slot_ref(match_slot);
3068 if (sd_bus_message_is_method_error(m, NULL)) {
3069 log_debug_errno(sd_bus_message_get_errno(m),
3070 "Unable to add match %s, failing connection: %s",
3071 match_slot->match_callback.match_string,
3072 sd_bus_message_get_error(m)->message);
3076 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3078 if (match_slot->match_callback.install_callback) {
3081 bus = sd_bus_message_get_bus(m);
3083 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3084 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3087 assert(bus->current_slot == match_slot->match_callback.install_slot);
3088 assert(bus->current_handler == add_match_callback);
3089 assert(bus->current_userdata == userdata);
3091 bus->current_slot = match_slot;
3092 bus->current_handler = match_slot->match_callback.install_callback;
3093 bus->current_userdata = match_slot->userdata;
3095 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3097 bus->current_slot = match_slot->match_callback.install_slot;
3098 bus->current_handler = add_match_callback;
3099 bus->current_userdata = userdata;
3101 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3103 if (failed) /* Generic failure handling: destroy the connection */
3104 bus_enter_closing(sd_bus_message_get_bus(m));
3109 if (failed && match_slot->floating) {
3110 bus_slot_disconnect(match_slot);
3111 sd_bus_slot_unref(match_slot);
3114 sd_bus_slot_unref(match_slot);
3119 static int bus_add_match_full(
3124 sd_bus_message_handler_t callback,
3125 sd_bus_message_handler_t install_callback,
3128 struct bus_match_component *components = NULL;
3129 unsigned n_components = 0;
3130 sd_bus_slot *s = NULL;
3133 assert_return(bus, -EINVAL);
3134 assert_return(match, -EINVAL);
3135 assert_return(!bus_pid_changed(bus), -ECHILD);
3137 r = bus_match_parse(match, &components, &n_components);
3141 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3147 s->match_callback.callback = callback;
3148 s->match_callback.install_callback = install_callback;
3150 if (bus->bus_client) {
3151 enum bus_match_scope scope;
3153 scope = bus_match_get_scope(components, n_components);
3155 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3156 if (scope != BUS_MATCH_LOCAL) {
3158 /* We store the original match string, so that we can use it to remove the match again. */
3160 s->match_callback.match_string = strdup(match);
3161 if (!s->match_callback.match_string) {
3167 r = bus_add_match_internal_async(bus,
3168 &s->match_callback.install_slot,
3169 s->match_callback.match_string,
3173 r = bus_add_match_internal(bus, s->match_callback.match_string);
3177 s->match_added = true;
3181 bus->match_callbacks_modified = true;
3182 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3191 bus_match_parse_free(components, n_components);
3192 sd_bus_slot_unref(s);
3197 #if 0 /// UNNEEDED by elogind
3199 _public_ int sd_bus_add_match(
3203 sd_bus_message_handler_t callback,
3206 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3209 _public_ int sd_bus_add_match_async(
3213 sd_bus_message_handler_t callback,
3214 sd_bus_message_handler_t install_callback,
3217 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3220 bool bus_pid_changed(sd_bus *bus) {
3223 /* We don't support people creating a bus connection and
3224 * keeping it around over a fork(). Let's complain. */
3226 return bus->original_pid != getpid_cached();
3229 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3230 sd_bus *bus = userdata;
3235 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3237 r = sd_bus_process(bus, NULL);
3239 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3240 bus_enter_closing(bus);
3246 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3247 sd_bus *bus = userdata;
3252 r = sd_bus_process(bus, NULL);
3254 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3255 bus_enter_closing(bus);
3261 static int prepare_callback(sd_event_source *s, void *userdata) {
3262 sd_bus *bus = userdata;
3269 e = sd_bus_get_events(bus);
3275 if (bus->output_fd != bus->input_fd) {
3277 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3281 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3283 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3287 r = sd_bus_get_timeout(bus, &until);
3293 j = sd_event_source_set_time(bus->time_event_source, until);
3300 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3307 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3308 bus_enter_closing(bus);
3313 static int quit_callback(sd_event_source *event, void *userdata) {
3314 sd_bus *bus = userdata;
3324 int bus_attach_io_events(sd_bus *bus) {
3329 if (bus->input_fd < 0)
3335 if (!bus->input_io_event_source) {
3336 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3340 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3344 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3348 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3350 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3355 if (bus->output_fd != bus->input_fd) {
3356 assert(bus->output_fd >= 0);
3358 if (!bus->output_io_event_source) {
3359 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3363 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3367 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3369 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3378 static void bus_detach_io_events(sd_bus *bus) {
3381 if (bus->input_io_event_source) {
3382 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3383 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3386 if (bus->output_io_event_source) {
3387 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3388 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3392 int bus_attach_inotify_event(sd_bus *bus) {
3397 if (bus->inotify_fd < 0)
3403 if (!bus->inotify_event_source) {
3404 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3408 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3412 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3414 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3421 static void bus_detach_inotify_event(sd_bus *bus) {
3424 if (bus->inotify_event_source) {
3425 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3426 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3430 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3433 assert_return(bus, -EINVAL);
3434 assert_return(!bus->event, -EBUSY);
3436 assert(!bus->input_io_event_source);
3437 assert(!bus->output_io_event_source);
3438 assert(!bus->time_event_source);
3441 bus->event = sd_event_ref(event);
3443 r = sd_event_default(&bus->event);
3448 bus->event_priority = priority;
3450 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3454 r = sd_event_source_set_priority(bus->time_event_source, priority);
3458 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3462 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3466 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3470 r = bus_attach_io_events(bus);
3474 r = bus_attach_inotify_event(bus);
3481 sd_bus_detach_event(bus);
3485 _public_ int sd_bus_detach_event(sd_bus *bus) {
3486 assert_return(bus, -EINVAL);
3491 bus_detach_io_events(bus);
3492 bus_detach_inotify_event(bus);
3494 if (bus->time_event_source) {
3495 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3496 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3499 if (bus->quit_event_source) {
3500 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3501 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3504 bus->event = sd_event_unref(bus->event);
3508 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3509 assert_return(bus, NULL);
3514 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3515 assert_return(bus, NULL);
3517 return bus->current_message;
3520 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3521 assert_return(bus, NULL);
3523 return bus->current_slot;
3526 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3527 assert_return(bus, NULL);
3529 return bus->current_handler;
3532 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3533 assert_return(bus, NULL);
3535 return bus->current_userdata;
3538 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3543 assert(default_bus);
3546 return !!*default_bus;
3549 *ret = sd_bus_ref(*default_bus);
3557 b->default_bus_ptr = default_bus;
3565 _public_ int sd_bus_default_system(sd_bus **ret) {
3566 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3570 _public_ int sd_bus_default_user(sd_bus **ret) {
3571 #if 0 /// elogind does not support user buses
3572 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3574 return sd_bus_default_system(ret);
3578 _public_ int sd_bus_default(sd_bus **ret) {
3582 /* Let's try our best to reuse another cached connection. If
3583 * the starter bus type is set, connect via our normal
3584 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3585 * we can share the connection with the user/system default
3588 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3590 if (streq(e, "system"))
3591 return sd_bus_default_system(ret);
3592 #if 0 /// elogind does not support systemd units
3593 else if (STR_IN_SET(e, "user", "session"))
3594 return sd_bus_default_user(ret);
3598 /* No type is specified, so we have not other option than to
3599 * use the starter address if it is set. */
3600 e = secure_getenv("DBUS_STARTER_ADDRESS");
3602 return bus_default(sd_bus_open, &default_starter_bus, ret);
3604 /* Finally, if nothing is set use the cached connection for
3605 * the right scope */
3607 #if 0 /// elogind does not support systemd user instances
3608 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3609 return sd_bus_default_user(ret);
3612 return sd_bus_default_system(ret);
3615 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3616 assert_return(b, -EINVAL);
3617 assert_return(tid, -EINVAL);
3618 assert_return(!bus_pid_changed(b), -ECHILD);
3626 return sd_event_get_tid(b->event, tid);
3631 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3632 _cleanup_free_ char *e = NULL;
3635 assert_return(object_path_is_valid(prefix), -EINVAL);
3636 assert_return(external_id, -EINVAL);
3637 assert_return(ret_path, -EINVAL);
3639 e = bus_label_escape(external_id);
3643 ret = strjoin(prefix, "/", e);
3651 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3655 assert_return(object_path_is_valid(path), -EINVAL);
3656 assert_return(object_path_is_valid(prefix), -EINVAL);
3657 assert_return(external_id, -EINVAL);
3659 e = object_path_startswith(path, prefix);
3661 *external_id = NULL;
3665 ret = bus_label_unescape(e);
3673 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3674 _cleanup_strv_free_ char **labels = NULL;
3675 char *path, *path_pos, **label_pos;
3676 const char *sep, *template_pos;
3681 assert_return(out, -EINVAL);
3682 assert_return(path_template, -EINVAL);
3684 path_length = strlen(path_template);
3686 va_start(list, path_template);
3687 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3691 arg = va_arg(list, const char *);
3697 label = bus_label_escape(arg);
3703 r = strv_consume(&labels, label);
3709 /* add label length, but account for the format character */
3710 path_length += strlen(label) - 1;
3714 path = malloc(path_length + 1);
3721 for (template_pos = path_template; *template_pos; ) {
3722 sep = strchrnul(template_pos, '%');
3723 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3727 path_pos = stpcpy(path_pos, *label_pos++);
3728 template_pos = sep + 1;
3736 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3737 _cleanup_strv_free_ char **labels = NULL;
3738 const char *template_pos, *path_pos;
3744 * This decodes an object-path based on a template argument. The
3745 * template consists of a verbatim path, optionally including special
3748 * - Each occurrence of '%' in the template matches an arbitrary
3749 * substring of a label in the given path. At most one such
3750 * directive is allowed per label. For each such directive, the
3751 * caller must provide an output parameter (char **) via va_arg. If
3752 * NULL is passed, the given label is verified, but not returned.
3753 * For each matched label, the *decoded* label is stored in the
3754 * passed output argument, and the caller is responsible to free
3755 * it. Note that the output arguments are only modified if the
3756 * actualy path matched the template. Otherwise, they're left
3759 * This function returns <0 on error, 0 if the path does not match the
3760 * template, 1 if it matched.
3763 assert_return(path, -EINVAL);
3764 assert_return(path_template, -EINVAL);
3768 for (template_pos = path_template; *template_pos; ) {
3773 /* verify everything until the next '%' matches verbatim */
3774 sep = strchrnul(template_pos, '%');
3775 length = sep - template_pos;
3776 if (strncmp(path_pos, template_pos, length))
3780 template_pos += length;
3785 /* We found the next '%' character. Everything up until here
3786 * matched. We now skip ahead to the end of this label and make
3787 * sure it matches the tail of the label in the path. Then we
3788 * decode the string in-between and save it for later use. */
3790 ++template_pos; /* skip over '%' */
3792 sep = strchrnul(template_pos, '/');
3793 length = sep - template_pos; /* length of suffix to match verbatim */
3795 /* verify the suffixes match */
3796 sep = strchrnul(path_pos, '/');
3797 if (sep - path_pos < (ssize_t)length ||
3798 strncmp(sep - length, template_pos, length))
3801 template_pos += length; /* skip over matched label */
3802 length = sep - path_pos - length; /* length of sub-label to decode */
3804 /* store unescaped label for later use */
3805 label = bus_label_unescape_n(path_pos, length);
3809 r = strv_consume(&labels, label);
3813 path_pos = sep; /* skip decoded label and suffix */
3816 /* end of template must match end of path */
3820 /* copy the labels over to the caller */
3821 va_start(list, path_template);
3822 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3825 arg = va_arg(list, char **);
3833 labels = mfree(labels);
3837 _public_ int sd_bus_try_close(sd_bus *bus) {
3838 assert_return(bus, -EINVAL);
3839 assert_return(!bus_pid_changed(bus), -ECHILD);
3844 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3845 assert_return(bus, -EINVAL);
3846 assert_return(description, -EINVAL);
3847 assert_return(bus->description, -ENXIO);
3848 assert_return(!bus_pid_changed(bus), -ECHILD);
3850 *description = bus->description;
3854 int bus_get_root_path(sd_bus *bus) {
3857 if (bus->cgroup_root)
3860 r = cg_get_root_path(&bus->cgroup_root);
3862 bus->cgroup_root = strdup("/");
3863 if (!bus->cgroup_root)
3872 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3873 assert_return(bus, -EINVAL);
3874 assert_return(scope, -EINVAL);
3875 assert_return(!bus_pid_changed(bus), -ECHILD);
3882 if (bus->is_system) {
3890 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3892 assert_return(bus, -EINVAL);
3893 assert_return(address, -EINVAL);
3894 assert_return(!bus_pid_changed(bus), -ECHILD);
3897 *address = bus->address;
3904 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3905 assert_return(bus, -EINVAL);
3906 assert_return(mask, -EINVAL);
3907 assert_return(!bus_pid_changed(bus), -ECHILD);
3909 *mask = bus->creds_mask;
3913 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3914 assert_return(bus, -EINVAL);
3915 assert_return(!bus_pid_changed(bus), -ECHILD);
3917 return bus->bus_client;
3920 _public_ int sd_bus_is_server(sd_bus *bus) {
3921 assert_return(bus, -EINVAL);
3922 assert_return(!bus_pid_changed(bus), -ECHILD);
3924 return bus->is_server;
3927 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3928 assert_return(bus, -EINVAL);
3929 assert_return(!bus_pid_changed(bus), -ECHILD);
3931 return bus->anonymous_auth;
3934 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3935 assert_return(bus, -EINVAL);
3936 assert_return(!bus_pid_changed(bus), -ECHILD);
3938 return bus->trusted;
3941 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3942 assert_return(bus, -EINVAL);
3943 assert_return(!bus_pid_changed(bus), -ECHILD);
3945 return bus->is_monitor;
3948 static void flush_close(sd_bus *bus) {
3952 /* Flushes and closes the specified bus. We take a ref before,
3953 * to ensure the flushing does not cause the bus to be
3956 sd_bus_flush_close_unref(sd_bus_ref(bus));
3959 _public_ void sd_bus_default_flush_close(void) {
3960 flush_close(default_starter_bus);
3961 #if 0 /// elogind does not support user buses
3962 flush_close(default_user_bus);
3964 flush_close(default_system_bus);
3967 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
3968 assert_return(bus, -EINVAL);
3970 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3971 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3972 * from the client side. */
3973 bus->exit_on_disconnect = b;
3975 /* If the exit condition was triggered already, exit immediately. */
3976 return bus_exit_now(bus);
3979 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
3980 assert_return(bus, -EINVAL);
3982 return bus->exit_on_disconnect;