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, 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], &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 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
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, &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_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1824 assert_return(m, -EINVAL);
1829 assert_return(!bus_pid_changed(bus), -ECHILD);
1831 if (!BUS_IS_OPEN(bus->state))
1834 if (!streq_ptr(m->destination, destination)) {
1839 r = sd_bus_message_set_destination(m, destination);
1844 return sd_bus_send(bus, m, cookie);
1847 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1850 if (usec == (uint64_t) -1)
1853 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1854 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1855 * relative timestamp, and afterwards the absolute one. */
1857 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1860 return now(CLOCK_MONOTONIC) + usec;
1863 static int timeout_compare(const void *a, const void *b) {
1864 const struct reply_callback *x = a, *y = b;
1866 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1869 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1872 if (x->timeout_usec < y->timeout_usec)
1875 if (x->timeout_usec > y->timeout_usec)
1881 _public_ int sd_bus_call_async(
1885 sd_bus_message_handler_t callback,
1889 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1890 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1893 assert_return(m, -EINVAL);
1894 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1895 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
1900 assert_return(!bus_pid_changed(bus), -ECHILD);
1902 if (!BUS_IS_OPEN(bus->state))
1905 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
1906 if (!callback && !slot && !m->sealed)
1907 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1909 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1913 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1917 r = bus_seal_message(bus, m, usec);
1921 r = bus_remarshal_message(bus, &m);
1925 if (slot || callback) {
1926 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1930 s->reply_callback.callback = callback;
1932 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1933 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1935 s->reply_callback.cookie = 0;
1939 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
1940 if (s->reply_callback.timeout_usec != 0) {
1941 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1943 s->reply_callback.timeout_usec = 0;
1949 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
1960 int bus_ensure_running(sd_bus *bus) {
1965 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
1967 if (bus->state == BUS_RUNNING)
1971 r = sd_bus_process(bus, NULL);
1974 if (bus->state == BUS_RUNNING)
1979 r = sd_bus_wait(bus, (uint64_t) -1);
1985 _public_ int sd_bus_call(
1989 sd_bus_error *error,
1990 sd_bus_message **reply) {
1992 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1998 bus_assert_return(m, -EINVAL, error);
1999 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2000 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2001 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2006 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2008 if (!BUS_IS_OPEN(bus->state)) {
2013 r = bus_ensure_running(bus);
2017 i = bus->rqueue_size;
2019 r = bus_seal_message(bus, m, usec);
2023 r = bus_remarshal_message(bus, &m);
2027 r = sd_bus_send(bus, m, &cookie);
2031 timeout = calc_elapse(bus, m->timeout);
2036 while (i < bus->rqueue_size) {
2037 sd_bus_message *incoming = NULL;
2039 incoming = bus->rqueue[i];
2041 if (incoming->reply_cookie == cookie) {
2042 /* Found a match! */
2044 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2046 log_debug_bus_message(incoming);
2048 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2050 if (incoming->n_fds <= 0 || bus->accept_fd) {
2054 sd_bus_message_unref(incoming);
2059 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2060 sd_bus_message_unref(incoming);
2063 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2064 r = sd_bus_error_copy(error, &incoming->error);
2065 sd_bus_message_unref(incoming);
2072 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2075 streq(bus->unique_name, incoming->sender)) {
2077 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2080 /* Our own message? Somebody is trying
2081 * to send its own client a message,
2082 * let's not dead-lock, let's fail
2085 sd_bus_message_unref(incoming);
2090 /* Try to read more, right-away */
2094 r = bus_read_message(bus, false, 0);
2096 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2097 bus_enter_closing(bus);
2109 n = now(CLOCK_MONOTONIC);
2117 left = (uint64_t) -1;
2119 r = bus_poll(bus, true, left);
2127 r = dispatch_wqueue(bus);
2129 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2130 bus_enter_closing(bus);
2139 return sd_bus_error_set_errno(error, r);
2142 _public_ int sd_bus_get_fd(sd_bus *bus) {
2144 assert_return(bus, -EINVAL);
2145 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2146 assert_return(!bus_pid_changed(bus), -ECHILD);
2148 if (bus->state == BUS_CLOSED)
2151 if (bus->inotify_fd >= 0)
2152 return bus->inotify_fd;
2154 if (bus->input_fd >= 0)
2155 return bus->input_fd;
2160 _public_ int sd_bus_get_events(sd_bus *bus) {
2163 assert_return(bus, -EINVAL);
2164 assert_return(!bus_pid_changed(bus), -ECHILD);
2166 switch (bus->state) {
2172 case BUS_WATCH_BIND:
2180 case BUS_AUTHENTICATING:
2181 if (bus_socket_auth_needs_write(bus))
2189 if (bus->rqueue_size <= 0)
2191 if (bus->wqueue_size > 0)
2199 assert_not_reached("Unknown state");
2205 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2206 struct reply_callback *c;
2208 assert_return(bus, -EINVAL);
2209 assert_return(timeout_usec, -EINVAL);
2210 assert_return(!bus_pid_changed(bus), -ECHILD);
2212 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2215 if (bus->track_queue) {
2220 switch (bus->state) {
2222 case BUS_AUTHENTICATING:
2223 *timeout_usec = bus->auth_timeout;
2228 if (bus->rqueue_size > 0) {
2233 c = prioq_peek(bus->reply_callbacks_prioq);
2235 *timeout_usec = (uint64_t) -1;
2239 if (c->timeout_usec == 0) {
2240 *timeout_usec = (uint64_t) -1;
2244 *timeout_usec = c->timeout_usec;
2251 case BUS_WATCH_BIND:
2253 *timeout_usec = (uint64_t) -1;
2257 assert_not_reached("Unknown or unexpected stat");
2261 static int process_timeout(sd_bus *bus) {
2262 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2263 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2264 struct reply_callback *c;
2271 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2273 c = prioq_peek(bus->reply_callbacks_prioq);
2277 n = now(CLOCK_MONOTONIC);
2278 if (c->timeout_usec > n)
2281 r = bus_message_new_synthetic_error(
2284 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2289 r = bus_seal_synthetic_message(bus, m);
2293 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2294 c->timeout_usec = 0;
2296 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2299 slot = container_of(c, sd_bus_slot, reply_callback);
2301 bus->iteration_counter++;
2303 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2305 bus->current_message = m;
2306 bus->current_slot = sd_bus_slot_ref(slot);
2307 bus->current_handler = c->callback;
2308 bus->current_userdata = slot->userdata;
2309 r = c->callback(m, slot->userdata, &error_buffer);
2310 bus->current_userdata = NULL;
2311 bus->current_handler = NULL;
2312 bus->current_slot = NULL;
2313 bus->current_message = NULL;
2315 if (slot->floating) {
2316 bus_slot_disconnect(slot);
2317 sd_bus_slot_unref(slot);
2320 sd_bus_slot_unref(slot);
2322 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2323 * and ignore the callback handler's return value. */
2327 return bus_maybe_reply_error(m, r, &error_buffer);
2330 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2334 if (bus->state != BUS_HELLO)
2337 /* Let's make sure the first message on the bus is the HELLO
2338 * reply. But note that we don't actually parse the message
2339 * here (we leave that to the usual handling), we just verify
2340 * we don't let any earlier msg through. */
2342 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2345 if (m->reply_cookie != 1)
2351 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2352 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2353 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2354 struct reply_callback *c;
2362 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2365 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2368 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2374 slot = container_of(c, sd_bus_slot, reply_callback);
2376 if (m->n_fds > 0 && !bus->accept_fd) {
2378 /* If the reply contained a file descriptor which we
2379 * didn't want we pass an error instead. */
2381 r = bus_message_new_synthetic_error(
2384 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2389 /* Copy over original timestamp */
2390 synthetic_reply->realtime = m->realtime;
2391 synthetic_reply->monotonic = m->monotonic;
2392 synthetic_reply->seqnum = m->seqnum;
2394 r = bus_seal_synthetic_message(bus, synthetic_reply);
2398 m = synthetic_reply;
2400 r = sd_bus_message_rewind(m, true);
2405 if (c->timeout_usec != 0) {
2406 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2407 c->timeout_usec = 0;
2410 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2412 bus->current_slot = sd_bus_slot_ref(slot);
2413 bus->current_handler = c->callback;
2414 bus->current_userdata = slot->userdata;
2415 r = c->callback(m, slot->userdata, &error_buffer);
2416 bus->current_userdata = NULL;
2417 bus->current_handler = NULL;
2418 bus->current_slot = NULL;
2420 if (slot->floating) {
2421 bus_slot_disconnect(slot);
2422 sd_bus_slot_unref(slot);
2425 sd_bus_slot_unref(slot);
2427 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2428 * ignore the callback handler's return value. */
2432 return bus_maybe_reply_error(m, r, &error_buffer);
2435 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2436 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2437 struct filter_callback *l;
2444 bus->filter_callbacks_modified = false;
2446 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2449 if (bus->filter_callbacks_modified)
2452 /* Don't run this more than once per iteration */
2453 if (l->last_iteration == bus->iteration_counter)
2456 l->last_iteration = bus->iteration_counter;
2458 r = sd_bus_message_rewind(m, true);
2462 slot = container_of(l, sd_bus_slot, filter_callback);
2464 bus->current_slot = sd_bus_slot_ref(slot);
2465 bus->current_handler = l->callback;
2466 bus->current_userdata = slot->userdata;
2467 r = l->callback(m, slot->userdata, &error_buffer);
2468 bus->current_userdata = NULL;
2469 bus->current_handler = NULL;
2470 bus->current_slot = sd_bus_slot_unref(slot);
2472 r = bus_maybe_reply_error(m, r, &error_buffer);
2478 } while (bus->filter_callbacks_modified);
2483 static int process_match(sd_bus *bus, sd_bus_message *m) {
2490 bus->match_callbacks_modified = false;
2492 r = bus_match_run(bus, &bus->match_callbacks, m);
2496 } while (bus->match_callbacks_modified);
2501 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2502 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2508 if (bus->is_monitor)
2511 if (bus->manual_peer_interface)
2514 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2517 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2520 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2523 if (streq_ptr(m->member, "Ping"))
2524 r = sd_bus_message_new_method_return(m, &reply);
2525 else if (streq_ptr(m->member, "GetMachineId")) {
2529 r = sd_id128_get_machine(&id);
2533 r = sd_bus_message_new_method_return(m, &reply);
2537 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2539 r = sd_bus_message_new_method_errorf(
2541 SD_BUS_ERROR_UNKNOWN_METHOD,
2542 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2548 r = sd_bus_send(bus, reply, NULL);
2555 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2559 /* If we got a message with a file descriptor which we didn't
2560 * want to accept, then let's drop it. How can this even
2561 * happen? For example, when the kernel queues a message into
2562 * an activatable names's queue which allows fds, and then is
2563 * delivered to us later even though we ourselves did not
2566 if (bus->is_monitor)
2575 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2576 return 1; /* just eat it up */
2578 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2581 static int process_message(sd_bus *bus, sd_bus_message *m) {
2587 bus->current_message = m;
2588 bus->iteration_counter++;
2590 log_debug_bus_message(m);
2592 r = process_hello(bus, m);
2596 r = process_reply(bus, m);
2600 r = process_fd_check(bus, m);
2604 r = process_filter(bus, m);
2608 r = process_match(bus, m);
2612 r = process_builtin(bus, m);
2616 r = bus_process_object(bus, m);
2619 bus->current_message = NULL;
2623 static int dispatch_track(sd_bus *bus) {
2626 if (!bus->track_queue)
2629 bus_track_dispatch(bus->track_queue);
2633 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2634 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2638 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2640 r = process_timeout(bus);
2644 r = dispatch_wqueue(bus);
2648 r = dispatch_track(bus);
2652 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2658 r = process_message(bus, m);
2663 r = sd_bus_message_rewind(m, true);
2672 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2674 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2675 strna(sd_bus_message_get_sender(m)),
2676 strna(sd_bus_message_get_path(m)),
2677 strna(sd_bus_message_get_interface(m)),
2678 strna(sd_bus_message_get_member(m)));
2680 r = sd_bus_reply_method_errorf(
2682 SD_BUS_ERROR_UNKNOWN_OBJECT,
2683 "Unknown object '%s'.", m->path);
2697 static int bus_exit_now(sd_bus *bus) {
2700 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2701 * sd_event_exit(), otherwise invokes libc exit(). */
2703 if (bus->exited) /* did we already exit? */
2705 if (!bus->exit_triggered) /* was the exit condition triggered? */
2707 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2710 bus->exited = true; /* never exit more than once */
2712 log_debug("Bus connection disconnected, exiting.");
2715 return sd_event_exit(bus->event, EXIT_FAILURE);
2719 assert_not_reached("exit() didn't exit?");
2722 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2723 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2724 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2731 r = bus_message_new_synthetic_error(
2734 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2739 r = bus_seal_synthetic_message(bus, m);
2743 if (c->timeout_usec != 0) {
2744 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2745 c->timeout_usec = 0;
2748 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2751 slot = container_of(c, sd_bus_slot, reply_callback);
2753 bus->iteration_counter++;
2755 bus->current_message = m;
2756 bus->current_slot = sd_bus_slot_ref(slot);
2757 bus->current_handler = c->callback;
2758 bus->current_userdata = slot->userdata;
2759 r = c->callback(m, slot->userdata, &error_buffer);
2760 bus->current_userdata = NULL;
2761 bus->current_handler = NULL;
2762 bus->current_slot = NULL;
2763 bus->current_message = NULL;
2765 if (slot->floating) {
2766 bus_slot_disconnect(slot);
2767 sd_bus_slot_unref(slot);
2770 sd_bus_slot_unref(slot);
2772 return bus_maybe_reply_error(m, r, &error_buffer);
2775 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2776 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2777 struct reply_callback *c;
2781 assert(bus->state == BUS_CLOSING);
2783 /* First, fail all outstanding method calls */
2784 c = ordered_hashmap_first(bus->reply_callbacks);
2786 return process_closing_reply_callback(bus, c);
2788 /* Then, fake-drop all remaining bus tracking references */
2790 bus_track_close(bus->tracks);
2794 /* Then, synthesize a Disconnected message */
2795 r = sd_bus_message_new_signal(
2798 "/org/freedesktop/DBus/Local",
2799 "org.freedesktop.DBus.Local",
2804 bus_message_set_sender_local(bus, m);
2806 r = bus_seal_synthetic_message(bus, m);
2812 bus->current_message = m;
2813 bus->iteration_counter++;
2815 r = process_filter(bus, m);
2819 r = process_match(bus, m);
2823 /* Nothing else to do, exit now, if the condition holds */
2824 bus->exit_triggered = true;
2825 (void) bus_exit_now(bus);
2835 bus->current_message = NULL;
2840 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2841 BUS_DONT_DESTROY(bus);
2844 /* Returns 0 when we didn't do anything. This should cause the
2845 * caller to invoke sd_bus_wait() before returning the next
2846 * time. Returns > 0 when we did something, which possibly
2847 * means *ret is filled in with an unprocessed message. */
2849 assert_return(bus, -EINVAL);
2850 assert_return(!bus_pid_changed(bus), -ECHILD);
2852 /* We don't allow recursively invoking sd_bus_process(). */
2853 assert_return(!bus->current_message, -EBUSY);
2854 assert(!bus->current_slot);
2856 switch (bus->state) {
2864 case BUS_WATCH_BIND:
2865 r = bus_socket_process_watch_bind(bus);
2869 r = bus_socket_process_opening(bus);
2872 case BUS_AUTHENTICATING:
2873 r = bus_socket_process_authenticating(bus);
2878 r = process_running(bus, hint_priority, priority, ret);
2882 /* This branch initializes *ret, hence we don't use the generic error checking below */
2886 return process_closing(bus, ret);
2889 assert_not_reached("Unknown state");
2892 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2893 bus_enter_closing(bus);
2904 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2905 return bus_process_internal(bus, false, 0, ret);
2908 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2909 return bus_process_internal(bus, true, priority, ret);
2912 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2913 struct pollfd p[2] = {};
2916 usec_t m = USEC_INFINITY;
2920 if (bus->state == BUS_CLOSING)
2923 if (!BUS_IS_OPEN(bus->state))
2926 if (bus->state == BUS_WATCH_BIND) {
2927 assert(bus->inotify_fd >= 0);
2929 p[0].events = POLLIN;
2930 p[0].fd = bus->inotify_fd;
2935 e = sd_bus_get_events(bus);
2940 /* The caller really needs some more data, he doesn't
2941 * care about what's already read, or any timeouts
2942 * except its own. */
2946 /* The caller wants to process if there's something to
2947 * process, but doesn't care otherwise */
2949 r = sd_bus_get_timeout(bus, &until);
2953 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
2956 p[0].fd = bus->input_fd;
2957 if (bus->output_fd == bus->input_fd) {
2961 p[0].events = e & POLLIN;
2962 p[1].fd = bus->output_fd;
2963 p[1].events = e & POLLOUT;
2968 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
2971 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
2975 return r > 0 ? 1 : 0;
2978 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2980 assert_return(bus, -EINVAL);
2981 assert_return(!bus_pid_changed(bus), -ECHILD);
2983 if (bus->state == BUS_CLOSING)
2986 if (!BUS_IS_OPEN(bus->state))
2989 if (bus->rqueue_size > 0)
2992 return bus_poll(bus, false, timeout_usec);
2995 _public_ int sd_bus_flush(sd_bus *bus) {
2998 assert_return(bus, -EINVAL);
2999 assert_return(!bus_pid_changed(bus), -ECHILD);
3001 if (bus->state == BUS_CLOSING)
3004 if (!BUS_IS_OPEN(bus->state))
3007 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3008 if (bus->state == BUS_WATCH_BIND)
3011 r = bus_ensure_running(bus);
3015 if (bus->wqueue_size <= 0)
3019 r = dispatch_wqueue(bus);
3021 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3022 bus_enter_closing(bus);
3029 if (bus->wqueue_size <= 0)
3032 r = bus_poll(bus, false, (uint64_t) -1);
3038 _public_ int sd_bus_add_filter(
3041 sd_bus_message_handler_t callback,
3046 assert_return(bus, -EINVAL);
3047 assert_return(callback, -EINVAL);
3048 assert_return(!bus_pid_changed(bus), -ECHILD);
3050 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3054 s->filter_callback.callback = callback;
3056 bus->filter_callbacks_modified = true;
3057 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3065 static int add_match_callback(
3068 sd_bus_error *ret_error) {
3070 sd_bus_slot *match_slot = userdata;
3071 bool failed = false;
3077 sd_bus_slot_ref(match_slot);
3079 if (sd_bus_message_is_method_error(m, NULL)) {
3080 log_debug_errno(sd_bus_message_get_errno(m),
3081 "Unable to add match %s, failing connection: %s",
3082 match_slot->match_callback.match_string,
3083 sd_bus_message_get_error(m)->message);
3087 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3089 if (match_slot->match_callback.install_callback) {
3092 bus = sd_bus_message_get_bus(m);
3094 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3095 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3098 assert(bus->current_slot == match_slot->match_callback.install_slot);
3099 assert(bus->current_handler == add_match_callback);
3100 assert(bus->current_userdata == userdata);
3102 bus->current_slot = match_slot;
3103 bus->current_handler = match_slot->match_callback.install_callback;
3104 bus->current_userdata = match_slot->userdata;
3106 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3108 bus->current_slot = match_slot->match_callback.install_slot;
3109 bus->current_handler = add_match_callback;
3110 bus->current_userdata = userdata;
3112 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3114 if (failed) /* Generic failure handling: destroy the connection */
3115 bus_enter_closing(sd_bus_message_get_bus(m));
3120 if (failed && match_slot->floating) {
3121 bus_slot_disconnect(match_slot);
3122 sd_bus_slot_unref(match_slot);
3125 sd_bus_slot_unref(match_slot);
3130 static int bus_add_match_full(
3135 sd_bus_message_handler_t callback,
3136 sd_bus_message_handler_t install_callback,
3139 struct bus_match_component *components = NULL;
3140 unsigned n_components = 0;
3141 sd_bus_slot *s = NULL;
3144 assert_return(bus, -EINVAL);
3145 assert_return(match, -EINVAL);
3146 assert_return(!bus_pid_changed(bus), -ECHILD);
3148 r = bus_match_parse(match, &components, &n_components);
3152 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3158 s->match_callback.callback = callback;
3159 s->match_callback.install_callback = install_callback;
3161 if (bus->bus_client) {
3162 enum bus_match_scope scope;
3164 scope = bus_match_get_scope(components, n_components);
3166 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3167 if (scope != BUS_MATCH_LOCAL) {
3169 /* We store the original match string, so that we can use it to remove the match again. */
3171 s->match_callback.match_string = strdup(match);
3172 if (!s->match_callback.match_string) {
3178 r = bus_add_match_internal_async(bus,
3179 &s->match_callback.install_slot,
3180 s->match_callback.match_string,
3184 r = bus_add_match_internal(bus, s->match_callback.match_string);
3188 s->match_added = true;
3192 bus->match_callbacks_modified = true;
3193 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3202 bus_match_parse_free(components, n_components);
3203 sd_bus_slot_unref(s);
3208 #if 0 /// UNNEEDED by elogind
3210 _public_ int sd_bus_add_match(
3214 sd_bus_message_handler_t callback,
3217 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3220 _public_ int sd_bus_add_match_async(
3224 sd_bus_message_handler_t callback,
3225 sd_bus_message_handler_t install_callback,
3228 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3231 bool bus_pid_changed(sd_bus *bus) {
3234 /* We don't support people creating a bus connection and
3235 * keeping it around over a fork(). Let's complain. */
3237 return bus->original_pid != getpid_cached();
3240 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3241 sd_bus *bus = userdata;
3246 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3248 r = sd_bus_process(bus, NULL);
3250 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3251 bus_enter_closing(bus);
3257 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3258 sd_bus *bus = userdata;
3263 r = sd_bus_process(bus, NULL);
3265 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3266 bus_enter_closing(bus);
3272 static int prepare_callback(sd_event_source *s, void *userdata) {
3273 sd_bus *bus = userdata;
3280 e = sd_bus_get_events(bus);
3286 if (bus->output_fd != bus->input_fd) {
3288 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3292 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3294 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3298 r = sd_bus_get_timeout(bus, &until);
3304 j = sd_event_source_set_time(bus->time_event_source, until);
3311 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3318 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3319 bus_enter_closing(bus);
3324 static int quit_callback(sd_event_source *event, void *userdata) {
3325 sd_bus *bus = userdata;
3335 int bus_attach_io_events(sd_bus *bus) {
3340 if (bus->input_fd < 0)
3346 if (!bus->input_io_event_source) {
3347 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3351 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3355 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3359 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3361 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3366 if (bus->output_fd != bus->input_fd) {
3367 assert(bus->output_fd >= 0);
3369 if (!bus->output_io_event_source) {
3370 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3374 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3378 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3380 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3389 static void bus_detach_io_events(sd_bus *bus) {
3392 if (bus->input_io_event_source) {
3393 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3394 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3397 if (bus->output_io_event_source) {
3398 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3399 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3403 int bus_attach_inotify_event(sd_bus *bus) {
3408 if (bus->inotify_fd < 0)
3414 if (!bus->inotify_event_source) {
3415 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3419 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3423 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3425 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3432 static void bus_detach_inotify_event(sd_bus *bus) {
3435 if (bus->inotify_event_source) {
3436 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3437 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3441 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3444 assert_return(bus, -EINVAL);
3445 assert_return(!bus->event, -EBUSY);
3447 assert(!bus->input_io_event_source);
3448 assert(!bus->output_io_event_source);
3449 assert(!bus->time_event_source);
3452 bus->event = sd_event_ref(event);
3454 r = sd_event_default(&bus->event);
3459 bus->event_priority = priority;
3461 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3465 r = sd_event_source_set_priority(bus->time_event_source, priority);
3469 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3473 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3477 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3481 r = bus_attach_io_events(bus);
3485 r = bus_attach_inotify_event(bus);
3492 sd_bus_detach_event(bus);
3496 _public_ int sd_bus_detach_event(sd_bus *bus) {
3497 assert_return(bus, -EINVAL);
3502 bus_detach_io_events(bus);
3503 bus_detach_inotify_event(bus);
3505 if (bus->time_event_source) {
3506 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3507 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3510 if (bus->quit_event_source) {
3511 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3512 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3515 bus->event = sd_event_unref(bus->event);
3519 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3520 assert_return(bus, NULL);
3525 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3526 assert_return(bus, NULL);
3528 return bus->current_message;
3531 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3532 assert_return(bus, NULL);
3534 return bus->current_slot;
3537 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3538 assert_return(bus, NULL);
3540 return bus->current_handler;
3543 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3544 assert_return(bus, NULL);
3546 return bus->current_userdata;
3549 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3554 assert(default_bus);
3557 return !!*default_bus;
3560 *ret = sd_bus_ref(*default_bus);
3568 b->default_bus_ptr = default_bus;
3576 _public_ int sd_bus_default_system(sd_bus **ret) {
3577 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3581 _public_ int sd_bus_default_user(sd_bus **ret) {
3582 #if 0 /// elogind does not support user buses
3583 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3585 return sd_bus_default_system(ret);
3589 _public_ int sd_bus_default(sd_bus **ret) {
3593 /* Let's try our best to reuse another cached connection. If
3594 * the starter bus type is set, connect via our normal
3595 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3596 * we can share the connection with the user/system default
3599 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3601 if (streq(e, "system"))
3602 return sd_bus_default_system(ret);
3603 #if 0 /// elogind does not support systemd units
3604 else if (STR_IN_SET(e, "user", "session"))
3605 return sd_bus_default_user(ret);
3609 /* No type is specified, so we have not other option than to
3610 * use the starter address if it is set. */
3611 e = secure_getenv("DBUS_STARTER_ADDRESS");
3613 return bus_default(sd_bus_open, &default_starter_bus, ret);
3615 /* Finally, if nothing is set use the cached connection for
3616 * the right scope */
3618 #if 0 /// elogind does not support systemd user instances
3619 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3620 return sd_bus_default_user(ret);
3623 return sd_bus_default_system(ret);
3626 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3627 assert_return(b, -EINVAL);
3628 assert_return(tid, -EINVAL);
3629 assert_return(!bus_pid_changed(b), -ECHILD);
3637 return sd_event_get_tid(b->event, tid);
3642 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3643 _cleanup_free_ char *e = NULL;
3646 assert_return(object_path_is_valid(prefix), -EINVAL);
3647 assert_return(external_id, -EINVAL);
3648 assert_return(ret_path, -EINVAL);
3650 e = bus_label_escape(external_id);
3654 ret = strjoin(prefix, "/", e);
3662 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3666 assert_return(object_path_is_valid(path), -EINVAL);
3667 assert_return(object_path_is_valid(prefix), -EINVAL);
3668 assert_return(external_id, -EINVAL);
3670 e = object_path_startswith(path, prefix);
3672 *external_id = NULL;
3676 ret = bus_label_unescape(e);
3684 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3685 _cleanup_strv_free_ char **labels = NULL;
3686 char *path, *path_pos, **label_pos;
3687 const char *sep, *template_pos;
3692 assert_return(out, -EINVAL);
3693 assert_return(path_template, -EINVAL);
3695 path_length = strlen(path_template);
3697 va_start(list, path_template);
3698 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3702 arg = va_arg(list, const char *);
3708 label = bus_label_escape(arg);
3714 r = strv_consume(&labels, label);
3720 /* add label length, but account for the format character */
3721 path_length += strlen(label) - 1;
3725 path = malloc(path_length + 1);
3732 for (template_pos = path_template; *template_pos; ) {
3733 sep = strchrnul(template_pos, '%');
3734 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3738 path_pos = stpcpy(path_pos, *label_pos++);
3739 template_pos = sep + 1;
3747 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3748 _cleanup_strv_free_ char **labels = NULL;
3749 const char *template_pos, *path_pos;
3755 * This decodes an object-path based on a template argument. The
3756 * template consists of a verbatim path, optionally including special
3759 * - Each occurrence of '%' in the template matches an arbitrary
3760 * substring of a label in the given path. At most one such
3761 * directive is allowed per label. For each such directive, the
3762 * caller must provide an output parameter (char **) via va_arg. If
3763 * NULL is passed, the given label is verified, but not returned.
3764 * For each matched label, the *decoded* label is stored in the
3765 * passed output argument, and the caller is responsible to free
3766 * it. Note that the output arguments are only modified if the
3767 * actualy path matched the template. Otherwise, they're left
3770 * This function returns <0 on error, 0 if the path does not match the
3771 * template, 1 if it matched.
3774 assert_return(path, -EINVAL);
3775 assert_return(path_template, -EINVAL);
3779 for (template_pos = path_template; *template_pos; ) {
3784 /* verify everything until the next '%' matches verbatim */
3785 sep = strchrnul(template_pos, '%');
3786 length = sep - template_pos;
3787 if (strncmp(path_pos, template_pos, length))
3791 template_pos += length;
3796 /* We found the next '%' character. Everything up until here
3797 * matched. We now skip ahead to the end of this label and make
3798 * sure it matches the tail of the label in the path. Then we
3799 * decode the string in-between and save it for later use. */
3801 ++template_pos; /* skip over '%' */
3803 sep = strchrnul(template_pos, '/');
3804 length = sep - template_pos; /* length of suffix to match verbatim */
3806 /* verify the suffixes match */
3807 sep = strchrnul(path_pos, '/');
3808 if (sep - path_pos < (ssize_t)length ||
3809 strncmp(sep - length, template_pos, length))
3812 template_pos += length; /* skip over matched label */
3813 length = sep - path_pos - length; /* length of sub-label to decode */
3815 /* store unescaped label for later use */
3816 label = bus_label_unescape_n(path_pos, length);
3820 r = strv_consume(&labels, label);
3824 path_pos = sep; /* skip decoded label and suffix */
3827 /* end of template must match end of path */
3831 /* copy the labels over to the caller */
3832 va_start(list, path_template);
3833 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3836 arg = va_arg(list, char **);
3844 labels = mfree(labels);
3848 _public_ int sd_bus_try_close(sd_bus *bus) {
3849 assert_return(bus, -EINVAL);
3850 assert_return(!bus_pid_changed(bus), -ECHILD);
3855 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3856 assert_return(bus, -EINVAL);
3857 assert_return(description, -EINVAL);
3858 assert_return(bus->description, -ENXIO);
3859 assert_return(!bus_pid_changed(bus), -ECHILD);
3861 *description = bus->description;
3865 int bus_get_root_path(sd_bus *bus) {
3868 if (bus->cgroup_root)
3871 r = cg_get_root_path(&bus->cgroup_root);
3873 bus->cgroup_root = strdup("/");
3874 if (!bus->cgroup_root)
3883 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3884 assert_return(bus, -EINVAL);
3885 assert_return(scope, -EINVAL);
3886 assert_return(!bus_pid_changed(bus), -ECHILD);
3893 if (bus->is_system) {
3901 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3903 assert_return(bus, -EINVAL);
3904 assert_return(address, -EINVAL);
3905 assert_return(!bus_pid_changed(bus), -ECHILD);
3908 *address = bus->address;
3915 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3916 assert_return(bus, -EINVAL);
3917 assert_return(mask, -EINVAL);
3918 assert_return(!bus_pid_changed(bus), -ECHILD);
3920 *mask = bus->creds_mask;
3924 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3925 assert_return(bus, -EINVAL);
3926 assert_return(!bus_pid_changed(bus), -ECHILD);
3928 return bus->bus_client;
3931 _public_ int sd_bus_is_server(sd_bus *bus) {
3932 assert_return(bus, -EINVAL);
3933 assert_return(!bus_pid_changed(bus), -ECHILD);
3935 return bus->is_server;
3938 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3939 assert_return(bus, -EINVAL);
3940 assert_return(!bus_pid_changed(bus), -ECHILD);
3942 return bus->anonymous_auth;
3945 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3946 assert_return(bus, -EINVAL);
3947 assert_return(!bus_pid_changed(bus), -ECHILD);
3949 return bus->trusted;
3952 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3953 assert_return(bus, -EINVAL);
3954 assert_return(!bus_pid_changed(bus), -ECHILD);
3956 return bus->is_monitor;
3959 static void flush_close(sd_bus *bus) {
3963 /* Flushes and closes the specified bus. We take a ref before,
3964 * to ensure the flushing does not cause the bus to be
3967 sd_bus_flush_close_unref(sd_bus_ref(bus));
3970 _public_ void sd_bus_default_flush_close(void) {
3971 flush_close(default_starter_bus);
3972 #if 0 /// elogind does not support user buses
3973 flush_close(default_user_bus);
3975 flush_close(default_system_bus);
3978 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
3979 assert_return(bus, -EINVAL);
3981 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3982 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3983 * from the client side. */
3984 bus->exit_on_disconnect = b;
3986 /* If the exit condition was triggered already, exit immediately. */
3987 return bus_exit_now(bus);
3990 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
3991 assert_return(bus, -EINVAL);
3993 return bus->exit_on_disconnect;
3996 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
3997 assert_return(bus, -EINVAL);
3998 assert_return(!bus->bus_client, -EPERM);
3999 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4001 return free_and_strdup(&bus->patch_sender, sender);
4004 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4005 assert_return(bus, -EINVAL);
4006 assert_return(ret, -EINVAL);
4008 if (!bus->patch_sender)
4011 *ret = bus->patch_sender;