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);
162 free(b->patch_sender);
165 strv_free(b->exec_argv);
167 close_many(b->fds, b->n_fds);
172 ordered_hashmap_free_free(b->reply_callbacks);
173 prioq_free(b->reply_callbacks_prioq);
175 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
176 bus_match_free(&b->match_callbacks);
178 hashmap_free_free(b->vtable_methods);
179 hashmap_free_free(b->vtable_properties);
181 assert(hashmap_isempty(b->nodes));
182 hashmap_free(b->nodes);
186 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
191 _public_ int sd_bus_new(sd_bus **ret) {
194 assert_return(ret, -EINVAL);
200 r->n_ref = REFCNT_INIT;
201 r->input_fd = r->output_fd = -1;
203 r->message_version = 1;
204 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
206 r->original_pid = getpid_cached();
207 r->n_groups = (size_t) -1;
209 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
211 /* We guarantee that wqueue always has space for at least one
213 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
222 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
225 assert_return(bus, -EINVAL);
226 assert_return(bus->state == BUS_UNSET, -EPERM);
227 assert_return(address, -EINVAL);
228 assert_return(!bus_pid_changed(bus), -ECHILD);
240 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
241 assert_return(bus, -EINVAL);
242 assert_return(bus->state == BUS_UNSET, -EPERM);
243 assert_return(input_fd >= 0, -EBADF);
244 assert_return(output_fd >= 0, -EBADF);
245 assert_return(!bus_pid_changed(bus), -ECHILD);
247 bus->input_fd = input_fd;
248 bus->output_fd = output_fd;
252 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
255 assert_return(bus, -EINVAL);
256 assert_return(bus->state == BUS_UNSET, -EPERM);
257 assert_return(path, -EINVAL);
258 assert_return(!strv_isempty(argv), -EINVAL);
259 assert_return(!bus_pid_changed(bus), -ECHILD);
271 free(bus->exec_path);
272 strv_free(bus->exec_argv);
280 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
281 assert_return(bus, -EINVAL);
282 assert_return(bus->state == BUS_UNSET, -EPERM);
283 assert_return(!bus->patch_sender, -EPERM);
284 assert_return(!bus_pid_changed(bus), -ECHILD);
286 bus->bus_client = !!b;
290 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
291 assert_return(bus, -EINVAL);
292 assert_return(bus->state == BUS_UNSET, -EPERM);
293 assert_return(!bus_pid_changed(bus), -ECHILD);
299 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
300 assert_return(bus, -EINVAL);
301 assert_return(bus->state == BUS_UNSET, -EPERM);
302 assert_return(!bus_pid_changed(bus), -ECHILD);
308 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
309 assert_return(bus, -EINVAL);
310 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
311 assert_return(!bus_pid_changed(bus), -ECHILD);
313 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
314 * replies, and maybe one day classic D-Bus learns this too */
315 bus->attach_timestamp = b;
320 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
321 assert_return(bus, -EINVAL);
322 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
323 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
324 assert_return(!bus_pid_changed(bus), -ECHILD);
326 SET_FLAG(bus->creds_mask, mask, b);
328 /* The well knowns we need unconditionally, so that matches can work */
329 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
334 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
335 assert_return(bus, -EINVAL);
336 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
337 assert_return(bus->state == BUS_UNSET, -EPERM);
338 assert_return(!bus_pid_changed(bus), -ECHILD);
340 bus->is_server = !!b;
341 bus->server_id = server_id;
345 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
346 assert_return(bus, -EINVAL);
347 assert_return(bus->state == BUS_UNSET, -EPERM);
348 assert_return(!bus_pid_changed(bus), -ECHILD);
350 bus->anonymous_auth = !!b;
354 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
355 assert_return(bus, -EINVAL);
356 assert_return(bus->state == BUS_UNSET, -EPERM);
357 assert_return(!bus_pid_changed(bus), -ECHILD);
363 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
364 assert_return(bus, -EINVAL);
365 assert_return(bus->state == BUS_UNSET, -EPERM);
366 assert_return(!bus_pid_changed(bus), -ECHILD);
368 return free_and_strdup(&bus->description, description);
371 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
372 assert_return(bus, -EINVAL);
373 assert_return(!bus_pid_changed(bus), -ECHILD);
375 bus->allow_interactive_authorization = !!b;
379 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
380 assert_return(bus, -EINVAL);
381 assert_return(!bus_pid_changed(bus), -ECHILD);
383 return bus->allow_interactive_authorization;
386 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
387 assert_return(bus, -EINVAL);
388 assert_return(bus->state == BUS_UNSET, -EPERM);
389 assert_return(!bus_pid_changed(bus), -ECHILD);
395 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
396 assert_return(bus, -EINVAL);
397 assert_return(!bus_pid_changed(bus), -ECHILD);
399 return bus->watch_bind;
402 _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) {
403 assert_return(bus, -EINVAL);
404 assert_return(bus->state == BUS_UNSET, -EPERM);
405 assert_return(!bus_pid_changed(bus), -ECHILD);
407 bus->connected_signal = b;
411 _public_ int sd_bus_get_connected_signal(sd_bus *bus) {
412 assert_return(bus, -EINVAL);
413 assert_return(!bus_pid_changed(bus), -ECHILD);
415 return bus->connected_signal;
418 static int synthesize_connected_signal(sd_bus *bus) {
419 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
424 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
425 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
426 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
428 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
429 * that works independently from whether we connected to a full bus or just a direct connection. */
431 if (!bus->connected_signal)
434 r = sd_bus_message_new_signal(
437 "/org/freedesktop/DBus/Local",
438 "org.freedesktop.DBus.Local",
443 bus_message_set_sender_local(bus, m);
445 r = bus_seal_synthetic_message(bus, m);
449 r = bus_rqueue_make_room(bus);
453 /* Insert at the very front */
454 memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size);
462 void bus_set_state(sd_bus *bus, enum bus_state state) {
464 static const char * const table[_BUS_STATE_MAX] = {
465 [BUS_UNSET] = "UNSET",
466 [BUS_WATCH_BIND] = "WATCH_BIND",
467 [BUS_OPENING] = "OPENING",
468 [BUS_AUTHENTICATING] = "AUTHENTICATING",
469 [BUS_HELLO] = "HELLO",
470 [BUS_RUNNING] = "RUNNING",
471 [BUS_CLOSING] = "CLOSING",
472 [BUS_CLOSED] = "CLOSED",
476 assert(state < _BUS_STATE_MAX);
478 if (state == bus->state)
481 log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state]);
485 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
493 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
495 r = sd_bus_message_get_errno(reply);
499 r = sd_bus_message_read(reply, "s", &s);
503 if (!service_name_is_valid(s) || s[0] != ':')
506 bus->unique_name = strdup(s);
507 if (!bus->unique_name)
510 if (bus->state == BUS_HELLO) {
511 bus_set_state(bus, BUS_RUNNING);
513 r = synthesize_connected_signal(bus);
521 static int bus_send_hello(sd_bus *bus) {
522 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
527 if (!bus->bus_client)
530 r = sd_bus_message_new_method_call(
533 "org.freedesktop.DBus",
534 "/org/freedesktop/DBus",
535 "org.freedesktop.DBus",
540 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
543 int bus_start_running(sd_bus *bus) {
544 struct reply_callback *c;
550 assert(bus->state < BUS_HELLO);
552 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
553 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
554 * adding a fixed value to all entries should not alter the internal order. */
556 n = now(CLOCK_MONOTONIC);
557 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
558 if (c->timeout_usec == 0)
561 c->timeout_usec = usec_add(n, c->timeout_usec);
564 if (bus->bus_client) {
565 bus_set_state(bus, BUS_HELLO);
569 bus_set_state(bus, BUS_RUNNING);
571 r = synthesize_connected_signal(bus);
578 static int parse_address_key(const char **p, const char *key, char **value) {
579 size_t l, n = 0, allocated = 0;
589 if (strncmp(*p, key, l) != 0)
602 while (!IN_SET(*a, ';', ',', 0)) {
620 c = (char) ((x << 4) | y);
627 if (!GREEDY_REALLOC(r, allocated, n + 2))
651 static void skip_address_key(const char **p) {
655 *p += strcspn(*p, ",");
661 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
662 _cleanup_free_ char *path = NULL, *abstract = NULL;
671 while (!IN_SET(**p, 0, ';')) {
672 r = parse_address_key(p, "guid", guid);
678 r = parse_address_key(p, "path", &path);
684 r = parse_address_key(p, "abstract", &abstract);
693 if (!path && !abstract)
696 if (path && abstract)
701 if (l > sizeof(b->sockaddr.un.sun_path))
704 b->sockaddr.un.sun_family = AF_UNIX;
705 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
706 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
707 } else if (abstract) {
708 l = strlen(abstract);
709 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
712 b->sockaddr.un.sun_family = AF_UNIX;
713 b->sockaddr.un.sun_path[0] = 0;
714 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
715 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
723 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
724 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
726 struct addrinfo *result, hints = {
727 .ai_socktype = SOCK_STREAM,
728 .ai_flags = AI_ADDRCONFIG,
736 while (!IN_SET(**p, 0, ';')) {
737 r = parse_address_key(p, "guid", guid);
743 r = parse_address_key(p, "host", &host);
749 r = parse_address_key(p, "port", &port);
755 r = parse_address_key(p, "family", &family);
768 if (streq(family, "ipv4"))
769 hints.ai_family = AF_INET;
770 else if (streq(family, "ipv6"))
771 hints.ai_family = AF_INET6;
776 r = getaddrinfo(host, port, &hints, &result);
780 return -EADDRNOTAVAIL;
782 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
783 b->sockaddr_size = result->ai_addrlen;
785 freeaddrinfo(result);
792 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
794 unsigned n_argv = 0, j;
796 size_t allocated = 0;
804 while (!IN_SET(**p, 0, ';')) {
805 r = parse_address_key(p, "guid", guid);
811 r = parse_address_key(p, "path", &path);
817 if (startswith(*p, "argv")) {
821 ul = strtoul(*p + 4, (char**) p, 10);
822 if (errno > 0 || **p != '=' || ul > 256) {
830 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
838 r = parse_address_key(p, NULL, argv + ul);
853 /* Make sure there are no holes in the array, with the
854 * exception of argv[0] */
855 for (j = 1; j < n_argv; j++)
861 if (argv && argv[0] == NULL) {
862 argv[0] = strdup(path);
877 for (j = 0; j < n_argv; j++)
885 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
886 _cleanup_free_ char *machine = NULL, *pid = NULL;
894 while (!IN_SET(**p, 0, ';')) {
895 r = parse_address_key(p, "guid", guid);
901 r = parse_address_key(p, "machine", &machine);
907 r = parse_address_key(p, "pid", &pid);
916 if (!machine == !pid)
920 if (!machine_name_is_valid(machine))
923 free_and_replace(b->machine, machine);
925 b->machine = mfree(b->machine);
929 r = parse_pid(pid, &b->nspid);
935 b->sockaddr.un.sun_family = AF_UNIX;
936 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
937 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
938 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
944 static void bus_reset_parsed_address(sd_bus *b) {
948 b->sockaddr_size = 0;
949 b->exec_argv = strv_free(b->exec_argv);
950 b->exec_path = mfree(b->exec_path);
951 b->server_id = SD_ID128_NULL;
952 b->machine = mfree(b->machine);
956 static int bus_parse_next_address(sd_bus *b) {
957 _cleanup_free_ char *guid = NULL;
965 if (b->address[b->address_index] == 0)
968 bus_reset_parsed_address(b);
970 a = b->address + b->address_index;
979 if (startswith(a, "unix:")) {
982 r = parse_unix_address(b, &a, &guid);
987 } else if (startswith(a, "tcp:")) {
990 r = parse_tcp_address(b, &a, &guid);
996 } else if (startswith(a, "unixexec:")) {
999 r = parse_exec_address(b, &a, &guid);
1005 } else if (startswith(a, "x-machine-unix:")) {
1008 r = parse_container_unix_address(b, &a, &guid);
1021 r = sd_id128_from_string(guid, &b->server_id);
1026 b->address_index = a - b->address;
1030 static int bus_start_address(sd_bus *b) {
1036 bus_close_io_fds(b);
1037 bus_close_inotify_fd(b);
1039 /* If you provide multiple different bus-addresses, we
1040 * try all of them in order and use the first one that
1044 r = bus_socket_exec(b);
1045 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1046 r = bus_container_connect_socket(b);
1047 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1048 r = bus_socket_connect(b);
1055 q = bus_attach_io_events(b);
1059 q = bus_attach_inotify_event(b);
1066 b->last_connect_error = -r;
1069 r = bus_parse_next_address(b);
1073 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1077 int bus_next_address(sd_bus *b) {
1080 bus_reset_parsed_address(b);
1081 return bus_start_address(b);
1084 static int bus_start_fd(sd_bus *b) {
1089 assert(b->input_fd >= 0);
1090 assert(b->output_fd >= 0);
1092 r = fd_nonblock(b->input_fd, true);
1096 r = fd_cloexec(b->input_fd, true);
1100 if (b->input_fd != b->output_fd) {
1101 r = fd_nonblock(b->output_fd, true);
1105 r = fd_cloexec(b->output_fd, true);
1110 if (fstat(b->input_fd, &st) < 0)
1113 return bus_socket_take_fd(b);
1116 _public_ int sd_bus_start(sd_bus *bus) {
1119 assert_return(bus, -EINVAL);
1120 assert_return(bus->state == BUS_UNSET, -EPERM);
1121 assert_return(!bus_pid_changed(bus), -ECHILD);
1123 bus_set_state(bus, BUS_OPENING);
1125 if (bus->is_server && bus->bus_client)
1128 if (bus->input_fd >= 0)
1129 r = bus_start_fd(bus);
1130 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1131 r = bus_start_address(bus);
1140 return bus_send_hello(bus);
1143 _public_ int sd_bus_open(sd_bus **ret) {
1148 assert_return(ret, -EINVAL);
1150 /* Let's connect to the starter bus if it is set, and
1151 * otherwise to the bus that is appropropriate for the scope
1152 * we are running in */
1154 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1156 if (streq(e, "system"))
1157 return sd_bus_open_system(ret);
1158 #if 0 /// elogind does not support systemd user instances
1159 else if (STR_IN_SET(e, "session", "user"))
1160 return sd_bus_open_user(ret);
1164 e = secure_getenv("DBUS_STARTER_ADDRESS");
1166 #if 0 /// elogind does not support systemd user instances
1167 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1168 return sd_bus_open_user(ret);
1171 return sd_bus_open_system(ret);
1178 r = sd_bus_set_address(b, e);
1182 b->bus_client = true;
1184 /* We don't know whether the bus is trusted or not, so better
1185 * be safe, and authenticate everything */
1187 b->is_local = false;
1188 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1190 r = sd_bus_start(b);
1202 int bus_set_address_system(sd_bus *b) {
1206 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1208 return sd_bus_set_address(b, e);
1210 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1213 _public_ int sd_bus_open_system(sd_bus **ret) {
1217 assert_return(ret, -EINVAL);
1223 r = bus_set_address_system(b);
1227 b->bus_client = true;
1228 b->is_system = true;
1230 /* Let's do per-method access control on the system bus. We
1231 * need the caller's UID and capability set for that. */
1233 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1236 r = sd_bus_start(b);
1248 #if 0 /// elogind can not open/use a user bus
1249 int bus_set_address_user(sd_bus *b) {
1251 _cleanup_free_ char *ee = NULL, *s = NULL;
1255 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1257 return sd_bus_set_address(b, e);
1259 e = secure_getenv("XDG_RUNTIME_DIR");
1263 ee = bus_address_escape(e);
1267 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1277 _public_ int sd_bus_open_user(sd_bus **ret) {
1278 #if 0 /// elogind does not support user buses
1282 assert_return(ret, -EINVAL);
1288 r = bus_set_address_user(b);
1292 b->bus_client = true;
1295 /* We don't do any per-method access control on the user
1300 r = sd_bus_start(b);
1311 return sd_bus_open_system(ret);
1315 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1316 _cleanup_free_ char *e = NULL;
1317 char *m = NULL, *c = NULL;
1322 /* Let's see if we shall enter some container */
1323 m = strchr(host, ':');
1327 /* Let's make sure this is not a port of some kind,
1328 * and is a valid machine name. */
1329 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1332 /* Cut out the host part */
1333 t = strndupa(host, m - host - 1);
1334 e = bus_address_escape(t);
1338 c = strjoina(",argv5=--machine=", m);
1343 e = bus_address_escape(host);
1348 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c);
1355 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1359 assert_return(host, -EINVAL);
1360 assert_return(ret, -EINVAL);
1362 r = sd_bus_new(&bus);
1366 r = bus_set_address_system_remote(bus, host);
1370 bus->bus_client = true;
1371 bus->trusted = false;
1372 bus->is_system = true;
1373 bus->is_local = false;
1375 r = sd_bus_start(bus);
1387 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1388 _cleanup_free_ char *e = NULL;
1393 e = bus_address_escape(machine);
1397 b->address = strjoin("x-machine-unix:machine=", e);
1404 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1408 assert_return(machine, -EINVAL);
1409 assert_return(ret, -EINVAL);
1410 assert_return(machine_name_is_valid(machine), -EINVAL);
1412 r = sd_bus_new(&bus);
1416 r = bus_set_address_system_machine(bus, machine);
1420 bus->bus_client = true;
1421 bus->trusted = false;
1422 bus->is_system = true;
1423 bus->is_local = false;
1425 r = sd_bus_start(bus);
1437 _public_ void sd_bus_close(sd_bus *bus) {
1441 if (bus->state == BUS_CLOSED)
1443 if (bus_pid_changed(bus))
1446 bus_set_state(bus, BUS_CLOSED);
1448 sd_bus_detach_event(bus);
1450 /* Drop all queued messages so that they drop references to
1451 * the bus object and the bus may be freed */
1452 bus_reset_queues(bus);
1454 bus_close_io_fds(bus);
1455 bus_close_inotify_fd(bus);
1458 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1466 return sd_bus_unref(bus);
1469 void bus_enter_closing(sd_bus *bus) {
1472 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1475 bus_set_state(bus, BUS_CLOSING);
1478 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1483 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1488 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1494 i = REFCNT_DEC(bus->n_ref);
1502 _public_ int sd_bus_is_open(sd_bus *bus) {
1504 assert_return(bus, -EINVAL);
1505 assert_return(!bus_pid_changed(bus), -ECHILD);
1507 return BUS_IS_OPEN(bus->state);
1510 _public_ int sd_bus_is_ready(sd_bus *bus) {
1511 assert_return(bus, -EINVAL);
1512 assert_return(!bus_pid_changed(bus), -ECHILD);
1514 return bus->state == BUS_RUNNING;
1517 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1520 assert_return(bus, -EINVAL);
1521 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1522 assert_return(!bus_pid_changed(bus), -ECHILD);
1524 if (bus->is_monitor)
1527 if (type == SD_BUS_TYPE_UNIX_FD) {
1528 if (!bus->accept_fd)
1531 r = bus_ensure_running(bus);
1535 return bus->can_fds;
1538 return bus_type_is_valid(type);
1541 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1544 assert_return(bus, -EINVAL);
1545 assert_return(id, -EINVAL);
1546 assert_return(!bus_pid_changed(bus), -ECHILD);
1548 r = bus_ensure_running(bus);
1552 *id = bus->server_id;
1556 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1563 /* If we copy the same message to multiple
1564 * destinations, avoid using the same cookie
1566 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1571 timeout = BUS_DEFAULT_TIMEOUT;
1573 if (!m->sender && b->patch_sender) {
1574 r = sd_bus_message_set_sender(m, b->patch_sender);
1579 return sd_bus_message_seal(m, ++b->cookie, timeout);
1582 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1583 bool remarshal = false;
1587 /* wrong packet version */
1588 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1591 /* wrong packet endianness */
1592 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1595 return remarshal ? bus_message_remarshal(b, m) : 0;
1598 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1602 /* Fake some timestamps, if they were requested, and not
1603 * already initialized */
1604 if (b->attach_timestamp) {
1605 if (m->realtime <= 0)
1606 m->realtime = now(CLOCK_REALTIME);
1608 if (m->monotonic <= 0)
1609 m->monotonic = now(CLOCK_MONOTONIC);
1612 /* The bus specification says the serial number cannot be 0,
1613 * hence let's fill something in for synthetic messages. Since
1614 * synthetic messages might have a fake sender and we don't
1615 * want to interfere with the real sender's serial numbers we
1616 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1617 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1618 * even though kdbus can do 64bit. */
1619 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1622 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1628 r = bus_socket_write_message(bus, m, idx);
1632 if (*idx >= BUS_MESSAGE_SIZE(m))
1633 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",
1634 bus_message_type_to_string(m->header->type),
1635 strna(sd_bus_message_get_sender(m)),
1636 strna(sd_bus_message_get_destination(m)),
1637 strna(sd_bus_message_get_path(m)),
1638 strna(sd_bus_message_get_interface(m)),
1639 strna(sd_bus_message_get_member(m)),
1640 BUS_MESSAGE_COOKIE(m),
1642 strna(m->root_container.signature),
1643 strna(m->error.name),
1644 strna(m->error.message));
1649 static int dispatch_wqueue(sd_bus *bus) {
1653 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1655 while (bus->wqueue_size > 0) {
1657 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1661 /* Didn't do anything this time */
1663 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1664 /* Fully written. Let's drop the entry from
1667 * This isn't particularly optimized, but
1668 * well, this is supposed to be our worst-case
1669 * buffer only, and the socket buffer is
1670 * supposed to be our primary buffer, and if
1671 * it got full, then all bets are off
1675 sd_bus_message_unref(bus->wqueue[0]);
1676 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1686 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1689 return bus_socket_read_message(bus);
1692 int bus_rqueue_make_room(sd_bus *bus) {
1695 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1698 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1704 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1709 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1711 /* Note that the priority logic is only available on kdbus,
1712 * where the rqueue is unused. We check the rqueue here
1713 * anyway, because it's simple... */
1716 if (bus->rqueue_size > 0) {
1717 /* Dispatch a queued message */
1719 *m = bus->rqueue[0];
1721 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1725 /* Try to read a new message */
1726 r = bus_read_message(bus, hint_priority, priority);
1736 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1737 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1740 assert_return(m, -EINVAL);
1745 assert_return(!bus_pid_changed(bus), -ECHILD);
1747 if (!BUS_IS_OPEN(bus->state))
1751 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1758 /* If the cookie number isn't kept, then we know that no reply
1760 if (!cookie && !m->sealed)
1761 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1763 r = bus_seal_message(bus, m, 0);
1767 /* Remarshall if we have to. This will possibly unref the
1768 * message and place a replacement in m */
1769 r = bus_remarshal_message(bus, &m);
1773 /* If this is a reply and no reply was requested, then let's
1774 * suppress this, if we can */
1778 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1781 r = bus_write_message(bus, m, hint_sync_call, &idx);
1783 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1784 bus_enter_closing(bus);
1791 if (idx < BUS_MESSAGE_SIZE(m)) {
1792 /* Wasn't fully written. So let's remember how
1793 * much was written. Note that the first entry
1794 * of the wqueue array is always allocated so
1795 * that we always can remember how much was
1797 bus->wqueue[0] = sd_bus_message_ref(m);
1798 bus->wqueue_size = 1;
1803 /* Just append it to the queue. */
1805 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1808 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1811 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1816 *cookie = BUS_MESSAGE_COOKIE(m);
1821 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1822 return bus_send_internal(bus, m, cookie, false);
1825 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1828 assert_return(m, -EINVAL);
1833 assert_return(!bus_pid_changed(bus), -ECHILD);
1835 if (!BUS_IS_OPEN(bus->state))
1838 if (!streq_ptr(m->destination, destination)) {
1843 r = sd_bus_message_set_destination(m, destination);
1848 return sd_bus_send(bus, m, cookie);
1851 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1854 if (usec == (uint64_t) -1)
1857 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1858 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1859 * relative timestamp, and afterwards the absolute one. */
1861 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1864 return now(CLOCK_MONOTONIC) + usec;
1867 static int timeout_compare(const void *a, const void *b) {
1868 const struct reply_callback *x = a, *y = b;
1870 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1873 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1876 if (x->timeout_usec < y->timeout_usec)
1879 if (x->timeout_usec > y->timeout_usec)
1885 _public_ int sd_bus_call_async(
1889 sd_bus_message_handler_t callback,
1893 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1894 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1897 assert_return(m, -EINVAL);
1898 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1899 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
1904 assert_return(!bus_pid_changed(bus), -ECHILD);
1906 if (!BUS_IS_OPEN(bus->state))
1909 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
1910 if (!callback && !slot && !m->sealed)
1911 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1913 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1917 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1921 r = bus_seal_message(bus, m, usec);
1925 r = bus_remarshal_message(bus, &m);
1929 if (slot || callback) {
1930 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1934 s->reply_callback.callback = callback;
1936 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1937 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1939 s->reply_callback.cookie = 0;
1943 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
1944 if (s->reply_callback.timeout_usec != 0) {
1945 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1947 s->reply_callback.timeout_usec = 0;
1953 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
1964 int bus_ensure_running(sd_bus *bus) {
1969 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
1971 if (bus->state == BUS_RUNNING)
1975 r = sd_bus_process(bus, NULL);
1978 if (bus->state == BUS_RUNNING)
1983 r = sd_bus_wait(bus, (uint64_t) -1);
1989 _public_ int sd_bus_call(
1993 sd_bus_error *error,
1994 sd_bus_message **reply) {
1996 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2002 bus_assert_return(m, -EINVAL, error);
2003 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2004 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2005 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2010 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2012 if (!BUS_IS_OPEN(bus->state)) {
2017 r = bus_ensure_running(bus);
2021 i = bus->rqueue_size;
2023 r = bus_seal_message(bus, m, usec);
2027 r = bus_remarshal_message(bus, &m);
2031 r = bus_send_internal(bus, m, &cookie, true);
2035 timeout = calc_elapse(bus, m->timeout);
2040 while (i < bus->rqueue_size) {
2041 sd_bus_message *incoming = NULL;
2043 incoming = bus->rqueue[i];
2045 if (incoming->reply_cookie == cookie) {
2046 /* Found a match! */
2048 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2050 log_debug_bus_message(incoming);
2052 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2054 if (incoming->n_fds <= 0 || bus->accept_fd) {
2058 sd_bus_message_unref(incoming);
2063 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2064 sd_bus_message_unref(incoming);
2067 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2068 r = sd_bus_error_copy(error, &incoming->error);
2069 sd_bus_message_unref(incoming);
2076 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2079 streq(bus->unique_name, incoming->sender)) {
2081 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2084 /* Our own message? Somebody is trying
2085 * to send its own client a message,
2086 * let's not dead-lock, let's fail
2089 sd_bus_message_unref(incoming);
2094 /* Try to read more, right-away */
2098 r = bus_read_message(bus, false, 0);
2100 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2101 bus_enter_closing(bus);
2113 n = now(CLOCK_MONOTONIC);
2121 left = (uint64_t) -1;
2123 r = bus_poll(bus, true, left);
2131 r = dispatch_wqueue(bus);
2133 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2134 bus_enter_closing(bus);
2143 return sd_bus_error_set_errno(error, r);
2146 _public_ int sd_bus_get_fd(sd_bus *bus) {
2148 assert_return(bus, -EINVAL);
2149 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2150 assert_return(!bus_pid_changed(bus), -ECHILD);
2152 if (bus->state == BUS_CLOSED)
2155 if (bus->inotify_fd >= 0)
2156 return bus->inotify_fd;
2158 if (bus->input_fd >= 0)
2159 return bus->input_fd;
2164 _public_ int sd_bus_get_events(sd_bus *bus) {
2167 assert_return(bus, -EINVAL);
2168 assert_return(!bus_pid_changed(bus), -ECHILD);
2170 switch (bus->state) {
2176 case BUS_WATCH_BIND:
2184 case BUS_AUTHENTICATING:
2185 if (bus_socket_auth_needs_write(bus))
2193 if (bus->rqueue_size <= 0)
2195 if (bus->wqueue_size > 0)
2203 assert_not_reached("Unknown state");
2209 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2210 struct reply_callback *c;
2212 assert_return(bus, -EINVAL);
2213 assert_return(timeout_usec, -EINVAL);
2214 assert_return(!bus_pid_changed(bus), -ECHILD);
2216 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2219 if (bus->track_queue) {
2224 switch (bus->state) {
2226 case BUS_AUTHENTICATING:
2227 *timeout_usec = bus->auth_timeout;
2232 if (bus->rqueue_size > 0) {
2237 c = prioq_peek(bus->reply_callbacks_prioq);
2239 *timeout_usec = (uint64_t) -1;
2243 if (c->timeout_usec == 0) {
2244 *timeout_usec = (uint64_t) -1;
2248 *timeout_usec = c->timeout_usec;
2255 case BUS_WATCH_BIND:
2257 *timeout_usec = (uint64_t) -1;
2261 assert_not_reached("Unknown or unexpected stat");
2265 static int process_timeout(sd_bus *bus) {
2266 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2267 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2268 struct reply_callback *c;
2275 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2277 c = prioq_peek(bus->reply_callbacks_prioq);
2281 n = now(CLOCK_MONOTONIC);
2282 if (c->timeout_usec > n)
2285 r = bus_message_new_synthetic_error(
2288 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2293 r = bus_seal_synthetic_message(bus, m);
2297 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2298 c->timeout_usec = 0;
2300 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2303 slot = container_of(c, sd_bus_slot, reply_callback);
2305 bus->iteration_counter++;
2307 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2309 bus->current_message = m;
2310 bus->current_slot = sd_bus_slot_ref(slot);
2311 bus->current_handler = c->callback;
2312 bus->current_userdata = slot->userdata;
2313 r = c->callback(m, slot->userdata, &error_buffer);
2314 bus->current_userdata = NULL;
2315 bus->current_handler = NULL;
2316 bus->current_slot = NULL;
2317 bus->current_message = NULL;
2319 if (slot->floating) {
2320 bus_slot_disconnect(slot);
2321 sd_bus_slot_unref(slot);
2324 sd_bus_slot_unref(slot);
2326 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2327 * and ignore the callback handler's return value. */
2331 return bus_maybe_reply_error(m, r, &error_buffer);
2334 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2338 if (bus->state != BUS_HELLO)
2341 /* Let's make sure the first message on the bus is the HELLO
2342 * reply. But note that we don't actually parse the message
2343 * here (we leave that to the usual handling), we just verify
2344 * we don't let any earlier msg through. */
2346 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2349 if (m->reply_cookie != 1)
2355 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2356 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2357 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2358 struct reply_callback *c;
2366 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2369 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2372 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2378 slot = container_of(c, sd_bus_slot, reply_callback);
2380 if (m->n_fds > 0 && !bus->accept_fd) {
2382 /* If the reply contained a file descriptor which we
2383 * didn't want we pass an error instead. */
2385 r = bus_message_new_synthetic_error(
2388 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2393 /* Copy over original timestamp */
2394 synthetic_reply->realtime = m->realtime;
2395 synthetic_reply->monotonic = m->monotonic;
2396 synthetic_reply->seqnum = m->seqnum;
2398 r = bus_seal_synthetic_message(bus, synthetic_reply);
2402 m = synthetic_reply;
2404 r = sd_bus_message_rewind(m, true);
2409 if (c->timeout_usec != 0) {
2410 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2411 c->timeout_usec = 0;
2414 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2416 bus->current_slot = sd_bus_slot_ref(slot);
2417 bus->current_handler = c->callback;
2418 bus->current_userdata = slot->userdata;
2419 r = c->callback(m, slot->userdata, &error_buffer);
2420 bus->current_userdata = NULL;
2421 bus->current_handler = NULL;
2422 bus->current_slot = NULL;
2424 if (slot->floating) {
2425 bus_slot_disconnect(slot);
2426 sd_bus_slot_unref(slot);
2429 sd_bus_slot_unref(slot);
2431 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2432 * ignore the callback handler's return value. */
2436 return bus_maybe_reply_error(m, r, &error_buffer);
2439 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2440 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2441 struct filter_callback *l;
2448 bus->filter_callbacks_modified = false;
2450 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2453 if (bus->filter_callbacks_modified)
2456 /* Don't run this more than once per iteration */
2457 if (l->last_iteration == bus->iteration_counter)
2460 l->last_iteration = bus->iteration_counter;
2462 r = sd_bus_message_rewind(m, true);
2466 slot = container_of(l, sd_bus_slot, filter_callback);
2468 bus->current_slot = sd_bus_slot_ref(slot);
2469 bus->current_handler = l->callback;
2470 bus->current_userdata = slot->userdata;
2471 r = l->callback(m, slot->userdata, &error_buffer);
2472 bus->current_userdata = NULL;
2473 bus->current_handler = NULL;
2474 bus->current_slot = sd_bus_slot_unref(slot);
2476 r = bus_maybe_reply_error(m, r, &error_buffer);
2482 } while (bus->filter_callbacks_modified);
2487 static int process_match(sd_bus *bus, sd_bus_message *m) {
2494 bus->match_callbacks_modified = false;
2496 r = bus_match_run(bus, &bus->match_callbacks, m);
2500 } while (bus->match_callbacks_modified);
2505 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2506 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2512 if (bus->is_monitor)
2515 if (bus->manual_peer_interface)
2518 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2521 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2524 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2527 if (streq_ptr(m->member, "Ping"))
2528 r = sd_bus_message_new_method_return(m, &reply);
2529 else if (streq_ptr(m->member, "GetMachineId")) {
2533 r = sd_id128_get_machine(&id);
2537 r = sd_bus_message_new_method_return(m, &reply);
2541 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2543 r = sd_bus_message_new_method_errorf(
2545 SD_BUS_ERROR_UNKNOWN_METHOD,
2546 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2552 r = sd_bus_send(bus, reply, NULL);
2559 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2563 /* If we got a message with a file descriptor which we didn't
2564 * want to accept, then let's drop it. How can this even
2565 * happen? For example, when the kernel queues a message into
2566 * an activatable names's queue which allows fds, and then is
2567 * delivered to us later even though we ourselves did not
2570 if (bus->is_monitor)
2579 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2580 return 1; /* just eat it up */
2582 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2585 static int process_message(sd_bus *bus, sd_bus_message *m) {
2591 bus->current_message = m;
2592 bus->iteration_counter++;
2594 log_debug_bus_message(m);
2596 r = process_hello(bus, m);
2600 r = process_reply(bus, m);
2604 r = process_fd_check(bus, m);
2608 r = process_filter(bus, m);
2612 r = process_match(bus, m);
2616 r = process_builtin(bus, m);
2620 r = bus_process_object(bus, m);
2623 bus->current_message = NULL;
2627 static int dispatch_track(sd_bus *bus) {
2630 if (!bus->track_queue)
2633 bus_track_dispatch(bus->track_queue);
2637 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2638 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2642 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2644 r = process_timeout(bus);
2648 r = dispatch_wqueue(bus);
2652 r = dispatch_track(bus);
2656 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2662 r = process_message(bus, m);
2667 r = sd_bus_message_rewind(m, true);
2676 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2678 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2679 strna(sd_bus_message_get_sender(m)),
2680 strna(sd_bus_message_get_path(m)),
2681 strna(sd_bus_message_get_interface(m)),
2682 strna(sd_bus_message_get_member(m)));
2684 r = sd_bus_reply_method_errorf(
2686 SD_BUS_ERROR_UNKNOWN_OBJECT,
2687 "Unknown object '%s'.", m->path);
2701 static int bus_exit_now(sd_bus *bus) {
2704 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2705 * sd_event_exit(), otherwise invokes libc exit(). */
2707 if (bus->exited) /* did we already exit? */
2709 if (!bus->exit_triggered) /* was the exit condition triggered? */
2711 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2714 bus->exited = true; /* never exit more than once */
2716 log_debug("Bus connection disconnected, exiting.");
2719 return sd_event_exit(bus->event, EXIT_FAILURE);
2723 assert_not_reached("exit() didn't exit?");
2726 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2727 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2728 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2735 r = bus_message_new_synthetic_error(
2738 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2743 r = bus_seal_synthetic_message(bus, m);
2747 if (c->timeout_usec != 0) {
2748 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2749 c->timeout_usec = 0;
2752 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2755 slot = container_of(c, sd_bus_slot, reply_callback);
2757 bus->iteration_counter++;
2759 bus->current_message = m;
2760 bus->current_slot = sd_bus_slot_ref(slot);
2761 bus->current_handler = c->callback;
2762 bus->current_userdata = slot->userdata;
2763 r = c->callback(m, slot->userdata, &error_buffer);
2764 bus->current_userdata = NULL;
2765 bus->current_handler = NULL;
2766 bus->current_slot = NULL;
2767 bus->current_message = NULL;
2769 if (slot->floating) {
2770 bus_slot_disconnect(slot);
2771 sd_bus_slot_unref(slot);
2774 sd_bus_slot_unref(slot);
2776 return bus_maybe_reply_error(m, r, &error_buffer);
2779 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2780 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2781 struct reply_callback *c;
2785 assert(bus->state == BUS_CLOSING);
2787 /* First, fail all outstanding method calls */
2788 c = ordered_hashmap_first(bus->reply_callbacks);
2790 return process_closing_reply_callback(bus, c);
2792 /* Then, fake-drop all remaining bus tracking references */
2794 bus_track_close(bus->tracks);
2798 /* Then, synthesize a Disconnected message */
2799 r = sd_bus_message_new_signal(
2802 "/org/freedesktop/DBus/Local",
2803 "org.freedesktop.DBus.Local",
2808 bus_message_set_sender_local(bus, m);
2810 r = bus_seal_synthetic_message(bus, m);
2816 bus->current_message = m;
2817 bus->iteration_counter++;
2819 r = process_filter(bus, m);
2823 r = process_match(bus, m);
2827 /* Nothing else to do, exit now, if the condition holds */
2828 bus->exit_triggered = true;
2829 (void) bus_exit_now(bus);
2839 bus->current_message = NULL;
2844 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2845 BUS_DONT_DESTROY(bus);
2848 /* Returns 0 when we didn't do anything. This should cause the
2849 * caller to invoke sd_bus_wait() before returning the next
2850 * time. Returns > 0 when we did something, which possibly
2851 * means *ret is filled in with an unprocessed message. */
2853 assert_return(bus, -EINVAL);
2854 assert_return(!bus_pid_changed(bus), -ECHILD);
2856 /* We don't allow recursively invoking sd_bus_process(). */
2857 assert_return(!bus->current_message, -EBUSY);
2858 assert(!bus->current_slot);
2860 switch (bus->state) {
2868 case BUS_WATCH_BIND:
2869 r = bus_socket_process_watch_bind(bus);
2873 r = bus_socket_process_opening(bus);
2876 case BUS_AUTHENTICATING:
2877 r = bus_socket_process_authenticating(bus);
2882 r = process_running(bus, hint_priority, priority, ret);
2886 /* This branch initializes *ret, hence we don't use the generic error checking below */
2890 return process_closing(bus, ret);
2893 assert_not_reached("Unknown state");
2896 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2897 bus_enter_closing(bus);
2908 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2909 return bus_process_internal(bus, false, 0, ret);
2912 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2913 return bus_process_internal(bus, true, priority, ret);
2916 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2917 struct pollfd p[2] = {};
2920 usec_t m = USEC_INFINITY;
2924 if (bus->state == BUS_CLOSING)
2927 if (!BUS_IS_OPEN(bus->state))
2930 if (bus->state == BUS_WATCH_BIND) {
2931 assert(bus->inotify_fd >= 0);
2933 p[0].events = POLLIN;
2934 p[0].fd = bus->inotify_fd;
2939 e = sd_bus_get_events(bus);
2944 /* The caller really needs some more data, he doesn't
2945 * care about what's already read, or any timeouts
2946 * except its own. */
2950 /* The caller wants to process if there's something to
2951 * process, but doesn't care otherwise */
2953 r = sd_bus_get_timeout(bus, &until);
2957 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
2960 p[0].fd = bus->input_fd;
2961 if (bus->output_fd == bus->input_fd) {
2965 p[0].events = e & POLLIN;
2966 p[1].fd = bus->output_fd;
2967 p[1].events = e & POLLOUT;
2972 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
2975 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
2979 return r > 0 ? 1 : 0;
2982 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2984 assert_return(bus, -EINVAL);
2985 assert_return(!bus_pid_changed(bus), -ECHILD);
2987 if (bus->state == BUS_CLOSING)
2990 if (!BUS_IS_OPEN(bus->state))
2993 if (bus->rqueue_size > 0)
2996 return bus_poll(bus, false, timeout_usec);
2999 _public_ int sd_bus_flush(sd_bus *bus) {
3002 assert_return(bus, -EINVAL);
3003 assert_return(!bus_pid_changed(bus), -ECHILD);
3005 if (bus->state == BUS_CLOSING)
3008 if (!BUS_IS_OPEN(bus->state))
3011 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3012 if (bus->state == BUS_WATCH_BIND)
3015 r = bus_ensure_running(bus);
3019 if (bus->wqueue_size <= 0)
3023 r = dispatch_wqueue(bus);
3025 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3026 bus_enter_closing(bus);
3033 if (bus->wqueue_size <= 0)
3036 r = bus_poll(bus, false, (uint64_t) -1);
3042 _public_ int sd_bus_add_filter(
3045 sd_bus_message_handler_t callback,
3050 assert_return(bus, -EINVAL);
3051 assert_return(callback, -EINVAL);
3052 assert_return(!bus_pid_changed(bus), -ECHILD);
3054 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3058 s->filter_callback.callback = callback;
3060 bus->filter_callbacks_modified = true;
3061 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3069 static int add_match_callback(
3072 sd_bus_error *ret_error) {
3074 sd_bus_slot *match_slot = userdata;
3075 bool failed = false;
3081 sd_bus_slot_ref(match_slot);
3083 if (sd_bus_message_is_method_error(m, NULL)) {
3084 log_debug_errno(sd_bus_message_get_errno(m),
3085 "Unable to add match %s, failing connection: %s",
3086 match_slot->match_callback.match_string,
3087 sd_bus_message_get_error(m)->message);
3091 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3093 if (match_slot->match_callback.install_callback) {
3096 bus = sd_bus_message_get_bus(m);
3098 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3099 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3102 assert(bus->current_slot == match_slot->match_callback.install_slot);
3103 assert(bus->current_handler == add_match_callback);
3104 assert(bus->current_userdata == userdata);
3106 bus->current_slot = match_slot;
3107 bus->current_handler = match_slot->match_callback.install_callback;
3108 bus->current_userdata = match_slot->userdata;
3110 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3112 bus->current_slot = match_slot->match_callback.install_slot;
3113 bus->current_handler = add_match_callback;
3114 bus->current_userdata = userdata;
3116 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3118 if (failed) /* Generic failure handling: destroy the connection */
3119 bus_enter_closing(sd_bus_message_get_bus(m));
3124 if (failed && match_slot->floating) {
3125 bus_slot_disconnect(match_slot);
3126 sd_bus_slot_unref(match_slot);
3129 sd_bus_slot_unref(match_slot);
3134 static int bus_add_match_full(
3139 sd_bus_message_handler_t callback,
3140 sd_bus_message_handler_t install_callback,
3143 struct bus_match_component *components = NULL;
3144 unsigned n_components = 0;
3145 sd_bus_slot *s = NULL;
3148 assert_return(bus, -EINVAL);
3149 assert_return(match, -EINVAL);
3150 assert_return(!bus_pid_changed(bus), -ECHILD);
3152 r = bus_match_parse(match, &components, &n_components);
3156 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3162 s->match_callback.callback = callback;
3163 s->match_callback.install_callback = install_callback;
3165 if (bus->bus_client) {
3166 enum bus_match_scope scope;
3168 scope = bus_match_get_scope(components, n_components);
3170 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3171 if (scope != BUS_MATCH_LOCAL) {
3173 /* We store the original match string, so that we can use it to remove the match again. */
3175 s->match_callback.match_string = strdup(match);
3176 if (!s->match_callback.match_string) {
3182 r = bus_add_match_internal_async(bus,
3183 &s->match_callback.install_slot,
3184 s->match_callback.match_string,
3188 r = bus_add_match_internal(bus, s->match_callback.match_string);
3192 s->match_added = true;
3196 bus->match_callbacks_modified = true;
3197 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3206 bus_match_parse_free(components, n_components);
3207 sd_bus_slot_unref(s);
3212 #if 0 /// UNNEEDED by elogind
3214 _public_ int sd_bus_add_match(
3218 sd_bus_message_handler_t callback,
3221 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3224 _public_ int sd_bus_add_match_async(
3228 sd_bus_message_handler_t callback,
3229 sd_bus_message_handler_t install_callback,
3232 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3235 bool bus_pid_changed(sd_bus *bus) {
3238 /* We don't support people creating a bus connection and
3239 * keeping it around over a fork(). Let's complain. */
3241 return bus->original_pid != getpid_cached();
3244 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3245 sd_bus *bus = userdata;
3250 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
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 time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3262 sd_bus *bus = userdata;
3267 r = sd_bus_process(bus, NULL);
3269 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3270 bus_enter_closing(bus);
3276 static int prepare_callback(sd_event_source *s, void *userdata) {
3277 sd_bus *bus = userdata;
3284 e = sd_bus_get_events(bus);
3290 if (bus->output_fd != bus->input_fd) {
3292 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3296 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3298 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3302 r = sd_bus_get_timeout(bus, &until);
3308 j = sd_event_source_set_time(bus->time_event_source, until);
3315 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3322 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3323 bus_enter_closing(bus);
3328 static int quit_callback(sd_event_source *event, void *userdata) {
3329 sd_bus *bus = userdata;
3339 int bus_attach_io_events(sd_bus *bus) {
3344 if (bus->input_fd < 0)
3350 if (!bus->input_io_event_source) {
3351 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3355 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3359 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3363 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3365 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3370 if (bus->output_fd != bus->input_fd) {
3371 assert(bus->output_fd >= 0);
3373 if (!bus->output_io_event_source) {
3374 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3378 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3382 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3384 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3393 static void bus_detach_io_events(sd_bus *bus) {
3396 if (bus->input_io_event_source) {
3397 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3398 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3401 if (bus->output_io_event_source) {
3402 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3403 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3407 int bus_attach_inotify_event(sd_bus *bus) {
3412 if (bus->inotify_fd < 0)
3418 if (!bus->inotify_event_source) {
3419 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3423 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3427 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3429 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3436 static void bus_detach_inotify_event(sd_bus *bus) {
3439 if (bus->inotify_event_source) {
3440 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3441 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3445 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3448 assert_return(bus, -EINVAL);
3449 assert_return(!bus->event, -EBUSY);
3451 assert(!bus->input_io_event_source);
3452 assert(!bus->output_io_event_source);
3453 assert(!bus->time_event_source);
3456 bus->event = sd_event_ref(event);
3458 r = sd_event_default(&bus->event);
3463 bus->event_priority = priority;
3465 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3469 r = sd_event_source_set_priority(bus->time_event_source, priority);
3473 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3477 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3481 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3485 r = bus_attach_io_events(bus);
3489 r = bus_attach_inotify_event(bus);
3496 sd_bus_detach_event(bus);
3500 _public_ int sd_bus_detach_event(sd_bus *bus) {
3501 assert_return(bus, -EINVAL);
3506 bus_detach_io_events(bus);
3507 bus_detach_inotify_event(bus);
3509 if (bus->time_event_source) {
3510 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3511 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3514 if (bus->quit_event_source) {
3515 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3516 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3519 bus->event = sd_event_unref(bus->event);
3523 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3524 assert_return(bus, NULL);
3529 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3530 assert_return(bus, NULL);
3532 return bus->current_message;
3535 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3536 assert_return(bus, NULL);
3538 return bus->current_slot;
3541 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3542 assert_return(bus, NULL);
3544 return bus->current_handler;
3547 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3548 assert_return(bus, NULL);
3550 return bus->current_userdata;
3553 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3558 assert(default_bus);
3561 return !!*default_bus;
3564 *ret = sd_bus_ref(*default_bus);
3572 b->default_bus_ptr = default_bus;
3580 _public_ int sd_bus_default_system(sd_bus **ret) {
3581 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3585 _public_ int sd_bus_default_user(sd_bus **ret) {
3586 #if 0 /// elogind does not support user buses
3587 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3589 return sd_bus_default_system(ret);
3593 _public_ int sd_bus_default(sd_bus **ret) {
3597 /* Let's try our best to reuse another cached connection. If
3598 * the starter bus type is set, connect via our normal
3599 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3600 * we can share the connection with the user/system default
3603 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3605 if (streq(e, "system"))
3606 return sd_bus_default_system(ret);
3607 #if 0 /// elogind does not support systemd units
3608 else if (STR_IN_SET(e, "user", "session"))
3609 return sd_bus_default_user(ret);
3613 /* No type is specified, so we have not other option than to
3614 * use the starter address if it is set. */
3615 e = secure_getenv("DBUS_STARTER_ADDRESS");
3617 return bus_default(sd_bus_open, &default_starter_bus, ret);
3619 /* Finally, if nothing is set use the cached connection for
3620 * the right scope */
3622 #if 0 /// elogind does not support systemd user instances
3623 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3624 return sd_bus_default_user(ret);
3627 return sd_bus_default_system(ret);
3630 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3631 assert_return(b, -EINVAL);
3632 assert_return(tid, -EINVAL);
3633 assert_return(!bus_pid_changed(b), -ECHILD);
3641 return sd_event_get_tid(b->event, tid);
3646 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3647 _cleanup_free_ char *e = NULL;
3650 assert_return(object_path_is_valid(prefix), -EINVAL);
3651 assert_return(external_id, -EINVAL);
3652 assert_return(ret_path, -EINVAL);
3654 e = bus_label_escape(external_id);
3658 ret = strjoin(prefix, "/", e);
3666 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3670 assert_return(object_path_is_valid(path), -EINVAL);
3671 assert_return(object_path_is_valid(prefix), -EINVAL);
3672 assert_return(external_id, -EINVAL);
3674 e = object_path_startswith(path, prefix);
3676 *external_id = NULL;
3680 ret = bus_label_unescape(e);
3688 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3689 _cleanup_strv_free_ char **labels = NULL;
3690 char *path, *path_pos, **label_pos;
3691 const char *sep, *template_pos;
3696 assert_return(out, -EINVAL);
3697 assert_return(path_template, -EINVAL);
3699 path_length = strlen(path_template);
3701 va_start(list, path_template);
3702 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3706 arg = va_arg(list, const char *);
3712 label = bus_label_escape(arg);
3718 r = strv_consume(&labels, label);
3724 /* add label length, but account for the format character */
3725 path_length += strlen(label) - 1;
3729 path = malloc(path_length + 1);
3736 for (template_pos = path_template; *template_pos; ) {
3737 sep = strchrnul(template_pos, '%');
3738 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3742 path_pos = stpcpy(path_pos, *label_pos++);
3743 template_pos = sep + 1;
3751 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3752 _cleanup_strv_free_ char **labels = NULL;
3753 const char *template_pos, *path_pos;
3759 * This decodes an object-path based on a template argument. The
3760 * template consists of a verbatim path, optionally including special
3763 * - Each occurrence of '%' in the template matches an arbitrary
3764 * substring of a label in the given path. At most one such
3765 * directive is allowed per label. For each such directive, the
3766 * caller must provide an output parameter (char **) via va_arg. If
3767 * NULL is passed, the given label is verified, but not returned.
3768 * For each matched label, the *decoded* label is stored in the
3769 * passed output argument, and the caller is responsible to free
3770 * it. Note that the output arguments are only modified if the
3771 * actualy path matched the template. Otherwise, they're left
3774 * This function returns <0 on error, 0 if the path does not match the
3775 * template, 1 if it matched.
3778 assert_return(path, -EINVAL);
3779 assert_return(path_template, -EINVAL);
3783 for (template_pos = path_template; *template_pos; ) {
3788 /* verify everything until the next '%' matches verbatim */
3789 sep = strchrnul(template_pos, '%');
3790 length = sep - template_pos;
3791 if (strncmp(path_pos, template_pos, length))
3795 template_pos += length;
3800 /* We found the next '%' character. Everything up until here
3801 * matched. We now skip ahead to the end of this label and make
3802 * sure it matches the tail of the label in the path. Then we
3803 * decode the string in-between and save it for later use. */
3805 ++template_pos; /* skip over '%' */
3807 sep = strchrnul(template_pos, '/');
3808 length = sep - template_pos; /* length of suffix to match verbatim */
3810 /* verify the suffixes match */
3811 sep = strchrnul(path_pos, '/');
3812 if (sep - path_pos < (ssize_t)length ||
3813 strncmp(sep - length, template_pos, length))
3816 template_pos += length; /* skip over matched label */
3817 length = sep - path_pos - length; /* length of sub-label to decode */
3819 /* store unescaped label for later use */
3820 label = bus_label_unescape_n(path_pos, length);
3824 r = strv_consume(&labels, label);
3828 path_pos = sep; /* skip decoded label and suffix */
3831 /* end of template must match end of path */
3835 /* copy the labels over to the caller */
3836 va_start(list, path_template);
3837 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3840 arg = va_arg(list, char **);
3848 labels = mfree(labels);
3852 _public_ int sd_bus_try_close(sd_bus *bus) {
3853 assert_return(bus, -EINVAL);
3854 assert_return(!bus_pid_changed(bus), -ECHILD);
3859 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3860 assert_return(bus, -EINVAL);
3861 assert_return(description, -EINVAL);
3862 assert_return(bus->description, -ENXIO);
3863 assert_return(!bus_pid_changed(bus), -ECHILD);
3865 *description = bus->description;
3869 int bus_get_root_path(sd_bus *bus) {
3872 if (bus->cgroup_root)
3875 r = cg_get_root_path(&bus->cgroup_root);
3877 bus->cgroup_root = strdup("/");
3878 if (!bus->cgroup_root)
3887 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3888 assert_return(bus, -EINVAL);
3889 assert_return(scope, -EINVAL);
3890 assert_return(!bus_pid_changed(bus), -ECHILD);
3897 if (bus->is_system) {
3905 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3907 assert_return(bus, -EINVAL);
3908 assert_return(address, -EINVAL);
3909 assert_return(!bus_pid_changed(bus), -ECHILD);
3912 *address = bus->address;
3919 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3920 assert_return(bus, -EINVAL);
3921 assert_return(mask, -EINVAL);
3922 assert_return(!bus_pid_changed(bus), -ECHILD);
3924 *mask = bus->creds_mask;
3928 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3929 assert_return(bus, -EINVAL);
3930 assert_return(!bus_pid_changed(bus), -ECHILD);
3932 return bus->bus_client;
3935 _public_ int sd_bus_is_server(sd_bus *bus) {
3936 assert_return(bus, -EINVAL);
3937 assert_return(!bus_pid_changed(bus), -ECHILD);
3939 return bus->is_server;
3942 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3943 assert_return(bus, -EINVAL);
3944 assert_return(!bus_pid_changed(bus), -ECHILD);
3946 return bus->anonymous_auth;
3949 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3950 assert_return(bus, -EINVAL);
3951 assert_return(!bus_pid_changed(bus), -ECHILD);
3953 return bus->trusted;
3956 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3957 assert_return(bus, -EINVAL);
3958 assert_return(!bus_pid_changed(bus), -ECHILD);
3960 return bus->is_monitor;
3963 static void flush_close(sd_bus *bus) {
3967 /* Flushes and closes the specified bus. We take a ref before,
3968 * to ensure the flushing does not cause the bus to be
3971 sd_bus_flush_close_unref(sd_bus_ref(bus));
3974 _public_ void sd_bus_default_flush_close(void) {
3975 flush_close(default_starter_bus);
3976 #if 0 /// elogind does not support user buses
3977 flush_close(default_user_bus);
3979 flush_close(default_system_bus);
3982 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
3983 assert_return(bus, -EINVAL);
3985 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3986 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3987 * from the client side. */
3988 bus->exit_on_disconnect = b;
3990 /* If the exit condition was triggered already, exit immediately. */
3991 return bus_exit_now(bus);
3994 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
3995 assert_return(bus, -EINVAL);
3997 return bus->exit_on_disconnect;
4000 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4001 assert_return(bus, -EINVAL);
4002 assert_return(!bus->bus_client, -EPERM);
4003 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4005 return free_and_strdup(&bus->patch_sender, sender);
4008 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4009 assert_return(bus, -EINVAL);
4010 assert_return(ret, -EINVAL);
4012 if (!bus->patch_sender)
4015 *ret = bus->patch_sender;